Version in base suite: 140.6.0esr-1~deb12u1 Version in overlay suite: 140.9.0esr-1~deb12u1 Base version: thunderbird_140.9.0esr-1~deb12u1 Target version: thunderbird_140.10.0esr-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/t/thunderbird/thunderbird_140.9.0esr-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/t/thunderbird/thunderbird_140.10.0esr-1~deb12u1.dsc .cargo/config.toml.in | 4 .gitignore | 3 CLOBBER | 2 Cargo.lock | 4 accessible/base/AccIterator.cpp | 4 accessible/base/AccIterator.h | 6 accessible/base/TextLeafRange.cpp | 2 accessible/base/TextLeafRange.h | 2 accessible/generic/HyperTextAccessible.cpp | 11 accessible/ipc/DocAccessibleParent.cpp | 25 browser/actors/BlockedSiteChild.sys.mjs | 16 browser/actors/BlockedSiteParent.sys.mjs | 38 browser/actors/DOMFullscreenParent.sys.mjs | 6 browser/base/content/browser-fullScreenAndPointerLock.js | 10 browser/base/content/test/fullscreen/browser.toml | 3 browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js | 184 browser/components/asrouter/modules/ASRouterTargeting.sys.mjs | 7 browser/components/asrouter/tests/browser/browser_asrouter_targeting.js | 15 browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json | 2 browser/config/version.txt | 2 browser/config/version_display.txt | 2 comm/.gecko_rev.yml | 4 comm/mail/config/version.txt | 2 comm/mail/config/version_display.txt | 2 comm/mail/locales/l10n-changesets.json | 132 comm/rust/.cargo/config.toml.in | 4 comm/rust/Cargo.lock | 4 comm/rust/checksums.json | 2 comm/rust/gkrust/Cargo.toml | 2 comm/third_party/rust/cubeb-coreaudio/.cargo-checksum.json | 2 comm/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs | 14 config/milestone.txt | 2 debian/changelog | 74 debian/patches/fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch | 118 debian/patches/fixes/Fix-sandbox-to-build-with-glibc-2.43.patch | 22 debian/patches/series | 2 devtools/client/aboutdebugging/test/browser/browser.toml | 1 devtools/client/application/test/browser/browser.toml | 7 devtools/client/debugger/src/.eslintrc.mjs | 2 devtools/client/debugger/src/components/QuickOpenModal.js | 64 devtools/client/debugger/test/mochitest/browser_aj.toml | 4 devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js | 28 devtools/client/framework/test/browser.toml | 9 devtools/client/inspector/animation/test/browser.toml | 7 devtools/client/webconsole/test/browser/_webconsole.toml | 2 devtools/client/webconsole/test/browser/stub-generator-helpers.js | 14 docshell/base/BrowsingContext.cpp | 13 docshell/base/BrowsingContext.h | 9 dom/abort/AbortSignal.cpp | 7 dom/animation/Animation.cpp | 44 dom/animation/Animation.h | 1 dom/base/Document.cpp | 23 dom/base/Document.h | 2 dom/base/Element.cpp | 6 dom/base/ImageEncoder.cpp | 18 dom/base/ScreenOrientation.cpp | 17 dom/base/ScreenOrientation.h | 9 dom/base/ShadowRoot.cpp | 2 dom/base/ShadowRoot.h | 2 dom/base/StructuredCloneBlob.cpp | 10 dom/base/TextInputProcessor.cpp | 5 dom/base/TextInputProcessor.h | 7 dom/base/nsAttrValue.cpp | 8 dom/base/nsContentList.cpp | 9 dom/base/nsContentList.h | 10 dom/base/nsDOMWindowUtils.cpp | 5 dom/base/nsFrameLoaderOwner.cpp | 2 dom/base/nsGlobalWindowInner.cpp | 6 dom/base/nsGlobalWindowInner.h | 4 dom/base/nsINode.cpp | 12 dom/base/nsObjectLoadingContent.cpp | 40 dom/base/nsPIDOMWindow.h | 1 dom/base/nsRange.cpp | 14 dom/base/nsScreen.cpp | 10 dom/base/nsScreen.h | 5 dom/base/nsWrapperCache.cpp | 7 dom/base/nsWrapperCache.h | 2 dom/base/nsWrapperCacheInlines.h | 6 dom/base/test/jsmodules/mochitest.toml | 2 dom/base/test/jsmodules/test_bug_2027541.html | 47 dom/bindings/BindingUtils.cpp | 31 dom/bindings/Codegen.py | 62 dom/bindings/ErrorResult.h | 7 dom/cache/Manager.cpp | 12 dom/cache/StreamList.cpp | 7 dom/canvas/CanvasRenderingContext2D.cpp | 132 dom/canvas/CanvasRenderingContext2D.h | 20 dom/canvas/ClientWebGLContext.cpp | 27 dom/canvas/DrawTargetWebgl.cpp | 75 dom/canvas/DrawTargetWebgl.h | 2 dom/canvas/ImageData.cpp | 25 dom/canvas/TexUnpackBlob.cpp | 13 dom/canvas/TexUnpackBlob.h | 4 dom/canvas/WebGLContext.cpp | 115 dom/canvas/WebGLContext.h | 4 dom/canvas/WebGLContextGL.cpp | 12 dom/canvas/WebGLShaderValidator.cpp | 29 dom/clients/manager/ClientManagerChild.cpp | 5 dom/clients/manager/ClientNavigateOpChild.cpp | 17 dom/clients/manager/ClientNavigateOpChild.h | 6 dom/clients/manager/ClientSource.cpp | 46 dom/console/Console.cpp | 1 dom/cookiestore/CookieStoreNotifier.cpp | 7 dom/events/EventListenerManager.cpp | 8 dom/events/IMEContentObserver.cpp | 3 dom/events/IMEContentObserver.h | 11 dom/events/IMEStateManager.cpp | 17 dom/fetch/Fetch.cpp | 55 dom/fetch/FetchParent.cpp | 3 dom/fetch/FetchParent.h | 1 dom/fetch/InternalResponse.cpp | 13 dom/fetch/InternalResponse.h | 2 dom/file/Blob.cpp | 11 dom/file/Blob.h | 6 dom/filesystem/FileSystemSecurity.cpp | 14 dom/filesystem/FileSystemUtils.cpp | 25 dom/fs/child/FileSystemRequestHandler.cpp | 13 dom/fs/include/fs/FileSystemRequestHandler.h | 4 dom/fs/parent/FileSystemAccessHandle.cpp | 3 dom/fs/test/gtest/FileSystemMocks.h | 7 dom/gamepad/GamepadPlatformService.cpp | 38 dom/gamepad/GamepadPlatformService.h | 60 dom/gamepad/GamepadRemapping.cpp | 10 dom/gamepad/GamepadRemapping.h | 3 dom/gamepad/cocoa/CocoaGamepad.cpp | 83 dom/gamepad/windows/WindowsGamepad.cpp | 4 dom/geolocation/Geolocation.cpp | 7 dom/geolocation/Geolocation.h | 5 dom/html/HTMLAllCollection.cpp | 35 dom/html/HTMLFieldSetElement.cpp | 5 dom/html/HTMLFieldSetElement.h | 2 dom/html/HTMLFormElement.cpp | 2 dom/html/HTMLMediaElement.cpp | 27 dom/html/HTMLMediaElement.h | 1 dom/html/HTMLSelectElement.cpp | 65 dom/html/HTMLSelectElement.h | 5 dom/html/HTMLSlotElement.cpp | 42 dom/html/TextTrackManager.cpp | 15 dom/indexedDB/ActorsParent.cpp | 18 dom/indexedDB/FileInfoImpl.h | 2 dom/indexedDB/IDBObjectStore.cpp | 59 dom/indexedDB/Key.cpp | 6 dom/interfaces/base/nsIDOMWindowUtils.idl | 7 dom/ipc/BrowserBridgeParent.cpp | 3 dom/ipc/BrowserParent.cpp | 6 dom/ipc/BrowserParent.h | 3 dom/ipc/ClonedErrorHolder.cpp | 9 dom/ipc/ContentParent.cpp | 29 dom/ipc/PBrowser.ipdl | 3 dom/ipc/RefMessageBodyService.cpp | 18 dom/ipc/RefMessageBodyService.h | 7 dom/ipc/VsyncParent.cpp | 1 dom/ipc/VsyncParent.h | 5 dom/locks/LockRequestChild.cpp | 2 dom/media/ADTSDemuxer.cpp | 2 dom/media/AsyncLogger.h | 19 dom/media/BaseMediaResource.cpp | 13 dom/media/ExternalEngineStateMachine.cpp | 7 dom/media/MediaData.cpp | 4 dom/media/MediaData.h | 4 dom/media/MediaDecoderStateMachine.cpp | 18 dom/media/eme/MediaEncryptedEvent.cpp | 3 dom/media/eme/MediaKeyMessageEvent.cpp | 3 dom/media/eme/mediafoundation/WMFCDMProxy.cpp | 3 dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp | 4 dom/media/gmp/ChromiumCDMCallback.h | 4 dom/media/gmp/ChromiumCDMCallbackProxy.cpp | 13 dom/media/gmp/ChromiumCDMCallbackProxy.h | 7 dom/media/gmp/ChromiumCDMChild.cpp | 143 dom/media/gmp/ChromiumCDMChild.h | 4 dom/media/gmp/ChromiumCDMParent.cpp | 41 dom/media/gmp/ChromiumCDMParent.h | 19 dom/media/gmp/GMPChild.cpp | 3 dom/media/gmp/GMPContentChild.cpp | 6 dom/media/gmp/GMPMessageUtils.h | 28 dom/media/gmp/GMPPlatform.cpp | 127 dom/media/gmp/GMPPlatform.h | 22 dom/media/gmp/GMPService.cpp | 8 dom/media/gmp/GMPSharedMemManager.cpp | 4 dom/media/gmp/GMPSharedMemManager.h | 1 dom/media/gmp/GMPStorageChild.cpp | 164 dom/media/gmp/GMPStorageChild.h | 26 dom/media/gmp/GMPTypes.ipdlh | 3 dom/media/gmp/GMPUtils.cpp | 68 dom/media/gmp/GMPUtils.h | 4 dom/media/gmp/GMPVideoDecoderChild.cpp | 100 dom/media/gmp/GMPVideoDecoderChild.h | 15 dom/media/gmp/GMPVideoDecoderParent.cpp | 26 dom/media/gmp/GMPVideoDecoderParent.h | 11 dom/media/gmp/GMPVideoEncodedFrameImpl.cpp | 55 dom/media/gmp/GMPVideoEncodedFrameImpl.h | 6 dom/media/gmp/GMPVideoEncoderChild.cpp | 56 dom/media/gmp/GMPVideoEncoderChild.h | 11 dom/media/gmp/GMPVideoEncoderParent.cpp | 31 dom/media/gmp/GMPVideoEncoderParent.h | 11 dom/media/gmp/GMPVideoHost.cpp | 50 dom/media/gmp/GMPVideoHost.h | 36 dom/media/gmp/GMPVideoi420FrameImpl.cpp | 53 dom/media/gmp/GMPVideoi420FrameImpl.h | 7 dom/media/gmp/PChromiumCDM.ipdl | 20 dom/media/gmp/widevine-adapter/WidevineFileIO.cpp | 18 dom/media/gmp/widevine-adapter/WidevineFileIO.h | 9 dom/media/gtest/TestCDMStorage.cpp | 8 dom/media/ipc/RDDChild.cpp | 38 dom/media/ipc/RemoteAudioDecoder.cpp | 10 dom/media/ipc/RemoteDecoderManagerChild.cpp | 39 dom/media/ipc/RemoteDecoderParent.cpp | 20 dom/media/ipc/RemoteDecoderParent.h | 2 dom/media/ipc/RemoteMediaData.cpp | 8 dom/media/ipc/RemoteVideoDecoder.cpp | 18 dom/media/ipc/RemoteVideoDecoder.h | 2 dom/media/platforms/MediaCodecsSupport.cpp | 33 dom/media/platforms/MediaCodecsSupport.h | 2 dom/media/platforms/agnostic/bytestreams/H265.cpp | 18 dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp | 9 dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp | 7 dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp | 3 dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h | 18 dom/media/platforms/ffmpeg/VALibWrapper.cpp | 30 dom/media/platforms/ffmpeg/VALibWrapper.h | 11 dom/media/systemservices/MediaSystemResourceManager.cpp | 45 dom/media/systemservices/MediaSystemResourceManager.h | 12 dom/media/systemservices/MediaSystemResourceManagerChild.cpp | 3 dom/media/systemservices/MediaSystemResourceManagerParent.cpp | 9 dom/media/systemservices/MediaSystemResourceManagerParent.h | 2 dom/media/systemservices/MediaSystemResourceService.cpp | 10 dom/media/systemservices/MediaSystemResourceService.h | 2 dom/media/systemservices/PMediaSystemResourceManager.ipdl | 7 dom/media/webaudio/AudioBufferSourceNode.cpp | 12 dom/media/webcodecs/AudioData.cpp | 28 dom/media/webcodecs/ImageDecoder.cpp | 33 dom/media/webcodecs/ImageDecoderReadRequest.cpp | 3 dom/media/webcodecs/VideoFrame.cpp | 27 dom/media/webrtc/jsapi/PeerConnectionImpl.cpp | 32 dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp | 29 dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h | 10 dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp | 29 dom/media/webrtc/jsapi/RTCEncodedFrameBase.h | 6 dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp | 25 dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h | 11 dom/media/webrtc/libwebrtcglue/VideoConduit.cpp | 4 dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp | 10 dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp | 9 dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h | 7 dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp | 14 dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h | 3 dom/media/webrtc/transport/nr_socket_prsock.cpp | 2 dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c | 4 dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c | 3 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c | 18 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h | 1 dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c | 2 dom/media/webvtt/TextTrack.cpp | 1 dom/network/TCPServerSocketParent.cpp | 10 dom/network/TCPSocket.cpp | 5 dom/network/TCPSocketParent.cpp | 8 dom/network/UDPSocket.cpp | 2 dom/network/UDPSocketParent.cpp | 4 dom/network/tests/chrome.toml | 1 dom/reporting/ReportingHeader.cpp | 3 dom/script/ScriptElement.cpp | 13 dom/security/nsCSPUtils.cpp | 10 dom/serviceworkers/ServiceWorkerOp.cpp | 8 dom/serviceworkers/ServiceWorkerRegistrationChild.cpp | 3 dom/smil/SMILCSSValueType.cpp | 2 dom/streams/QueueWithSizes.h | 24 dom/streams/ReadableByteStreamController.cpp | 5 dom/streams/ReadableStream.cpp | 29 dom/streams/ReadableStream.h | 4 dom/streams/ReadableStreamBYOBReader.cpp | 6 dom/streams/ReadableStreamDefaultController.cpp | 5 dom/streams/ReadableStreamDefaultReader.cpp | 9 dom/streams/ReadableStreamPipeTo.cpp | 19 dom/streams/ReadableStreamTee.cpp | 12 dom/streams/TeeState.cpp | 18 dom/streams/TeeState.h | 6 dom/streams/TransformStream.cpp | 24 dom/streams/TransformStreamDefaultController.cpp | 7 dom/streams/UnderlyingSourceCallbackHelpers.cpp | 18 dom/streams/WritableStream.cpp | 14 dom/streams/WritableStream.h | 4 dom/streams/WritableStreamDefaultController.cpp | 15 dom/streams/WritableStreamDefaultWriter.cpp | 26 dom/svg/DOMSVGLength.cpp | 4 dom/svg/DOMSVGLength.h | 5 dom/svg/DOMSVGLengthList.cpp | 7 dom/svg/DOMSVGNumber.h | 5 dom/svg/DOMSVGNumberList.cpp | 7 dom/svg/DOMSVGPoint.cpp | 4 dom/svg/DOMSVGPoint.h | 5 dom/svg/DOMSVGPointList.cpp | 7 dom/svg/DOMSVGTransform.h | 5 dom/svg/DOMSVGTransformList.cpp | 7 dom/svg/SVGFEBlendElement.cpp | 37 dom/svg/SVGFEColorMatrixElement.cpp | 22 dom/svg/SVGFEComponentTransferElement.cpp | 2 dom/svg/SVGFECompositeElement.cpp | 23 dom/svg/SVGFEConvolveMatrixElement.cpp | 10 dom/svg/SVGFEDisplacementMapElement.cpp | 18 dom/svg/SVGFEMorphologyElement.cpp | 10 dom/svg/SVGFETurbulenceElement.cpp | 11 dom/svg/SVGFilters.cpp | 27 dom/svg/SVGFragmentIdentifier.cpp | 2 dom/webauthn/AuthenticatorAssertionResponse.cpp | 42 dom/webauthn/AuthenticatorAssertionResponse.h | 5 dom/webauthn/AuthenticatorAttestationResponse.cpp | 20 dom/webauthn/AuthenticatorAttestationResponse.h | 3 dom/webauthn/AuthenticatorResponse.cpp | 19 dom/webauthn/AuthenticatorResponse.h | 3 dom/webauthn/MacOSWebAuthnService.mm | 19 dom/webauthn/PublicKeyCredential.cpp | 19 dom/webauthn/PublicKeyCredential.h | 3 dom/webauthn/WebAuthnHandler.cpp | 4 dom/webauthn/WebAuthnTransactionParent.cpp | 10 dom/webauthn/WebAuthnUtil.h | 2 dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp | 7 dom/webidl/WebAuthentication.webidl | 24 dom/webtransport/parent/WebTransportParent.cpp | 3 dom/workers/MessageEventRunnable.cpp | 9 dom/workers/MessageEventRunnable.h | 6 dom/workers/RuntimeService.cpp | 18 dom/workers/RuntimeService.h | 8 dom/workers/WorkerError.cpp | 4 dom/workers/WorkerError.h | 4 dom/workers/WorkerNavigator.cpp | 2 dom/worklet/WorkletFetchHandler.cpp | 10 dom/worklet/loader/WorkletModuleLoader.cpp | 7 dom/worklet/loader/WorkletModuleLoader.h | 9 dom/xhr/XMLHttpRequestMainThread.cpp | 6 dom/xhr/XMLHttpRequestMainThread.h | 11 dom/xml/nsXMLPrettyPrinter.cpp | 2 dom/xslt/xpath/txForwardContext.h | 2 dom/xslt/xpath/txPathExpr.cpp | 4 dom/xslt/xslt/txInstructions.cpp | 12 dom/xslt/xslt/txKey.h | 10 dom/xslt/xslt/txKeyFunctionCall.cpp | 14 dom/xslt/xslt/txXSLTNumber.cpp | 2 editor/libeditor/HTMLEditorDeleteHandler.cpp | 10 extensions/permissions/test/unit/test_permmanager_expiration.js | 7 extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp | 12 extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h | 3 extensions/spellcheck/src/mozSpellChecker.cpp | 2 gfx/2d/2D.h | 1 gfx/2d/DrawTargetSkia.cpp | 8 gfx/2d/FilterNodeSoftware.cpp | 10 gfx/2d/FilterProcessingScalar.cpp | 4 gfx/angle/checkout/include/GLSLANG/ShaderVars.h | 1 gfx/angle/checkout/out/gen/angle/angle_commit.h | 6 gfx/angle/checkout/src/compiler/translator/BaseTypes.h | 3 gfx/angle/checkout/src/compiler/translator/Compiler.cpp | 14 gfx/angle/checkout/src/compiler/translator/ParseContext.cpp | 62 gfx/angle/checkout/src/compiler/translator/ParseContext.h | 4 gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp | 7 gfx/angle/cherry_picks.txt | 200 gfx/cairo/cairo/src/cairo-cff-subset.c | 6 gfx/gl/GLBlitHelper.cpp | 11 gfx/gl/GLLibraryEGL.cpp | 11 gfx/harfbuzz/src/hb-aat-layout-morx-table.hh | 13 gfx/harfbuzz/src/moz.build | 5 gfx/ipc/CanvasShutdownManager.cpp | 27 gfx/ipc/CanvasShutdownManager.h | 3 gfx/ipc/GPUChild.cpp | 50 gfx/ipc/GPUChild.h | 2 gfx/ipc/GPUParent.cpp | 8 gfx/ipc/GPUParent.h | 2 gfx/ipc/GPUProcessManager.cpp | 5 gfx/ipc/GPUProcessManager.h | 6 gfx/ipc/GfxMessageUtils.h | 31 gfx/ipc/PGPU.ipdl | 8 gfx/layers/BufferTexture.cpp | 4 gfx/layers/D3D11ShareHandleImage.cpp | 4 gfx/layers/D3D11YCbCrImage.cpp | 2 gfx/layers/DMABUFSurfaceImage.cpp | 2 gfx/layers/DcompSurfaceImage.cpp | 14 gfx/layers/ImageDataSerializer.cpp | 4 gfx/layers/MacIOSurfaceImage.cpp | 2 gfx/layers/RemoteTextureMap.cpp | 2 gfx/layers/ScreenshotGrabber.cpp | 6 gfx/layers/SourceSurfaceSharedData.cpp | 6 gfx/layers/apz/src/APZCTreeManager.cpp | 3 gfx/layers/apz/util/CheckerboardReportService.cpp | 2 gfx/layers/client/ImageClient.cpp | 2 gfx/layers/client/TextureClient.cpp | 59 gfx/layers/composite/TextureHost.cpp | 139 gfx/layers/composite/TextureHost.h | 19 gfx/layers/d3d11/TextureD3D11.cpp | 36 gfx/layers/ipc/APZInputBridgeChild.cpp | 4 gfx/layers/ipc/CanvasChild.cpp | 61 gfx/layers/ipc/CanvasTranslator.cpp | 33 gfx/layers/ipc/CompositableTransactionParent.cpp | 16 gfx/layers/ipc/CompositableTransactionParent.h | 2 gfx/layers/ipc/CompositorBridgeChild.cpp | 10 gfx/layers/ipc/CompositorBridgeChild.h | 2 gfx/layers/ipc/CompositorBridgeParent.cpp | 3 gfx/layers/ipc/CompositorBridgeParent.h | 4 gfx/layers/ipc/CompositorThread.cpp | 4 gfx/layers/ipc/ContentCompositorBridgeParent.cpp | 31 gfx/layers/ipc/ContentCompositorBridgeParent.h | 2 gfx/layers/ipc/ISurfaceAllocator.cpp | 15 gfx/layers/ipc/ISurfaceAllocator.h | 12 gfx/layers/ipc/ImageBridgeChild.h | 2 gfx/layers/ipc/ImageBridgeParent.cpp | 17 gfx/layers/ipc/KnowsCompositor.cpp | 52 gfx/layers/ipc/KnowsCompositor.h | 4 gfx/layers/ipc/PCompositorBridge.ipdl | 2 gfx/layers/ipc/PWebRenderBridge.ipdl | 2 gfx/layers/ipc/RemoteContentController.cpp | 4 gfx/layers/ipc/SharedSurfacesParent.cpp | 5 gfx/layers/ipc/VideoBridgeChild.cpp | 2 gfx/layers/ipc/VideoBridgeChild.h | 2 gfx/layers/ipc/VideoBridgeParent.cpp | 38 gfx/layers/ipc/VideoBridgeParent.h | 7 gfx/layers/opengl/DMABUFTextureHostOGL.cpp | 58 gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp | 60 gfx/layers/opengl/TextureHostOGL.cpp | 31 gfx/layers/wr/AsyncImagePipelineOp.cpp | 30 gfx/layers/wr/AsyncImagePipelineOp.h | 36 gfx/layers/wr/WebRenderBridgeChild.cpp | 7 gfx/layers/wr/WebRenderBridgeChild.h | 4 gfx/layers/wr/WebRenderBridgeParent.cpp | 66 gfx/layers/wr/WebRenderBridgeParent.h | 2 gfx/layers/wr/WebRenderMessageUtils.h | 78 gfx/layers/wr/WebRenderScrollData.cpp | 6 gfx/ots/moz.yaml | 4 gfx/ots/ots-lz4.patch | 37 gfx/ots/src/cff.cc | 26 gfx/ots/src/cff_charstring.cc | 2 gfx/ots/src/cmap.cc | 3 gfx/ots/src/colr.cc | 20 gfx/ots/src/glat.cc | 2 gfx/ots/src/layout.cc | 12 gfx/ots/src/ots.cc | 2 gfx/ots/src/silf.cc | 4 gfx/ots/src/variations.cc | 6 gfx/src/FilterSupport.cpp | 187 gfx/src/FilterSupport.h | 204 gfx/tests/gtest/TestYUVtoRGB32.cpp | 156 gfx/thebes/COLRFonts.cpp | 2 gfx/thebes/CoreTextFontList.h | 2 gfx/thebes/SharedFontList.cpp | 8 gfx/thebes/SharedFontList.h | 3 gfx/thebes/gfxDWriteFontList.cpp | 21 gfx/thebes/gfxDWriteFontList.h | 4 gfx/thebes/gfxFT2FontBase.cpp | 4 gfx/thebes/gfxFT2FontBase.h | 2 gfx/thebes/gfxFT2FontList.cpp | 95 gfx/thebes/gfxFT2FontList.h | 17 gfx/thebes/gfxFcPlatformFontList.cpp | 99 gfx/thebes/gfxFcPlatformFontList.h | 15 gfx/thebes/gfxFont.cpp | 4 gfx/thebes/gfxFontEntry.cpp | 261 gfx/thebes/gfxFontEntry.h | 132 gfx/thebes/gfxGDIFontList.cpp | 17 gfx/thebes/gfxGDIFontList.h | 6 gfx/thebes/gfxHarfBuzzShaper.cpp | 261 gfx/thebes/gfxHarfBuzzShaper.h | 191 gfx/thebes/gfxPlatformFontList.cpp | 138 gfx/thebes/gfxPlatformFontList.h | 66 gfx/thebes/gfxTextRun.cpp | 13 gfx/thebes/gfxUserFontSet.cpp | 31 gfx/thebes/gfxUserFontSet.h | 2 gfx/thebes/gfxUtils.cpp | 6 gfx/vr/VRManager.cpp | 4 gfx/vr/external_api/moz_external_vr.h | 3 gfx/vr/ipc/VRChild.cpp | 38 gfx/webrender_bindings/RenderTextureHost.cpp | 3 gfx/webrender_bindings/RenderTextureHost.h | 11 gfx/webrender_bindings/RenderTextureHostSWGL.h | 2 gfx/webrender_bindings/RenderTextureHostWrapper.cpp | 24 gfx/webrender_bindings/RenderTextureHostWrapper.h | 7 gfx/webrender_bindings/WebRenderAPI.cpp | 11 gfx/webrender_bindings/WebRenderAPI.h | 2 gfx/webrender_bindings/src/bindings.rs | 13 gfx/ycbcr/scale_yuv_argb.cpp | 3 gfx/ycbcr/yuv_convert.cpp | 82 image/ImageWrapper.cpp | 3 image/RasterImage.cpp | 8 image/RasterImage.h | 3 image/VectorImage.cpp | 4 image/decoders/nsBMPDecoder.cpp | 13 image/decoders/nsBMPDecoder.h | 4 image/decoders/nsICODecoder.cpp | 62 image/decoders/nsPNGDecoder.cpp | 139 ipc/glue/BackgroundParentImpl.cpp | 10 ipc/glue/UtilityProcessParent.cpp | 25 js/loader/ModuleLoaderBase.cpp | 21 js/loader/ModuleLoaderBase.h | 2 js/public/Object.h | 6 js/src/builtin/temporal/Instant.cpp | 4 js/src/debugger/Debugger.cpp | 3 js/src/gc/GC.cpp | 7 js/src/gc/GCRuntime.h | 4 js/src/gc/Heap.cpp | 7 js/src/jit/MIR-wasm.cpp | 10 js/src/jit/MIR.cpp | 28 js/src/jit/MIR.h | 12 js/src/jit/MIROps.yaml | 16 js/src/jit/ScalarReplacement.cpp | 12 js/src/jsfriendapi.cpp | 4 js/src/proxy/Proxy.cpp | 17 js/src/vm/ArgumentsObject.cpp | 18 js/src/vm/AsyncFunction.cpp | 3 js/src/vm/CharacterEncoding.cpp | 17 js/src/vm/EnvironmentObject.cpp | 24 js/src/vm/EnvironmentObject.h | 1 js/src/vm/MatchPairs.h | 5 js/src/vm/Modules.cpp | 51 js/src/vm/Modules.h | 4 js/src/vm/RegExpStatics.h | 1 js/src/vm/StructuredClone.cpp | 21 js/src/wasm/WasmInstance.cpp | 20 js/src/wasm/WasmJS.cpp | 9 js/src/wasm/WasmJS.h | 1 js/xpconnect/src/ExportHelpers.cpp | 10 js/xpconnect/src/XPCJSRuntime.cpp | 2 layout/base/PresShell.cpp | 24 layout/base/PresShell.h | 5 layout/base/tests/mochitest.toml | 2 layout/base/tests/test_getClientRects_emptytext.html | 26 layout/forms/nsRangeFrame.cpp | 10 layout/forms/nsTextControlFrame.cpp | 5 layout/generic/ScrollContainerFrame.cpp | 5 layout/generic/ScrollbarActivity.cpp | 1 layout/generic/nsFrameSelection.cpp | 134 layout/generic/nsFrameSelection.h | 7 layout/generic/nsIFrame.cpp | 10 layout/printing/ipc/RemotePrintJobParent.cpp | 9 layout/printing/ipc/RemotePrintJobParent.h | 4 layout/style/FontFace.cpp | 34 layout/style/FontFaceImpl.cpp | 44 layout/style/FontFaceImpl.h | 3 layout/style/FontFaceSet.cpp | 12 layout/style/FontFaceSetDocumentImpl.cpp | 2 layout/style/FontFaceSetImpl.cpp | 23 layout/style/FontFaceSetImpl.h | 5 layout/style/PostTraversalTask.cpp | 37 layout/style/PostTraversalTask.h | 88 layout/style/ServoStyleSet.cpp | 1 layout/style/ServoStyleSet.h | 2 layout/style/nsFontFaceLoader.cpp | 3 layout/svg/CSSFilterInstance.cpp | 32 layout/svg/FilterInstance.cpp | 116 layout/svg/SVGObserverUtils.cpp | 6 layout/tables/celldata.h | 9 layout/tables/nsCellMap.cpp | 10 media/ffvpx/README_MOZILLA | 5 media/ffvpx/libavcodec/vp9.c | 4 media/ffvpx/vp9-get-format-rollback.patch | 16 media/gmp-clearkey/0.1/VideoDecoder.cpp | 14 media/gmp-clearkey/0.1/VideoDecoder.h | 8 media/gmp-clearkey/0.1/WMFH264Decoder.cpp | 34 media/gmp-clearkey/0.1/WMFH264Decoder.h | 20 media/libpng/ANNOUNCE | 29 media/libpng/AUTHORS | 4 media/libpng/CHANGES | 42 media/libpng/README | 2 media/libpng/arm/palette_neon_intrinsics.c | 61 media/libpng/libpng-manual.txt | 10 media/libpng/moz.yaml | 5 media/libpng/png.c | 16 media/libpng/png.h | 16 media/libpng/pngconf.h | 2 media/libpng/pngpriv.h | 4 media/libpng/pngread.c | 68 media/libpng/pngrtran.c | 58 media/libpng/pngrutil.c | 42 media/libpng/pngset.c | 121 media/libpng/pngstruct.h | 6 media/libpng/pngtrans.c | 40 media/libpng/pngwrite.c | 16 media/libpng/pngwutil.c | 49 media/libvpx/libvpx/vp8/common/alloccommon.c | 6 media/libvpx/moz.yaml | 1 media/libvpx/reset_post_proc_state.patch | 32 mfbt/CheckedInt.h | 2 modules/brotli/common/constants.c | 14 modules/brotli/common/constants.h | 7 modules/brotli/common/context.c | 4 modules/brotli/common/context.h | 3 modules/brotli/common/dictionary.c | 5860 ---------- modules/brotli/common/dictionary.h | 3 modules/brotli/common/dictionary_inc.h | 5847 +++++++++ modules/brotli/common/platform.c | 4 modules/brotli/common/platform.h | 240 modules/brotli/common/shared_dictionary.c | 10 modules/brotli/common/shared_dictionary_internal.h | 2 modules/brotli/common/static_init.h | 56 modules/brotli/common/transform.c | 10 modules/brotli/common/transform.h | 3 modules/brotli/common/version.h | 6 modules/brotli/dec/bit_reader.c | 11 modules/brotli/dec/bit_reader.h | 4 modules/brotli/dec/decode.c | 267 modules/brotli/dec/huffman.c | 7 modules/brotli/dec/huffman.h | 2 modules/brotli/dec/prefix.c | 67 modules/brotli/dec/prefix.h | 726 - modules/brotli/dec/prefix_inc.h | 707 + modules/brotli/dec/state.c | 33 modules/brotli/dec/state.h | 8 modules/brotli/dec/static_init.c | 53 modules/brotli/dec/static_init.h | 30 modules/brotli/include/brotli/decode.h | 6 modules/brotli/include/brotli/encode.h | 6 modules/brotli/include/brotli/port.h | 11 modules/brotli/include/brotli/types.h | 4 modules/brotli/moz.build | 2 modules/brotli/moz.yaml | 8 modules/libpref/Preferences.cpp | 1 modules/libpref/init/StaticPrefList.yaml | 16 mozglue/interposers/env_interposer.cpp | 18 netwerk/base/Tickler.cpp | 10 netwerk/base/Tickler.h | 7 netwerk/base/nsBaseChannel.cpp | 2 netwerk/base/nsDownloader.cpp | 1 netwerk/base/nsSyncStreamListener.cpp | 3 netwerk/base/nsUDPSocket.cpp | 30 netwerk/base/nsUDPSocket.h | 18 netwerk/build/components.conf | 1 netwerk/build/moz.build | 6 netwerk/cookie/CookieStorage.cpp | 14 netwerk/dns/DNS.cpp | 49 netwerk/dns/DNS.h | 1 netwerk/dns/DNSPacket.cpp | 7 netwerk/dns/TRRServiceChild.cpp | 2 netwerk/dns/TRRServiceParent.cpp | 15 netwerk/dns/effective_tld_names.dat | 84 netwerk/dns/nsDNSService2.cpp | 2 netwerk/dns/nsHostResolver.cpp | 2 netwerk/ipc/DocumentLoadListener.cpp | 1 netwerk/ipc/NeckoChannelParams.ipdlh | 25 netwerk/ipc/NeckoChild.cpp | 21 netwerk/ipc/NeckoChild.h | 6 netwerk/ipc/NeckoMessageUtils.h | 7 netwerk/ipc/NeckoParent.cpp | 54 netwerk/ipc/NeckoParent.h | 11 netwerk/ipc/PNecko.ipdl | 9 netwerk/ipc/SocketProcessBridgeParent.cpp | 4 netwerk/ipc/SocketProcessParent.cpp | 58 netwerk/ipc/moz.build | 2 netwerk/protocol/gio/GIOChannelChild.cpp | 457 netwerk/protocol/gio/GIOChannelChild.h | 111 netwerk/protocol/gio/GIOChannelParent.cpp | 324 netwerk/protocol/gio/GIOChannelParent.h | 80 netwerk/protocol/gio/PGIOChannel.ipdl | 51 netwerk/protocol/gio/components.conf | 24 netwerk/protocol/gio/moz.build | 42 netwerk/protocol/gio/nsGIOProtocolHandler.cpp | 1027 - netwerk/protocol/gio/nsGIOProtocolHandler.h | 38 netwerk/protocol/http/BackgroundChannelRegistrar.cpp | 20 netwerk/protocol/http/BackgroundChannelRegistrar.h | 11 netwerk/protocol/http/BackgroundDataBridgeParent.cpp | 14 netwerk/protocol/http/BackgroundDataBridgeParent.h | 3 netwerk/protocol/http/HttpChannelParent.cpp | 16 netwerk/protocol/http/HttpTransactionParent.cpp | 35 netwerk/protocol/http/ObliviousHttpChannel.cpp | 17 netwerk/protocol/http/ObliviousHttpChannel.h | 2 netwerk/protocol/http/ReplacedHttpResponse.cpp | 8 netwerk/protocol/http/ReplacedHttpResponse.h | 2 netwerk/protocol/http/TLSTransportLayer.cpp | 12 netwerk/protocol/http/nsHttpActivityDistributor.cpp | 2 netwerk/protocol/http/nsHttpChannel.cpp | 68 netwerk/protocol/http/nsHttpChannel.h | 11 netwerk/protocol/http/nsHttpConnection.cpp | 3 netwerk/protocol/http/nsHttpHandler.cpp | 4 netwerk/protocol/http/nsHttpHandler.h | 8 netwerk/protocol/http/nsHttpTransaction.cpp | 4 netwerk/protocol/moz.build | 14 netwerk/protocol/res/ExtensionProtocolHandler.cpp | 22 netwerk/protocol/websocket/WebSocketChannelChild.cpp | 26 netwerk/protocol/webtransport/WebTransportSessionProxy.cpp | 20 netwerk/streamconv/converters/mozTXTToHTMLConv.cpp | 11 netwerk/system/mac/nsNetworkLinkService.mm | 37 netwerk/test/unit/test_gio_protocol.js | 201 netwerk/test/unit/xpcshell.toml | 3 netwerk/test/unit_ipc/test_gio_protocol_wrap.js | 21 netwerk/test/unit_ipc/xpcshell.toml | 4 parser/html/nsHtml5TreeOperation.cpp | 20 security/ct/CTKnownLogs.h | 2 security/manager/ssl/PSMRunnable.cpp | 42 security/manager/ssl/PSMRunnable.h | 49 security/manager/ssl/SSLServerCertVerification.cpp | 1 security/manager/ssl/StaticHPKPins.h | 2 security/manager/ssl/moz.build | 7 security/manager/ssl/nsNSSCallbacks.cpp | 37 security/manager/ssl/nsNSSIOLayer.cpp | 1 security/manager/ssl/nsSTSPreloadList.inc | 4378 +++---- security/manager/tools/PreloadedHPKPins.json | 4 security/manager/tools/log_list.json | 4 security/nss/cpputil/nss_scoped_ptrs.h | 11 security/nss/doc/rst/releases/nss_3_112_4.rst | 52 security/nss/gtests/der_gtest/der_gtest.gyp | 1 security/nss/gtests/der_gtest/p12_import_unittest.cc | 23 security/nss/gtests/der_gtest/p7_import_unittest.cc | 60 security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp | 39 security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc | 116 security/nss/lib/certdb/alg1485.c | 8 security/nss/lib/certdb/stanpcertdb.c | 13 security/nss/lib/certhigh/certvfy.c | 7 security/nss/lib/cryptohi/dsautil.c | 21 security/nss/lib/freebl/blapii.h | 1 security/nss/lib/freebl/rsa_blind.c | 3 security/nss/lib/freebl/rsapkcs.c | 21 security/nss/lib/mozpkix/lib/pkixnames.cpp | 76 security/nss/lib/nss/nss.h | 4 security/nss/lib/pk11wrap/pk11pk12.c | 11 security/nss/lib/pkcs7/p7decode.c | 61 security/nss/lib/pki/tdcache.c | 31 security/nss/lib/smime/cmsdecode.c | 16 security/nss/lib/smime/cmspubkey.c | 1 security/nss/lib/softoken/softkver.h | 4 security/nss/lib/ssl/dtlscon.c | 33 security/nss/lib/ssl/ssl3con.c | 1 security/nss/lib/ssl/ssl3ext.c | 20 security/nss/lib/ssl/ssl3ext.h | 3 security/nss/lib/ssl/ssl3exthandle.c | 38 security/nss/lib/ssl/tls13con.c | 21 security/nss/lib/ssl/tls13ech.c | 2 security/nss/lib/ssl/tls13exthandle.c | 43 security/nss/lib/util/nssutil.h | 4 security/nss/lib/util/quickder.c | 11 security/nss/moz.yaml | 4 services/settings/dumps/blocklists/addons-bloomfilters.json | 5149 ++++++++ services/settings/dumps/main/devtools-compatibility-browsers.json | 394 services/settings/dumps/main/search-config-icons.json | 19 services/settings/dumps/main/search-config-v2.json | 36 services/settings/dumps/main/search-telemetry-v2.json | 747 - services/settings/dumps/main/urlbar-persisted-search-terms.json | 28 services/settings/dumps/security-state/intermediates.json | 553 services/settings/dumps/security-state/onecrl.json | 92 servo/components/style/values/specified/calc.rs | 3 sourcestamp.txt | 6 taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js | 10 taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js | 13 testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html | 1 testing/web-platform/meta/fedcm/lfedcm-identity.create-store-collect.tentative.sub.https.html.ini | 3 third_party/libwebrtc/call/BUILD.gn | 1 third_party/libwebrtc/call/rtp_video_sender.cc | 5 third_party/libwebrtc/call/rtp_video_sender_unittest.cc | 70 third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc | 9 third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h | 6 third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc | 25 third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg | 1 third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc | 11 third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h | 1 third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc | 8 third_party/rust/cubeb-coreaudio/.cargo-checksum.json | 2 third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs | 14 thunderbird-l10n/af/manifest.json | 4 thunderbird-l10n/ar/manifest.json | 4 thunderbird-l10n/ast/manifest.json | 4 thunderbird-l10n/be/chrome/be/locale/be/messenger/addressbook/pref-directory-add.dtd | 2 thunderbird-l10n/be/chrome/be/locale/be/messenger/imapMsgs.properties | 2 thunderbird-l10n/be/localization/be/messenger/preferences/languages.ftl | 18 thunderbird-l10n/be/manifest.json | 4 thunderbird-l10n/bg/manifest.json | 4 thunderbird-l10n/br/manifest.json | 4 thunderbird-l10n/ca/localization/ca/messenger/openpgp/openpgp.ftl | 1 thunderbird-l10n/ca/localization/ca/messenger/preferences/preferences.ftl | 2 thunderbird-l10n/ca/manifest.json | 4 thunderbird-l10n/cak/manifest.json | 4 thunderbird-l10n/cs/localization/cs/calendar/calendar.ftl | 2 thunderbird-l10n/cs/localization/cs/messenger/about3Pane.ftl | 2 thunderbird-l10n/cs/localization/cs/messenger/aboutSupportMail.ftl | 2 thunderbird-l10n/cs/localization/cs/messenger/accountcreation/accountHub.ftl | 4 thunderbird-l10n/cs/localization/cs/messenger/appmenu.ftl | 6 thunderbird-l10n/cs/localization/cs/messenger/menubar.ftl | 8 thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp-frontend.ftl | 2 thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp.ftl | 2 thunderbird-l10n/cs/localization/cs/messenger/preferences/preferences.ftl | 12 thunderbird-l10n/cs/manifest.json | 4 thunderbird-l10n/cy/manifest.json | 4 thunderbird-l10n/da/manifest.json | 4 thunderbird-l10n/de/manifest.json | 4 thunderbird-l10n/dsb/manifest.json | 4 thunderbird-l10n/el/localization/el/messenger/preferences/languages.ftl | 2 thunderbird-l10n/el/manifest.json | 4 thunderbird-l10n/en-CA/manifest.json | 4 thunderbird-l10n/en-GB/manifest.json | 4 thunderbird-l10n/es-AR/localization/es-AR/messenger/preferences/connection.ftl | 2 thunderbird-l10n/es-AR/manifest.json | 4 thunderbird-l10n/es-ES/manifest.json | 4 thunderbird-l10n/es-MX/manifest.json | 4 thunderbird-l10n/et/manifest.json | 4 thunderbird-l10n/eu/manifest.json | 4 thunderbird-l10n/fi/manifest.json | 4 thunderbird-l10n/fr/localization/fr/messenger/about3Pane.ftl | 4 thunderbird-l10n/fr/manifest.json | 4 thunderbird-l10n/fy-NL/manifest.json | 4 thunderbird-l10n/ga-IE/manifest.json | 4 thunderbird-l10n/gd/localization/gd/calendar/calendar-event-listing.ftl | 2 thunderbird-l10n/gd/manifest.json | 4 thunderbird-l10n/gl/manifest.json | 4 thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/pref-directory.dtd | 8 thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/replicationProgress.properties | 2 thunderbird-l10n/he/chrome/he/locale/he/messenger/am-addressing.dtd | 2 thunderbird-l10n/he/localization/he/branding/brand.ftl | 1 thunderbird-l10n/he/localization/he/calendar/calendar-event-listing.ftl | 6 thunderbird-l10n/he/localization/he/chat/matrix.ftl | 1 thunderbird-l10n/he/localization/he/messenger/syncAccounts.ftl | 8 thunderbird-l10n/he/manifest.json | 4 thunderbird-l10n/hr/localization/hr/messenger/openpgp/openpgp.ftl | 73 thunderbird-l10n/hr/manifest.json | 4 thunderbird-l10n/hsb/manifest.json | 4 thunderbird-l10n/hu/manifest.json | 4 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/calendar.dtd | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/menuOverlay.dtd | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/feed-subscriptions.dtd | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/newsblog.properties | 4 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/SearchDialog.dtd | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/accountCreationModel.properties | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/activity.properties | 8 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/addressBook.properties | 4 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/ldapAutoCompErrs.properties | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/gloda.properties | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/imapMsgs.properties | 2 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.dtd | 4 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.properties | 4 thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messengercompose/messengercompose.dtd | 2 thunderbird-l10n/hy-AM/localization/hy-AM/calendar/calendar.ftl | 4 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountManager.ftl | 1 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountHub.ftl | 7 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountSetup.ftl | 24 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/addressbook/aboutAddressBook.ftl | 7 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/appmenu.ftl | 11 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionPermissions.ftl | 1 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionsUI.ftl | 1 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/menubar.ftl | 15 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messageheader/headerFields.ftl | 3 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messenger.ftl | 26 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messengercompose/messengercompose.ftl | 3 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/policies/policies-descriptions.ftl | 2 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/am-archiveoptions.ftl | 6 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/connection.ftl | 2 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/preferences.ftl | 7 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/system-integration.ftl | 6 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/troubleshootMode.ftl | 4 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbar.ftl | 6 thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbarItems.ftl | 11 thunderbird-l10n/hy-AM/manifest.json | 4 thunderbird-l10n/id/manifest.json | 4 thunderbird-l10n/is/manifest.json | 4 thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar-event-dialog.properties | 6 thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar.dtd | 4 thunderbird-l10n/it/chrome/it/locale/it/lightning/lightning.properties | 10 thunderbird-l10n/it/chrome/it/locale/it/messenger/FilterEditor.dtd | 2 thunderbird-l10n/it/chrome/it/locale/it/messenger/filter.properties | 2 thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd | 4 thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.properties | 6 thunderbird-l10n/it/chrome/it/locale/it/messenger/messengercompose/composeMsgs.properties | 2 thunderbird-l10n/it/localization/it/messenger/accountcreation/accountSetup.ftl | 4 thunderbird-l10n/it/manifest.json | 4 thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/preferences.properties | 2 thunderbird-l10n/ja/localization/ja/messenger/calendarDialog.ftl | 2 thunderbird-l10n/ja/localization/ja/messenger/messengercompose/messengercompose.ftl | 6 thunderbird-l10n/ja/manifest.json | 4 thunderbird-l10n/ka/localization/ka/messenger/messenger.ftl | 2 thunderbird-l10n/ka/localization/ka/messenger/preferences/preferences.ftl | 2 thunderbird-l10n/ka/manifest.json | 4 thunderbird-l10n/kab/manifest.json | 4 thunderbird-l10n/kk/localization/kk/messenger/accountcreation/accountHub.ftl | 2 thunderbird-l10n/kk/manifest.json | 4 thunderbird-l10n/ko/manifest.json | 4 thunderbird-l10n/lt/manifest.json | 4 thunderbird-l10n/lv/manifest.json | 4 thunderbird-l10n/ms/manifest.json | 4 thunderbird-l10n/nb-NO/localization/nb-NO/messenger/policies/policies-descriptions.ftl | 2 thunderbird-l10n/nb-NO/localization/nb-NO/messenger/preferences/connection.ftl | 4 thunderbird-l10n/nb-NO/manifest.json | 4 thunderbird-l10n/nl/localization/nl/messenger/policies/policies-descriptions.ftl | 2 thunderbird-l10n/nl/localization/nl/messenger/preferences/preferences.ftl | 4 thunderbird-l10n/nl/manifest.json | 4 thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/imapMsgs.properties | 2 thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/EditorSpellCheck.dtd | 2 thunderbird-l10n/nn-NO/localization/nn-NO/messenger/accountcreation/accountSetup.ftl | 2 thunderbird-l10n/nn-NO/manifest.json | 4 thunderbird-l10n/pa-IN/localization/pa-IN/calendar/calendar-alarms.ftl | 25 thunderbird-l10n/pa-IN/manifest.json | 4 thunderbird-l10n/pl/manifest.json | 4 thunderbird-l10n/pt-BR/manifest.json | 4 thunderbird-l10n/pt-PT/localization/pt-PT/messenger/openpgp/openpgp.ftl | 11 thunderbird-l10n/pt-PT/localization/pt-PT/messenger/otr/am-im-otr.ftl | 1 thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/am-archiveoptions.ftl | 2 thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/notifications.ftl | 1 thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/preferences.ftl | 30 thunderbird-l10n/pt-PT/manifest.json | 4 thunderbird-l10n/rm/manifest.json | 4 thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/glodaFacetView.properties | 2 thunderbird-l10n/ro/manifest.json | 4 thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/chat.properties | 2 thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.properties | 4 thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/sanitize.dtd | 2 thunderbird-l10n/ru/chrome/ru/locale/ru/mozldap/ldap.properties | 2 thunderbird-l10n/ru/localization/ru/chat/irc.ftl | 2 thunderbird-l10n/ru/localization/ru/messenger/aboutImport.ftl | 2 thunderbird-l10n/ru/localization/ru/messenger/addonNotifications.ftl | 4 thunderbird-l10n/ru/localization/ru/messenger/messenger.ftl | 6 thunderbird-l10n/ru/manifest.json | 4 thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messengercompose/messengercompose.dtd | 4 thunderbird-l10n/sk/manifest.json | 4 thunderbird-l10n/sl/localization/sl/messenger/openpgp/keyWizard.ftl | 4 thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp-frontend.ftl | 2 thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp.ftl | 22 thunderbird-l10n/sl/manifest.json | 4 thunderbird-l10n/sq/localization/sq/messenger/messenger.ftl | 1 thunderbird-l10n/sq/manifest.json | 4 thunderbird-l10n/sr/chrome/sr/locale/sr/calendar/calendar-extract.properties | 46 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger-region/region.properties | 2 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/appstrings.properties | 76 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/imapMsgs.properties | 2 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.dtd | 4 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.properties | 14 thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messengercompose/composeMsgs.properties | 2 thunderbird-l10n/sr/localization/sr/calendar/calendar-event-listing.ftl | 6 thunderbird-l10n/sr/localization/sr/calendar/calendar-itip-identity-dialog.ftl | 2 thunderbird-l10n/sr/localization/sr/calendar/calendar-today-pane.ftl | 8 thunderbird-l10n/sr/localization/sr/calendar/calendar.ftl | 46 thunderbird-l10n/sr/localization/sr/chat/irc.ftl | 1 thunderbird-l10n/sr/localization/sr/chat/matrix-properties.ftl | 56 thunderbird-l10n/sr/localization/sr/messenger/about3Pane.ftl | 43 thunderbird-l10n/sr/localization/sr/messenger/aboutDialog.ftl | 6 thunderbird-l10n/sr/localization/sr/messenger/aboutImport.ftl | 30 thunderbird-l10n/sr/localization/sr/messenger/aboutRights.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/aboutSupportCalendar.ftl | 19 thunderbird-l10n/sr/localization/sr/messenger/aboutSupportMail.ftl | 2 thunderbird-l10n/sr/localization/sr/messenger/accountManager.ftl | 16 thunderbird-l10n/sr/localization/sr/messenger/accountSettings.ftl | 6 thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountHub.ftl | 91 thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountSetup.ftl | 97 thunderbird-l10n/sr/localization/sr/messenger/addressbook/aboutAddressBook.ftl | 135 thunderbird-l10n/sr/localization/sr/messenger/addressbook/vcard.ftl | 73 thunderbird-l10n/sr/localization/sr/messenger/appmenu.ftl | 29 thunderbird-l10n/sr/localization/sr/messenger/calendarDialog.ftl | 23 thunderbird-l10n/sr/localization/sr/messenger/certError.ftl | 4 thunderbird-l10n/sr/localization/sr/messenger/chat.ftl | 27 thunderbird-l10n/sr/localization/sr/messenger/customizableshortcuts/customizableShortcuts.ftl | 2 thunderbird-l10n/sr/localization/sr/messenger/extensionPermissions.ftl | 6 thunderbird-l10n/sr/localization/sr/messenger/flatpak.ftl | 3 thunderbird-l10n/sr/localization/sr/messenger/importDialog.ftl | 14 thunderbird-l10n/sr/localization/sr/messenger/inAppNotifications.ftl | 8 thunderbird-l10n/sr/localization/sr/messenger/menubar.ftl | 9 thunderbird-l10n/sr/localization/sr/messenger/messageheader/headerFields.ftl | 42 thunderbird-l10n/sr/localization/sr/messenger/messenger.ftl | 128 thunderbird-l10n/sr/localization/sr/messenger/messengercompose/messengercompose.ftl | 40 thunderbird-l10n/sr/localization/sr/messenger/msgAuthPrompt.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/news.ftl | 15 thunderbird-l10n/sr/localization/sr/messenger/openpgp/changeExpiryDlg.ftl | 17 thunderbird-l10n/sr/localization/sr/messenger/openpgp/composeKeyStatus.ftl | 7 thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyAssistant.ftl | 74 thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyWizard.ftl | 102 thunderbird-l10n/sr/localization/sr/messenger/openpgp/msgReadStatus.ftl | 3 thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp-frontend.ftl | 33 thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp.ftl | 511 thunderbird-l10n/sr/localization/sr/messenger/otr/auth.ftl | 3 thunderbird-l10n/sr/localization/sr/messenger/otr/otr.ftl | 24 thunderbird-l10n/sr/localization/sr/messenger/otr/otrUI.ftl | 22 thunderbird-l10n/sr/localization/sr/messenger/policies/policies-descriptions.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/preferences/am-archiveoptions.ftl | 7 thunderbird-l10n/sr/localization/sr/messenger/preferences/cookies.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/preferences/notifications.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/preferences/passwordManager.ftl | 5 thunderbird-l10n/sr/localization/sr/messenger/preferences/preferences.ftl | 211 thunderbird-l10n/sr/localization/sr/messenger/searchbar.ftl | 6 thunderbird-l10n/sr/localization/sr/messenger/syncAccounts.ftl | 1 thunderbird-l10n/sr/localization/sr/messenger/treeView.ftl | 38 thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbar.ftl | 5 thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbarItems.ftl | 18 thunderbird-l10n/sr/manifest.json | 4 thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar-invitations-dialog.dtd | 2 thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar.dtd | 4 thunderbird-l10n/sv-SE/localization/sv-SE/messenger/preferences/new-tag.ftl | 2 thunderbird-l10n/sv-SE/manifest.json | 4 thunderbird-l10n/th/manifest.json | 4 thunderbird-l10n/tr/localization/tr/messenger/openpgp/msgReadStatus.ftl | 1 thunderbird-l10n/tr/manifest.json | 4 thunderbird-l10n/uk/manifest.json | 4 thunderbird-l10n/uz/manifest.json | 4 thunderbird-l10n/vi/manifest.json | 4 thunderbird-l10n/zh-CN/manifest.json | 4 thunderbird-l10n/zh-TW/manifest.json | 4 toolkit/actors/FindBarParent.sys.mjs | 16 toolkit/actors/PictureInPictureChild.sys.mjs | 4 toolkit/components/antitracking/StorageAccessAPIHelper.cpp | 36 toolkit/components/downloads/DownloadPaths.sys.mjs | 9 toolkit/components/downloads/test/unit/test_DownloadPaths.js | 10 toolkit/components/extensions/MatchPattern.cpp | 2 toolkit/components/formautofill/FormAutofillParent.sys.mjs | 21 toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs | 6 toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json | 18 toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md | 6 toolkit/components/passwordmgr/LoginManagerParent.sys.mjs | 2 toolkit/components/reputationservice/ApplicationReputation.cpp | 4 toolkit/components/reputationservice/ApplicationReputation.h | 4 toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp | 2 toolkit/components/search/schema/search-config-v2-schema.json | 2 toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js | 26 toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js | 4 toolkit/components/url-classifier/LookupCache.cpp | 2 toolkit/components/utils/SimpleServices.sys.mjs | 4 toolkit/content/widgets/findbar.js | 8 toolkit/crashreporter/client/app/src/glean.rs | 75 toolkit/crashreporter/client/app/src/lang/langpack.rs | 17 toolkit/crashreporter/client/app/src/main.rs | 1 toolkit/crashreporter/client/app/src/prefs_parser.rs | 86 toolkit/crashreporter/client/app/src/std/fs.rs | 6 toolkit/crashreporter/client/app/src/test.rs | 97 toolkit/crashreporter/client/app/src/ui/gtk.rs | 62 toolkit/crashreporter/client/gtkbind/build.rs | 2 toolkit/library/rust/shared/Cargo.toml | 2 toolkit/mozapps/update/updater/updater.cpp | 51 widget/ClipboardWriteRequestParent.cpp | 6 widget/IMEData.h | 86 widget/PuppetWidget.cpp | 17 widget/SwipeTracker.cpp | 35 widget/SwipeTracker.h | 7 widget/TextEventDispatcher.cpp | 2 widget/TextEventDispatcherListener.h | 4 widget/android/GeckoEditableSupport.cpp | 2 widget/cocoa/TextInputHandler.mm | 2 widget/gtk/DMABufSurface.cpp | 32 widget/gtk/IMContextWrapper.cpp | 9 widget/gtk/nsFilePicker.cpp | 5 widget/gtk/nsPrintDialogGTK.cpp | 40 widget/nsBaseClipboard.cpp | 16 widget/nsBaseWidget.cpp | 4 widget/nsColorPickerProxy.cpp | 14 widget/nsGUIEventIPC.h | 121 widget/nsIWidget.h | 1 widget/nsTransferable.cpp | 1 widget/uikit/TextInputHandler.mm | 2 widget/windows/IMMHandler.cpp | 5 widget/windows/TSFEmptyTextStore.cpp | 2 widget/windows/TSFTextStore.cpp | 11 widget/windows/TSFUtils.cpp | 2 widget/windows/TSFUtils.h | 3 widget/windows/WinIMEHandler.cpp | 2 xpcom/base/CycleCollectedJSContext.cpp | 36 xpcom/base/CycleCollectedJSContext.h | 4 xpcom/base/CycleCollectedJSRuntime.cpp | 20 xpcom/base/CycleCollectedJSRuntime.h | 1 xpcom/base/nsISupportsImpl.h | 26 xpcom/ds/StaticAtoms.py | 1 xpcom/io/nsLocalFileCommon.cpp | 2 xpcom/io/nsLocalFileCommon.h | 4 xpcom/io/nsLocalFileUnix.cpp | 23 xpcom/tests/gtest/TestAutoRefCnt.cpp | 114 xpcom/threads/nsThreadPool.cpp | 4 1047 files changed, 27664 insertions(+), 17780 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpuywkhfe8/thunderbird_140.9.0esr-1~deb12u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpuywkhfe8/thunderbird_140.10.0esr-1~deb12u1.dsc: no acceptable signature found diff -Nru thunderbird-140.9.0esr/.cargo/config.toml.in thunderbird-140.10.0esr/.cargo/config.toml.in --- thunderbird-140.9.0esr/.cargo/config.toml.in 2026-03-20 19:18:29.000000000 +0000 +++ thunderbird-140.10.0esr/.cargo/config.toml.in 2026-04-21 14:52:50.000000000 +0000 @@ -85,9 +85,9 @@ rev = "e6f44a2bd1e57d11dfc737632a9e849077632330" replace-with = "vendored-sources" -[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd"] +[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840"] git = "https://github.com/mozilla/cubeb-coreaudio-rs" -rev = "579b75af21c040700eee6a1d8520e222699fe4cd" +rev = "bebaa23317332c95734df76e25193c24a83a6840" replace-with = "vendored-sources" [source."git+https://github.com/mozilla/cubeb-pulse-rs?rev=8678dcab1c287de79c4c184ccc2e065bc62b70e2"] diff -Nru thunderbird-140.9.0esr/.gitignore thunderbird-140.10.0esr/.gitignore --- thunderbird-140.9.0esr/.gitignore 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/.gitignore 2026-04-21 14:52:50.000000000 +0000 @@ -373,3 +373,6 @@ # Ignore mozperftest artifacts folder /artifacts/ + +# Ignore personal preferences files +CLAUDE.local.md diff -Nru thunderbird-140.9.0esr/CLOBBER thunderbird-140.10.0esr/CLOBBER --- thunderbird-140.9.0esr/CLOBBER 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/CLOBBER 2026-04-21 14:52:51.000000000 +0000 @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Merge day clobber 2026-02-23 \ No newline at end of file +Merge day clobber 2026-03-23 \ No newline at end of file diff -Nru thunderbird-140.9.0esr/Cargo.lock thunderbird-140.10.0esr/Cargo.lock --- thunderbird-140.9.0esr/Cargo.lock 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/Cargo.lock 2026-04-21 14:52:51.000000000 +0000 @@ -1086,7 +1086,7 @@ [[package]] name = "coreaudio-sys-utils" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "core-foundation-sys", "coreaudio-sys", @@ -1398,7 +1398,7 @@ [[package]] name = "cubeb-coreaudio" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "atomic", "audio-mixer", diff -Nru thunderbird-140.9.0esr/accessible/base/AccIterator.cpp thunderbird-140.10.0esr/accessible/base/AccIterator.cpp --- thunderbird-140.9.0esr/accessible/base/AccIterator.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/base/AccIterator.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -23,7 +23,7 @@ // AccIterator //////////////////////////////////////////////////////////////////////////////// -AccIterator::AccIterator(const LocalAccessible* aAccessible, +AccIterator::AccIterator(LocalAccessible* aAccessible, filters::FilterFuncPtr aFilterFunc) : mFilterFunc(aFilterFunc) { mState = new IteratorState(aAccessible); @@ -63,7 +63,7 @@ //////////////////////////////////////////////////////////////////////////////// // nsAccIterator::IteratorState -AccIterator::IteratorState::IteratorState(const LocalAccessible* aParent, +AccIterator::IteratorState::IteratorState(LocalAccessible* aParent, IteratorState* mParentState) : mParent(aParent), mIndex(0), mParentState(mParentState) {} diff -Nru thunderbird-140.9.0esr/accessible/base/AccIterator.h thunderbird-140.10.0esr/accessible/base/AccIterator.h --- thunderbird-140.9.0esr/accessible/base/AccIterator.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/base/AccIterator.h 2026-04-21 14:52:51.000000000 +0000 @@ -42,7 +42,7 @@ */ class AccIterator : public AccIterable { public: - AccIterator(const LocalAccessible* aRoot, filters::FilterFuncPtr aFilterFunc); + AccIterator(LocalAccessible* aRoot, filters::FilterFuncPtr aFilterFunc); virtual ~AccIterator(); /** @@ -57,10 +57,10 @@ AccIterator& operator=(const AccIterator&); struct IteratorState { - explicit IteratorState(const LocalAccessible* aParent, + explicit IteratorState(LocalAccessible* aParent, IteratorState* mParentState = nullptr); - const LocalAccessible* mParent; + RefPtr mParent; int32_t mIndex; IteratorState* mParentState; }; diff -Nru thunderbird-140.9.0esr/accessible/base/TextLeafRange.cpp thunderbird-140.10.0esr/accessible/base/TextLeafRange.cpp --- thunderbird-140.9.0esr/accessible/base/TextLeafRange.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/base/TextLeafRange.cpp 2026-04-21 14:52:50.000000000 +0000 @@ -536,7 +536,7 @@ return startFrameSel ? &startFrameSel->NormalSelection() : nullptr; } -std::pair TextLeafPoint::ToDOMPoint( +std::pair, uint32_t> TextLeafPoint::ToDOMPoint( bool aIncludeGenerated) const { if (!(*this) || !mAcc->IsLocal()) { MOZ_ASSERT_UNREACHABLE("Invalid point"); diff -Nru thunderbird-140.9.0esr/accessible/base/TextLeafRange.h thunderbird-140.10.0esr/accessible/base/TextLeafRange.h --- thunderbird-140.9.0esr/accessible/base/TextLeafRange.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/base/TextLeafRange.h 2026-04-21 14:52:51.000000000 +0000 @@ -188,7 +188,7 @@ /** * Translate given TextLeafPoint into a DOM point. */ - MOZ_CAN_RUN_SCRIPT std::pair ToDOMPoint( + MOZ_CAN_RUN_SCRIPT std::pair, uint32_t> ToDOMPoint( bool aIncludeGenerated = true) const; private: diff -Nru thunderbird-140.9.0esr/accessible/generic/HyperTextAccessible.cpp thunderbird-140.10.0esr/accessible/generic/HyperTextAccessible.cpp --- thunderbird-140.9.0esr/accessible/generic/HyperTextAccessible.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/generic/HyperTextAccessible.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -859,16 +859,15 @@ return; } + RefPtr editorBase = GetEditor(); + SetSelectionBoundsAt(TextLeafRange::kRemoveAllExistingSelectedRanges, 0, CharacterCount()); - RefPtr editorBase = GetEditor(); - if (!editorBase) { - return; + if (editorBase) { + DebugOnly rv = editorBase->InsertTextAsAction(aText); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text"); } - - DebugOnly rv = editorBase->InsertTextAsAction(aText); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to insert the new text"); } void HyperTextAccessible::InsertText(const nsAString& aText, diff -Nru thunderbird-140.9.0esr/accessible/ipc/DocAccessibleParent.cpp thunderbird-140.10.0esr/accessible/ipc/DocAccessibleParent.cpp --- thunderbird-140.9.0esr/accessible/ipc/DocAccessibleParent.cpp 2026-03-20 19:18:29.000000000 +0000 +++ thunderbird-140.10.0esr/accessible/ipc/DocAccessibleParent.cpp 2026-04-21 14:52:50.000000000 +0000 @@ -118,6 +118,11 @@ return IPC_OK(); #endif } + + if (parent->IsOuterDoc()) { + return IPC_FAIL(this, "Cannot attach non-doc to OuterDoc"); + } + lastParent = parent; lastParentID = accData.ParentID(); @@ -223,6 +228,11 @@ RemoteAccessible* DocAccessibleParent::CreateAcc( const AccessibleData& aAccData) { + if (aAccData.ID() == 0) { + MOZ_ASSERT_UNREACHABLE("An ID of 0 is reserved for the document itself"); + return nullptr; + } + RemoteAccessible* newProxy; if ((newProxy = GetAccessible(aAccData.ID()))) { // This is a move. Reuse the Accessible; don't destroy it. @@ -906,7 +916,10 @@ MOZ_ASSERT(CheckDocTree()); auto childDoc = static_cast(aChildDoc.get()); - childDoc->Unbind(); + if (childDoc->IsShutdown()) { + return IPC_FAIL(this, "Attempt to bind a shutdown child doc"); + } + ipc::IPCResult result = AddChildDoc(childDoc, aID, false); MOZ_ASSERT(result); MOZ_ASSERT(CheckDocTree()); @@ -929,6 +942,10 @@ "Attempt to add child doc which already has a parent"); } + if (aChildDoc->IsShutdown()) { + return IPC_FAIL(this, "Attempt to add a shutdown child doc"); + } + // We do not use GetAccessible here because we want to be sure to not get the // document it self. ProxyEntry* e = mAccessibles.GetEntry(aParentID); @@ -1031,6 +1048,9 @@ // If we are already shutdown that is because our containing tab parent is // shutting down in which case we don't need to do anything. if (mShutdown) { + // Just in case there is a cycle in the document heirarchy. + mParent = nullptr; + mIndexInParent = -1; return; } @@ -1113,6 +1133,9 @@ if (!mShutdown) { ACQUIRE_ANDROID_LOCK Destroy(); + } else if (RemoteParent()) { + ACQUIRE_ANDROID_LOCK + Unbind(); } } diff -Nru thunderbird-140.9.0esr/browser/actors/BlockedSiteChild.sys.mjs thunderbird-140.10.0esr/browser/actors/BlockedSiteChild.sys.mjs --- thunderbird-140.9.0esr/browser/actors/BlockedSiteChild.sys.mjs 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/actors/BlockedSiteChild.sys.mjs 2026-04-21 14:52:50.000000000 +0000 @@ -16,25 +16,9 @@ Ci.nsIClassifiedChannel ); if (classifiedChannel) { - let httpChannel = docShell.failedChannel.QueryInterface( - Ci.nsIHttpChannel - ); - - let reportUri = httpChannel.URI; - - // Remove the query to avoid leaking sensitive data - if (reportUri instanceof Ci.nsIURL) { - reportUri = reportUri.mutate().setQuery("").finalize(); - } - - let triggeringPrincipal = docShell.failedChannel.loadInfo - ? docShell.failedChannel.loadInfo.triggeringPrincipal - : null; blockedInfo = { list: classifiedChannel.matchedList, - triggeringPrincipal, provider: classifiedChannel.matchedProvider, - uri: reportUri.asciiSpec, }; } } diff -Nru thunderbird-140.9.0esr/browser/actors/BlockedSiteParent.sys.mjs thunderbird-140.10.0esr/browser/actors/BlockedSiteParent.sys.mjs --- thunderbird-140.9.0esr/browser/actors/BlockedSiteParent.sys.mjs 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/actors/BlockedSiteParent.sys.mjs 2026-04-21 14:52:50.000000000 +0000 @@ -177,8 +177,11 @@ // site, so that they don't lose track after, e.g., tab switching. // We can't use browser.contentPrincipal which is principal of about:blocked // Create one from uri with current principal origin attributes + + // Remove the query to avoid leaking sensitive data + let uri = browsingContext.currentURI.mutate().setQuery("").finalize(); let principal = Services.scriptSecurityManager.createContentPrincipal( - Services.io.newURI(blockedInfo.uri), + uri, browsingContext.currentWindowGlobal.documentPrincipal.originAttributes ); Services.perms.addFromPrincipal( @@ -206,10 +209,10 @@ let title; let chromeWin = browsingContext.topChromeWindow; if (reason === "malware") { - let reportUrl = lazy.SafeBrowsing.getReportURL( - "MalwareMistake", - blockedInfo - ); + let reportUrl = lazy.SafeBrowsing.getReportURL("MalwareMistake", { + ...blockedInfo, + uri: uri.asciiSpec, + }); title = lazy.browserBundle.GetStringFromName( "safebrowsing.reportedAttackSite" ); @@ -233,10 +236,10 @@ }; } } else if (reason === "phishing") { - let reportUrl = lazy.SafeBrowsing.getReportURL( - "PhishMistake", - blockedInfo - ); + let reportUrl = lazy.SafeBrowsing.getReportURL("PhishMistake", { + ...blockedInfo, + uri: uri.asciiSpec, + }); title = lazy.browserBundle.GetStringFromName( "safebrowsing.deceptiveSite" ); @@ -281,16 +284,15 @@ buttons ); - // Allow users to override and continue through to the site. - // Note that we have to use the passed URI info and can't just - // rely on the document URI, because the latter contains - // additional query parameters that should be stripped. - let triggeringPrincipal = - blockedInfo.triggeringPrincipal || - Services.scriptSecurityManager.createNullPrincipal({}); + let activeSHEntry = browsingContext.activeSessionHistoryEntry; + if (!activeSHEntry) { + console.error("No active session history entry found"); + return; + } - browsingContext.fixupAndLoadURIString(blockedInfo.uri, { - triggeringPrincipal, + // Allow users to override and continue through to the site. + browsingContext.loadURI(uri, { + triggeringPrincipal: activeSHEntry.triggeringPrincipal, loadFlags: Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CLASSIFIER, }); } diff -Nru thunderbird-140.9.0esr/browser/actors/DOMFullscreenParent.sys.mjs thunderbird-140.10.0esr/browser/actors/DOMFullscreenParent.sys.mjs --- thunderbird-140.9.0esr/browser/actors/DOMFullscreenParent.sys.mjs 2026-03-20 19:18:29.000000000 +0000 +++ thunderbird-140.10.0esr/browser/actors/DOMFullscreenParent.sys.mjs 2026-04-21 14:52:50.000000000 +0000 @@ -142,9 +142,7 @@ case "DOMFullscreen:NewOrigin": { // Don't show the warning if we've already exited fullscreen. if (window.document.fullscreen) { - window.PointerlockFsWarning.showFullScreen( - aMessage.data.originNoSuffix - ); + window.PointerlockFsWarning.showFullScreen(topBrowsingContext); } this.updateFullscreenWindowReference(window); break; @@ -222,7 +220,7 @@ if (!this.hasBeenDestroyed() && this.requestOrigin) { window.PointerlockFsWarning.showFullScreen( - this.requestOrigin.manager.documentPrincipal.originNoSuffix + this.requestOrigin.browsingContext ); } break; diff -Nru thunderbird-140.9.0esr/browser/base/content/browser-fullScreenAndPointerLock.js thunderbird-140.10.0esr/browser/base/content/browser-fullScreenAndPointerLock.js --- thunderbird-140.9.0esr/browser/base/content/browser-fullScreenAndPointerLock.js 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/base/content/browser-fullScreenAndPointerLock.js 2026-04-21 14:52:51.000000000 +0000 @@ -49,10 +49,16 @@ } }, - showFullScreen(aOrigin) { + // Show info that top level has entered fullscreen. Ultimately, it is always + // ancestors who are in control and can with various means make the user believe + // a site has entered fullscreen while displaying it's own content. + // We try to make it clear to the user that it's the top level that is actually in fullscreen + showFullScreen(browsingContext) { + const origin = + browsingContext.top.currentWindowGlobal.documentPrincipal.originNoSuffix; let timeout = Services.prefs.getIntPref("full-screen-api.warning.timeout"); let delay = Services.prefs.getIntPref("full-screen-api.warning.delay"); - this.show(aOrigin, "fullscreen-warning", timeout, delay); + this.show(origin, "fullscreen-warning", timeout, delay); }, // Shows a warning that the site has entered fullscreen or diff -Nru thunderbird-140.9.0esr/browser/base/content/test/fullscreen/browser.toml thunderbird-140.10.0esr/browser/base/content/test/fullscreen/browser.toml --- thunderbird-140.9.0esr/browser/base/content/test/fullscreen/browser.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/base/content/test/fullscreen/browser.toml 2026-04-21 14:52:51.000000000 +0000 @@ -60,6 +60,9 @@ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && swgl", # Bug 1949995 ] +["browser_fullscreen_toplevel_warning.js"] +support-files = ["fullscreen.html"] + ["browser_fullscreen_warning.js"] support-files = ["fullscreen.html"] skip-if = [ diff -Nru thunderbird-140.9.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js thunderbird-140.10.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js --- thunderbird-140.9.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/browser/base/content/test/fullscreen/browser_fullscreen_toplevel_warning.js 2026-04-21 14:52:51.000000000 +0000 @@ -0,0 +1,184 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const FULLSCREEN_PATH = + "/browser/browser/base/content/test/fullscreen/fullscreen.html"; + +function getWarningDomain(warning) { + let textElem = warning.querySelector(".pointerlockfswarning-domain-text"); + if (textElem.hidden) { + return null; + } + let args = textElem.getAttribute("data-l10n-args"); + return args ? JSON.parse(args).domain : null; +} + +async function waitForWarningState(aWarningElement, aExpectedState) { + await BrowserTestUtils.waitForAttribute(aExpectedState, aWarningElement, ""); +} + +add_setup(async function init() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["test.wait300msAfterTabSwitch", true], + ["full-screen-api.enabled", true], + ["full-screen-api.allow-trusted-requests-only", false], + ], + }); +}); + +// Bug 2021080 - Verify the fullscreen warning always displays the top-level domain, +// not the origin of the cross-origin frame that requested fullscreen. +add_task(async function test_fullscreen_warning_cross_origin_shows_toplevel() { + await BrowserTestUtils.withNewTab("https://example.com", async browser => { + let warning = document.getElementById("fullscreen-warning"); + + await SpecialPowers.spawn(browser, [FULLSCREEN_PATH], async path => { + let iframe = content.document.createElement("iframe"); + iframe.allow = "fullscreen"; + iframe.src = `https://example.org${path}`; + let loaded = new Promise(r => + iframe.addEventListener("load", r, { once: true }) + ); + content.document.body.appendChild(iframe); + await loaded; + }); + + let warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let frame = content.document.querySelector("iframe"); + frame.focus(); + await SpecialPowers.spawn(frame, [], () => { + content.document.getElementById("request").click(); + }); + }); + await warningShown; + + let activeOrigin = await SpecialPowers.spawn(browser, [], async () => { + let frame = content.document.querySelector("iframe"); + return SpecialPowers.spawn(frame, [], () => content.location.hostname); + }); + is( + activeOrigin, + "example.org", + "Cross-origin frame (example.org) is the active fullscreen document" + ); + is( + getWarningDomain(warning), + "example.com", + "Warning shows top-level domain, not the active fullscreen frame's domain" + ); + + let warningHidden = waitForWarningState(warning, "hidden"); + let exitPromise = BrowserTestUtils.waitForEvent( + document, + "fullscreenchange", + false, + () => !document.fullscreenElement + ); + document.getElementById("fullscreen-exit-button").click(); + await Promise.all([exitPromise, warningHidden]); + }); +}); + +// Bug 2021080 - Verify the fullscreen warning shows the top-level domain when each +// of three nested cross-origin frames (top, middle, inner) requests fullscreen. +add_task(async function test_fullscreen_warning_three_nested_origins() { + await BrowserTestUtils.withNewTab("https://example.com", async browser => { + let warning = document.getElementById("fullscreen-warning"); + + // Build a 3-level nested structure: + // example.com (div > iframe[example.org (div > iframe[example.net])]) + await SpecialPowers.spawn(browser, [FULLSCREEN_PATH], async path => { + let topDiv = content.document.createElement("div"); + content.document.body.appendChild(topDiv); + + let middleFrame = content.document.createElement("iframe"); + middleFrame.allow = "fullscreen"; + middleFrame.src = `https://example.org${path}`; + let loaded = new Promise(r => + middleFrame.addEventListener("load", r, { once: true }) + ); + topDiv.appendChild(middleFrame); + await loaded; + + await SpecialPowers.spawn(middleFrame, [path], async innerPath => { + let middleDiv = content.document.createElement("div"); + content.document.body.appendChild(middleDiv); + + let innerFrame = content.document.createElement("iframe"); + innerFrame.allow = "fullscreen"; + innerFrame.src = `https://example.net${innerPath}`; + let innerLoaded = new Promise(r => + innerFrame.addEventListener("load", r, { once: true }) + ); + middleDiv.appendChild(innerFrame); + await innerLoaded; + }); + }); + + async function exitFullscreen() { + let warningHidden = waitForWarningState(warning, "hidden"); + let exitPromise = BrowserTestUtils.waitForEvent( + document, + "fullscreenchange", + false, + () => !document.fullscreenElement + ); + document.getElementById("fullscreen-exit-button").click(); + await Promise.all([exitPromise, warningHidden]); + } + + // Step 1: Top-level (example.com) requests fullscreen on its div. + let warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], () => { + content.document.querySelector("div").requestFullscreen(); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Top-level fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + + // Step 2: Middle frame (example.org) requests fullscreen on its div. + warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let middleFrame = content.document.querySelector("iframe"); + middleFrame.focus(); + await SpecialPowers.spawn(middleFrame, [], () => { + content.document.querySelector("div").requestFullscreen(); + }); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Middle frame fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + + // Step 3: Inner frame (example.net) requests fullscreen on an element. + warningShown = waitForWarningState(warning, "onscreen"); + await SpecialPowers.spawn(browser, [], async () => { + let middleFrame = content.document.querySelector("iframe"); + await SpecialPowers.spawn(middleFrame, [], async () => { + let innerFrame = content.document.querySelector("iframe"); + innerFrame.focus(); + await SpecialPowers.spawn(innerFrame, [], () => { + content.document.getElementById("request").click(); + }); + }); + }); + await warningShown; + is( + getWarningDomain(warning), + "example.com", + "Inner frame fullscreen: warning shows top-level domain" + ); + await exitFullscreen(); + }); +}); diff -Nru thunderbird-140.9.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs thunderbird-140.10.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs --- thunderbird-140.9.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/components/asrouter/modules/ASRouterTargeting.sys.mjs 2026-04-21 14:52:50.000000000 +0000 @@ -551,11 +551,8 @@ // JSActors, but that would import a lot of code for a targeting attribute. return 0; } - let records = await actor?.receiveMessage({ - name: "FormAutofill:GetRecords", - data, - }); - return records?.records?.length ?? 0; + let records = await actor?.getRecords(data); + return records?.length ?? 0; } // Attribution data can be encoded multiple times so we need this function to diff -Nru thunderbird-140.9.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js thunderbird-140.10.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js --- thunderbird-140.9.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/components/asrouter/tests/browser/browser_asrouter_targeting.js 2026-04-21 14:52:51.000000000 +0000 @@ -1418,15 +1418,10 @@ gBrowser.selectedBrowser.browsingContext.currentWindowGlobal.getActor( "FormAutofill" ), - "receiveMessage" + "getRecords" ) - .withArgs( - sandbox.match({ - name: "FormAutofill:GetRecords", - data: { collectionName: "creditCards" }, - }) - ) - .resolves({ records: [creditcard] }) + .withArgs(sandbox.match({ collectionName: "creditCards" })) + .resolves([creditcard]) .callThrough(); is( @@ -1435,8 +1430,8 @@ "Should return 1 when 1 credit card is saved" ); ok( - stub.calledWithMatch({ name: "FormAutofill:GetRecords" }), - "Targeting called FormAutofill:GetRecords" + stub.calledWithMatch({ collectionName: "creditCards" }), + "Targeting called getRecords" ); sandbox.restore(); diff -Nru thunderbird-140.9.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json thunderbird-140.10.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json --- thunderbird-140.9.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/components/urlbar/schema/urlbar-persisted-search-terms-schema.json 2026-04-21 14:52:50.000000000 +0000 @@ -60,5 +60,5 @@ } } }, - "required": ["providerId", "searchPageRegexp", "includeParams"] + "required": ["providerId", "searchPageRegexp"] } diff -Nru thunderbird-140.9.0esr/browser/config/version.txt thunderbird-140.10.0esr/browser/config/version.txt --- thunderbird-140.9.0esr/browser/config/version.txt 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/browser/config/version.txt 2026-04-21 14:52:50.000000000 +0000 @@ -1 +1 @@ -140.9.0 +140.10.0 diff -Nru thunderbird-140.9.0esr/browser/config/version_display.txt thunderbird-140.10.0esr/browser/config/version_display.txt --- thunderbird-140.9.0esr/browser/config/version_display.txt 2026-03-20 19:18:29.000000000 +0000 +++ thunderbird-140.10.0esr/browser/config/version_display.txt 2026-04-21 14:52:50.000000000 +0000 @@ -1 +1 @@ -140.9.0esr +140.10.0esr diff -Nru thunderbird-140.9.0esr/comm/.gecko_rev.yml thunderbird-140.10.0esr/comm/.gecko_rev.yml --- thunderbird-140.9.0esr/comm/.gecko_rev.yml 2026-03-20 19:19:03.000000000 +0000 +++ thunderbird-140.10.0esr/comm/.gecko_rev.yml 2026-04-21 14:53:23.000000000 +0000 @@ -1,8 +1,8 @@ --- GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-esr140 -GECKO_HEAD_REF: FIREFOX_140_9_0esr_BUILD1 -GECKO_HEAD_REV: ad4a5ceb5516151b4014e2af6c1565c68ab330cc +GECKO_HEAD_REF: FIREFOX_140_10_0esr_BUILD1 +GECKO_HEAD_REV: a1c8c4081ea0e227dbde64c95ec6942fa71edb28 ###### ### For comm-central diff -Nru thunderbird-140.9.0esr/comm/mail/config/version.txt thunderbird-140.10.0esr/comm/mail/config/version.txt --- thunderbird-140.9.0esr/comm/mail/config/version.txt 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/mail/config/version.txt 2026-04-21 14:53:23.000000000 +0000 @@ -1 +1 @@ -140.9.0 +140.10.0 diff -Nru thunderbird-140.9.0esr/comm/mail/config/version_display.txt thunderbird-140.10.0esr/comm/mail/config/version_display.txt --- thunderbird-140.9.0esr/comm/mail/config/version_display.txt 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/mail/config/version_display.txt 2026-04-21 14:53:23.000000000 +0000 @@ -1 +1 @@ -140.9.0esr +140.10.0esr diff -Nru thunderbird-140.9.0esr/comm/mail/locales/l10n-changesets.json thunderbird-140.10.0esr/comm/mail/locales/l10n-changesets.json --- thunderbird-140.9.0esr/comm/mail/locales/l10n-changesets.json 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/mail/locales/l10n-changesets.json 2026-04-21 14:53:23.000000000 +0000 @@ -8,7 +8,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ar": { "pin": false, @@ -19,7 +19,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ast": { "pin": false, @@ -30,7 +30,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "be": { "pin": false, @@ -41,7 +41,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "bg": { "pin": false, @@ -52,7 +52,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "br": { "pin": false, @@ -63,7 +63,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ca": { "pin": false, @@ -74,7 +74,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "cak": { "pin": false, @@ -85,7 +85,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "cs": { "pin": false, @@ -96,7 +96,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "cy": { "pin": false, @@ -107,7 +107,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "da": { "pin": false, @@ -118,7 +118,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "de": { "pin": false, @@ -129,7 +129,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "dsb": { "pin": false, @@ -140,7 +140,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "el": { "pin": false, @@ -151,7 +151,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "en-CA": { "pin": false, @@ -162,7 +162,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "en-GB": { "pin": false, @@ -173,7 +173,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "es-AR": { "pin": false, @@ -184,7 +184,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "es-ES": { "pin": false, @@ -195,7 +195,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "es-MX": { "pin": false, @@ -206,7 +206,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "et": { "pin": false, @@ -217,7 +217,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "eu": { "pin": false, @@ -228,7 +228,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "fi": { "pin": false, @@ -239,7 +239,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "fr": { "pin": false, @@ -250,7 +250,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "fy-NL": { "pin": false, @@ -261,7 +261,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ga-IE": { "pin": false, @@ -272,7 +272,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "gd": { "pin": false, @@ -283,7 +283,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "gl": { "pin": false, @@ -294,7 +294,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "he": { "pin": false, @@ -305,7 +305,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "hr": { "pin": false, @@ -316,7 +316,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "hsb": { "pin": false, @@ -327,7 +327,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "hu": { "pin": false, @@ -338,7 +338,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "hy-AM": { "pin": false, @@ -349,7 +349,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "id": { "pin": false, @@ -360,7 +360,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "is": { "pin": false, @@ -371,7 +371,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "it": { "pin": false, @@ -382,7 +382,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ja": { "pin": false, @@ -392,14 +392,14 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ja-JP-mac": { "pin": false, "platforms": [ "macosx64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ka": { "pin": false, @@ -410,7 +410,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "kab": { "pin": false, @@ -421,7 +421,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "kk": { "pin": false, @@ -432,7 +432,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ko": { "pin": false, @@ -443,7 +443,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "lt": { "pin": false, @@ -454,7 +454,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "lv": { "pin": false, @@ -465,7 +465,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ms": { "pin": false, @@ -476,7 +476,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "nb-NO": { "pin": false, @@ -487,7 +487,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "nl": { "pin": false, @@ -498,7 +498,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "nn-NO": { "pin": false, @@ -509,7 +509,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "pa-IN": { "pin": false, @@ -520,7 +520,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "pl": { "pin": false, @@ -531,7 +531,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "pt-BR": { "pin": false, @@ -542,7 +542,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "pt-PT": { "pin": false, @@ -553,7 +553,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "rm": { "pin": false, @@ -564,7 +564,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ro": { "pin": false, @@ -575,7 +575,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "ru": { "pin": false, @@ -586,7 +586,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "sk": { "pin": false, @@ -597,7 +597,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "sl": { "pin": false, @@ -608,7 +608,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "sq": { "pin": false, @@ -619,7 +619,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "sr": { "pin": false, @@ -630,7 +630,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "sv-SE": { "pin": false, @@ -641,7 +641,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "th": { "pin": false, @@ -652,7 +652,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "tr": { "pin": false, @@ -663,7 +663,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "uk": { "pin": false, @@ -674,7 +674,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "uz": { "pin": false, @@ -685,7 +685,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "vi": { "pin": false, @@ -696,7 +696,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "zh-CN": { "pin": false, @@ -707,7 +707,7 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" }, "zh-TW": { "pin": false, @@ -718,6 +718,6 @@ "win32", "win64" ], - "revision": "7c86eab97e77f00ca7ed8f224d38338a3ed46693" + "revision": "938c3663efd9771a2bbdcc02d1236142424a50de" } } diff -Nru thunderbird-140.9.0esr/comm/rust/.cargo/config.toml.in thunderbird-140.10.0esr/comm/rust/.cargo/config.toml.in --- thunderbird-140.9.0esr/comm/rust/.cargo/config.toml.in 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/rust/.cargo/config.toml.in 2026-04-21 14:53:23.000000000 +0000 @@ -81,9 +81,9 @@ rev = "e6f44a2bd1e57d11dfc737632a9e849077632330" replace-with = "vendored-sources" -[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd"] +[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840"] git = "https://github.com/mozilla/cubeb-coreaudio-rs" -rev = "579b75af21c040700eee6a1d8520e222699fe4cd" +rev = "bebaa23317332c95734df76e25193c24a83a6840" replace-with = "vendored-sources" [source."git+https://github.com/mozilla/cubeb-pulse-rs?rev=8678dcab1c287de79c4c184ccc2e065bc62b70e2"] diff -Nru thunderbird-140.9.0esr/comm/rust/Cargo.lock thunderbird-140.10.0esr/comm/rust/Cargo.lock --- thunderbird-140.9.0esr/comm/rust/Cargo.lock 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/rust/Cargo.lock 2026-04-21 14:53:23.000000000 +0000 @@ -962,7 +962,7 @@ [[package]] name = "coreaudio-sys-utils" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "core-foundation-sys", "coreaudio-sys", @@ -1202,7 +1202,7 @@ [[package]] name = "cubeb-coreaudio" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=579b75af21c040700eee6a1d8520e222699fe4cd#579b75af21c040700eee6a1d8520e222699fe4cd" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=bebaa23317332c95734df76e25193c24a83a6840#bebaa23317332c95734df76e25193c24a83a6840" dependencies = [ "atomic", "audio-mixer", diff -Nru thunderbird-140.9.0esr/comm/rust/checksums.json thunderbird-140.10.0esr/comm/rust/checksums.json --- thunderbird-140.9.0esr/comm/rust/checksums.json 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/rust/checksums.json 2026-04-21 14:53:23.000000000 +0000 @@ -1 +1 @@ -{"mc_workspace_toml": "1ab51fc7f070006cb9101893a503908fcd1edfd93b81b367289fbc734e59ec022947d6a2f127592acc34e0626c89ff20217e81abe96abd9c44f5cc60aa8b4031", "mc_gkrust_toml": "d247dce96ce88c4fe9cff941825831539f27d062eb74fb167858fe21fe0b3d77fcc8bc5b1d154640fa63a259394fe13be44f03a345f3db6148d3340c121d0b65", "mc_hack_toml": "fba150c03e85bea54154a337babb30678c678f843452cfdec69bb00331b87cf003f1b93c33dfb1283b9cf4ff5e75ccd01379ff760b9adbf18832441238102305", "mc_cargo_lock": "a37a800b97f18501389d74453d8b754a1edf9c62613735a446dbc3314cc190e1506875aa28a4e21a35b7986862730157a686427498fab10ef75832577cef6700"} \ No newline at end of file +{"mc_workspace_toml": "1ab51fc7f070006cb9101893a503908fcd1edfd93b81b367289fbc734e59ec022947d6a2f127592acc34e0626c89ff20217e81abe96abd9c44f5cc60aa8b4031", "mc_gkrust_toml": "1e9e8f2699aea4b4c7b364787557029c615d407fee726e0b499ac5781d1b8ca62c968c49477de690cf9ac5182f62c4108f8ef6a8e98bc8d35962e56ca6963bbe", "mc_hack_toml": "fba150c03e85bea54154a337babb30678c678f843452cfdec69bb00331b87cf003f1b93c33dfb1283b9cf4ff5e75ccd01379ff760b9adbf18832441238102305", "mc_cargo_lock": "21f8d62abad7a6ba3100b6f6e5526fd09a95ce464716d68ac9f86dc970b714b2c41bf9829a0d823752029e3fc96557c2128b533c17075190cddf75c5d0f121f5"} \ No newline at end of file diff -Nru thunderbird-140.9.0esr/comm/rust/gkrust/Cargo.toml thunderbird-140.10.0esr/comm/rust/gkrust/Cargo.toml --- thunderbird-140.9.0esr/comm/rust/gkrust/Cargo.toml 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/rust/gkrust/Cargo.toml 2026-04-21 14:53:23.000000000 +0000 @@ -34,7 +34,7 @@ cose-c = { version = "0.1.5" } crash_helper_client = { path = "../../../toolkit/crashreporter/crash_helper_client", optional = true } crypto_hash = { path = "../../../security/manager/ssl/crypto_hash" } -cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "579b75af21c040700eee6a1d8520e222699fe4cd", optional = true } +cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "bebaa23317332c95734df76e25193c24a83a6840", optional = true } cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev = "8678dcab1c287de79c4c184ccc2e065bc62b70e2", optional = true, features = ['pulse-dlopen'] } cubeb-sys = { version = "0.13", optional = true, features = ['gecko-in-tree'] } dap_ffi = { path = "../../../toolkit/components/telemetry/dap/ffi" } diff -Nru thunderbird-140.9.0esr/comm/third_party/rust/cubeb-coreaudio/.cargo-checksum.json thunderbird-140.10.0esr/comm/third_party/rust/cubeb-coreaudio/.cargo-checksum.json --- thunderbird-140.9.0esr/comm/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-04-21 14:53:24.000000000 +0000 @@ -1 +1 @@ -{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"f408ea934a20f5a24372fdcaa3bbc113713239fdb32323de0fd6334034c25e46","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file +{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"3e2b5d1fa24130a9b14d6761b443fc7d1ed2f7884c545013ed2d048a1de2c3e6","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file diff -Nru thunderbird-140.9.0esr/comm/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs thunderbird-140.10.0esr/comm/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs --- thunderbird-140.9.0esr/comm/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-03-20 19:19:04.000000000 +0000 +++ thunderbird-140.10.0esr/comm/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-04-21 14:53:24.000000000 +0000 @@ -334,17 +334,19 @@ return Err(Error::from(status)); } - let cleanup = || { + let _teardown = finally(|| { let status = audio_object_remove_property_listener( device_id, &address, devices_changed_callback, data_ptr as *mut c_void, ); + // kAudioHardwareBadObjectError implies device_id is somehow dead, + // so its listener should receive nothing. + assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); sync_callback_registry_unregister(data_ptr as usize); unsafe { drop(Box::from_raw(data_ptr)) }; - status - }; + }); Self::set_sub_devices(device_id, input_id, output_id)?; @@ -362,10 +364,6 @@ ); } if *dev != device_id { - let status = cleanup(); - // If the error is kAudioHardwareBadObjectError, it implies `device_id` is somehow - // dead, so its listener should receive nothing. It's ok to leave here. - assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); return Err(Error::from(waiting_time)); } } @@ -386,8 +384,6 @@ NO_ERR } - let status = cleanup(); - assert_eq!(status, NO_ERR); Ok(()) } diff -Nru thunderbird-140.9.0esr/config/milestone.txt thunderbird-140.10.0esr/config/milestone.txt --- thunderbird-140.9.0esr/config/milestone.txt 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/config/milestone.txt 2026-04-21 14:52:51.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -140.9.0 +140.10.0 diff -Nru thunderbird-140.9.0esr/debian/changelog thunderbird-140.10.0esr/debian/changelog --- thunderbird-140.9.0esr/debian/changelog 2026-03-25 09:53:34.000000000 +0000 +++ thunderbird-140.10.0esr/debian/changelog 2026-04-23 10:22:35.000000000 +0000 @@ -1,3 +1,77 @@ +thunderbird (1:140.10.0esr-1~deb12u1) bookworm-security; urgency=medium + + * Rebuild for bookworm-security + + -- Christoph Goehre Thu, 23 Apr 2026 12:22:35 +0200 + +thunderbird (1:140.10.0esr-1) unstable; urgency=medium + + * [00598c1] rebuild patch queue from patch-queue branch + added patches: + fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch + fixes/Fix-sandbox-to-build-with-glibc-2.43.patch + (Closes: #1128876) + * [b212746] New upstream version 140.10.0esr + Fixed CVE issues in upstream version 140.10 (MFSA 2026-34): + CVE-2026-6746: Use-after-free in the DOM: Core & HTML component + CVE-2026-6747: Use-after-free in the WebRTC component + CVE-2026-6748: Uninitialized memory in the Audio/Video: Web Codecs + component + CVE-2026-6749: Information disclosure due to uninitialized memory in the + Graphics: Canvas2D component + CVE-2026-6750: Privilege escalation in the Graphics: WebRender component + CVE-2026-6751: Uninitialized memory in the Audio/Video: Web Codecs + component + CVE-2026-6752: Incorrect boundary conditions in the WebRTC component + CVE-2026-6753: Incorrect boundary conditions in the WebRTC component + CVE-2026-6754: Use-after-free in the JavaScript Engine component + CVE-2026-6757: Invalid pointer in the JavaScript: WebAssembly component + CVE-2026-6759: Use-after-free in the Widget: Cocoa component + CVE-2026-6761: Privilege escalation in the Networking component + CVE-2026-6762: Spoofing issue in the DOM: Core & HTML component + CVE-2026-6763: Mitigation bypass in the File Handling component + CVE-2026-6764: Incorrect boundary conditions in the DOM: Device Interfaces + component + CVE-2026-6765: Information disclosure in the Form Autofill component + CVE-2026-6766: Incorrect boundary conditions in the Libraries component in + NSS + CVE-2026-6767: Other issue in the Libraries component in NSS + CVE-2026-6769: Privilege escalation in the Debugger component + CVE-2026-6770: Other issue in the Storage: IndexedDB component + CVE-2026-6771: Mitigation bypass in the DOM: Security component + CVE-2026-6772: Incorrect boundary conditions in the Libraries component in + NSS + CVE-2026-6776: Incorrect boundary conditions in the WebRTC: Networking + component + CVE-2026-6785: Memory safety bugs fixed in Firefox ESR 115.35, Firefox ESR + 140.10, Thunderbird ESR 140.10, Firefox 150 and Thunderbird + 150 + CVE-2026-6786: Memory safety bugs fixed in Firefox ESR 140.10, Thunderbird + ESR 140.10, Firefox 150 and Thunderbird 150 + + -- Christoph Goehre Thu, 23 Apr 2026 08:12:14 +0200 + +thunderbird (1:140.9.1esr-1~deb12u1) bookworm-security; urgency=medium + + * Rebuild for bookworm-security + + -- Christoph Goehre Tue, 14 Apr 2026 08:59:49 +0200 + +thunderbird (1:140.9.1esr-1) unstable; urgency=medium + + * [49731f6] New upstream version 140.9.1esr + Fixed CVE issues in upstream version 140.9.1 (MFSA 2026-29): + CVE-2026-5732: Incorrect boundary conditions, integer overflow in the + Graphics: Text component + CVE-2026-5731: Memory safety bugs fixed in Firefox ESR 115.34.1, Firefox + ESR 140.9.1, Thunderbird ESR 140.9.1, Firefox 149.0.2 and + Thunderbird 149.0.2 + CVE-2026-5734: Memory safety bugs fixed in Firefox ESR 140.9.1, + Thunderbird ESR 140.9.1, Firefox 149.0.2 and Thunderbird + 149.0.2 + + -- Christoph Goehre Tue, 14 Apr 2026 07:06:54 +0200 + thunderbird (1:140.9.0esr-1~deb12u1) bookworm-security; urgency=medium * Rebuild for bookworm-security diff -Nru thunderbird-140.9.0esr/debian/patches/fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch thunderbird-140.10.0esr/debian/patches/fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch --- thunderbird-140.9.0esr/debian/patches/fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/debian/patches/fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch 2026-04-23 10:22:35.000000000 +0000 @@ -0,0 +1,118 @@ +From: Kingsley Yung +Date: Mon, 23 Feb 2026 19:29:39 +0800 +Subject: Fix conflicting types for `once_flag` and `call_once` with glibc + 2.43 + +Starting from glibc 2.43, `once_flag` and `call_once` are added to +`stdlib.h` for C23. (See commit a7ddbf4 of the glibc repository.) + +https://sourceware.org/cgit/glibc/commit/?id=a7ddbf456d97ac8d1aa7afd735e196a1488bd874 + +This conflicts with the definition of once_flag and call_once in +`include/c11/threads_posix.h`. + +Wrap the definition `once_flag` and `call_once` in +`include/c11/threads_posix.h` with the preprocessor flag +`__once_flag_defined` to avoid conflicting with the definition in +`stdlib.h`. + +Forwarded: needed +--- + comm/third_party/rust/glslopt/.cargo-checksum.json | 2 +- + .../rust/glslopt/glsl-optimizer/include/c11/threads_posix.h | 6 ++++++ + third_party/rust/glslopt/.cargo-checksum.json | 2 +- + third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h | 6 ++++++ + 4 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/comm/third_party/rust/glslopt/.cargo-checksum.json b/comm/third_party/rust/glslopt/.cargo-checksum.json +index 173f895..9a2bac5 100644 +--- a/comm/third_party/rust/glslopt/.cargo-checksum.json ++++ b/comm/third_party/rust/glslopt/.cargo-checksum.json +@@ -1 +1 @@ +-{"files":{".cargo_vcs_info.json":"4f4520f22bd23141975fa500dd331d507dabf8ab4276c98c44dbc2abef0b9399",".gitmodules":"ffc0cce90e856d4f4bdb3bd3c950c9e59501a45ebd5022b91cfe8c07c79ef1ac","Cargo.toml":"010bb96167ff152e0e5ac30f9905dc749a3f038199b70c541c5d8cb97a185ee3","Cargo.toml.orig":"ba32e100fba855432ed7d7e8b45d72ff912a2b560147fd5fc598bc931f10ad6b","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"6a64610018701781af182c418a4355c9ac5d99d000be9457f0e38a7dadf7542a","glsl-optimizer/.editorconfig":"dca7ff05a95f608849c4dc640af7f83a0f415618e327a2ecb6a0afa0d9d2bacb","glsl-optimizer/.gitignore":"8ba554a4ca510ea7d9684475aa043edbeba7d15a5c9c4a04d8b1379a04ec6270","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/.editorconfig":"f96a2354e5f2b90367d643e6d9e980ce76278d4d47afd8b2713b595753aa8b4b","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"f8ad2b69fa472e332b50572c1b2dcc1c8a0fa783a1199aad245398d3df421b4b","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"913662ae8335df058d56e00f11340b20fa82e03e0276587797ef325ab01e50d4"} +\ No newline at end of file ++{"files":{".cargo_vcs_info.json":"4f4520f22bd23141975fa500dd331d507dabf8ab4276c98c44dbc2abef0b9399",".gitmodules":"ffc0cce90e856d4f4bdb3bd3c950c9e59501a45ebd5022b91cfe8c07c79ef1ac","Cargo.toml":"010bb96167ff152e0e5ac30f9905dc749a3f038199b70c541c5d8cb97a185ee3","Cargo.toml.orig":"ba32e100fba855432ed7d7e8b45d72ff912a2b560147fd5fc598bc931f10ad6b","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"6a64610018701781af182c418a4355c9ac5d99d000be9457f0e38a7dadf7542a","glsl-optimizer/.editorconfig":"dca7ff05a95f608849c4dc640af7f83a0f415618e327a2ecb6a0afa0d9d2bacb","glsl-optimizer/.gitignore":"8ba554a4ca510ea7d9684475aa043edbeba7d15a5c9c4a04d8b1379a04ec6270","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/.editorconfig":"f96a2354e5f2b90367d643e6d9e980ce76278d4d47afd8b2713b595753aa8b4b","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"5fa592653213459e2cce70b430715246d53fd1a10c1866acf427874530a69f92","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"913662ae8335df058d56e00f11340b20fa82e03e0276587797ef325ab01e50d4"} +diff --git a/comm/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h b/comm/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h +index 45cb607..5f22aca 100644 +--- a/comm/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h ++++ b/comm/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h +@@ -51,7 +51,9 @@ Configuration macro: + #include + + /*---------------------------- macros ----------------------------*/ ++#ifndef __once_flag_defined + #define ONCE_FLAG_INIT PTHREAD_ONCE_INIT ++#endif + #ifdef INIT_ONCE_STATIC_INIT + #define TSS_DTOR_ITERATIONS PTHREAD_DESTRUCTOR_ITERATIONS + #else +@@ -66,7 +68,9 @@ typedef pthread_cond_t cnd_t; + typedef pthread_t thrd_t; + typedef pthread_key_t tss_t; + typedef pthread_mutex_t mtx_t; ++#ifndef __once_flag_defined + typedef pthread_once_t once_flag; ++#endif + + + /* +@@ -90,11 +94,13 @@ impl_thrd_routine(void *p) + + /*--------------- 7.25.2 Initialization functions ---------------*/ + // 7.25.2.1 ++#ifndef __once_flag_defined + static inline void + call_once(once_flag *flag, void (*func)(void)) + { + pthread_once(flag, func); + } ++#endif + + + /*------------- 7.25.3 Condition variable functions -------------*/ +diff --git a/third_party/rust/glslopt/.cargo-checksum.json b/third_party/rust/glslopt/.cargo-checksum.json +index ddd05da..352aac8 100644 +--- a/third_party/rust/glslopt/.cargo-checksum.json ++++ b/third_party/rust/glslopt/.cargo-checksum.json +@@ -1 +1 @@ +-{"files":{"Cargo.toml":"010bb96167ff152e0e5ac30f9905dc749a3f038199b70c541c5d8cb97a185ee3","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"6a64610018701781af182c418a4355c9ac5d99d000be9457f0e38a7dadf7542a","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"f8ad2b69fa472e332b50572c1b2dcc1c8a0fa783a1199aad245398d3df421b4b","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"913662ae8335df058d56e00f11340b20fa82e03e0276587797ef325ab01e50d4"} +\ No newline at end of file ++{"files":{"Cargo.toml":"010bb96167ff152e0e5ac30f9905dc749a3f038199b70c541c5d8cb97a185ee3","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"6a64610018701781af182c418a4355c9ac5d99d000be9457f0e38a7dadf7542a","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"5fa592653213459e2cce70b430715246d53fd1a10c1866acf427874530a69f92","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"913662ae8335df058d56e00f11340b20fa82e03e0276587797ef325ab01e50d4"} +diff --git a/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h b/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h +index 45cb607..5f22aca 100644 +--- a/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h ++++ b/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h +@@ -51,7 +51,9 @@ Configuration macro: + #include + + /*---------------------------- macros ----------------------------*/ ++#ifndef __once_flag_defined + #define ONCE_FLAG_INIT PTHREAD_ONCE_INIT ++#endif + #ifdef INIT_ONCE_STATIC_INIT + #define TSS_DTOR_ITERATIONS PTHREAD_DESTRUCTOR_ITERATIONS + #else +@@ -66,7 +68,9 @@ typedef pthread_cond_t cnd_t; + typedef pthread_t thrd_t; + typedef pthread_key_t tss_t; + typedef pthread_mutex_t mtx_t; ++#ifndef __once_flag_defined + typedef pthread_once_t once_flag; ++#endif + + + /* +@@ -90,11 +94,13 @@ impl_thrd_routine(void *p) + + /*--------------- 7.25.2 Initialization functions ---------------*/ + // 7.25.2.1 ++#ifndef __once_flag_defined + static inline void + call_once(once_flag *flag, void (*func)(void)) + { + pthread_once(flag, func); + } ++#endif + + + /*------------- 7.25.3 Condition variable functions -------------*/ diff -Nru thunderbird-140.9.0esr/debian/patches/fixes/Fix-sandbox-to-build-with-glibc-2.43.patch thunderbird-140.10.0esr/debian/patches/fixes/Fix-sandbox-to-build-with-glibc-2.43.patch --- thunderbird-140.9.0esr/debian/patches/fixes/Fix-sandbox-to-build-with-glibc-2.43.patch 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/debian/patches/fixes/Fix-sandbox-to-build-with-glibc-2.43.patch 2026-04-23 10:22:35.000000000 +0000 @@ -0,0 +1,22 @@ +From: "Jan Alexander Steffens (heftig)" +Date: Tue, 17 Feb 2026 18:35:42 -0600 +Subject: Fix sandbox to build with glibc 2.43 + +Forwarded: needed +--- + security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h b/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h +index a60fe2a..27f2cc7 100644 +--- a/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h ++++ b/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h +@@ -5,6 +5,8 @@ + #ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SECCOMP_H_ + #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SECCOMP_H_ + ++#include ++ + // The Seccomp2 kernel ABI is not part of older versions of glibc. + // As we can't break compilation with these versions of the library, + // we explicitly define all missing symbols. diff -Nru thunderbird-140.9.0esr/debian/patches/series thunderbird-140.10.0esr/debian/patches/series --- thunderbird-140.9.0esr/debian/patches/series 2026-03-25 09:53:34.000000000 +0000 +++ thunderbird-140.10.0esr/debian/patches/series 2026-04-23 10:22:35.000000000 +0000 @@ -22,3 +22,5 @@ porting-loong64/loong64-Add-loongarch64-detection-to-third_party-botan.patch debian-hacks/all-thunderbird.js-Append-esr-to-VERSION-variable.patch fixes/Add-missing-.gitmodules-files-which-are-needed-to-build-t.patch +fixes/Fix-conflicting-types-for-once_flag-and-call_once-with-gl.patch +fixes/Fix-sandbox-to-build-with-glibc-2.43.patch diff -Nru thunderbird-140.9.0esr/devtools/client/aboutdebugging/test/browser/browser.toml thunderbird-140.10.0esr/devtools/client/aboutdebugging/test/browser/browser.toml --- thunderbird-140.9.0esr/devtools/client/aboutdebugging/test/browser/browser.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/aboutdebugging/test/browser/browser.toml 2026-04-21 14:52:51.000000000 +0000 @@ -190,6 +190,7 @@ ["browser_aboutdebugging_serviceworker_start.js"] skip-if = [ + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1947358, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && tsan", # Bug 1947358 ] diff -Nru thunderbird-140.9.0esr/devtools/client/application/test/browser/browser.toml thunderbird-140.10.0esr/devtools/client/application/test/browser/browser.toml --- thunderbird-140.9.0esr/devtools/client/application/test/browser/browser.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/application/test/browser/browser.toml 2026-04-21 14:52:51.000000000 +0000 @@ -96,8 +96,11 @@ ["browser_application_panel_start-service-worker.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled skip-if = [ - "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1608640 - "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && tsan", # Bug 1608640 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1608640, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 + "os == 'mac' && os_version == '14.70' && processor == 'x86_64'", # Bug 1980084, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && asan", # Bug 1781479, Bug 2030884 ] ["browser_application_panel_target-switching.js"] diff -Nru thunderbird-140.9.0esr/devtools/client/debugger/src/.eslintrc.mjs thunderbird-140.10.0esr/devtools/client/debugger/src/.eslintrc.mjs --- thunderbird-140.9.0esr/devtools/client/debugger/src/.eslintrc.mjs 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/debugger/src/.eslintrc.mjs 2026-04-21 14:52:51.000000000 +0000 @@ -47,6 +47,8 @@ process: true, global: true, L10N: true, + // TODO: Add this to the main ESlint globals Bug 2025542 + Sanitizer: true, }, }, rules: { diff -Nru thunderbird-140.9.0esr/devtools/client/debugger/src/components/QuickOpenModal.js thunderbird-140.10.0esr/devtools/client/debugger/src/components/QuickOpenModal.js --- thunderbird-140.9.0esr/devtools/client/debugger/src/components/QuickOpenModal.js 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/debugger/src/components/QuickOpenModal.js 2026-04-21 14:52:51.000000000 +0000 @@ -2,11 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ -import React, { Component } from "devtools/client/shared/vendor/react"; -import { div } from "devtools/client/shared/vendor/react-dom-factories"; +import React, { + Component, + createRef, +} from "devtools/client/shared/vendor/react"; import PropTypes from "devtools/client/shared/vendor/react-prop-types"; import { connect } from "devtools/client/shared/vendor/react-redux"; -import { basename } from "../utils/path"; import { createLocation } from "../utils/location"; const fuzzyAldrin = require("resource://devtools/client/shared/vendor/fuzzaldrin-plus.js"); @@ -59,6 +60,7 @@ constructor(props) { super(props); this.state = { results: null, selectedIndex: 0 }; + this.resultListRef = createRef(); } static get propTypes() { @@ -223,20 +225,14 @@ if (query == "" && !this.isShortcutQuery()) { this.showTopSources(); - return; - } - - if (this.isSymbolSearch()) { + } else if (this.isSymbolSearch()) { await this.searchSymbols(query); - return; - } - - if (this.isShortcutQuery()) { + } else if (this.isShortcutQuery()) { this.searchShortcuts(query); - return; + } else { + this.searchSources(query); } - - this.searchSources(query); + this.highlightQueryMatches(this.props.query); } catch (e) { // Due to throttling this might get scheduled after the component and the // toolbox are destroyed. @@ -394,23 +390,35 @@ isSourcesQuery = () => this.props.searchType === "sources"; isSourceSearch = () => this.isSourcesQuery() || this.isGotoSourceQuery(); - /* eslint-disable react/no-danger */ - renderHighlight(candidateString, query) { + highlightQueryMatches(query) { const options = { wrap: { tagOpen: '', tagClose: "", }, }; - const html = fuzzyAldrin.wrap(candidateString, query, options); - return div({ - dangerouslySetInnerHTML: { - __html: html, - }, - }); + if (this.resultListRef.current) { + const domEl = this.resultListRef.current.ref.current; + for (const titleNode of domEl.querySelectorAll(".title")) { + const htmlString = fuzzyAldrin.wrap( + titleNode.innerText, + query, + options + ); + // Sanitizer API not supported in ESR 140 + // Should remove at ESR 153 + if ("Sanitizer" in window) { + const sanitizer = new Sanitizer({ + elements: ["mark"], + attributes: ["class"], + }); + titleNode.setHTML(htmlString, { sanitizer }); + } + } + } } - highlightMatching = (query, results) => { + renderResults = (query, results) => { let newQuery = query; if (newQuery === "") { return results; @@ -421,11 +429,7 @@ if (typeof result.title == "string") { return { ...result, - title: this.renderHighlight( - result.title, - basename(newQuery), - "title" - ), + title: result.title, }; } return result; @@ -454,7 +458,7 @@ const { query } = this.props; const { selectedIndex, results } = this.state; - const items = this.highlightMatching(query, results || []); + const items = this.renderResults(query, results || []); const expanded = !!items && !!items.length; return React.createElement( Modal, @@ -487,7 +491,7 @@ items, selected: selectedIndex, selectItem: this.selectResultItem, - ref: "resultList", + ref: this.resultListRef, expanded, ...(this.isSourceSearch() ? SIZE_BIG : SIZE_DEFAULT), }) diff -Nru thunderbird-140.9.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml thunderbird-140.10.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml --- thunderbird-140.9.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/debugger/test/mochitest/browser_aj.toml 2026-04-21 14:52:51.000000000 +0000 @@ -115,6 +115,9 @@ ["browser_dbg-call-stack.js"] ["browser_dbg-chrome-create.js"] +skip-if = [ + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && asan", # Bug 2030884 +] ["browser_dbg-console-async.js"] @@ -286,6 +289,7 @@ ["browser_dbg-javascript-tracer-values-preview.js"] skip-if = [ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt && a11y_checks", # Bug The tracer tree isn't yet accessible + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && tsan", # Bug 1959018, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && opt && a11y_checks", # Bug The tracer tree isn't yet accessible ] diff -Nru thunderbird-140.9.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js thunderbird-140.10.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js --- thunderbird-140.9.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js 2026-04-21 14:52:51.000000000 +0000 @@ -94,6 +94,18 @@ pressKey(dbg, "Escape"); assertQuickOpenDisabled(dbg); + info("Test that the highlighted result matches match the query"); + await quickOpen(dbg, "sw"); + await waitForResults(dbg, [ + "script-switching-01.js", + "script-switching-02.js", + ]); + await assertHighlightMatches(dbg, 1, "sw"); + await assertHighlightMatches(dbg, 2, "sw"); + EventUtils.sendString("i"); + await assertHighlightMatches(dbg, 1, "swi"); + pressKey(dbg, "Escape"); + info("Testing goto line:column"); assertLine(dbg, 0); assertColumn(dbg, 1); @@ -170,3 +182,19 @@ "Result should be a tab" ); } + +async function assertHighlightMatches(dbg, resultIndex, expectedMatchText) { + // Sanitizer API not supported in ESR 140 + // Should remove at ESR 153 + if ("Sanitizer" in dbg.win) { + const el = await findResultEl(dbg, resultIndex); + const highlight = await waitForElementWithSelector(dbg, "mark.highlight"); + ok(el && !!highlight, "The query match is highlighted"); + await waitUntil( + () => el.querySelector("mark.highlight").innerText == expectedMatchText + ); + ok(true, "The highlighted text matches the query text"); + } else { + ok(true, "The text is not highlighted"); + } +} diff -Nru thunderbird-140.9.0esr/devtools/client/framework/test/browser.toml thunderbird-140.10.0esr/devtools/client/framework/test/browser.toml --- thunderbird-140.9.0esr/devtools/client/framework/test/browser.toml 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/framework/test/browser.toml 2026-04-21 14:52:50.000000000 +0000 @@ -112,6 +112,12 @@ ["browser_tab_commands_factory.js"] ["browser_tab_descriptor_fission.js"] +skip-if = [ + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1966872, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && asan", # Bug 1966872, Bug 2030884 +] ["browser_target_cached-front.js"] @@ -291,6 +297,9 @@ ["browser_toolbox_watchedByDevTools.js"] ["browser_toolbox_window_global_debugging.js"] +skip-if = [ + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1950845, Bug 2030884 +] ["browser_toolbox_window_reload_target.js"] diff -Nru thunderbird-140.9.0esr/devtools/client/inspector/animation/test/browser.toml thunderbird-140.10.0esr/devtools/client/inspector/animation/test/browser.toml --- thunderbird-140.9.0esr/devtools/client/inspector/animation/test/browser.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/inspector/animation/test/browser.toml 2026-04-21 14:52:51.000000000 +0000 @@ -150,8 +150,11 @@ ["browser_animation_logic_mutations_fast.js"] skip-if = [ - "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && debug", # Bug 1567800 - "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && debug", # Bug 1567800 + "os == 'linux' && processor == 'x86_64' && asan", # Bug 1980142, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && debug", # Bug 1567800, Bug 2030884 + "os == 'linux' && processor == 'x86_64' && tsan", # Bug 1980142, Bug 2030884 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && debug", # Bug 1980142, Bug 2030884 + "os == 'win' && os_version == '11.26200' && processor == 'x86_64' && debug", # Bug 1980142, Bug 2030884 ] ["browser_animation_logic_mutations_properties.js"] diff -Nru thunderbird-140.9.0esr/devtools/client/webconsole/test/browser/_webconsole.toml thunderbird-140.10.0esr/devtools/client/webconsole/test/browser/_webconsole.toml --- thunderbird-140.9.0esr/devtools/client/webconsole/test/browser/_webconsole.toml 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/webconsole/test/browser/_webconsole.toml 2026-04-21 14:52:51.000000000 +0000 @@ -587,7 +587,9 @@ https_first_disabled = true # JS HttpServer doesn't support https skip-if = [ "http3", # JS HttpServer doesn't support http3 + "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt", # Bug 1965340, Bug 2030884 "os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && opt", # Bug 1965340 + "os == 'mac' && os_version == '14.70' && processor == 'x86_64'", # Bug 1965340, Bug 2030884 ] ["browser_webconsole_object_inspector_getters.js"] diff -Nru thunderbird-140.9.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js thunderbird-140.10.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js --- thunderbird-140.9.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/devtools/client/webconsole/test/browser/stub-generator-helpers.js 2026-04-21 14:52:51.000000000 +0000 @@ -179,17 +179,17 @@ res.startedDateTime = existingPacket.startedDateTime; } - if (res.totalTime && existingPacket.totalTime) { - res.totalTime = existingPacket.totalTime; - } - if (res.securityState && existingPacket.securityState) { res.securityState = existingPacket.securityState; } - // waitingTime can be very small and rounded to 0. However this is still a - // valid waiting time, so check isNaN instead of a simple truthy check. - if (!isNaN(res.waitingTime) && existingPacket.waitingTime) { + // totalTime and waitingTime can be very small and rounded to 0. However this + // is still a valid time value, so check isNaN instead of a simple truthy check. + if (!isNaN(res.totalTime) && !isNaN(existingPacket.totalTime)) { + res.totalTime = existingPacket.totalTime; + } + + if (!isNaN(res.waitingTime) && !isNaN(existingPacket.waitingTime)) { res.waitingTime = existingPacket.waitingTime; } diff -Nru thunderbird-140.9.0esr/docshell/base/BrowsingContext.cpp thunderbird-140.10.0esr/docshell/base/BrowsingContext.cpp --- thunderbird-140.9.0esr/docshell/base/BrowsingContext.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/docshell/base/BrowsingContext.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -1937,6 +1937,19 @@ return IsCertainlyAliveForCC(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END +/* static */ +void BrowsingContext::SweepWindowProxies(JSTracer* aTrc) { + if (!sBrowsingContexts) { + return; + } + + for (BrowsingContext* bc : sBrowsingContexts->Values()) { + if (bc->mWindowProxy) { + JS_UpdateWeakPointerAfterGC(aTrc, &bc->mWindowProxy); + } + } +} + class RemoteLocationProxy : public RemoteObjectProxy { diff -Nru thunderbird-140.9.0esr/docshell/base/BrowsingContext.h thunderbird-140.10.0esr/docshell/base/BrowsingContext.h --- thunderbird-140.9.0esr/docshell/base/BrowsingContext.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/docshell/base/BrowsingContext.h 2026-04-21 14:52:52.000000000 +0000 @@ -734,6 +734,9 @@ mWindowProxy = aWindowProxy; } + // Since mWindowProxy is a weak pointer it has to be updated during sweeping. + static void SweepWindowProxies(JSTracer* aTrc); + Nullable GetWindow(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS @@ -1378,10 +1381,8 @@ RefPtr mGeolocationServiceOverride; - // This is not a strong reference, but using a JS::Heap for that should be - // fine. The JSObject stored in here should be a proxy with a - // nsOuterWindowProxy handler, which will update the pointer from its - // objectMoved hook and clear it from its finalize hook. + // This is a weak reference. It will be updated automatically during sweeping + // by SweepWindowProxies. JS::Heap mWindowProxy; LocationProxy mLocation; diff -Nru thunderbird-140.9.0esr/dom/abort/AbortSignal.cpp thunderbird-140.10.0esr/dom/abort/AbortSignal.cpp --- thunderbird-140.9.0esr/dom/abort/AbortSignal.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/abort/AbortSignal.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -38,6 +38,11 @@ } MaybeAssignAbortError(aCx); aReason.set(mReason); + if (NS_WARN_IF(!JS_WrapValue(aCx, aReason))) { + aReason.setUndefined(); + // TODO(Bug 2026137) - AbortSignalImpl::GetReason should be made fallible + JS_ClearPendingException(aCx); + } } JS::Value AbortSignalImpl::RawReason() const { return mReason.get(); } @@ -75,7 +80,7 @@ // https://dom.spec.whatwg.org/#abortsignal-remove could be invoked in an // earlier algorithm to remove a later algorithm, so |mFollowers| must be a // |nsTObserverArray| to defend against mutation. - for (RefPtr& follower : mFollowers.ForwardRange()) { + for (RefPtr follower : mFollowers.ForwardRange()) { MOZ_ASSERT(follower->mFollowingSignal == this); follower->RunAbortAlgorithm(); } diff -Nru thunderbird-140.9.0esr/dom/animation/Animation.cpp thunderbird-140.10.0esr/dom/animation/Animation.cpp --- thunderbird-140.9.0esr/dom/animation/Animation.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/animation/Animation.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -386,11 +386,9 @@ } CancelPendingTasks(); - if (mReady) { - // We may have already resolved mReady, but in that case calling - // MaybeResolve is a no-op, so that's okay. - mReady->MaybeResolve(this); - } + // We may have already resolved mReady, but in that case calling + // MaybeResolve is a no-op, so that's okay. + MaybeResolvePromiseWithThis(mReady); UpdateTiming(SeekFlag::DidSeek, SyncNotifyFlag::Async); if (IsRelevant()) { @@ -449,9 +447,7 @@ ApplyPendingPlaybackRate(); mStartTime.SetNull(); - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); CancelPendingTasks(); } @@ -608,11 +604,25 @@ return nullptr; } if (!Pending()) { - mReady->MaybeResolve(this); + MaybeResolvePromiseWithThis(mReady); } return mReady; } +void Animation::MaybeResolvePromiseWithThis(Promise* aPromise) { + if (!aPromise) { + return; + } + if (!nsContentUtils::IsSafeToRunScript()) { + nsContentUtils::AddScriptRunner(NewRunnableMethod>( + "MaybeResolvePromiseWithThis", this, + &Animation::MaybeResolvePromiseWithThis, aPromise)); + return; + } + RefPtr promise = aPromise; + promise->MaybeResolve(this); +} + Promise* Animation::GetFinished(ErrorResult& aRv) { nsCOMPtr global = GetOwnerGlobal(); if (!mFinished && global) { @@ -714,9 +724,7 @@ } CancelPendingTasks(); didChange = true; - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } UpdateTiming(SeekFlag::DidSeek, SyncNotifyFlag::Sync); if (didChange && IsRelevant()) { @@ -1607,9 +1615,7 @@ MutationObservers::NotifyAnimationChanged(this); } - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } void Animation::PauseAt(const TimeDuration& aReadyTime) { @@ -1626,9 +1632,7 @@ UpdateTiming(SeekFlag::NoSeek, SyncNotifyFlag::Async); - if (mReady) { - mReady->MaybeResolve(this); - } + MaybeResolvePromiseWithThis(mReady); } void Animation::UpdateTiming(SeekFlag aSeekFlag, @@ -1877,10 +1881,8 @@ } void Animation::MaybeResolveFinishedPromise() { - if (mFinished) { - mFinished->MaybeResolve(this); - } mFinishedIsResolved = true; + MaybeResolvePromiseWithThis(mFinished); } void Animation::DoFinishNotificationImmediately(MicroTaskRunnable* aAsync) { diff -Nru thunderbird-140.9.0esr/dom/animation/Animation.h thunderbird-140.10.0esr/dom/animation/Animation.h --- thunderbird-140.9.0esr/dom/animation/Animation.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/animation/Animation.h 2026-04-21 14:52:51.000000000 +0000 @@ -466,6 +466,7 @@ friend class AsyncFinishNotification; void DoFinishNotificationImmediately(MicroTaskRunnable* aAsync = nullptr); void QueuePlaybackEvent(nsAtom* aOnEvent, TimeStamp&& aScheduledEventTime); + void MaybeResolvePromiseWithThis(Promise*); /** * Remove this animation from the pending animation tracker and reset diff -Nru thunderbird-140.9.0esr/dom/base/Document.cpp thunderbird-140.10.0esr/dom/base/Document.cpp --- thunderbird-140.9.0esr/dom/base/Document.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/Document.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -10664,23 +10664,25 @@ mozilla::DebugOnly rv = element->UnsetAttr(attr->NodeInfo()->NamespaceID(), - attr->NodeInfo()->NameAtom(), false); + attr->NodeInfo()->NameAtom(), true); // XXX Should we abort here? NS_ASSERTION(NS_SUCCEEDED(rv), "Uh-oh, UnsetAttr shouldn't fail!"); } } - if (mozilla::dom::ShadowRoot* shadow = element->GetShadowRoot()) { + // Hold the strong reference to be sure, since we may notify + if (RefPtr shadow = element->GetShadowRoot()) { BlastSubtreeToPieces(shadow); element->UnattachShadow(); } } while (aNode->HasChildren()) { - nsIContent* node = aNode->GetFirstChild(); + // Hold the strong reference to be sure, since we are notifying. + nsCOMPtr node = aNode->GetFirstChild(); BlastSubtreeToPieces(node); - aNode->RemoveChildNode(node, false); + aNode->RemoveChildNode(node, true); } } @@ -16275,11 +16277,16 @@ /* static */ bool Document::HandlePendingFullscreenRequests(Document* aDoc) { + AutoTArray, 1> requests; + { + PendingFullscreenChangeList::Iterator iter( + aDoc, PendingFullscreenChangeList::eDocumentsWithSameRoot); + while (!iter.AtEnd()) { + requests.AppendElement(iter.TakeAndNext()); + } + } bool handled = false; - PendingFullscreenChangeList::Iterator iter( - aDoc, PendingFullscreenChangeList::eDocumentsWithSameRoot); - while (!iter.AtEnd()) { - UniquePtr request = iter.TakeAndNext(); + for (UniquePtr& request : requests) { Document* doc = request->Document(); if (doc->ApplyFullscreen(std::move(request))) { handled = true; diff -Nru thunderbird-140.9.0esr/dom/base/Document.h thunderbird-140.10.0esr/dom/base/Document.h --- thunderbird-140.9.0esr/dom/base/Document.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/Document.h 2026-04-21 14:52:51.000000000 +0000 @@ -5732,7 +5732,7 @@ } private: - Document* mDoc; + RefPtr mDoc; }; bool IsInFocusedTab(Document* aDoc); diff -Nru thunderbird-140.9.0esr/dom/base/Element.cpp thunderbird-140.10.0esr/dom/base/Element.cpp --- thunderbird-140.9.0esr/dom/base/Element.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/Element.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -279,8 +279,9 @@ return nullptr; } + RefPtr presShell = frame->PresShell(); if (aType == mozilla::FlushType::Layout) { - frame->PresShell()->EnsureReflowIfFrameHasHiddenContent(frame); + presShell->EnsureReflowIfFrameHasHiddenContent(frame); frame = GetPrimaryFrame(); } @@ -2807,6 +2808,7 @@ } nsAutoScriptBlocker scriptBlocker; + OnAttrSetButNotChanged(aNamespaceID, aName, aValue, aNotify); MutationObservers::NotifyAttributeSetToCurrentValue(this, aNamespaceID, aName); return true; @@ -2856,7 +2858,6 @@ if (OnlyNotifySameValueSet(aNamespaceID, aName, aPrefix, value, aNotify, oldValue, &modType, &hasListeners, &oldValueSet)) { - OnAttrSetButNotChanged(aNamespaceID, aName, value, aNotify); return NS_OK; } } @@ -2906,7 +2907,6 @@ if (OnlyNotifySameValueSet(aNamespaceID, aName, aPrefix, value, aNotify, oldValue, &modType, &hasListeners, &oldValueSet)) { - OnAttrSetButNotChanged(aNamespaceID, aName, value, aNotify); return NS_OK; } } diff -Nru thunderbird-140.9.0esr/dom/base/ImageEncoder.cpp thunderbird-140.10.0esr/dom/base/ImageEncoder.cpp --- thunderbird-140.9.0esr/dom/base/ImageEncoder.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/ImageEncoder.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -341,8 +341,8 @@ return NS_ERROR_INVALID_ARG; } auto size = data->GetSize(); - rv = aEncoder->InitFromData(map.mData, size.width * size.height * 4, - size.width, size.height, size.width * 4, + rv = aEncoder->InitFromData(map.mData, map.mStride * size.height, + size.width, size.height, map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); data->Unmap(); } @@ -374,8 +374,8 @@ } rv = aEncoder->InitFromData(data.Elements(), - aSize.width * aSize.height * 4, aSize.width, - aSize.height, aSize.width * 4, + length, aSize.width, + aSize.height, stride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); } else { if (BufferSizeFromDimensions(aSize.width, aSize.height, 4) == 0) { @@ -391,8 +391,8 @@ return NS_ERROR_INVALID_ARG; } auto size = dataSurface->GetSize(); - rv = aEncoder->InitFromData(map.mData, size.width * size.height * 4, - size.width, size.height, size.width * 4, + rv = aEncoder->InitFromData(map.mData, map.mStride * size.height, + size.width, size.height, map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); dataSurface->Unmap(); } @@ -421,13 +421,13 @@ if (!emptyCanvas->Map(DataSourceSurface::MapType::WRITE, &map)) { return NS_ERROR_INVALID_ARG; } + auto size = map.mStride * aSize.height; if (aUsePlaceholder) { - auto size = 4 * aSize.width * aSize.height; auto* data = map.mData; GeneratePlaceholderCanvasData(size, data); } - rv = aEncoder->InitFromData(map.mData, aSize.width * aSize.height * 4, - aSize.width, aSize.height, aSize.width * 4, + rv = aEncoder->InitFromData(map.mData, size, aSize.width, aSize.height, + map.mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, aOptions); emptyCanvas->Unmap(); if (NS_SUCCEEDED(rv)) { diff -Nru thunderbird-140.9.0esr/dom/base/ScreenOrientation.cpp thunderbird-140.10.0esr/dom/base/ScreenOrientation.cpp --- thunderbird-140.9.0esr/dom/base/ScreenOrientation.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/ScreenOrientation.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -70,15 +70,24 @@ : DOMEventTargetHelper(aWindow), mScreen(aScreen) { MOZ_ASSERT(aWindow); MOZ_ASSERT(aScreen); +} + +/* static */ already_AddRefed ScreenOrientation::Create( + nsPIDOMWindowInner* aWindow, nsScreen* aScreen) { + RefPtr screenOrientation = new ScreenOrientation(aWindow, aScreen); - mAngle = aScreen->GetOrientationAngle(); - mType = InternalOrientationToType(aScreen->GetOrientationType()); + screenOrientation->mAngle = aScreen->GetOrientationAngle(); + screenOrientation->mType = + InternalOrientationToType(aScreen->GetOrientationType()); - Document* doc = GetResponsibleDocument(); + Document* doc = screenOrientation->GetResponsibleDocument(); BrowsingContext* bc = doc ? doc->GetBrowsingContext() : nullptr; if (bc && !bc->IsDiscarded() && !bc->InRDMPane()) { - MOZ_ALWAYS_SUCCEEDS(bc->SetCurrentOrientation(mType, mAngle)); + MOZ_ALWAYS_SUCCEEDS(bc->SetCurrentOrientation(screenOrientation->mType, + screenOrientation->mAngle)); } + + return screenOrientation.forget(); } ScreenOrientation::~ScreenOrientation() { diff -Nru thunderbird-140.9.0esr/dom/base/ScreenOrientation.h thunderbird-140.10.0esr/dom/base/ScreenOrientation.h --- thunderbird-140.9.0esr/dom/base/ScreenOrientation.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/ScreenOrientation.h 2026-04-21 14:52:51.000000000 +0000 @@ -33,8 +33,13 @@ // Called when the orientation may have changed. void MaybeChanged(); + private: ScreenOrientation(nsPIDOMWindowInner* aWindow, nsScreen* aScreen); + public: + static already_AddRefed Create(nsPIDOMWindowInner* aWindow, + nsScreen* aScreen); + already_AddRefed Lock(OrientationLockType aOrientation, ErrorResult& aRv); @@ -107,8 +112,8 @@ RefPtr mScreen; RefPtr mFullscreenListener; RefPtr mVisibleListener; - OrientationType mType; - uint16_t mAngle; + OrientationType mType{}; + uint16_t mAngle{}; // Whether we've tried to call into hal to lock the device orientation. This // is needed because you don't want calling UnlockDeviceOrientation() during // shutdown to initialize PHal if it hasn't been initialized earlier. Also, diff -Nru thunderbird-140.9.0esr/dom/base/ShadowRoot.cpp thunderbird-140.10.0esr/dom/base/ShadowRoot.cpp --- thunderbird-140.9.0esr/dom/base/ShadowRoot.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/ShadowRoot.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -213,7 +213,7 @@ void ShadowRoot::InvalidateStyleAndLayoutOnSubtree(Element* aElement) { MOZ_ASSERT(aElement); - Document* doc = GetComposedDoc(); + Document* doc = aElement->GetComposedDoc(); if (!doc) { return; } diff -Nru thunderbird-140.9.0esr/dom/base/ShadowRoot.h thunderbird-140.10.0esr/dom/base/ShadowRoot.h --- thunderbird-140.9.0esr/dom/base/ShadowRoot.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/ShadowRoot.h 2026-04-21 14:52:51.000000000 +0000 @@ -136,7 +136,7 @@ * It is important that this runs _before_ actually shuffling the flat tree * around, so that layout knows the actual tree that it needs to invalidate. */ - void InvalidateStyleAndLayoutOnSubtree(Element*); + static void InvalidateStyleAndLayoutOnSubtree(Element*); private: void InsertSheetIntoAuthorData(size_t aIndex, StyleSheet&, diff -Nru thunderbird-140.9.0esr/dom/base/StructuredCloneBlob.cpp thunderbird-140.10.0esr/dom/base/StructuredCloneBlob.cpp --- thunderbird-140.9.0esr/dom/base/StructuredCloneBlob.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/StructuredCloneBlob.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -15,6 +15,7 @@ #include "js/Wrapper.h" #include "jsapi.h" #include "mozilla/Assertions.h" +#include "mozilla/CheckedInt.h" #include "mozilla/ErrorResult.h" #include "mozilla/Maybe.h" #include "mozilla/Span.h" @@ -214,8 +215,13 @@ bool StructuredCloneBlob::Holder::WriteStructuredClone( JSContext* aCx, JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) { - auto& data = mBuffer->data(); - if (!JS_WriteUint32Pair(aWriter, data.Size(), JS_STRUCTURED_CLONE_VERSION) || + const auto& data = mBuffer->data(); + CheckedUint32 dataSize(data.Size()); + if (!dataSize.isValid()) { + return false; + } + if (!JS_WriteUint32Pair(aWriter, dataSize.value(), + JS_STRUCTURED_CLONE_VERSION) || !JS_WriteUint32Pair(aWriter, aHolder->BlobImpls().Length(), BlobImpls().Length())) { return false; diff -Nru thunderbird-140.9.0esr/dom/base/TextInputProcessor.cpp thunderbird-140.10.0esr/dom/base/TextInputProcessor.cpp --- thunderbird-140.9.0esr/dom/base/TextInputProcessor.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/TextInputProcessor.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -938,9 +938,8 @@ NS_IMETHODIMP_(IMENotificationRequests) TextInputProcessor::GetIMENotificationRequests() { // TextInputProcessor should support all change notifications. - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE); + return {IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange}; } NS_IMETHODIMP_(void) diff -Nru thunderbird-140.9.0esr/dom/base/TextInputProcessor.h thunderbird-140.10.0esr/dom/base/TextInputProcessor.h --- thunderbird-140.9.0esr/dom/base/TextInputProcessor.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/TextInputProcessor.h 2026-04-21 14:52:51.000000000 +0000 @@ -27,9 +27,10 @@ class TextInputProcessor final : public nsITextInputProcessor, public widget::TextEventDispatcherListener { - typedef mozilla::widget::IMENotification IMENotification; - typedef mozilla::widget::IMENotificationRequests IMENotificationRequests; - typedef mozilla::widget::TextEventDispatcher TextEventDispatcher; + using IMENotification = mozilla::widget::IMENotification; + using IMENotificationRequest = mozilla::widget::IMENotificationRequest; + using IMENotificationRequests = mozilla::widget::IMENotificationRequests; + using TextEventDispatcher = mozilla::widget::TextEventDispatcher; public: TextInputProcessor(); diff -Nru thunderbird-140.9.0esr/dom/base/nsAttrValue.cpp thunderbird-140.10.0esr/dom/base/nsAttrValue.cpp --- thunderbird-140.9.0esr/dom/base/nsAttrValue.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsAttrValue.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -1333,7 +1333,11 @@ void nsAttrValue::ParseAtomArray(nsAtom* aValue) { if (MiscContainer* cont = AtomArrayCache::Lookup(aValue)) { // Set our MiscContainer to the cached one. + // AddRef must happen before ResetIfSet: the cache does not hold a strong + // reference, and ResetIfSet could release the last reference to cont if + // this nsAttrValue is already holding it. NS_ADDREF(cont); + ResetIfSet(); SetPtrValueAndType(cont, eOtherBase); return; } @@ -1933,7 +1937,11 @@ if (cachingAllowed) { if (MiscContainer* cont = attrStyles->LookupStyleAttr(aString)) { // Set our MiscContainer to the cached one. + // AddRef must happen before ResetIfSet: the cache does not hold a strong + // reference, and ResetIfSet could release the last reference to cont if + // this nsAttrValue is already holding it. NS_ADDREF(cont); + ResetIfSet(); SetPtrValueAndType(cont, eOtherBase); return true; } diff -Nru thunderbird-140.9.0esr/dom/base/nsContentList.cpp thunderbird-140.10.0esr/dom/base/nsContentList.cpp --- thunderbird-140.9.0esr/dom/base/nsContentList.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsContentList.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -592,7 +592,8 @@ return mNamedItemsCache->Get(name); } -void nsContentList::GetSupportedNames(nsTArray& aNames) { +void nsContentList::GetSupportedNames(nsTArray& aNames, + FilterElementWithName aFilter) { BringSelfUpToDate(true); AutoTArray atoms; @@ -606,14 +607,14 @@ } } - nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content); - if (el) { + if (nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content)) { // XXXbz should we be checking for particular tags here? How // stable is this part of the spec? // Note: nsINode::HasName means the name is exposed on the document, // which is false for options, so we don't check it here. const nsAttrValue* val = el->GetParsedAttr(nsGkAtoms::name); - if (val && val->Type() == nsAttrValue::eAtom) { + if (val && val->Type() == nsAttrValue::eAtom && + (!aFilter || aFilter(el))) { nsAtom* name = val->GetAtomValue(); MOZ_ASSERT(name != nsGkAtoms::_empty, "Empty names don't get atomized"); if (!atoms.Contains(name)) { diff -Nru thunderbird-140.9.0esr/dom/base/nsContentList.h thunderbird-140.10.0esr/dom/base/nsContentList.h --- thunderbird-140.9.0esr/dom/base/nsContentList.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsContentList.h 2026-04-21 14:52:52.000000000 +0000 @@ -296,13 +296,21 @@ aFound = !!item; return item; } - void GetSupportedNames(nsTArray& aNames) override; + void GetSupportedNames(nsTArray& aNames) override { + GetSupportedNames(aNames, nullptr); + } // nsContentList public methods uint32_t Length(bool aDoFlush); nsIContent* Item(uint32_t aIndex, bool aDoFlush); Element* NamedItem(const nsAString& aName, bool aDoFlush); + // Used by HTMLAllCollection to limit the elements whose name attribute is + // considered. The filter MUST NOT cause any flushes. + using FilterElementWithName = bool (*)(nsIContent*); + void GetSupportedNames(nsTArray& aNames, + FilterElementWithName aFilter); + // nsIMutationObserver NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED diff -Nru thunderbird-140.9.0esr/dom/base/nsDOMWindowUtils.cpp thunderbird-140.10.0esr/dom/base/nsDOMWindowUtils.cpp --- thunderbird-140.9.0esr/dom/base/nsDOMWindowUtils.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsDOMWindowUtils.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -4533,10 +4533,9 @@ } NS_IMETHODIMP -nsDOMWindowUtils::WrStartCaptureSequence(const nsACString& aPath, - uint32_t aFlags) { +nsDOMWindowUtils::WrStartCaptureSequence(uint32_t aFlags) { if (WebRenderBridgeChild* wrbc = GetWebRenderBridge()) { - wrbc->StartCaptureSequence(nsCString(aPath), aFlags); + wrbc->StartCaptureSequence(aFlags); } return NS_OK; } diff -Nru thunderbird-140.9.0esr/dom/base/nsFrameLoaderOwner.cpp thunderbird-140.10.0esr/dom/base/nsFrameLoaderOwner.cpp --- thunderbird-140.9.0esr/dom/base/nsFrameLoaderOwner.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsFrameLoaderOwner.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -105,7 +105,7 @@ // no other blockers. Since we're going to be adding a new blocker as soon as // we recreate the frame loader, this is not what we want, so add our own // blocker until the process is complete. - Document* doc = owner->OwnerDoc(); + RefPtr doc = owner->OwnerDoc(); doc->BlockOnload(); auto cleanup = MakeScopeExit([&]() { doc->UnblockOnload(false); }); diff -Nru thunderbird-140.9.0esr/dom/base/nsGlobalWindowInner.cpp thunderbird-140.10.0esr/dom/base/nsGlobalWindowInner.cpp --- thunderbird-140.9.0esr/dom/base/nsGlobalWindowInner.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsGlobalWindowInner.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2459,7 +2459,7 @@ nsScreen* nsGlobalWindowInner::Screen() { if (!mScreen) { - mScreen = new nsScreen(this); + mScreen = nsScreen::Create(this); } return mScreen; } @@ -2535,6 +2535,10 @@ return nsGlobalWindowInner::Cast(this)->GetController(); } +ClientSource* nsPIDOMWindowInner::GetClientSource() const { + return nsGlobalWindowInner::Cast(this)->GetClientSource(); +} + void nsPIDOMWindowInner::SetCsp(nsIContentSecurityPolicy* aCsp) { return nsGlobalWindowInner::Cast(this)->SetCsp(aCsp); } diff -Nru thunderbird-140.9.0esr/dom/base/nsGlobalWindowInner.h thunderbird-140.10.0esr/dom/base/nsGlobalWindowInner.h --- thunderbird-140.9.0esr/dom/base/nsGlobalWindowInner.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsGlobalWindowInner.h 2026-04-21 14:52:51.000000000 +0000 @@ -1286,6 +1286,10 @@ void SetCurrentPasteDataTransfer(mozilla::dom::DataTransfer* aDataTransfer); mozilla::dom::DataTransfer* GetCurrentPasteDataTransfer() const; + mozilla::dom::ClientSource* GetClientSource() const { + return mClientSource.get(); + } + private: RefPtr mContentMediaController; diff -Nru thunderbird-140.9.0esr/dom/base/nsINode.cpp thunderbird-140.10.0esr/dom/base/nsINode.cpp --- thunderbird-140.9.0esr/dom/base/nsINode.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsINode.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -1105,11 +1105,7 @@ const nsTextFragment* text = node->GetText(); if (text->GetLength()) { nsIContent* target = node->GetPreviousSibling(); - NS_ASSERTION( - (target && target->NodeType() == TEXT_NODE) || hasRemoveListeners, - "Should always have a previous text sibling unless " - "mutation events messed us up"); - if (!hasRemoveListeners || (target && target->NodeType() == TEXT_NODE)) { + if (target && target->NodeType() == TEXT_NODE) { nsTextNode* t = static_cast(target); if (text->Is2b()) { t->AppendTextForNormalize(text->Get2b(), text->GetLength(), true, @@ -3721,8 +3717,10 @@ JSAutoRealm ar(cx, wrapper); UpdateReflectorGlobal(cx, wrapper, aError); if (aError.Failed()) { + bool needsRollBack = false; if (wasRegistered) { - newDoc->UnregisterActivityObserver(aNode->AsElement()); + needsRollBack = + newDoc->UnregisterActivityObserver(aNode->AsElement()); } if (hadProperties) { // NOTE: When it fails it removes all properties for the node @@ -3732,7 +3730,7 @@ } aNode->mNodeInfo.swap(newNodeInfo); aNode->NodeInfoChanged(newDoc); - if (wasRegistered) { + if (needsRollBack) { oldDoc->RegisterActivityObserver(aNode->AsElement()); } return nullptr; diff -Nru thunderbird-140.9.0esr/dom/base/nsObjectLoadingContent.cpp thunderbird-140.10.0esr/dom/base/nsObjectLoadingContent.cpp --- thunderbird-140.9.0esr/dom/base/nsObjectLoadingContent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsObjectLoadingContent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -214,8 +214,8 @@ } if (!docShell) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); return nullptr; } @@ -1284,8 +1284,8 @@ nsCOMPtr uriLoader(components::URILoader::Service()); if (NS_WARN_IF(!uriLoader)) { MOZ_ASSERT_UNREACHABLE("Failed to get uriLoader service"); - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); break; } @@ -1591,11 +1591,6 @@ } void nsObjectLoadingContent::Destroy() { - if (mFrameLoader) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; - } - // Reset state so that if the element is re-appended to tree again (e.g. // adopting to another document), it will reload resource again. UnloadObject(); @@ -1619,8 +1614,8 @@ void nsObjectLoadingContent::UnloadObject(bool aResetState) { if (mFrameLoader) { - mFrameLoader->Destroy(); - mFrameLoader = nullptr; + RefPtr loader = std::move(mFrameLoader); + loader->Destroy(); } if (aResetState) { @@ -1718,23 +1713,30 @@ } // Do a depth-first traverse of node tree with the current element as root, // looking for non- elements. If we find some then we have an HTML - // fallback for this element. + // fallback for this element + AutoTArray, 4> targets; for (nsIContent* child = el->GetFirstChild(); child;) { // and elements in the fallback need to StartObjectLoad. // Their children should be ignored since they are part of those element's // fallback. - if (auto* embed = HTMLEmbedElement::FromNode(child)) { - embed->StartObjectLoad(true, true); - // Skip the children - child = child->GetNextNonChildNode(el); - } else if (auto* object = HTMLObjectElement::FromNode(child)) { - object->StartObjectLoad(true, true); - // Skip the children + if (child->IsAnyOfHTMLElements(nsGkAtoms::embed, nsGkAtoms::object)) { + targets.AppendElement(child); child = child->GetNextNonChildNode(el); } else { child = child->GetNextNode(el); } } + + for (RefPtr& target : targets) { + if (!target->IsInclusiveDescendantOf(el)) { + continue; + } + if (auto* embed = HTMLEmbedElement::FromNode(target)) { + embed->StartObjectLoad(true, true); + } else if (auto* object = HTMLObjectElement::FromNode(target)) { + object->StartObjectLoad(true, true); + } + } } NS_IMETHODIMP diff -Nru thunderbird-140.9.0esr/dom/base/nsPIDOMWindow.h thunderbird-140.10.0esr/dom/base/nsPIDOMWindow.h --- thunderbird-140.9.0esr/dom/base/nsPIDOMWindow.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsPIDOMWindow.h 2026-04-21 14:52:51.000000000 +0000 @@ -366,6 +366,7 @@ mozilla::Maybe GetClientInfo() const; mozilla::Maybe GetClientState() const; mozilla::Maybe GetController() const; + mozilla::dom::ClientSource* GetClientSource() const; void SetCsp(nsIContentSecurityPolicy* aCsp); void SetPreloadCsp(nsIContentSecurityPolicy* aPreloadCsp); diff -Nru thunderbird-140.9.0esr/dom/base/nsRange.cpp thunderbird-140.10.0esr/dom/base/nsRange.cpp --- thunderbird-140.9.0esr/dom/base/nsRange.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsRange.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2829,20 +2829,6 @@ return nullptr; } - // Try to un-suppress whitespace if needed, but only if we'll be able to flush - // to immediately see the results of the un-suppression. If we can't flush - // here, then calling EnsureFrameForTextNodeIsCreatedAfterFlush would be - // pointless anyway. - if (aFlushLayout) { - const bool frameWillBeUnsuppressed = - presShell->FrameConstructor() - ->EnsureFrameForTextNodeIsCreatedAfterFlush( - static_cast(aContent)); - if (frameWillBeUnsuppressed) { - doc->FlushPendingNotifications(FlushType::Layout); - } - } - nsIFrame* frame = aContent->GetPrimaryFrame(); if (!frame || !frame->IsTextFrame()) { return nullptr; diff -Nru thunderbird-140.9.0esr/dom/base/nsScreen.cpp thunderbird-140.10.0esr/dom/base/nsScreen.cpp --- thunderbird-140.9.0esr/dom/base/nsScreen.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsScreen.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -23,8 +23,14 @@ using namespace mozilla::dom; nsScreen::nsScreen(nsPIDOMWindowInner* aWindow) - : DOMEventTargetHelper(aWindow), - mScreenOrientation(new ScreenOrientation(aWindow, this)) {} + : DOMEventTargetHelper(aWindow) {} + +/* static */ already_AddRefed nsScreen::Create( + nsPIDOMWindowInner* aWindow) { + RefPtr screen = new nsScreen(aWindow); + screen->mScreenOrientation = ScreenOrientation::Create(aWindow, screen); + return screen.forget(); +} nsScreen::~nsScreen() = default; diff -Nru thunderbird-140.9.0esr/dom/base/nsScreen.h thunderbird-140.10.0esr/dom/base/nsScreen.h --- thunderbird-140.9.0esr/dom/base/nsScreen.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsScreen.h 2026-04-21 14:52:51.000000000 +0000 @@ -21,9 +21,12 @@ // Script "screen" object class nsScreen : public mozilla::DOMEventTargetHelper { - public: + private: explicit nsScreen(nsPIDOMWindowInner* aWindow); + public: + static already_AddRefed Create(nsPIDOMWindowInner* aWindow); + NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsScreen, mozilla::DOMEventTargetHelper) diff -Nru thunderbird-140.9.0esr/dom/base/nsWrapperCache.cpp thunderbird-140.10.0esr/dom/base/nsWrapperCache.cpp --- thunderbird-140.9.0esr/dom/base/nsWrapperCache.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsWrapperCache.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -47,6 +47,13 @@ } } +void nsWrapperCache::ClearWrapperOnWrapFailure() { + if (IsNurseryWrapper(mWrapper)) { + CycleCollectedJSRuntime::Get()->NurseryWrapperRemovedSlow(this); + } + ClearWrapper(); +} + void nsWrapperCache::ReleaseWrapper(void* aScriptObjectHolder) { // If the behavior here changes in a substantive way, you may need // to update css::Rule::UnlinkDeclarationWrapper as well. diff -Nru thunderbird-140.9.0esr/dom/base/nsWrapperCache.h thunderbird-140.10.0esr/dom/base/nsWrapperCache.h --- thunderbird-140.9.0esr/dom/base/nsWrapperCache.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsWrapperCache.h 2026-04-21 14:52:51.000000000 +0000 @@ -170,6 +170,8 @@ } } + void ClearWrapperOnWrapFailure(); + /** * Update the wrapper when the object moves between globals. */ diff -Nru thunderbird-140.9.0esr/dom/base/nsWrapperCacheInlines.h thunderbird-140.10.0esr/dom/base/nsWrapperCacheInlines.h --- thunderbird-140.9.0esr/dom/base/nsWrapperCacheInlines.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/nsWrapperCacheInlines.h 2026-04-21 14:52:51.000000000 +0000 @@ -86,12 +86,18 @@ SetPreservingWrapper(false); } + JSObject* oldWrapper = mWrapper; SetWrapper(aNewWrapper); if (zoneChanged) { PreserveWrapper(aScriptObjectHolder); } else if (preserving) { SetPreservingWrapper(true); + if (!JS::ObjectIsTenured(mWrapper)) { + // SetWrapper doesn't fire a write barrier; add one so minor GC can + // update mWrapper if the new wrapper is tenured. + JS::HeapObjectPostWriteBarrier(&mWrapper, oldWrapper, mWrapper); + } } } diff -Nru thunderbird-140.9.0esr/dom/base/test/jsmodules/mochitest.toml thunderbird-140.10.0esr/dom/base/test/jsmodules/mochitest.toml --- thunderbird-140.9.0esr/dom/base/test/jsmodules/mochitest.toml 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/test/jsmodules/mochitest.toml 2026-04-21 14:52:52.000000000 +0000 @@ -1,3 +1,5 @@ [DEFAULT] +["test_bug_2027541.html"] + ["test_nested_modules.html"] diff -Nru thunderbird-140.9.0esr/dom/base/test/jsmodules/test_bug_2027541.html thunderbird-140.10.0esr/dom/base/test/jsmodules/test_bug_2027541.html --- thunderbird-140.9.0esr/dom/base/test/jsmodules/test_bug_2027541.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/dom/base/test/jsmodules/test_bug_2027541.html 2026-04-21 14:52:51.000000000 +0000 @@ -0,0 +1,47 @@ + + + + Call import.meta.resolve after iframe removal + + + + + diff -Nru thunderbird-140.9.0esr/dom/bindings/BindingUtils.cpp thunderbird-140.10.0esr/dom/bindings/BindingUtils.cpp --- thunderbird-140.9.0esr/dom/bindings/BindingUtils.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/bindings/BindingUtils.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2473,8 +2473,7 @@ } // We've set up |newobj|, so we make it own the native by setting its reserved - // slot and nulling out the reserved slot of |obj|. Update the wrapper cache - // to keep everything consistent in case GC moves newobj. + // slot and nulling out the reserved slot of |obj|. // // NB: It's important to do this _after_ copying the properties to // propertyHolder. Otherwise, an object with |foo.x === foo| will @@ -2483,18 +2482,37 @@ JS::SetReservedSlot(newobj, DOM_OBJECT_SLOT, JS::GetReservedSlot(aObj, DOM_OBJECT_SLOT)); JS::SetReservedSlot(aObj, DOM_OBJECT_SLOT, JS::PrivateValue(nullptr)); + size_t nslots = JSCLASS_RESERVED_SLOTS(JS::GetClass(aObj)); + for (size_t slot = DOM_INSTANCE_RESERVED_SLOTS; slot < nslots; ++slot) { + const JS::Value& slotValue = JS::GetReservedSlot(aObj, slot); + if (slotValue.isObject()) { + JSObject* slotObj = &slotValue.toObject(); + if (IsObservableArrayProxy(slotObj)) { + JS::SetReservedSlot(newobj, slot, slotValue); + JS::SetReservedSlot(aObj, slot, JS::UndefinedValue()); + } + } + } + nsWrapperCache* cache = nullptr; CallQueryInterface(native, &cache); - cache->UpdateWrapperForNewGlobal(native, newobj); + + // For preserved wrappers the store buffer keeps mWrapper consistent across + // the transplant. For non-preserved wrappers clear mWrapper so that + // JSObjectsTenured doesn't follow a stale pointer if nursery GC fires. + bool preserving = cache->PreservingWrapper(); + if (preserving) { + cache->UpdateWrapperForNewGlobal(native, newobj); + } else { + cache->ClearWrapper(); + } aObj = xpc::TransplantObjectRetainingXrayExpandos(aCx, aObj, newobj); if (!aObj) { MOZ_CRASH(); } - // Update the wrapper cache again if transplanting didn't use newobj but - // returned some other object. - if (aObj != newobj) { + if (!preserving || aObj != newobj) { MOZ_ASSERT(UnwrapDOMObjectToISupports(aObj) == native); cache->UpdateWrapperForNewGlobal(native, aObj); } @@ -3555,6 +3573,7 @@ ? aObj : js::UncheckedUnwrap(aObj, /* stopAtWindowProxy = */ false); + MOZ_ASSERT(aSlotIndex < JSCLASS_RESERVED_SLOTS(JS::GetClass(reflector))); // Retrieve the backing object from the reserved slot on the maplike/setlike // object. If it doesn't exist yet, create it. diff -Nru thunderbird-140.9.0esr/dom/bindings/Codegen.py thunderbird-140.10.0esr/dom/bindings/Codegen.py --- thunderbird-140.9.0esr/dom/bindings/Codegen.py 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/bindings/Codegen.py 2026-04-21 14:52:51.000000000 +0000 @@ -4683,7 +4683,7 @@ failureCode = dedent( """ aCache->ReleaseWrapper(aObject); - aCache->ClearWrapper(); + aCache->ClearWrapperOnWrapFailure(); return false; """ ) @@ -23213,7 +23213,9 @@ CGGeneric.__init__(self, createIterator) -def getObservableArrayBackingObject(descriptor, attr, errorReturn="return false;\n"): +def getObservableArrayBackingObject( + descriptor, attr, objName="obj", errorReturn="return false;\n" +): """ Generate code to get/create a JS backing list for an observableArray attribute from the declaration slot. @@ -23228,7 +23230,7 @@ """ JS::Rooted backingObj(cx); bool created = false; - if (!GetObservableArrayBackingObject(cx, obj, ${slot}, + if (!GetObservableArrayBackingObject(cx, ${objName}, ${slot}, &backingObj, &created, ${namespace}::ObservableArrayProxyHandler::getInstance(), self)) { $*{errorReturn} @@ -23237,8 +23239,9 @@ PreserveWrapper(self); } """, - namespace=toBindingNamespace(MakeNativeName(attr.identifier.name)), + objName=objName, slot=memberReservedSlot(attr, descriptor), + namespace=toBindingNamespace(MakeNativeName(attr.identifier.name)), errorReturn=errorReturn, selfType=descriptor.nativeType, ) @@ -23350,12 +23353,18 @@ $*{convertType} $*{preCallback} - JS::Value val = js::GetProxyReservedSlot(aProxy, OBSERVABLE_ARRAY_DOM_INTERFACE_SLOT); - auto* interface = static_cast<${ifaceType}*>(val.toPrivate()); - MOZ_ASSERT(interface); + const JS::Value& val = js::GetProxyReservedSlot(aProxy, OBSERVABLE_ARRAY_DOM_INTERFACE_SLOT); + if (MOZ_LIKELY(!val.isUndefined())) { + auto* interface = static_cast<${ifaceType}*>(val.toPrivate()); + MOZ_ASSERT(interface); + + ErrorResult rv; + MOZ_KnownLive(interface)->${methodName}(${callbackArgs}); + if (rv.MaybeSetPendingException(cx)) { + return false; + } + } - ErrorResult rv; - MOZ_KnownLive(interface)->${methodName}(${callbackArgs}); $*{postCallback} """, preConversion=self.preConversion(), @@ -23399,7 +23408,7 @@ def postCallback(self): return dedent( """ - return !rv.MaybeSetPendingException(cx); + return true; """ ) @@ -23464,10 +23473,6 @@ def postCallback(self): return dedent( """ - if (rv.MaybeSetPendingException(cx)) { - return false; - } - if (!JS_SetElement(aCx, aBackingList, aIndex, aValue)) { return false; } @@ -23530,7 +23535,9 @@ def __init__(self, descriptor, attr): assert attr.isAttr() assert attr.type.isObservableArray() - getBackingObject = getObservableArrayBackingObject(descriptor, attr) + getBackingObject = getObservableArrayBackingObject( + descriptor, attr, objName="unwrappedObj" + ) setElement = dedent( """ if (!JS_SetElement(cx, backingObj, i, val)) { @@ -23557,15 +23564,22 @@ return false; } - ${getBackingObject} - const ObservableArrayProxyHandler* handler = GetObservableArrayProxyHandler(backingObj); - if (!handler->SetLength(cx, backingObj, 0)) { - return false; - } + JS::Rooted unwrappedObj(cx, js::UncheckedUnwrap(obj, /* stopAtWindowProxy = */ false)); + MOZ_ASSERT(IsDOMObject(unwrappedObj)); + { + JSAutoRealm ar(cx, unwrappedObj); - JS::Rooted val(cx); - for (size_t i = 0; i < arg0.Length(); i++) { - $*{conversion} + $*{getBackingObject} + + const ObservableArrayProxyHandler* handler = GetObservableArrayProxyHandler(backingObj); + if (!handler->SetLength(cx, backingObj, 0)) { + return false; + } + + JS::Rooted val(cx); + for (size_t i = 0; i < arg0.Length(); i++) { + $*{conversion} + } } """, conversion=conversion, @@ -23611,7 +23625,7 @@ getObservableArrayBackingObject( descriptor, attr, - dedent( + errorReturn=dedent( """ aRv.Throw(NS_ERROR_UNEXPECTED); return%s; diff -Nru thunderbird-140.9.0esr/dom/bindings/ErrorResult.h thunderbird-140.10.0esr/dom/bindings/ErrorResult.h --- thunderbird-140.9.0esr/dom/bindings/ErrorResult.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/bindings/ErrorResult.h 2026-04-21 14:52:52.000000000 +0000 @@ -215,6 +215,7 @@ // informative message and calling the relevant Throw*Error. void MOZ_MUST_RETURN_FROM_CALLER_IF_THIS_IS_ARG Throw(nsresult rv) { MOZ_ASSERT(NS_FAILED(rv), "Please don't try throwing success"); + ClearUnionData(); AssignErrorCode(rv); } @@ -431,7 +432,10 @@ // Backwards-compat to make conversion simpler. We don't call // Throw() here because people can easily pass success codes to // this. This operator is deprecated and ideally shouldn't be used. - void operator=(nsresult rv) { AssignErrorCode(rv); } + void operator=(nsresult rv) { + ClearUnionData(); + AssignErrorCode(rv); + } bool Failed() const { return NS_FAILED(mResult); } @@ -542,6 +546,7 @@ } void AssignErrorCode(nsresult aRv) { + MOZ_ASSERT(mUnionState == HasNothing); MOZ_ASSERT(aRv != NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR, "Use ThrowTypeError()"); MOZ_ASSERT(aRv != NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR, diff -Nru thunderbird-140.9.0esr/dom/cache/Manager.cpp thunderbird-140.10.0esr/dom/cache/Manager.cpp --- thunderbird-140.9.0esr/dom/cache/Manager.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/cache/Manager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -658,7 +658,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -734,7 +735,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -1289,7 +1291,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } @@ -1368,7 +1371,8 @@ // If we entered shutdown on the main thread while we were doing IO, // bail out now. - if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { + if (IsCanceled() || + AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownQM)) { if (stream) { stream->Close(); } diff -Nru thunderbird-140.9.0esr/dom/cache/StreamList.cpp thunderbird-140.10.0esr/dom/cache/StreamList.cpp --- thunderbird-140.9.0esr/dom/cache/StreamList.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/cache/StreamList.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -30,7 +30,6 @@ mStreamControl(nullptr), mActivated(false) { MOZ_DIAGNOSTIC_ASSERT(mManager); - mContext->AddActivity(*this); } Manager& StreamList::GetManager() const { @@ -73,6 +72,9 @@ MOZ_DIAGNOSTIC_ASSERT(mCacheId == INVALID_CACHE_ID); mActivated = true; mCacheId = aCacheId; + + mContext->AddActivity(*this); + mManager->AddRefCacheId(mCacheId); mManager->AddStreamList(*this); @@ -134,6 +136,7 @@ void StreamList::CloseAll() { NS_ASSERT_OWNINGTHREAD(StreamList); + SafeRefPtr kungFuDeathGrip = SafeRefPtrFromThis(); if (mStreamControl && mStreamControl->CanSend()) { // CloseAll will kick off everything needed for shutdown. @@ -192,13 +195,13 @@ NS_ASSERT_OWNINGTHREAD(StreamList); MOZ_DIAGNOSTIC_ASSERT(!mStreamControl); if (mActivated) { + mContext->RemoveActivity(*this); mManager->RemoveStreamList(*this); for (uint32_t i = 0; i < mList.Length(); ++i) { mManager->ReleaseBodyId(mList[i].mId); } mManager->ReleaseCacheId(mCacheId); } - mContext->RemoveActivity(*this); } } // namespace mozilla::dom::cache diff -Nru thunderbird-140.9.0esr/dom/canvas/CanvasRenderingContext2D.cpp thunderbird-140.10.0esr/dom/canvas/CanvasRenderingContext2D.cpp --- thunderbird-140.9.0esr/dom/canvas/CanvasRenderingContext2D.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/CanvasRenderingContext2D.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -880,6 +880,8 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D) + tmp->RemoveShutdownObserver(); + tmp->OnShutdown(); // Make sure we remove ourselves from the list of demotable contexts (raw // pointers), since we're logically destructed at this point. NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement) @@ -2888,8 +2890,12 @@ void CanvasRenderingContext2D::SetLetterSpacing( const nsACString& aLetterSpacing) { - ParseSpacing(aLetterSpacing, &CurrentState().letterSpacing, - CurrentState().letterSpacingStr); + nsAutoCString normalized; + Maybe value = ParseSpacing(aLetterSpacing, normalized); + if (value) { + CurrentState().letterSpacing = *value; + CurrentState().letterSpacingStr = normalized; + } } void CanvasRenderingContext2D::GetWordSpacing(nsACString& aWordSpacing) { @@ -2901,8 +2907,12 @@ } void CanvasRenderingContext2D::SetWordSpacing(const nsACString& aWordSpacing) { - ParseSpacing(aWordSpacing, &CurrentState().wordSpacing, - CurrentState().wordSpacingStr); + nsAutoCString normalized; + Maybe value = ParseSpacing(aWordSpacing, normalized); + if (value) { + CurrentState().wordSpacing = *value; + CurrentState().wordSpacingStr = normalized; + } } static GeckoFontMetrics GetFontMetricsFromCanvas(void* aContext) { @@ -2933,9 +2943,8 @@ 0.0f}; } -void CanvasRenderingContext2D::ParseSpacing(const nsACString& aSpacing, - float* aValue, - nsACString& aNormalized) { +Maybe CanvasRenderingContext2D::ParseSpacing(const nsACString& aSpacing, + nsACString& aNormalized) { // Normalize whitespace in the string before trying to parse it, as we want // to store it in normalized form, and this allows a simple check against the // 'normal' keyword, which is not accepted. @@ -2943,28 +2952,28 @@ normalized.CompressWhitespace(true, true); ToLowerCase(normalized); if (normalized.EqualsLiteral("normal")) { - return; + return Nothing(); } float value; if (!Servo_ParseLengthWithoutStyleContext(&normalized, &value, GetFontMetricsFromCanvas, this)) { if (!GetPresShell()) { - return; + return Nothing(); } // This will parse aSpacing as a ... RefPtr style = ResolveStyleForProperty(eCSSProperty_letter_spacing, aSpacing); if (!style) { - return; + return Nothing(); } // ...but only is allowed according to the canvas spec. if (!style->StyleText()->mLetterSpacing.IsLength()) { - return; + return Nothing(); } value = style->StyleText()->mLetterSpacing.AsLength().ToCSSPixels(); } aNormalized = normalized; - *aValue = value; + return Some(value); } class CanvasUserSpaceMetrics final : public UserSpaceMetricsWithSize { @@ -3434,6 +3443,11 @@ return; } + const bool needBounds = NeedToCalculateBounds(); + if (!IsTargetValid()) { + return; + } + const ContextState* state = &CurrentState(); StrokeOptions strokeOptions(state->lineWidth, CanvasToGfx(state->lineJoin), CanvasToGfx(state->lineCap), state->miterLimit, @@ -3441,10 +3455,6 @@ state->dashOffset); state = nullptr; - const bool needBounds = NeedToCalculateBounds(); - if (!IsTargetValid()) { - return; - } gfx::Rect bounds; if (needBounds) { bounds = aPath.GetStrokedBounds(strokeOptions, mTarget->GetTransform()); @@ -4695,6 +4705,7 @@ } mCtx->EnsureTarget(); + const bool needBounds = mCtx->NeedToCalculateBounds(); if (!mCtx->IsTargetValid()) { return; } @@ -4709,7 +4720,7 @@ const ContextState& state = mCtx->CurrentState(); gfx::Rect bounds; - if (mCtx->NeedToCalculateBounds()) { + if (needBounds) { bounds = ToRect(mBoundingBox); bounds.MoveBy(mPt / mAppUnitsPerDevPixel); if (style == Style::STROKE) { @@ -4857,6 +4868,9 @@ canvasStyle = nsComputedDOMStyle::GetComputedStyle(mCanvasElement); } + // This is only needed to know if we can know the drawing bounding box easily. + const bool doCalculateBounds = NeedToCalculateBounds(); + // Get text direction, either from the property or inherited from context. const ContextState& state = CurrentState(); bool isRTL; @@ -4882,8 +4896,6 @@ MOZ_CRASH("unknown direction!"); } - // This is only needed to know if we can know the drawing bounding box easily. - const bool doCalculateBounds = NeedToCalculateBounds(); if (presShell && presShell->IsDestroying()) { aError = NS_ERROR_FAILURE; return nullptr; @@ -5163,50 +5175,54 @@ nsPresContext* presContext = presShell ? presShell->GetPresContext() : nullptr; - // If we have a cached fontGroup, check that it is valid for the current - // prescontext; if not, we need to discard and re-create it. - RefPtr& fontGroup = CurrentState().fontGroup; - if (fontGroup) { - if (fontGroup->GetPresContext() != presContext) { - fontGroup = nullptr; + { + // If we have a cached fontGroup, check that it is valid for the current + // prescontext; if not, we need to discard and re-create it. + RefPtr& fontGroup = CurrentState().fontGroup; + if (fontGroup) { + if (fontGroup->GetPresContext() != presContext) { + fontGroup = nullptr; + } else { + return fontGroup; + } } } - if (!fontGroup) { - ErrorResult err; - constexpr auto kDefaultFontStyle = "10px sans-serif"_ns; - const float kDefaultFontSize = 10.0; - // If the font has already been set, we're re-creating the fontGroup - // and should re-use the existing font attribute; if not, we initialize - // it to the canvas default. - const nsCString& currentFont = CurrentState().font; - bool fontUpdated = SetFontInternal( - currentFont.IsEmpty() ? kDefaultFontStyle : currentFont, err); - if (err.Failed() || !fontUpdated) { - err.SuppressException(); - // XXX Should we get a default lang from the prescontext or something? - nsAtom* language = nsGkAtoms::x_western; - bool explicitLanguage = false; - gfxFontStyle style; - style.size = kDefaultFontSize; - int32_t perDevPixel, perCSSPixel; - GetAppUnitsValues(&perDevPixel, &perCSSPixel); - gfxFloat devToCssSize = gfxFloat(perDevPixel) / gfxFloat(perCSSPixel); - const auto* sans = - Servo_FontFamily_Generic(StyleGenericFontFamily::SansSerif); - fontGroup = new gfxFontGroup( - presContext, sans->families, &style, language, explicitLanguage, - presContext ? presContext->GetTextPerfMetrics() : nullptr, nullptr, - devToCssSize, StyleFontVariantEmoji::Normal); - if (fontGroup) { - CurrentState().font = kDefaultFontStyle; - } else { - NS_ERROR("Default canvas font is invalid"); - } + ErrorResult err; + constexpr auto kDefaultFontStyle = "10px sans-serif"_ns; + const float kDefaultFontSize = 10.0; + // If the font has already been set, we're re-creating the fontGroup + // and should re-use the existing font attribute; if not, we initialize + // it to the canvas default. + nsAutoCString currentFont(CurrentState().font); + if (currentFont.IsEmpty()) { + currentFont = kDefaultFontStyle; + } + bool fontUpdated = SetFontInternal(currentFont, err); + if (err.Failed() || !fontUpdated) { + err.SuppressException(); + // XXX Should we get a default lang from the prescontext or something? + nsAtom* language = nsGkAtoms::x_western; + bool explicitLanguage = false; + gfxFontStyle style; + style.size = kDefaultFontSize; + int32_t perDevPixel, perCSSPixel; + GetAppUnitsValues(&perDevPixel, &perCSSPixel); + gfxFloat devToCssSize = gfxFloat(perDevPixel) / gfxFloat(perCSSPixel); + const auto* sans = + Servo_FontFamily_Generic(StyleGenericFontFamily::SansSerif); + CurrentState().fontGroup = new gfxFontGroup( + presContext, sans->families, &style, language, explicitLanguage, + presContext ? presContext->GetTextPerfMetrics() : nullptr, nullptr, + devToCssSize, StyleFontVariantEmoji::Normal); + if (CurrentState().fontGroup) { + CurrentState().font = kDefaultFontStyle; + } else { + NS_ERROR("Default canvas font is invalid"); } } - return fontGroup; + return CurrentState().fontGroup; } // @@ -5711,7 +5727,7 @@ HTMLVideoElement* video = HTMLVideoElement::FromNodeOrNull(element); if (video && mBufferProvider->IsAccelerated() && mTarget->IsRecording() && - !(!NeedToApplyFilter() && NeedToDrawShadow())) { + !(NeedToApplyFilter() || NeedToDrawShadow())) { res = nsLayoutUtils::SurfaceFromElement( video, sfeFlags, mTarget, /* aOptimizeSourceSurface */ false); surfaceDescriptor = MaybeGetSurfaceDescriptorForRemoteCanvas(res); diff -Nru thunderbird-140.9.0esr/dom/canvas/CanvasRenderingContext2D.h thunderbird-140.10.0esr/dom/canvas/CanvasRenderingContext2D.h --- thunderbird-140.9.0esr/dom/canvas/CanvasRenderingContext2D.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/CanvasRenderingContext2D.h 2026-04-21 14:52:52.000000000 +0000 @@ -613,11 +613,13 @@ protected: /** * Helper to parse a value for the letterSpacing or wordSpacing attribute. - * If successful, returns the result in aValue, and the whitespace-normalized - * value string in aNormalized; if unsuccessful these are left untouched. + * If the string can be parsed, returns Some(value) and sets aNormalized to + * the normalized form of the specified string. If it cannot be parsed as a + * spacing value, returns Nothing, and aNormalized is untouched. + * Note that ParseSpacing may flush style (to resolve font-relative units). */ - void ParseSpacing(const nsACString& aSpacing, float* aValue, - nsACString& aNormalized); + mozilla::Maybe ParseSpacing(const nsACString& aSpacing, + nsACString& aNormalized); already_AddRefed ResolveStyleForProperty( nsCSSPropertyID aProperty, const nsACString& aValue); @@ -1000,10 +1002,14 @@ * last call to UpdateFilter and now. */ const gfx::FilterDescription& EnsureUpdatedFilter() { - bool isWriteOnly = mCanvasElement && mCanvasElement->IsWriteOnly(); + bool isWriteOnly = IsWriteOnly() || + (mCanvasElement && mCanvasElement->IsWriteOnly()) || + (mOffscreenCanvas && mOffscreenCanvas->IsWriteOnly()); if (CurrentState().filterSourceGraphicTainted != isWriteOnly) { - UpdateFilter(/* aFlushIfNeeded = */ true); - EnsureTarget(); + // Do not flush here: this runs inside drawing operations that hold raw + // references to mPath/state, and a flush can run script that resets the + // context, leading to UAF. Flush already happened at SetFilter() time. + UpdateFilter(/* aFlushIfNeeded = */ false); } MOZ_ASSERT(CurrentState().filterSourceGraphicTainted == isWriteOnly); return CurrentState().filter; diff -Nru thunderbird-140.9.0esr/dom/canvas/ClientWebGLContext.cpp thunderbird-140.10.0esr/dom/canvas/ClientWebGLContext.cpp --- thunderbird-140.9.0esr/dom/canvas/ClientWebGLContext.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/ClientWebGLContext.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -198,7 +198,18 @@ : mIsWebGL2(webgl2), mExtLoseContext(new ClientWebGLExtensionLoseContext(*this)) {} -ClientWebGLContext::~ClientWebGLContext() { RemovePostRefreshObserver(); } +static inline void SafeReleaseNotLostData(std::shared_ptr& notLost) { + if (notLost) { + const auto keepAlive = std::move(notLost); + keepAlive->extensions = {}; + keepAlive->state = {}; + } +} + +ClientWebGLContext::~ClientWebGLContext() { + RemovePostRefreshObserver(); + SafeReleaseNotLostData(mNotLost); +} void ClientWebGLContext::JsWarning(const std::string& utf8) const { nsIGlobalObject* global = nullptr; @@ -4511,6 +4522,14 @@ std::string{"gpuProcessTextureId works only in GPU process."}); } } break; + case layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr: { + MOZ_ASSERT(desc->image); + keepAliveImage = desc->image; + } break; + case layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface: { + MOZ_ASSERT(desc->image); + keepAliveImage = desc->image; + } break; case layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo: { const auto& inProcess = mNotLost->inProcess; MOZ_ASSERT(desc->image); @@ -7004,11 +7023,7 @@ } void ImplCycleCollectionUnlink(std::shared_ptr& field) { - if (!field) return; - const auto keepAlive = field; - keepAlive->extensions = {}; - keepAlive->state = {}; - field = nullptr; + SafeReleaseNotLostData(field); } // ----------------------------------------------------- diff -Nru thunderbird-140.9.0esr/dom/canvas/DrawTargetWebgl.cpp thunderbird-140.10.0esr/dom/canvas/DrawTargetWebgl.cpp --- thunderbird-140.9.0esr/dom/canvas/DrawTargetWebgl.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/DrawTargetWebgl.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -21,7 +21,6 @@ #include "mozilla/gfx/Swizzle.h" #include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/RemoteTextureMap.h" -#include "mozilla/widget/ScreenManager.h" #include "skia/include/core/SkPixmap.h" #include "nsContentUtils.h" #include "nsIMemoryReporter.h" @@ -817,7 +816,7 @@ return !!data; } -bool DrawTargetWebgl::SetSimpleClipRect() { +Maybe DrawTargetWebgl::ComputeSimpleClipRect() const { // Determine whether the clipping rectangle is simple enough to accelerate. // Check if there is a device space clip rectangle available from the Skia // target. @@ -829,9 +828,7 @@ if (!clip->IsEmpty() && clip->Contains(GetRect())) { clip = Some(GetRect()); } - mSharedContext->SetClipRect(*clip); - mSharedContext->SetNoClipMask(); - return true; + return Some(Rect(*clip)); } // There was no pixel-aligned clip rect available, so check the clip stack to @@ -842,15 +839,22 @@ // complex. if (clipStack.mPath || !clipStack.mTransform.PreservesAxisAlignedRectangles()) { - return false; + return Nothing(); } // Transform the rect and intersect it with the current clip. rect = clipStack.mTransform.TransformBounds(clipStack.mRect).Intersect(rect); } - mSharedContext->SetClipRect(rect); - mSharedContext->SetNoClipMask(); - return true; + return Some(rect); +} + +bool DrawTargetWebgl::SetSimpleClipRect() { + if (Maybe rect = ComputeSimpleClipRect()) { + mSharedContext->SetClipRect(*rect); + mSharedContext->SetNoClipMask(); + return true; + } + return false; } // Installs the Skia clip rectangle, if applicable, onto the shared WebGL @@ -874,6 +878,21 @@ return mSharedContext->SetTarget(this); } +// Whether clipping may be necessary for the operation. This tries to avoid +// generating a complex clip mask in case the current target is not active +// or not using WebGL. If there is only a simple clip mask and its bounds +// encompass the viewport, then no clipping is required. +bool DrawTargetWebgl::ShouldClip() { + if (mSharedContext->IsCurrentTarget(this) && !mRefreshClipState) { + return mSharedContext->HasClipMask() || + !mSharedContext->mClipAARect.Contains(Rect(GetRect())); + } + if (Maybe rect = ComputeSimpleClipRect()) { + return !rect->Contains(Rect(GetRect())); + } + return true; +} + bool SharedContextWebgl::IsContextLost() const { return !mWebgl || mWebgl->IsContextLost(); } @@ -905,29 +924,12 @@ return false; } - // Maximum pref allows 3 different options: - // 0 means unlimited size, + // Maximum pref allows 2 different options: + // <= 0 means unlimited size, // > 0 means use value as an absolute threshold, - // < 0 means use the number of screen pixels as a threshold. int32_t maxSize = StaticPrefs::gfx_canvas_accelerated_max_size(); - if (maxSize > 0) { - if (std::max(aSize.width, aSize.height) > maxSize) { - return false; - } - } else if (maxSize < 0) { - // Default to historical mobile screen size of 980x480, like FishIEtank. - // In addition, allow acceleration up to this size even if the screen is - // smaller. A lot content expects this size to work well. See Bug 999841 - static const int32_t kScreenPixels = 980 * 480; - - if (RefPtr screen = - widget::ScreenManager::GetSingleton().GetPrimaryScreen()) { - LayoutDeviceIntSize screenSize = screen->GetRect().Size(); - if (aSize.width * aSize.height > - std::max(screenSize.width * screenSize.height, kScreenPixels)) { - return false; - } - } + if (maxSize > 0 && std::max(aSize.width, aSize.height) > maxSize) { + return false; } return true; @@ -1645,9 +1647,7 @@ // If the clear rectangle encompasses the entire viewport and is not clipped, // then mark the target as entirely clear. - if (containsViewport && mSharedContext->IsCurrentTarget(this) && - !mSharedContext->HasClipMask() && - mSharedContext->mClipAARect.Contains(Rect(GetRect()))) { + if (containsViewport && !ShouldClip()) { mIsClear = true; } } @@ -2038,6 +2038,7 @@ if (srcRect.IsEmpty()) { return true; } + Maybe map; if (aData) { // If the source rect could not possibly overlap the surface, then it is // effectively empty with nothing to upload. @@ -2058,15 +2059,15 @@ // The surface needs to be uploaded to its backing texture either to // initialize or update the texture handle contents. Map the data // contents of the surface so it can be read. - DataSourceSurface::ScopedMap map(aData, DataSourceSurface::READ); - if (!map.IsMapped()) { + map.emplace(aData, DataSourceSurface::READ); + if (!map->IsMapped()) { return false; } - int32_t stride = map.GetStride(); + int32_t stride = map->GetStride(); // Get the data pointer range considering the sampling rect offset and // size. Span range( - map.GetData() + srcRect.y * size_t(stride) + srcRect.x * bpp, + map->GetData() + srcRect.y * size_t(stride) + srcRect.x * bpp, std::max(srcRect.height - 1, 0) * size_t(stride) + srcRect.width * bpp); texDesc.cpuData = Some(range); // If the stride happens to be 4 byte aligned, assume that is the diff -Nru thunderbird-140.9.0esr/dom/canvas/DrawTargetWebgl.h thunderbird-140.10.0esr/dom/canvas/DrawTargetWebgl.h --- thunderbird-140.9.0esr/dom/canvas/DrawTargetWebgl.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/DrawTargetWebgl.h 2026-04-21 14:52:51.000000000 +0000 @@ -617,9 +617,11 @@ return mSharedContext->SupportsPattern(aPattern); } + Maybe ComputeSimpleClipRect() const; bool SetSimpleClipRect(); bool GenerateComplexClipMask(); bool PrepareContext(bool aClipped = true); + bool ShouldClip(); void DrawRectFallback(const Rect& aRect, const Pattern& aPattern, const DrawOptions& aOptions, diff -Nru thunderbird-140.9.0esr/dom/canvas/ImageData.cpp thunderbird-140.10.0esr/dom/canvas/ImageData.cpp --- thunderbird-140.9.0esr/dom/canvas/ImageData.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/ImageData.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -146,10 +146,29 @@ !JS_ReadTypedArray(aReader, &dataArray)) { return nullptr; } - MOZ_ASSERT(dataArray.isObject()); - JS::Rooted arrayObj(aCx, &dataArray.toObject()); - RefPtr imageData = new ImageData(aGlobal, width, height, arrayObj); + JS::Rooted dataObj(aCx, &dataArray.toObject()); + RootedSpiderMonkeyInterface data(aCx); + if (!data.Init(dataObj)) { + return nullptr; + } + + Maybe maybeLength = data.ProcessData( + [&](const Span& aData, JS::AutoCheckCannotGC&& nogc) { + return Some(aData.Length()); + }); + if (maybeLength.isNothing()) { + return nullptr; + } + + CheckedInt calculatedLength = + CheckedInt(width) * height * 4; + if (!calculatedLength.isValid() || + size_t(calculatedLength.value()) != maybeLength.value()) { + return nullptr; + } + + RefPtr imageData = new ImageData(aGlobal, width, height, dataObj); return imageData.forget(); } diff -Nru thunderbird-140.9.0esr/dom/canvas/TexUnpackBlob.cpp thunderbird-140.10.0esr/dom/canvas/TexUnpackBlob.cpp --- thunderbird-140.9.0esr/dom/canvas/TexUnpackBlob.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/TexUnpackBlob.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -391,8 +391,8 @@ } bool TexUnpackBlob::ConvertIfNeeded( - const WebGLContext* const webgl, const uint32_t rowLength, - const uint32_t rowCount, WebGLTexelFormat srcFormat, + const WebGLContext* const webgl, const size_t rowLength, + const size_t rowCount, WebGLTexelFormat srcFormat, const uint8_t* const srcBegin, const ptrdiff_t srcStride, WebGLTexelFormat dstFormat, const ptrdiff_t dstStride, const uint8_t** const out_begin, @@ -469,7 +469,7 @@ //// - const auto dstTotalBytes = CheckedUint32(rowCount) * dstStride; + const auto dstTotalBytes = CheckedInt(rowCount) * dstStride; if (!dstTotalBytes.isValid()) { webgl->ErrorOutOfMemory("Calculation failed."); return false; @@ -855,9 +855,14 @@ : dom::PredefinedColorSpace::Srgb; bool sameColorSpace = (srcColorSpace == dstColorSpace); - const auto reason = BlitPreventReason( + Maybe reason; + if (!webgl->IsUploadableSdType(sd)) { + reason = Some(std::string("Unsupported surface descriptor type")); + } else { + reason = BlitPreventReason( level, {xOffset, yOffset, zOffset}, dui->internalFormat, pi, mDesc, webgl->mOptionalRenderableFormatBits, sameColorSpace); + } if (reason) { webgl->GeneratePerfWarning( "Failed to hit GPU-copy fast-path." diff -Nru thunderbird-140.9.0esr/dom/canvas/TexUnpackBlob.h thunderbird-140.10.0esr/dom/canvas/TexUnpackBlob.h --- thunderbird-140.9.0esr/dom/canvas/TexUnpackBlob.h 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/TexUnpackBlob.h 2026-04-21 14:52:51.000000000 +0000 @@ -65,8 +65,8 @@ virtual ~TexUnpackBlob() = default; protected: - bool ConvertIfNeeded(const WebGLContext*, const uint32_t rowLength, - const uint32_t rowCount, WebGLTexelFormat srcFormat, + bool ConvertIfNeeded(const WebGLContext*, const size_t rowLength, + const size_t rowCount, WebGLTexelFormat srcFormat, const uint8_t* const srcBegin, const ptrdiff_t srcStride, WebGLTexelFormat dstFormat, const ptrdiff_t dstStride, diff -Nru thunderbird-140.9.0esr/dom/canvas/WebGLContext.cpp thunderbird-140.10.0esr/dom/canvas/WebGLContext.cpp --- thunderbird-140.9.0esr/dom/canvas/WebGLContext.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/WebGLContext.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -630,50 +630,6 @@ // - - const auto UploadableSdTypes = [&]() { - webgl::EnumMask types; - types[layers::SurfaceDescriptor::TSurfaceDescriptorBuffer] = true; - // Only support canvas surface interchange if using AC2D. This guarantees - // that WebGL and AC2D commands are sequenced and processed on the same - // thread, so that there is no mal-ordering between AC2D and WebGL - // processing. We can flush out AC2D commands to produce a surface in time - // for WebGL to use without requiring any blocking to occur. - types[layers::SurfaceDescriptor::TSurfaceDescriptorCanvasSurface] = - gfx::gfxVars::UseAcceleratedCanvas2D(); - // This is conditional on not using the Compositor thread because we may - // need to synchronize with the RDD process over the PVideoBridge protocol - // to wait for the texture to be available in the compositor process. We - // cannot block on the Compositor thread, so in that configuration, we would - // prefer to do the readback from the RDD which is guaranteed to work, and - // only block the owning thread for WebGL. - const bool offCompositorThread = gfx::gfxVars::UseCanvasRenderThread() || - !gfx::gfxVars::SupportsThreadsafeGL(); - types[layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo] = - offCompositorThread; - // Similarly to the PVideoBridge protocol, we may need to synchronize with - // the content process over the PCompositorManager protocol to wait for the - // shared surface to be available in the compositor process, and we cannot - // block on the Compositor thread. - types[layers::SurfaceDescriptor::TSurfaceDescriptorExternalImage] = - offCompositorThread; - if (webgl->gl->IsANGLE()) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorD3D10] = true; - types[layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr] = true; - } - if (kIsMacOS) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface] = true; - } - if (kIsAndroid) { - types[layers::SurfaceDescriptor::TSurfaceTextureDescriptor] = true; - } - if (kIsLinux) { - types[layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf] = true; - } - return types; - }; - - // - - constexpr GLenum SHADER_TYPES[] = { LOCAL_GL_VERTEX_SHADER, LOCAL_GL_FRAGMENT_SHADER, @@ -709,7 +665,7 @@ out->options = webgl->mOptions; out->limits = *webgl->mLimits; - out->uploadableSdTypes = UploadableSdTypes(); + out->uploadableSdTypes = webgl->mUploadableSdTypes; out->vendor = webgl->gl->Vendor(); out->optionalRenderableFormatBits = webgl->mOptionalRenderableFormatBits; @@ -811,6 +767,58 @@ gl->ResetSyncCallCount("WebGLContext Initialization"); LoseLruContextIfLimitExceeded(); + + InitUploadableSdTypes(); +} + +void WebGLContext::InitUploadableSdTypes() { + webgl::EnumMask types; + types[layers::SurfaceDescriptor::TSurfaceDescriptorBuffer] = true; + // Only support canvas surface interchange if using AC2D. This guarantees + // that WebGL and AC2D commands are sequenced and processed on the same + // thread, so that there is no mal-ordering between AC2D and WebGL + // processing. We can flush out AC2D commands to produce a surface in time + // for WebGL to use without requiring any blocking to occur. + types[layers::SurfaceDescriptor::TSurfaceDescriptorCanvasSurface] = + gfx::gfxVars::UseAcceleratedCanvas2D(); + // This is conditional on not using the Compositor thread because we may + // need to synchronize with the RDD process over the PVideoBridge protocol + // to wait for the texture to be available in the compositor process. We + // cannot block on the Compositor thread, so in that configuration, we would + // prefer to do the readback from the RDD which is guaranteed to work, and + // only block the owning thread for WebGL. + const bool offCompositorThread = gfx::gfxVars::UseCanvasRenderThread() || + !gfx::gfxVars::SupportsThreadsafeGL(); + types[layers::SurfaceDescriptor::TSurfaceDescriptorGPUVideo] = + offCompositorThread; + // Similarly to the PVideoBridge protocol, we may need to synchronize with + // the content process over the PCompositorManager protocol to wait for the + // shared surface to be available in the compositor process, and we cannot + // block on the Compositor thread. + types[layers::SurfaceDescriptor::TSurfaceDescriptorExternalImage] = + offCompositorThread; + if (gl->IsANGLE()) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorD3D10] = true; + types[layers::SurfaceDescriptor::TSurfaceDescriptorDXGIYCbCr] = true; + } + if (kIsMacOS) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorMacIOSurface] = true; + } + if (kIsAndroid) { + types[layers::SurfaceDescriptor::TSurfaceTextureDescriptor] = true; + } + if (kIsLinux) { + types[layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf] = true; + } + + mUploadableSdTypes = types; +} + +bool WebGLContext::IsUploadableSdType( + const layers::SurfaceDescriptor& sd) const { + // If the WebGLContext is remote, then validate that the SD is an allowed + // type. + return !bool(mHost) || mUploadableSdTypes[sd.type()]; } void WebGLContext::SetCompositableHost( @@ -2787,6 +2795,23 @@ const Maybe bytesPerRowStrideOverride) { auto state = stateOrZero; + // Enforce the GLES alignmentInTypeElems invariant. ElemsPerRowStride below + // assumes a in {1,2,4,8}. Callers at IPC entry points validate this but + // alignmentInTypeElems is deserialized from IPC, so guard it here too. + switch (state.alignmentInTypeElems) { + case 1: + case 2: + case 4: + case 8: + break; + default: { + const auto text = nsPrintfCString( + "PACK/UNPACK_ALIGNMENT must be one of [1,2,4,8], was %u.", + state.alignmentInTypeElems); + return Err(mozilla::ToString(text)); + } + } + if (!IsTexTarget3D(target)) { state.skipImages = 0; state.imageHeight = 0; diff -Nru thunderbird-140.9.0esr/dom/canvas/WebGLContext.h thunderbird-140.10.0esr/dom/canvas/WebGLContext.h --- thunderbird-140.9.0esr/dom/canvas/WebGLContext.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/WebGLContext.h 2026-04-21 14:52:52.000000000 +0000 @@ -292,6 +292,7 @@ WebGLContextOptions mOptions; const uint32_t mPrincipalKey; Maybe mLimits; + webgl::EnumMask mUploadableSdTypes; const uint32_t mMaxVertIdsPerDraw = StaticPrefs::webgl_max_vert_ids_per_draw(); @@ -340,6 +341,7 @@ webgl::OptionalRenderableFormatBits mOptionalRenderableFormatBits = webgl::OptionalRenderableFormatBits{0}; void FinishInit(); + void InitUploadableSdTypes(); protected: WebGLContext(HostWebGLContext*, const webgl::InitContextDesc&); @@ -995,6 +997,8 @@ bool IsFormatValidForFB(TexInternalFormat format) const; + bool IsUploadableSdType(const layers::SurfaceDescriptor& sd) const; + protected: // ------------------------------------------------------------------------- // WebGL extensions (implemented in WebGLContextExtensions.cpp) diff -Nru thunderbird-140.9.0esr/dom/canvas/WebGLContextGL.cpp thunderbird-140.10.0esr/dom/canvas/WebGLContextGL.cpp --- thunderbird-140.9.0esr/dom/canvas/WebGLContextGL.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/WebGLContextGL.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -1133,6 +1133,18 @@ ////// + // Reject invalid pack alignment. + switch (desc.packState.alignmentInTypeElems) { + case 1: + case 2: + case 4: + case 8: + break; // all good + default: + ErrorInvalidValue("pack alignment must be 1, 2, 4, or 8."); + return {}; + } + const auto& srcOffset = desc.srcOffset; const auto& size = desc.size; diff -Nru thunderbird-140.9.0esr/dom/canvas/WebGLShaderValidator.cpp thunderbird-140.10.0esr/dom/canvas/WebGLShaderValidator.cpp --- thunderbird-140.9.0esr/dom/canvas/WebGLShaderValidator.cpp 2026-03-20 19:18:30.000000000 +0000 +++ thunderbird-140.10.0esr/dom/canvas/WebGLShaderValidator.cpp 2026-04-21 14:52:51.000000000 +0000 @@ -487,23 +487,28 @@ size_t ShaderValidatorResults::SizeOfIncludingThis( const MallocSizeOf fnSizeOf) const { auto ret = fnSizeOf(this); - ret += mInfoLog.size(); - ret += mObjectCode.size(); - for (const auto& cur : mAttributes) { - ret += fnSizeOf(&cur); + // std::string heap allocations are not measured here because: + // 1. Small String Optimization (SSO) means data() may point to inline + // storage within the std::string object (already counted in + // fnSizeOf(this)) + // 2. There's no standard way to distinguish SSO from heap-allocated strings + // 3. Calling fnSizeOf on a pointer to inline storage is inappropriate + + if (!mAttributes.empty()) { + ret += fnSizeOf(mAttributes.data()); } - for (const auto& cur : mInterfaceBlocks) { - ret += fnSizeOf(&cur); + if (!mInterfaceBlocks.empty()) { + ret += fnSizeOf(mInterfaceBlocks.data()); } - for (const auto& cur : mOutputVariables) { - ret += fnSizeOf(&cur); + if (!mOutputVariables.empty()) { + ret += fnSizeOf(mOutputVariables.data()); } - for (const auto& cur : mUniforms) { - ret += fnSizeOf(&cur); + if (!mUniforms.empty()) { + ret += fnSizeOf(mUniforms.data()); } - for (const auto& cur : mVaryings) { - ret += fnSizeOf(&cur); + if (!mVaryings.empty()) { + ret += fnSizeOf(mVaryings.data()); } return ret; diff -Nru thunderbird-140.9.0esr/dom/clients/manager/ClientManagerChild.cpp thunderbird-140.10.0esr/dom/clients/manager/ClientManagerChild.cpp --- thunderbird-140.9.0esr/dom/clients/manager/ClientManagerChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/clients/manager/ClientManagerChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -55,8 +55,9 @@ mozilla::ipc::IPCResult ClientManagerChild::RecvPClientNavigateOpConstructor( PClientNavigateOpChild* aActor, const ClientNavigateOpConstructorArgs& aArgs) { - auto actor = static_cast(aActor); - actor->Init(aArgs); + RefPtr proxy = aActor->GetLifecycleProxy(); + auto* actor = static_cast(aActor); + actor->Init(aArgs, proxy); return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/dom/clients/manager/ClientNavigateOpChild.cpp thunderbird-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.cpp --- thunderbird-140.9.0esr/dom/clients/manager/ClientNavigateOpChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -152,7 +152,8 @@ } // anonymous namespace RefPtr ClientNavigateOpChild::DoNavigate( - const ClientNavigateOpConstructorArgs& aArgs) { + const ClientNavigateOpConstructorArgs& aArgs, + mozilla::ipc::ActorLifecycleProxy* aProxy) { nsCOMPtr window; // Navigating the target client window will result in the original @@ -278,6 +279,12 @@ return ClientOpPromise::CreateAndReject(result, __func__); } + if (!aProxy->Get() || !CanSend()) { + CopyableErrorResult result; + result.ThrowInvalidStateError("Unknown Client"); + return ClientOpPromise::CreateAndReject(result, __func__); + } + RefPtr promise = new ClientOpPromise::Private(__func__); @@ -305,8 +312,12 @@ mPromiseRequestHolder.DisconnectIfExists(); } -void ClientNavigateOpChild::Init(const ClientNavigateOpConstructorArgs& aArgs) { - RefPtr promise = DoNavigate(aArgs); +void ClientNavigateOpChild::Init(const ClientNavigateOpConstructorArgs& aArgs, + mozilla::ipc::ActorLifecycleProxy* aProxy) { + RefPtr promise = DoNavigate(aArgs, aProxy); + if (!aProxy->Get() || !CanSend()) { + return; + } // Normally we get the event target from the window in DoNavigate(). If a // failure occurred, though, we may need to fall back to the current thread diff -Nru thunderbird-140.9.0esr/dom/clients/manager/ClientNavigateOpChild.h thunderbird-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.h --- thunderbird-140.9.0esr/dom/clients/manager/ClientNavigateOpChild.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/clients/manager/ClientNavigateOpChild.h 2026-04-21 14:52:52.000000000 +0000 @@ -16,7 +16,8 @@ nsCOMPtr mSerialEventTarget; [[nodiscard]] RefPtr DoNavigate( - const ClientNavigateOpConstructorArgs& aArgs); + const ClientNavigateOpConstructorArgs& aArgs, + mozilla::ipc::ActorLifecycleProxy* aProxy); // PClientNavigateOpChild interface void ActorDestroy(ActorDestroyReason aReason) override; @@ -25,7 +26,8 @@ ClientNavigateOpChild() = default; ~ClientNavigateOpChild() = default; - void Init(const ClientNavigateOpConstructorArgs& aArgs); + void Init(const ClientNavigateOpConstructorArgs& aArgs, + mozilla::ipc::ActorLifecycleProxy* aProxy); }; } // namespace mozilla::dom diff -Nru thunderbird-140.9.0esr/dom/clients/manager/ClientSource.cpp thunderbird-140.10.0esr/dom/clients/manager/ClientSource.cpp --- thunderbird-140.9.0esr/dom/clients/manager/ClientSource.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/clients/manager/ClientSource.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -520,11 +520,12 @@ return ClientOpPromise::CreateAndReject(rv, __func__); } nsCOMPtr outer; - nsPIDOMWindowInner* inner = GetInnerWindow(); + nsCOMPtr inner = GetInnerWindow(); + nsIDocShell* docshell = nullptr; if (inner) { outer = inner->GetOuterWindow(); } else { - nsIDocShell* docshell = GetDocShell(); + docshell = GetDocShell(); if (docshell) { outer = docshell->GetWindow(); } @@ -537,9 +538,48 @@ } MOZ_ASSERT(NS_IsMainThread()); + + // Inlined from `ClientSource::SnapshotWindowState()`: + // Should not be necessary after bug 543435. Clean this up in bug 2025284. + if (docshell) { + // Force the creation of the initial document if it does not yet exist. + if (!docshell->GetDocument()) { + CopyableErrorResult rv; + rv.ThrowInvalidStateError("No document available."); + return ClientOpPromise::CreateAndReject(rv, __func__); + } + inner = GetInnerWindow(); + } + nsFocusManager::FocusWindow(outer, aArgs.callerType()); - Result state = SnapshotState(); + Result state = + [&]() -> Result { + if (!inner) { + // Inlined from `ClientSource::SnapshotWindowState()`: + return ClientState(ClientWindowState(VisibilityState::Hidden, TimeStamp(), + StorageAccess::eDeny, false)); + } + if (inner->GetClientSource() == this) { + // The pointer comparison assumes that an inner window + // cannot gain a new ClientSource other than this same + // `ClientSource` having moved from a docshell owner to an + // inner window owner gained via `outer`, so we don't need to worry + // about a newly-allocated ClientSource occupying the same + // memory as the one pointed to by `this`. That is, in the case + // of the pointers being unequal, `inner->GetClientSource()` + // returns `nullptr` and `this` is an invalid pointer. + // Per [expr.eq], it's not UB to compare a pointer to a deleted + // object, since no pointer comparisons are UB anymore. The + // case about pointer-past-end for a different object being + // _unspecified_ behavior does not apply here. + return SnapshotState(); + } + ErrorResult rv; + rv.ThrowInvalidStateError("Client destroyed during focus"); + return Err(std::move(rv)); + }(); + if (state.isErr()) { return ClientOpPromise::CreateAndReject( CopyableErrorResult(state.unwrapErr()), __func__); diff -Nru thunderbird-140.9.0esr/dom/console/Console.cpp thunderbird-140.10.0esr/dom/console/Console.cpp --- thunderbird-140.9.0esr/dom/console/Console.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/console/Console.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -424,6 +424,7 @@ } Sequence arguments; + SequenceRooter rooter(aCx, &arguments); for (uint32_t i = 0; i < length; ++i) { JS::Rooted value(aCx); diff -Nru thunderbird-140.9.0esr/dom/cookiestore/CookieStoreNotifier.cpp thunderbird-140.10.0esr/dom/cookiestore/CookieStoreNotifier.cpp --- thunderbird-140.9.0esr/dom/cookiestore/CookieStoreNotifier.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/cookiestore/CookieStoreNotifier.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -196,10 +196,17 @@ void CookieStoreNotifier::FireDelayedDOMEvents() { MOZ_ASSERT(NS_IsMainThread()); + RefPtr kungFuDeathGrip(this); + nsTArray> delayedDOMEvents; delayedDOMEvents.SwapElements(mDelayedDOMEvents); for (Event* event : delayedDOMEvents) { + // mCookieStore is a raw pointer cleared by Disentangle(). + if (!mCookieStore) { + break; + } + mCookieStore->DispatchEvent(*event); } } diff -Nru thunderbird-140.9.0esr/dom/events/EventListenerManager.cpp thunderbird-140.10.0esr/dom/events/EventListenerManager.cpp --- thunderbird-140.9.0esr/dom/events/EventListenerManager.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/events/EventListenerManager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2134,9 +2134,13 @@ } JSEventHandler* jsEventHandler = listener->GetJSEventHandler(); - + Maybe> pin; if (listener->mHandlerIsString) { - CompileEventHandlerInternal(listener, aEventName, nullptr, nullptr); + pin.emplace(jsEventHandler); + if (NS_FAILED(CompileEventHandlerInternal(listener, aEventName, nullptr, + nullptr))) { + listener = nullptr; + } } const TypedEventHandler& typedHandler = diff -Nru thunderbird-140.9.0esr/dom/events/IMEContentObserver.cpp thunderbird-140.10.0esr/dom/events/IMEContentObserver.cpp --- thunderbird-140.9.0esr/dom/events/IMEContentObserver.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/events/IMEContentObserver.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -788,7 +788,8 @@ bool IMEContentObserver::OnMouseButtonEvent(nsPresContext& aPresContext, WidgetMouseEvent& aMouseEvent) { if (!mIMENotificationRequests || - !mIMENotificationRequests->WantMouseButtonEventOnChar()) { + !mIMENotificationRequests->contains( + IMENotificationRequest::MouseEventOnChar)) { return false; } if (!aMouseEvent.IsTrusted() || aMouseEvent.DefaultPrevented() || diff -Nru thunderbird-140.9.0esr/dom/events/IMEContentObserver.h thunderbird-140.10.0esr/dom/events/IMEContentObserver.h --- thunderbird-140.9.0esr/dom/events/IMEContentObserver.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/events/IMEContentObserver.h 2026-04-21 14:52:52.000000000 +0000 @@ -47,6 +47,7 @@ using SelectionChangeData = widget::IMENotification::SelectionChangeData; using TextChangeData = widget::IMENotification::TextChangeData; using TextChangeDataBase = widget::IMENotification::TextChangeDataBase; + using IMENotificationRequest = widget::IMENotificationRequest; using IMENotificationRequests = widget::IMENotificationRequests; using IMEMessage = widget::IMEMessage; enum class ForRemoval : bool { No, Yes }; @@ -163,7 +164,8 @@ bool IsEditorHandlingEventForComposition() const; bool KeepAliveDuringDeactive() const { return mIMENotificationRequests && - mIMENotificationRequests->WantDuringDeactive(); + mIMENotificationRequests->contains( + IMENotificationRequest::NotifyDuringInactive); } [[nodiscard]] bool EditorIsTextEditor() const { return mEditorBase && mEditorBase->IsTextEditor(); @@ -328,12 +330,13 @@ void UnregisterObservers(); void FlushMergeableNotifications(); bool NeedsTextChangeNotification() const { - return mIMENotificationRequests && - mIMENotificationRequests->WantTextChange(); + return mIMENotificationRequests && mIMENotificationRequests->contains( + IMENotificationRequest::TextChange); } bool NeedsPositionChangeNotification() const { return mIMENotificationRequests && - mIMENotificationRequests->WantPositionChanged(); + mIMENotificationRequests->contains( + IMENotificationRequest::PositionChange); } void ClearPendingNotifications() { mNeedsToNotifyIMEOfFocusSet = false; diff -Nru thunderbird-140.9.0esr/dom/events/IMEStateManager.cpp thunderbird-140.10.0esr/dom/events/IMEStateManager.cpp --- thunderbird-140.9.0esr/dom/events/IMEStateManager.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/events/IMEStateManager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -198,13 +198,12 @@ RefPtr composition = sTextCompositions->GetCompositionFor(oldWidget); if (composition) { - MOZ_LOG( - sISMLog, LogLevel::Debug, - (" OnFocusMovedBetweenBrowsers(), requesting to commit " - "composition to " - "the (previous) focused widget (would request=%s)", - GetBoolName( - !oldWidget->IMENotificationRequestsRef().WantDuringDeactive()))); + MOZ_LOG(sISMLog, LogLevel::Debug, + (" OnFocusMovedBetweenBrowsers(), requesting to commit " + "composition to " + "the (previous) focused widget (would request=%s)", + GetBoolName(!oldWidget->IMENotificationRequestsRef().contains( + IMENotificationRequest::NotifyDuringInactive)))); NotifyIME(REQUEST_TO_COMMIT_COMPOSITION, oldWidget, composition->GetBrowserParent()); } @@ -727,8 +726,8 @@ // such case, sFocusedIMEWidget is perhaps nullptr). For example, IME // may receive only blur notification but still has composition. // We need to clean up only the oldWidget's composition state here. - if (aPresContext || - !oldWidget->IMENotificationRequestsRef().WantDuringDeactive()) { + if (aPresContext || !oldWidget->IMENotificationRequestsRef().contains( + IMENotificationRequest::NotifyDuringInactive)) { MOZ_LOG( sISMLog, LogLevel::Info, (" OnChangeFocusInternal(), requesting to commit composition to " diff -Nru thunderbird-140.9.0esr/dom/fetch/Fetch.cpp thunderbird-140.10.0esr/dom/fetch/Fetch.cpp --- thunderbird-140.9.0esr/dom/fetch/Fetch.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fetch/Fetch.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -66,21 +66,17 @@ // https://fetch.spec.whatwg.org/#concept-http-network-fetch // If stream is readable, then error stream with ... void AbortStream(JSContext* aCx, ReadableStream* aReadableStream, - ErrorResult& aRv, JS::Handle aReasonDetails) { + AbortSignalImpl* aSignal, ErrorResult& aRv) { + MOZ_ASSERT(aSignal->Aborted()); + if (aReadableStream->State() != ReadableStream::ReaderState::Readable) { return; } - JS::Rooted value(aCx, aReasonDetails); - - if (aReasonDetails.isUndefined()) { - RefPtr e = DOMException::Create(NS_ERROR_DOM_ABORT_ERR); - if (!GetOrCreateDOMReflector(aCx, e, &value)) { - return; - } - } + JS::Rooted reason(aCx); + aSignal->GetReason(aCx, &reason); - aReadableStream->ErrorNative(aCx, value, aRv); + aReadableStream->ErrorNative(aCx, reason, aRv); } } // namespace @@ -533,12 +529,8 @@ if (signalImpl && signalImpl->Aborted()) { // Already aborted signal rejects immediately. - JS::Rooted reason(cx, signalImpl->RawReason()); - if (reason.get().isUndefined()) { - aRv.Throw(NS_ERROR_DOM_ABORT_ERR); - return nullptr; - } - + JS::Rooted reason(cx); + signalImpl->GetReason(cx, &reason); p->MaybeReject(reason); return p.forget(); } @@ -1422,16 +1414,15 @@ DerivedClass()->GetSignalImplToConsumeBody(); if (signalImpl && signalImpl->Aborted()) { - JS::Rooted abortReason(aCx, signalImpl->RawReason()); + JS::Rooted abortReason(aCx); + signalImpl->GetReason(aCx, &abortReason); - if (abortReason.get().isUndefined()) { - aRv.Throw(NS_ERROR_DOM_ABORT_ERR); + nsCOMPtr global = DerivedClass()->GetParentObject(); + RefPtr promise = Promise::Create(global, aRv); + if (aRv.Failed()) { return nullptr; } - nsCOMPtr go = DerivedClass()->GetParentObject(); - - RefPtr promise = Promise::Create(go, aRv); promise->MaybeReject(abortReason); return promise.forget(); } @@ -1572,11 +1563,9 @@ return; } - bool aborted = signalImpl->Aborted(); - if (aborted) { + if (signalImpl->Aborted()) { IgnoredErrorResult result; - JS::Rooted abortReason(aCx, signalImpl->RawReason()); - AbortStream(aCx, mReadableStreamBody, result, abortReason); + AbortStream(aCx, mReadableStreamBody, signalImpl, result); if (NS_WARN_IF(result.Failed())) { return; } @@ -1632,8 +1621,7 @@ RefPtr signalImpl = DerivedClass()->GetSignalImpl(); if (signalImpl) { if (signalImpl->Aborted()) { - JS::Rooted abortReason(aCx, signalImpl->RawReason()); - AbortStream(aCx, body, aRv, abortReason); + AbortStream(aCx, body, signalImpl, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } @@ -1733,16 +1721,7 @@ JSContext* cx = jsapi.cx(); RefPtr body(mReadableStreamBody); - IgnoredErrorResult result; - - JS::Rooted abortReason(cx); - - AbortSignalImpl* signalImpl = Signal(); - if (signalImpl) { - abortReason.set(signalImpl->RawReason()); - } - - AbortStream(cx, body, result, abortReason); + AbortStream(cx, body, Signal(), IgnoredErrorResult()); } template void FetchBody::RunAbortAlgorithm(); diff -Nru thunderbird-140.9.0esr/dom/fetch/FetchParent.cpp thunderbird-140.10.0esr/dom/fetch/FetchParent.cpp --- thunderbird-140.9.0esr/dom/fetch/FetchParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fetch/FetchParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -89,6 +89,9 @@ FETCH_LOG(("FetchParent::RecvFetchOp [%p]", this)); AssertIsOnBackgroundThread(); + if (mReceivedFetchOp.exchange(true)) { + return IPC_FAIL(this, "FetchOp received more than once on this actor"); + } MOZ_ASSERT(!mIsDone); if (mActorDestroyed) { return IPC_OK(); diff -Nru thunderbird-140.9.0esr/dom/fetch/FetchParent.h thunderbird-140.10.0esr/dom/fetch/FetchParent.h --- thunderbird-140.9.0esr/dom/fetch/FetchParent.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fetch/FetchParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -103,6 +103,7 @@ Atomic mIsDone{false}; Atomic mActorDestroyed{false}; + Atomic mReceivedFetchOp{false}; nsCOMPtr mBackgroundEventTarget; }; diff -Nru thunderbird-140.9.0esr/dom/fetch/InternalResponse.cpp thunderbird-140.10.0esr/dom/fetch/InternalResponse.cpp --- thunderbird-140.9.0esr/dom/fetch/InternalResponse.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fetch/InternalResponse.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -123,6 +123,19 @@ InternalResponse::~InternalResponse() = default; +void InternalResponse::SnapshotUnfilteredHeaders() { + auto snapshot = [](InternalHeaders* aHeaders) { + nsTArray entries; + aHeaders->GetEntries(entries); + return MakeRefPtr(std::move(entries), aHeaders->Guard()); + }; + if (mWrappedResponse) { + mWrappedResponse->mHeaders = snapshot(mWrappedResponse->mHeaders); + } else { + mHeaders = snapshot(mHeaders); + } +} + InternalResponseMetadata InternalResponse::GetMetadata() { nsTArray headers; HeadersGuardEnum headersGuard; diff -Nru thunderbird-140.9.0esr/dom/fetch/InternalResponse.h thunderbird-140.10.0esr/dom/fetch/InternalResponse.h --- thunderbird-140.9.0esr/dom/fetch/InternalResponse.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fetch/InternalResponse.h 2026-04-21 14:52:52.000000000 +0000 @@ -169,6 +169,8 @@ return Headers(); } + void SnapshotUnfilteredHeaders(); + void GetUnfilteredBody(nsIInputStream** aStream, int64_t* aBodySize = nullptr) { if (mWrappedResponse) { diff -Nru thunderbird-140.9.0esr/dom/file/Blob.cpp thunderbird-140.10.0esr/dom/file/Blob.cpp --- thunderbird-140.9.0esr/dom/file/Blob.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/file/Blob.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -8,6 +8,7 @@ #include "EmptyBlobImpl.h" #include "File.h" #include "MemoryBlobImpl.h" +#include "js/Object.h" #include "mozilla/dom/BlobBinding.h" #include "mozilla/dom/ReadableStream.h" #include "mozilla/dom/WorkerCommon.h" @@ -121,6 +122,16 @@ Blob::~Blob() = default; +already_AddRefed Blob::Clone() const { + RefPtr clone = Create(GetParentObject(), Impl()); + return clone.forget(); +} + +bool Blob::HasExpandos() const { + const JSObject* wrapper = GetWrapperPreserveColor(); + return wrapper && JS::NativeObjectHasOwnProperties(wrapper); +} + bool Blob::IsFile() const { return mImpl->IsFile(); } const nsTArray>* Blob::GetSubBlobImpls() const { diff -Nru thunderbird-140.9.0esr/dom/file/Blob.h thunderbird-140.10.0esr/dom/file/Blob.h --- thunderbird-140.9.0esr/dom/file/Blob.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/file/Blob.h 2026-04-21 14:52:52.000000000 +0000 @@ -56,6 +56,12 @@ uint64_t aLength, const nsAString& aContentType); + // This clones the current Blob + already_AddRefed Clone() const; + + // Returns true if the blob's JS wrapper has user-added properties (expandos). + bool HasExpandos() const; + BlobImpl* Impl() const { return mImpl; } bool IsFile() const; diff -Nru thunderbird-140.9.0esr/dom/filesystem/FileSystemSecurity.cpp thunderbird-140.10.0esr/dom/filesystem/FileSystemSecurity.cpp --- thunderbird-140.9.0esr/dom/filesystem/FileSystemSecurity.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/filesystem/FileSystemSecurity.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -80,22 +80,24 @@ #if defined(XP_WIN) if (StringBeginsWith(aPath, u"..\\"_ns) || - FindInReadable(u"\\..\\"_ns, aPath)) { + FindInReadable(u"\\..\\"_ns, aPath) || + StringEndsWith(aPath, u"\\.."_ns)) { return false; } -#elif defined(XP_UNIX) - if (StringBeginsWith(aPath, u"../"_ns) || FindInReadable(u"/../"_ns, aPath)) { +#endif + if (StringBeginsWith(aPath, u"../"_ns) || FindInReadable(u"/../"_ns, aPath) || + StringEndsWith(aPath, u"/.."_ns) || aPath.EqualsLiteral("..")) { return false; } -#endif nsTArray* paths; if (!mPaths.Get(aId, &paths)) { return false; } - for (uint32_t i = 0, len = paths->Length(); i < len; ++i) { - if (FileSystemUtils::IsDescendantPath(paths->ElementAt(i), aPath)) { + MOZ_DIAGNOSTIC_ASSERT(paths); + for (const auto& authorizedRoot : *paths) { + if (FileSystemUtils::IsDescendantPath(authorizedRoot, aPath)) { return true; } } diff -Nru thunderbird-140.9.0esr/dom/filesystem/FileSystemUtils.cpp thunderbird-140.10.0esr/dom/filesystem/FileSystemUtils.cpp --- thunderbird-140.9.0esr/dom/filesystem/FileSystemUtils.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/filesystem/FileSystemUtils.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -12,11 +12,28 @@ namespace mozilla::dom { /* static */ -bool FileSystemUtils::IsDescendantPath(const nsAString& aPath, - const nsAString& aDescendantPath) { +bool FileSystemUtils::IsDescendantPath(const nsAString& aAuthorizedRoot, + const nsAString& aRequestedDescendant) { // Check the sub-directory path to see if it has the parent path as prefix. - if (!aDescendantPath.Equals(aPath) && - !StringBeginsWith(aDescendantPath, aPath)) { + if (aRequestedDescendant.Equals(aAuthorizedRoot)) { + return true; + } + + if (!StringBeginsWith(/*aSource*/ aRequestedDescendant, + /*aSubstring*/ aAuthorizedRoot)) { + return false; + } + + // Require a path separator immediately after the granted prefix. + const uint32_t prefixLen = aAuthorizedRoot.Length(); + if (prefixLen > 0 && + aAuthorizedRoot.Last() == FILESYSTEM_DOM_PATH_SEPARATOR_CHAR) { + return true; + } + + if (aRequestedDescendant.Length() <= prefixLen || + aRequestedDescendant.CharAt(prefixLen) != + FILESYSTEM_DOM_PATH_SEPARATOR_CHAR) { return false; } diff -Nru thunderbird-140.9.0esr/dom/fs/child/FileSystemRequestHandler.cpp thunderbird-140.10.0esr/dom/fs/child/FileSystemRequestHandler.cpp --- thunderbird-140.9.0esr/dom/fs/child/FileSystemRequestHandler.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fs/child/FileSystemRequestHandler.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -214,12 +214,13 @@ HandleFailedStatus(aResponse.get_nsresult(), aPromise); } -template <> void ResolveCallback( FileSystemMoveEntryResponse&& aResponse, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) - FileSystemEntryMetadata* const& aEntry, const Name& aName) { + RefPtr aHandle, FileSystemEntryMetadata* const& aEntry, + const Name& aName) { MOZ_ASSERT(aPromise); + MOZ_ASSERT(aHandle); QM_TRY(OkIf(Promise::PromiseState::Pending == aPromise->State()), QM_VOID); if (FileSystemMoveEntryResponse::TEntryId == aResponse.type()) { @@ -553,7 +554,7 @@ } void FileSystemRequestHandler::MoveEntry( - RefPtr& aManager, FileSystemHandle* aHandle, + RefPtr& aManager, RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) @@ -577,7 +578,7 @@ aManager->BeginRequest( [request = FileSystemMoveEntryRequest(*aEntry, aNewEntry), onResolve = SelectResolveCallback( - aPromise, aEntry, aNewEntry.childName()), + aPromise, std::move(aHandle), aEntry, aNewEntry.childName()), onReject = GetRejectCallback(aPromise)](const auto& actor) mutable { actor->SendMoveEntry(request, std::move(onResolve), std::move(onReject)); @@ -586,7 +587,7 @@ } void FileSystemRequestHandler::RenameEntry( - RefPtr& aManager, FileSystemHandle* aHandle, + RefPtr& aManager, RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, // NOLINT(performance-unnecessary-value-param) ErrorResult& aError) { @@ -609,7 +610,7 @@ aManager->BeginRequest( [request = FileSystemRenameEntryRequest(*aEntry, aName), onResolve = SelectResolveCallback( - aPromise, aEntry, aName), + aPromise, std::move(aHandle), aEntry, aName), onReject = GetRejectCallback(aPromise)](const auto& actor) mutable { actor->SendRenameEntry(request, std::move(onResolve), std::move(onReject)); diff -Nru thunderbird-140.9.0esr/dom/fs/include/fs/FileSystemRequestHandler.h thunderbird-140.10.0esr/dom/fs/include/fs/FileSystemRequestHandler.h --- thunderbird-140.9.0esr/dom/fs/include/fs/FileSystemRequestHandler.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fs/include/fs/FileSystemRequestHandler.h 2026-04-21 14:52:52.000000000 +0000 @@ -69,13 +69,13 @@ ErrorResult& aError); virtual void MoveEntry(RefPtr& aManager, - FileSystemHandle* aHandle, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, ErrorResult& aError); virtual void RenameEntry(RefPtr& aManager, - FileSystemHandle* aHandle, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, ErrorResult& aError); diff -Nru thunderbird-140.9.0esr/dom/fs/parent/FileSystemAccessHandle.cpp thunderbird-140.10.0esr/dom/fs/parent/FileSystemAccessHandle.cpp --- thunderbird-140.9.0esr/dom/fs/parent/FileSystemAccessHandle.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fs/parent/FileSystemAccessHandle.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -124,6 +124,9 @@ bool FileSystemAccessHandle::IsOpen() const { return !mClosed; } RefPtr FileSystemAccessHandle::BeginClose() { + if (mClosed) { + return BoolPromise::CreateAndResolve(true, __func__); + } MOZ_ASSERT(IsOpen()); LOG(("Closing AccessHandle")); diff -Nru thunderbird-140.9.0esr/dom/fs/test/gtest/FileSystemMocks.h thunderbird-140.10.0esr/dom/fs/test/gtest/FileSystemMocks.h --- thunderbird-140.9.0esr/dom/fs/test/gtest/FileSystemMocks.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/fs/test/gtest/FileSystemMocks.h 2026-04-21 14:52:52.000000000 +0000 @@ -24,6 +24,7 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/DOMException.h" #include "mozilla/dom/DOMExceptionBinding.h" +#include "mozilla/dom/FileSystemHandle.h" #include "mozilla/dom/FileSystemManagerChild.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/PromiseNativeHandler.h" @@ -92,14 +93,16 @@ (override)); MOCK_METHOD(void, MoveEntry, - (RefPtr & aManager, FileSystemHandle* aHandle, + (RefPtr & aManager, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const FileSystemChildMetadata& aNewEntry, RefPtr aPromise, ErrorResult& aError), (override)); MOCK_METHOD(void, RenameEntry, - (RefPtr & aManager, FileSystemHandle* aHandle, + (RefPtr & aManager, + RefPtr aHandle, FileSystemEntryMetadata* const aEntry, const Name& aName, RefPtr aPromise, ErrorResult& aError), (override)); diff -Nru thunderbird-140.9.0esr/dom/gamepad/GamepadPlatformService.cpp thunderbird-140.10.0esr/dom/gamepad/GamepadPlatformService.cpp --- thunderbird-140.9.0esr/dom/gamepad/GamepadPlatformService.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/GamepadPlatformService.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -80,8 +80,8 @@ } GamepadPlatformService::GamepadPlatformService() - : mNextGamepadHandleValue(1), - mMutex("mozilla::dom::GamepadPlatformService") {} + : mMutex("mozilla::dom::GamepadPlatformService"), + mNextGamepadHandleValue(1) {} GamepadPlatformService::~GamepadPlatformService() { Cleanup(); } @@ -113,10 +113,6 @@ GamepadChangeEventBody body(aInfo); GamepadChangeEvent e(aHandle, body); - // mChannelParents may be accessed by background thread in the - // same time, we use mutex to prevent possible race condtion - MutexAutoLock autoLock(mMutex); - for (uint32_t i = 0; i < mChannelParents.Length(); ++i) { mChannelParents[i]->DispatchUpdateEvent(e); } @@ -131,16 +127,19 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); - GamepadHandle gamepadHandle{mNextGamepadHandleValue++, - GamepadHandleKind::GamepadPlatformManager}; - // Only VR controllers has displayID, we give 0 to the general gamepads. GamepadAdded a(NS_ConvertUTF8toUTF16(nsDependentCString(aID)), aMapping, aHand, 0, aNumButtons, aNumAxes, aHaptics, aNumLightIndicator, aNumTouchEvents); - mGamepadAdded.emplace(gamepadHandle, a); - NotifyGamepadChange(gamepadHandle, a); + GamepadHandle gamepadHandle; + { + MutexAutoLock autoLock(mMutex); + gamepadHandle = GamepadHandle{mNextGamepadHandleValue++, + GamepadHandleKind::GamepadPlatformManager}; + mGamepadAdded.emplace(gamepadHandle, a); + NotifyGamepadChange(gamepadHandle, a); + } return gamepadHandle; } @@ -150,8 +149,11 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadRemoved a; - NotifyGamepadChange(aHandle, a); - mGamepadAdded.erase(aHandle); + { + MutexAutoLock autoLock(mMutex); + NotifyGamepadChange(aHandle, a); + mGamepadAdded.erase(aHandle); + } } void GamepadPlatformService::NewButtonEvent(GamepadHandle aHandle, @@ -162,6 +164,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadButtonInformation a(aButton, aValue, aPressed, aTouched); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -204,6 +207,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadAxisInformation a(aAxis, aValue); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -214,6 +218,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadLightIndicatorTypeInformation a(aLight, aType); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -224,6 +229,7 @@ MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); GamepadPoseInformation a(aState); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -236,6 +242,7 @@ MOZ_ASSERT(!NS_IsMainThread()); GamepadTouchInformation a(aTouchArrayIndex, aState); + MutexAutoLock autoLock(mMutex); NotifyGamepadChange(aHandle, a); } @@ -244,6 +251,7 @@ // platform-dependent backends MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(!NS_IsMainThread()); + MutexAutoLock autoLock(mMutex); mNextGamepadHandleValue = 1; } @@ -253,11 +261,11 @@ // is created or removed in Background thread AssertIsOnBackgroundThread(); MOZ_ASSERT(aParent); - MOZ_ASSERT(!mChannelParents.Contains(aParent)); // We use mutex here to prevent race condition with monitor thread { MutexAutoLock autoLock(mMutex); + MOZ_ASSERT(!mChannelParents.Contains(aParent)); mChannelParents.AppendElement(aParent); // For a new GamepadEventChannel, we have to send the exising GamepadAdded @@ -282,11 +290,11 @@ // is created or removed in Background thread AssertIsOnBackgroundThread(); MOZ_ASSERT(aParent); - MOZ_ASSERT(mChannelParents.Contains(aParent)); // We use mutex here to prevent race condition with monitor thread { MutexAutoLock autoLock(mMutex); + MOZ_ASSERT(mChannelParents.Contains(aParent)); mChannelParents.RemoveElement(aParent); if (!mChannelParents.IsEmpty()) { return; diff -Nru thunderbird-140.9.0esr/dom/gamepad/GamepadPlatformService.h thunderbird-140.10.0esr/dom/gamepad/GamepadPlatformService.h --- thunderbird-140.9.0esr/dom/gamepad/GamepadPlatformService.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/GamepadPlatformService.h 2026-04-21 14:52:52.000000000 +0000 @@ -75,9 +75,9 @@ GamepadHand aHand, uint32_t aNumButtons, uint32_t aNumAxes, uint32_t aNumHaptics, uint32_t aNumLightIndicator, - uint32_t aNumTouchEvents); + uint32_t aNumTouchEvents) MOZ_EXCLUDES(mMutex); // Remove the gamepad at |aHandle| from the list of known gamepads. - void RemoveGamepad(GamepadHandle aHandle); + void RemoveGamepad(GamepadHandle aHandle) MOZ_EXCLUDES(mMutex); // Update the state of |aButton| for the gamepad at |aHandle| for all // windows that are listening and visible, and fire one of @@ -85,44 +85,51 @@ // aPressed is used for digital buttons, aTouched is for detecting touched // events, aValue is for analog buttons. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - bool aTouched, double aValue); + bool aTouched, double aValue) MOZ_EXCLUDES(mMutex); // When only a digital button is available the value will be synthesized. - void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed); + void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed) + MOZ_EXCLUDES(mMutex); // When only a digital button are available the value will be synthesized. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - bool aTouched); + bool aTouched) MOZ_EXCLUDES(mMutex); // When only a digital button are available the value will be synthesized. void NewButtonEvent(GamepadHandle aHandle, uint32_t aButton, bool aPressed, - double aValue); + double aValue) MOZ_EXCLUDES(mMutex); // Update the state of |aAxis| for the gamepad at |aHandle| for all // windows that are listening and visible, and fire a gamepadaxismove // event at them as well. - void NewAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue); + void NewAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue) + MOZ_EXCLUDES(mMutex); // Update the state of |aState| for the gamepad at |aHandle| for all // windows that are listening and visible. - void NewPoseEvent(GamepadHandle aHandle, const GamepadPoseState& aState); + void NewPoseEvent(GamepadHandle aHandle, const GamepadPoseState& aState) + MOZ_EXCLUDES(mMutex); // Update the type of |aType| for the gamepad at |aHandle| for all // windows that are listening and visible. void NewLightIndicatorTypeEvent(GamepadHandle aHandle, uint32_t aLight, - GamepadLightIndicatorType aType); + GamepadLightIndicatorType aType) + MOZ_EXCLUDES(mMutex); // Update the state of |aState| for the gamepad at |aHandle| with // |aTouchArrayIndex| for all windows that are listening and visible. void NewMultiTouchEvent(GamepadHandle aHandle, uint32_t aTouchArrayIndex, - const GamepadTouchState& aState); + const GamepadTouchState& aState) MOZ_EXCLUDES(mMutex); // When shutting down the platform communications for gamepad, also reset the // indexes. - void ResetGamepadIndexes(); + void ResetGamepadIndexes() MOZ_EXCLUDES(mMutex); // Add IPDL parent instance - void AddChannelParent(GamepadEventChannelParent* aParent); + void AddChannelParent(GamepadEventChannelParent* aParent) + MOZ_EXCLUDES(mMutex); // Remove IPDL parent instance - void RemoveChannelParent(GamepadEventChannelParent* aParent); + void RemoveChannelParent(GamepadEventChannelParent* aParent) + MOZ_EXCLUDES(mMutex); - void MaybeShutdown(); + void MaybeShutdown() MOZ_EXCLUDES(mMutex); - nsTArray GetAllGamePads() { + nsTArray GetAllGamePads() MOZ_EXCLUDES(mMutex) { + MutexAutoLock autoLock(mMutex); nsTArray gamepads; for (const auto& elem : mGamepadAdded) { @@ -135,23 +142,24 @@ GamepadPlatformService(); ~GamepadPlatformService(); template - void NotifyGamepadChange(GamepadHandle aHandle, const T& aInfo); + void NotifyGamepadChange(GamepadHandle aHandle, const T& aInfo) + MOZ_REQUIRES(mMutex); - void Cleanup(); + void Cleanup() MOZ_EXCLUDES(mMutex); - // mNextGamepadHandleValue can only be accessed by monitor thread - uint32_t mNextGamepadHandleValue; + // This mutex protects mNextGamepadHandleValue, mChannelParents, and + // mGamepadAdded from race condition between background and monitor thread + Mutex mMutex; + + uint32_t mNextGamepadHandleValue MOZ_GUARDED_BY(mMutex); // mChannelParents stores all the GamepadEventChannelParent instances // which may be accessed by both background thread and monitor thread - // simultaneously, so we have a mutex to prevent race condition - nsTArray> mChannelParents; - - // This mutex protects mChannelParents from race condition - // between background and monitor thread - Mutex mMutex MOZ_UNANNOTATED; + // simultaneously + nsTArray> mChannelParents + MOZ_GUARDED_BY(mMutex); - std::map mGamepadAdded; + std::map mGamepadAdded MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla::dom diff -Nru thunderbird-140.9.0esr/dom/gamepad/GamepadRemapping.cpp thunderbird-140.10.0esr/dom/gamepad/GamepadRemapping.cpp --- thunderbird-140.9.0esr/dom/gamepad/GamepadRemapping.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/GamepadRemapping.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -477,10 +477,16 @@ return MAX_INPUT_LEN; } - virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) override { + static constexpr size_t kMinTouchReportLen = 43; + + virtual void ProcessTouchData(GamepadHandle aHandle, const uint8_t* aInput, + size_t aInputLen) override { + if (aInputLen < kMinTouchReportLen) { + return; + } nsTArray touches(TOUCH_EVENT_COUNT); touches.SetLength(TOUCH_EVENT_COUNT); - uint8_t* rawData = (uint8_t*)aInput; + const uint8_t* rawData = aInput; const uint32_t kTouchDimensionX = 1920; const uint32_t kTouchDimensionY = 942; diff -Nru thunderbird-140.9.0esr/dom/gamepad/GamepadRemapping.h thunderbird-140.10.0esr/dom/gamepad/GamepadRemapping.h --- thunderbird-140.9.0esr/dom/gamepad/GamepadRemapping.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/GamepadRemapping.h 2026-04-21 14:52:52.000000000 +0000 @@ -152,7 +152,8 @@ virtual GamepadMappingType GetMappingType() const { return GamepadMappingType::Standard; } - virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) {} + virtual void ProcessTouchData(GamepadHandle aHandle, const uint8_t* aInput, + size_t aInputLen) {} virtual void RemapAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis, double aValue) const = 0; virtual void RemapButtonEvent(GamepadHandle aHandle, uint32_t aButton, diff -Nru thunderbird-140.9.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp thunderbird-140.10.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp --- thunderbird-140.9.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/cocoa/CocoaGamepad.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -7,6 +7,8 @@ // mostly derived from the Allegro source code at: // http://alleg.svn.sourceforge.net/viewvc/alleg/allegro/branches/4.9/src/macosx/hidjoy.m?revision=13760&view=markup +#include "mozilla/Atomics.h" +#include "mozilla/Mutex.h" #include "mozilla/dom/GamepadHandle.h" #include "mozilla/dom/GamepadPlatformService.h" #include "mozilla/dom/GamepadRemapping.h" @@ -96,6 +98,7 @@ bool operator==(IOHIDDeviceRef device) const { return mDevice == device; } bool empty() const { return mDevice == nullptr; } + IOHIDDeviceRef Device() const { return mDevice; } void clear() { mDevice = nullptr; buttons.Clear(); @@ -104,7 +107,6 @@ } void init(IOHIDDeviceRef device, bool defaultRemapper); void ReportChanged(uint8_t* report, CFIndex report_length); - size_t WriteOutputReport(const std::vector& aReport) const; size_t numButtons() { return buttons.Length(); } size_t numAxes() { return axes.Length(); } @@ -200,12 +202,13 @@ class DarwinGamepadService { private: IOHIDManagerRef mManager; - nsTArray mGamepads; + Mutex mGamepadsMutex; + nsTArray mGamepads MOZ_GUARDED_BY(mGamepadsMutex); nsCOMPtr mMonitorThread; nsCOMPtr mBackgroundThread; nsCOMPtr mPollingTimer; - bool mIsRunning; + Atomic mIsRunning; static void DeviceAddedCallback(void* data, IOReturn result, void* sender, IOHIDDeviceRef device); @@ -292,6 +295,12 @@ return; } + // Holding the lock through IOHIDDeviceRegisterInputReportCallback is safe: + // ReportChangedCallback (which also acquires this lock) is only ever invoked + // from within CFRunLoopRunInMode on the monitor thread, which is not running + // while DeviceAdded is executing. + MutexAutoLock lock(mGamepadsMutex); + size_t slot = size_t(-1); for (size_t i = 0; i < mGamepads.Length(); i++) { if (mGamepads[i] == device) return; @@ -368,6 +377,11 @@ if (!service) { return; } + // Same reasoning as DeviceAdded: holding the lock through + // IOHIDDeviceRegisterInputReportCallback (the unregister call) is safe + // because ReportChangedCallback only runs from within CFRunLoopRunInMode on + // the monitor thread, which is not running while DeviceRemoved executes. + MutexAutoLock lock(mGamepadsMutex); for (Gamepad& gamepad : mGamepads) { if (gamepad == device) { IOHIDDeviceRegisterInputReportCallback( @@ -390,6 +404,7 @@ if (context && report_type == kIOHIDReportTypeInput && report_length) { auto reportContext = static_cast(context); DarwinGamepadService* service = reportContext->service; + MutexAutoLock lock(service->mGamepadsMutex); service->mGamepads[reportContext->gamepadSlot].ReportChanged(report, report_length); } @@ -397,16 +412,7 @@ void Gamepad::ReportChanged(uint8_t* report, CFIndex report_len) { MOZ_RELEASE_ASSERT(report_len <= mRemapper->GetMaxInputReportLength()); - mRemapper->ProcessTouchData(mHandle, report); -} - -size_t Gamepad::WriteOutputReport(const std::vector& aReport) const { - IOReturn success = - IOHIDDeviceSetReport(mDevice, kIOHIDReportTypeOutput, aReport[0], - aReport.data(), aReport.size()); - - MOZ_ASSERT(success == kIOReturnSuccess); - return (success == kIOReturnSuccess) ? aReport.size() : 0; + mRemapper->ProcessTouchData(mHandle, report, report_len); } void DarwinGamepadService::InputValueChanged(IOHIDValueRef value) { @@ -425,6 +431,7 @@ IOHIDElementRef element = IOHIDValueGetElement(value); IOHIDDeviceRef device = IOHIDElementGetDevice(element); + MutexAutoLock lock(mGamepadsMutex); for (Gamepad& gamepad : mGamepads) { if (gamepad == device) { // Axis elements represent axes and d-pads. @@ -505,7 +512,9 @@ } DarwinGamepadService::DarwinGamepadService() - : mManager(nullptr), mIsRunning(false) {} + : mManager(nullptr), + mGamepadsMutex("DarwinGamepadService::mGamepads"), + mIsRunning(false) {} DarwinGamepadService::~DarwinGamepadService() { if (mManager != nullptr) CFRelease(mManager); @@ -612,24 +621,38 @@ const uint8_t& aGreen, const uint8_t& aBlue) { // We get aControllerIdx from GamepadPlatformService::AddGamepad(), // It begins from 1 and is stored at Gamepad.id. - const Gamepad* gamepad = MOZ_FIND_AND_VALIDATE( - aGamepadHandle, list_item.mHandle == aGamepadHandle, mGamepads); - if (!gamepad) { - MOZ_ASSERT(false); - return; - } + IOHIDDeviceRef device = nullptr; + std::vector report; + { + MutexAutoLock lock(mGamepadsMutex); + // the tainting macro confuses clang + MOZ_PUSH_IGNORE_THREAD_SAFETY + const Gamepad* gamepad = MOZ_FIND_AND_VALIDATE( + aGamepadHandle, list_item.mHandle == aGamepadHandle, mGamepads); + MOZ_POP_THREAD_SAFETY + if (!gamepad) { + MOZ_ASSERT(false); + return; + } - RefPtr remapper = gamepad->mRemapper; - if (!remapper || - MOZ_IS_VALID(aLightColorIndex, - remapper->GetLightIndicatorCount() <= aLightColorIndex)) { - MOZ_ASSERT(false); - return; - } + RefPtr remapper = gamepad->mRemapper; + if (!remapper || + MOZ_IS_VALID(aLightColorIndex, + remapper->GetLightIndicatorCount() <= aLightColorIndex)) { + MOZ_ASSERT(false); + return; + } - std::vector report; - remapper->GetLightColorReport(aRed, aGreen, aBlue, report); - gamepad->WriteOutputReport(report); + remapper->GetLightColorReport(aRed, aGreen, aBlue, report); + device = gamepad->Device(); + } + if (device) { + IOReturn success = IOHIDDeviceSetReport(device, kIOHIDReportTypeOutput, + report[0], report.data(), + report.size()); + MOZ_ASSERT(success == kIOReturnSuccess); + (void)success; + } } } // namespace diff -Nru thunderbird-140.9.0esr/dom/gamepad/windows/WindowsGamepad.cpp thunderbird-140.10.0esr/dom/gamepad/windows/WindowsGamepad.cpp --- thunderbird-140.9.0esr/dom/gamepad/windows/WindowsGamepad.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/gamepad/windows/WindowsGamepad.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -883,8 +883,8 @@ } } - BYTE* rawData = raw->data.hid.bRawData; - gamepad->remapper->ProcessTouchData(gamepad->gamepadHandle, rawData); + gamepad->remapper->ProcessTouchData( + gamepad->gamepadHandle, raw->data.hid.bRawData, raw->data.hid.dwSizeHid); return true; } diff -Nru thunderbird-140.9.0esr/dom/geolocation/Geolocation.cpp thunderbird-140.10.0esr/dom/geolocation/Geolocation.cpp --- thunderbird-140.9.0esr/dom/geolocation/Geolocation.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/geolocation/Geolocation.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -1018,9 +1018,12 @@ } void nsGeolocationService::MoveLocators(nsGeolocationService* aService) { - for (uint32_t i = 0; i < mGeolocators.Length(); i++) { - aService->AddLocator(mGeolocators[i]); + for (Geolocation* loc : mGeolocators) { + aService->AddLocator(loc); + loc->SetService(aService); } + + mGeolocators.Clear(); } //////////////////////////////////////////////////// diff -Nru thunderbird-140.9.0esr/dom/geolocation/Geolocation.h thunderbird-140.10.0esr/dom/geolocation/Geolocation.h --- thunderbird-140.9.0esr/dom/geolocation/Geolocation.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/geolocation/Geolocation.h 2026-04-21 14:52:52.000000000 +0000 @@ -126,6 +126,8 @@ * Can return a geolocation info */ class Geolocation final : public nsIGeolocationUpdate, public nsWrapperCache { + friend class ::nsGeolocationService; + public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(Geolocation) @@ -234,6 +236,9 @@ // Initates the asynchronous process of filling the request. static void RequestIfPermitted(nsGeolocationRequest* request); + // Allow updating service for shutdown deregistering + void SetService(nsGeolocationService* aService) { mService = aService; } + // Two callback arrays. The first |mPendingCallbacks| holds objects for only // one callback and then they are released/removed from the array. The second // |mWatchingCallbacks| holds objects until the object is explicitly removed diff -Nru thunderbird-140.9.0esr/dom/html/HTMLAllCollection.cpp thunderbird-140.10.0esr/dom/html/HTMLAllCollection.cpp --- thunderbird-140.9.0esr/dom/html/HTMLAllCollection.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLAllCollection.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -151,40 +151,7 @@ } void HTMLAllCollection::GetSupportedNames(nsTArray& aNames) { - // XXXbz this is very similar to nsContentList::GetSupportedNames, - // but has to check IsAllNamedElement for the name case. - AutoTArray atoms; - for (uint32_t i = 0; i < Length(); ++i) { - nsIContent* content = Item(i); - if (content->HasID()) { - nsAtom* id = content->GetID(); - MOZ_ASSERT(id != nsGkAtoms::_empty, "Empty ids don't get atomized"); - if (!atoms.Contains(id)) { - atoms.AppendElement(id); - } - } - - nsGenericHTMLElement* el = nsGenericHTMLElement::FromNode(content); - if (el) { - // Note: nsINode::HasName means the name is exposed on the document, - // which is false for options, so we don't check it here. - const nsAttrValue* val = el->GetParsedAttr(nsGkAtoms::name); - if (val && val->Type() == nsAttrValue::eAtom && - IsAllNamedElement(content)) { - nsAtom* name = val->GetAtomValue(); - MOZ_ASSERT(name != nsGkAtoms::_empty, "Empty names don't get atomized"); - if (!atoms.Contains(name)) { - atoms.AppendElement(name); - } - } - } - } - - uint32_t atomsLen = atoms.Length(); - nsString* names = aNames.AppendElements(atomsLen); - for (uint32_t i = 0; i < atomsLen; ++i) { - atoms[i]->ToString(names[i]); - } + Collection()->GetSupportedNames(aNames, IsAllNamedElement); } JSObject* HTMLAllCollection::WrapObject(JSContext* aCx, diff -Nru thunderbird-140.9.0esr/dom/html/HTMLFieldSetElement.cpp thunderbird-140.10.0esr/dom/html/HTMLFieldSetElement.cpp --- thunderbird-140.9.0esr/dom/html/HTMLFieldSetElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLFieldSetElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -23,7 +23,6 @@ : nsGenericHTMLFormControlElement(std::move(aNodeInfo), FormControlType::Fieldset), mElements(nullptr), - mFirstLegend(nullptr), mInvalidElementsCount(0) { //
is always barred from constraint validation. SetBarredFromConstraintValidation(true); @@ -41,7 +40,7 @@ NS_IMPL_CYCLE_COLLECTION_INHERITED(HTMLFieldSetElement, nsGenericHTMLFormControlElement, mValidity, - mElements) + mElements, mFirstLegend) NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED(HTMLFieldSetElement, nsGenericHTMLFormControlElement, @@ -110,6 +109,7 @@ nsIContent* aBeforeThis, bool aNotify, ErrorResult& aRv) { bool firstLegendHasChanged = false; + RefPtr oldFirstLegend = mFirstLegend; if (aChild->IsHTMLElement(nsGkAtoms::legend)) { if (!mFirstLegend) { @@ -134,6 +134,7 @@ nsGenericHTMLFormControlElement::InsertChildBefore(aChild, aBeforeThis, aNotify, aRv); if (aRv.Failed()) { + mFirstLegend = oldFirstLegend; return; } diff -Nru thunderbird-140.9.0esr/dom/html/HTMLFieldSetElement.h thunderbird-140.10.0esr/dom/html/HTMLFieldSetElement.h --- thunderbird-140.9.0esr/dom/html/HTMLFieldSetElement.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLFieldSetElement.h 2026-04-21 14:52:52.000000000 +0000 @@ -126,7 +126,7 @@ // List of elements which have this fieldset as first fieldset ancestor. nsTArray mDependentElements; - nsIContent* mFirstLegend; + RefPtr mFirstLegend; /** * Number of invalid and candidate for constraint validation diff -Nru thunderbird-140.9.0esr/dom/html/HTMLFormElement.cpp thunderbird-140.10.0esr/dom/html/HTMLFormElement.cpp --- thunderbird-140.9.0esr/dom/html/HTMLFormElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLFormElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -249,7 +249,7 @@ // 1-4 of // https://html.spec.whatwg.org/multipage/forms.html#concept-form-submit - Document* doc = GetComposedDoc(); + RefPtr doc = GetComposedDoc(); if (mIsConstructingEntryList || !doc || (doc->GetSandboxFlags() & SANDBOXED_FORMS)) { return; diff -Nru thunderbird-140.9.0esr/dom/html/HTMLMediaElement.cpp thunderbird-140.10.0esr/dom/html/HTMLMediaElement.cpp --- thunderbird-140.9.0esr/dom/html/HTMLMediaElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLMediaElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2161,6 +2161,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK(mMediaKeys) NS_IMPL_CYCLE_COLLECTION_UNLINK(mIncomingMediaKeys) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSelectedVideoStreamTrack) + tmp->mSelectedVideoStreamTrackGraph = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK(mPendingPlayPromises) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSeekDOMPromise) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSetMediaKeysDOMPromise) @@ -2882,17 +2883,24 @@ mSelectedVideoStreamTrack = t->GetVideoStreamTrack(); mSelectedVideoStreamTrack->AddPrincipalChangeObserver(this); - if (mMediaStreamRenderer) { - mMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); - } - if (mSecondaryMediaStreamRenderer) { - mSecondaryMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + if (!mSelectedVideoStreamTrackGraph) { + mSelectedVideoStreamTrackGraph = mSelectedVideoStreamTrack->Graph(); } - if (mMediaInfo.HasVideo()) { - mMediaInfo.mVideo.SetAlpha(mSelectedVideoStreamTrack->HasAlpha()); + if (mSelectedVideoStreamTrackGraph == + mSelectedVideoStreamTrack->Graph()) { + if (mMediaStreamRenderer) { + mMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + } + if (mSecondaryMediaStreamRenderer) { + mSecondaryMediaStreamRenderer->AddTrack(mSelectedVideoStreamTrack); + } + if (mMediaInfo.HasVideo()) { + mMediaInfo.mVideo.SetAlpha(mSelectedVideoStreamTrack->HasAlpha()); + } + nsContentUtils::CombineResourcePrincipals( + &mSrcStreamVideoPrincipal, + mSelectedVideoStreamTrack->GetPrincipal()); } - nsContentUtils::CombineResourcePrincipals( - &mSrcStreamVideoPrincipal, mSelectedVideoStreamTrack->GetPrincipal()); } } @@ -5484,6 +5492,7 @@ mSelectedVideoStreamTrack->RemovePrincipalChangeObserver(this); } mSelectedVideoStreamTrack = nullptr; + mSelectedVideoStreamTrackGraph = nullptr; MOZ_ASSERT_IF(mSecondaryMediaStreamRenderer, !mMediaStreamRenderer == !mSecondaryMediaStreamRenderer); diff -Nru thunderbird-140.9.0esr/dom/html/HTMLMediaElement.h thunderbird-140.10.0esr/dom/html/HTMLMediaElement.h --- thunderbird-140.9.0esr/dom/html/HTMLMediaElement.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLMediaElement.h 2026-04-21 14:52:52.000000000 +0000 @@ -1490,6 +1490,7 @@ // The currently selected video stream track. RefPtr mSelectedVideoStreamTrack; + MediaTrackGraph* mSelectedVideoStreamTrackGraph = nullptr; const RefPtr mShutdownObserver; diff -Nru thunderbird-140.9.0esr/dom/html/HTMLSelectElement.cpp thunderbird-140.10.0esr/dom/html/HTMLSelectElement.cpp --- thunderbird-140.9.0esr/dom/html/HTMLSelectElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLSelectElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -299,24 +299,10 @@ OnSelectionChanged(); } - // Get the frame stuff for notification. No need to flush here - // since if there's no frame for the select yet the select will - // get into the right state once it's created. - nsISelectControlFrame* selectFrame = nullptr; - AutoWeakFrame weakSelectFrame; - bool didGetFrame = false; - // Actually select the options if the added options warrant it for (int32_t i = aListIndex; i < insertIndex; i++) { - // Notify the frame that the option is added - if (!didGetFrame || (selectFrame && !weakSelectFrame.IsAlive())) { - selectFrame = GetSelectFrame(); - weakSelectFrame = do_QueryFrame(selectFrame); - didGetFrame = true; - } - - if (selectFrame) { - selectFrame->AddOption(i); + if (auto* frame = GetSelectFrame()) { + frame->AddOption(i); } RefPtr option = Item(i); @@ -332,7 +318,7 @@ // This is sort of a hack ... we need to notify that the option was // set and change selectedIndex even though we didn't really change // its value. - OnOptionSelected(selectFrame, i, true, false, aNotify); + OnOptionSelected(i, true, false, aNotify); } } @@ -715,8 +701,7 @@ return option && option->Selected(); } -void HTMLSelectElement::OnOptionSelected(nsISelectControlFrame* aSelectFrame, - int32_t aIndex, bool aSelected, +void HTMLSelectElement::OnOptionSelected(int32_t aIndex, bool aSelected, bool aChangeOptionState, bool aNotify) { // Set the selected index @@ -736,8 +721,8 @@ } // Let the frame know too - if (aSelectFrame) { - aSelectFrame->OnOptionSelected(aIndex, aSelected); + if (auto* frame = GetSelectFrame()) { + frame->OnOptionSelected(aIndex, aSelected); } UpdateSelectedOptions(); @@ -808,10 +793,6 @@ bool optionsSelected = false; bool optionsDeselected = false; - nsISelectControlFrame* selectFrame = nullptr; - bool didGetFrame = false; - AutoWeakFrame weakSelectFrame; - if (aOptionsMask.contains(OptionFlag::IsSelected)) { // Setting selectedIndex to an out-of-bounds index means -1. (HTML5) if (aStartIndex < 0 || AssertedCast(aStartIndex) >= numItems || @@ -861,15 +842,7 @@ // the option has just been inserted we have to get in sync with it. if (option && (aOptionsMask.contains(OptionFlag::InsertingOptions) || !option->Selected())) { - // To notify the frame if anything gets changed. No need - // to flush here, if there's no frame yet we don't need to - // force it to be created just to notify it about a change - // in the select. - selectFrame = GetSelectFrame(); - weakSelectFrame = do_QueryFrame(selectFrame); - didGetFrame = true; - - OnOptionSelected(selectFrame, optIndex, true, !option->Selected(), + OnOptionSelected(optIndex, true, !option->Selected(), aOptionsMask.contains(OptionFlag::Notify)); optionsSelected = true; } @@ -889,17 +862,7 @@ HTMLOptionElement* option = Item(optIndex); // If the index is already deselected, ignore it. if (option && option->Selected()) { - if (!didGetFrame || (selectFrame && !weakSelectFrame.IsAlive())) { - // To notify the frame if anything gets changed, don't - // flush, if the frame doesn't exist we don't need to - // create it just to tell it about this change. - selectFrame = GetSelectFrame(); - weakSelectFrame = do_QueryFrame(selectFrame); - - didGetFrame = true; - } - - OnOptionSelected(selectFrame, optIndex, false, true, + OnOptionSelected(optIndex, false, true, aOptionsMask.contains(OptionFlag::Notify)); optionsDeselected = true; @@ -923,17 +886,7 @@ // If the index is already selected, ignore it. if (option && option->Selected()) { - if (!didGetFrame || (selectFrame && !weakSelectFrame.IsAlive())) { - // To notify the frame if anything gets changed, don't - // flush, if the frame doesn't exist we don't need to - // create it just to tell it about this change. - selectFrame = GetSelectFrame(); - weakSelectFrame = do_QueryFrame(selectFrame); - - didGetFrame = true; - } - - OnOptionSelected(selectFrame, optIndex, false, true, + OnOptionSelected(optIndex, false, true, aOptionsMask.contains(OptionFlag::Notify)); optionsDeselected = true; } diff -Nru thunderbird-140.9.0esr/dom/html/HTMLSelectElement.h thunderbird-140.10.0esr/dom/html/HTMLSelectElement.h --- thunderbird-140.9.0esr/dom/html/HTMLSelectElement.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLSelectElement.h 2026-04-21 14:52:52.000000000 +0000 @@ -368,7 +368,6 @@ /** * Called to trigger notifications of frames and fixing selected index * - * @param aSelectFrame the frame for this content (could be null) * @param aIndex the index that was selected or deselected * @param aSelected whether the index was selected or deselected * @param aChangeOptionState if false, don't do anything to the @@ -376,8 +375,8 @@ * its selected state to aSelected. * @param aNotify whether to notify the style system and such */ - void OnOptionSelected(nsISelectControlFrame* aSelectFrame, int32_t aIndex, - bool aSelected, bool aChangeOptionState, bool aNotify); + void OnOptionSelected(int32_t aIndex, bool aSelected, bool aChangeOptionState, + bool aNotify); /** * Restore state to a particular state string (representing the options) * @param aNewSelected the state string to restore to diff -Nru thunderbird-140.9.0esr/dom/html/HTMLSlotElement.cpp thunderbird-140.10.0esr/dom/html/HTMLSlotElement.cpp --- thunderbird-140.9.0esr/dom/html/HTMLSlotElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/HTMLSlotElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -231,7 +231,9 @@ if (!mAssignedNodes.IsEmpty()) { changedSlots.EnsureInserted(this); if (root) { - root->InvalidateStyleAndLayoutOnSubtree(this); + // If not in a shadow tree, the flat tree is not really changing, so no + // need to invalidate layout. Same applies to other callers here. + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(this); } ClearAssignedNodes(); } @@ -252,29 +254,27 @@ // XXXsmaug Should we have a helper for // https://infra.spec.whatwg.org/#ordered-set? if (content->GetManualSlotAssignment() != this) { - if (HTMLSlotElement* oldSlot = content->GetAssignedSlot()) { - if (changedSlots.EnsureInserted(oldSlot)) { - if (root) { - MOZ_ASSERT(oldSlot->GetContainingShadow() == root); - root->InvalidateStyleAndLayoutOnSubtree(oldSlot); - } + // Step 3.1: If content's manual slot assignment refers to a slot, + // then remove node from that slot's manually assigned nodes. + if (HTMLSlotElement* prevSlot = content->GetManualSlotAssignment()) { + ShadowRoot* prevSlotRoot = prevSlot->GetContainingShadow(); + const bool wasAssigned = content->GetAssignedSlot() == prevSlot; + if (wasAssigned && prevSlotRoot && + changedSlots.EnsureInserted(prevSlot)) { + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(prevSlot); } + prevSlot->RemoveManuallyAssignedNode(*content); } - if (changedSlots.EnsureInserted(this)) { - if (root) { - root->InvalidateStyleAndLayoutOnSubtree(this); - } - } - // 3.1 (HTML Spec) If content's manual slot assignment refers to a slot, - // then remove node from that slot's manually assigned nodes. 3.2 (HTML - // Spec) Set content's manual slot assignment to this. - if (HTMLSlotElement* oldSlot = content->GetManualSlotAssignment()) { - oldSlot->RemoveManuallyAssignedNode(*content); - } + // Step 3.2: Set content's manual slot assignment to this. content->SetManualSlotAssignment(this); + // Step 3.3: Append content to nodesSet. mManuallyAssignedNodes.AppendElement(content); + if (changedSlots.EnsureInserted(this) && root) { + ShadowRoot::InvalidateStyleAndLayoutOnSubtree(this); + } + if (root && host && content->GetParent() == host) { // Equivalent to 4.2.2.4.3 (DOM Spec) `Set slot's assigned nodes to // slottables` @@ -295,7 +295,11 @@ } } } - MOZ_ASSERT(changedSlots.IsEmpty()); + } + // Fire slotchange for any remaining slots that are in a different shadow + // tree (cross-root case). The spec doesn't define an ordering here. + for (const auto& slot : changedSlots) { + slot->EnqueueSlotChangeEvent(); } } diff -Nru thunderbird-140.9.0esr/dom/html/TextTrackManager.cpp thunderbird-140.10.0esr/dom/html/TextTrackManager.cpp --- thunderbird-140.9.0esr/dom/html/TextTrackManager.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/html/TextTrackManager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -202,6 +202,7 @@ for (uint32_t i = 0; i < cueList->Length(); ++i) { mNewCues->AddCue(*cueList->IndexedGetter(i, dummy)); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } } @@ -226,6 +227,7 @@ for (uint32_t i = 0; i < removeCueList->Length(); ++i) { mNewCues->RemoveCue(*((*removeCueList)[i])); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } } @@ -288,6 +290,7 @@ if (mNewCues) { mNewCues->AddCue(aCue); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); } @@ -296,6 +299,7 @@ if (mNewCues) { mNewCues->RemoveCue(aCue); } + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); DispatchUpdateCueDisplay(); } @@ -342,7 +346,7 @@ // Step 4: Set all TextTracks with a kind of metadata that are disabled // to hidden. for (uint32_t i = 0; i < mTextTracks->Length(); i++) { - TextTrack* track = (*mTextTracks)[i]; + RefPtr track = (*mTextTracks)[i]; if (track->Kind() == TextTrackKind::Metadata && TrackIsDefault(track) && track->Mode() == TextTrackMode::Disabled) { track->SetMode(TextTrackMode::Hidden); @@ -383,11 +387,11 @@ // first TextTrack in candidates with a default attribute to showing. // TODO: Bug 981691 - Honor user preferences for text track selection. for (uint32_t i = 0; i < candidates.Length(); i++) { - if (TrackIsDefault(candidates[i]) && - candidates[i]->Mode() == TextTrackMode::Disabled) { - candidates[i]->SetMode(TextTrackMode::Showing); + RefPtr track = candidates[i]; + if (TrackIsDefault(track) && track->Mode() == TextTrackMode::Disabled) { + track->SetMode(TextTrackMode::Showing); WEBVTT_LOGV("PerformTrackSelection set Showing kind %d", - static_cast(candidates[i]->Kind())); + static_cast(track->Kind())); return; } } @@ -831,6 +835,7 @@ void TextTrackManager::NotifyCueUpdated(TextTrackCue* aCue) { // TODO: Add/Reorder the cue to mNewCues if we have some optimization? WEBVTT_LOG("NotifyCueUpdated, cue=%p", aCue); + RefPtr kungFuDeathGrip(this); MaybeRunTimeMarchesOn(); // For the case "Texttrack.mode = hidden/showing", if the mode // changing between showing and hidden, TimeMarchesOn diff -Nru thunderbird-140.9.0esr/dom/indexedDB/ActorsParent.cpp thunderbird-140.10.0esr/dom/indexedDB/ActorsParent.cpp --- thunderbird-140.9.0esr/dom/indexedDB/ActorsParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/indexedDB/ActorsParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -7572,6 +7572,15 @@ mConnection->AssertIsOnConnectionThread(); MOZ_ASSERT(mInSavepoint); + // The savepoint is being committed. The deltas it contributed are now + // permanent in mDelta, so reset mSavepointDelta on each entry before + // dropping the index. The FileInfoEntry objects themselves persist in + // mFileInfoEntries across savepoints; without this reset, a stale + // mSavepointDelta would be carried into the next savepoint. + for (const auto& entry : mSavepointEntriesIndex.Values()) { + entry->ResetSavepointDelta(); + } + mSavepointEntriesIndex.Clear(); mInSavepoint = false; } @@ -10329,6 +10338,13 @@ if (NS_AUUF_OR_WARN_IF(!file)) { return false; } + + // Reject actors managed by a different Database + if (NS_AUUF_OR_WARN_IF(file->Manager() != + static_cast( + &GetDatabase()))) { + return false; + } break; case StructuredCloneFileBase::eMutableFile: { @@ -17012,6 +17028,8 @@ if (HasFailed()) { mResolver(ClampResultCode(ResultCode())); } else { + std::sort(mDatabaseMetadataArray.begin(), mDatabaseMetadataArray.end(), + [](const auto& a, const auto& b) { return a.name() < b.name(); }); mResolver(mDatabaseMetadataArray); } diff -Nru thunderbird-140.9.0esr/dom/indexedDB/FileInfoImpl.h thunderbird-140.10.0esr/dom/indexedDB/FileInfoImpl.h --- thunderbird-140.9.0esr/dom/indexedDB/FileInfoImpl.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/indexedDB/FileInfoImpl.h 2026-04-21 14:52:52.000000000 +0000 @@ -74,7 +74,7 @@ aRefCount = aRefCount + aDelta; - if (mRefCnt + mDBRefCnt > 0) { + if (mRefCnt > 0 || mDBRefCnt > 0) { return; } diff -Nru thunderbird-140.9.0esr/dom/indexedDB/IDBObjectStore.cpp thunderbird-140.10.0esr/dom/indexedDB/IDBObjectStore.cpp --- thunderbird-140.9.0esr/dom/indexedDB/IDBObjectStore.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/indexedDB/IDBObjectStore.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -454,9 +454,15 @@ RefPtr blob = fileChild.BlobPtr(); MOZ_ASSERT(blob->IsFile()); - RefPtr file = blob->ToFile(); + RefPtr file; + if (blob->HasExpandos()) { + const RefPtr clonedBlob = blob->Clone(); + file = clonedBlob->ToFile(); + } else { + file = blob->ToFile(); + } if (!file) { - MOZ_ASSERT(false, "Could not convert blob to file!"); + MOZ_ASSERT(false, "Could not create file!"); return nullptr; } @@ -489,11 +495,29 @@ StructuredCloneFileChild& file = cloneInfo->mFiles[aData]; switch (static_cast(aTag)) { - case SCTAG_DOM_BLOB: + case SCTAG_DOM_BLOB: { MOZ_ASSERT(file.Type() == StructuredCloneFileBase::eBlob); MOZ_ASSERT(!file.Blob().IsFile()); - return WrapAsJSObject(aCx, file.MutableBlob()); + JS::Rooted result(aCx); + if (file.Blob().HasExpandos()) { + const RefPtr newBlob = file.Blob().Clone(); + MOZ_ASSERT(newBlob); + + if (!WrapAsJSObject(aCx, newBlob, &result)) { + return nullptr; + } + } else { + // If the blob has no expandos, we can return the existing wrapper + // directly. This is an optimization over step 10 of + // https://w3c.github.io/IndexedDB/#add-or-put since the result is + // observably equivalent when there are no user-added properties. + if (!WrapAsJSObject(aCx, file.MutableBlob(), &result)) { + return nullptr; + } + } + return result; + } case SCTAG_DOM_FILE: { MOZ_ASSERT(file.Type() == StructuredCloneFileBase::eBlob); @@ -502,15 +526,30 @@ { // Create a scope so ~RefPtr fires before returning an unwrapped - // JS::Value. + // JSObject*. Otherwise ~JS::Rooted will unroot the object, then + // ~RefPtr will trigger GC before the value is returned and rooted + // again by the caller. + // See bug 1480640 for details. const RefPtr blob = file.BlobPtr(); MOZ_ASSERT(blob->IsFile()); - const RefPtr file = blob->ToFile(); - MOZ_ASSERT(file); - - if (!WrapAsJSObject(aCx, file, &result)) { - return nullptr; + // Same logic as blob above: clone only if necessary + if (blob->HasExpandos()) { + const RefPtr clonedBlob = blob->Clone(); + MOZ_ASSERT(clonedBlob); + const RefPtr file = clonedBlob->ToFile(); + MOZ_ASSERT(file); + + if (!WrapAsJSObject(aCx, file, &result)) { + return nullptr; + } + } else { + const RefPtr file = blob->ToFile(); + MOZ_ASSERT(file); + + if (!WrapAsJSObject(aCx, file, &result)) { + return nullptr; + } } } diff -Nru thunderbird-140.9.0esr/dom/indexedDB/Key.cpp thunderbird-140.10.0esr/dom/indexedDB/Key.cpp --- thunderbird-140.9.0esr/dom/indexedDB/Key.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/indexedDB/Key.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -940,6 +940,12 @@ return Err(NS_ERROR_DOM_INDEXEDDB_DATA_ERR); } + JSObject* obj = aArrayBufferOrView.asObjectUnbarriered(); + if (JS::IsSharedArrayBufferObject(obj) || + (JS_IsArrayBufferViewObject(obj) && JS::IsArrayBufferViewShared(obj))) { + return Err(NS_ERROR_DOM_INDEXEDDB_DATA_ERR); + } + // 1. Let aData be the result of getting the bytes held by the buffer source // input. // 2. Return a new key with type binary and value aData. diff -Nru thunderbird-140.9.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl thunderbird-140.10.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl --- thunderbird-140.9.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/interfaces/base/nsIDOMWindowUtils.idl 2026-04-21 14:52:52.000000000 +0000 @@ -2193,7 +2193,7 @@ /** * Start capturing each WebRender frame to disk. * - * |aPath| is the name of a new directory to be created to hold the captures. + * a new directory with name "wr-capture" is created to hold the captures. * it is relative to: * - the |PUBLIC_STORAGE| environment variable, if set, else * - the |MOZ_UPLOAD_DIR| environment variable, if set, else @@ -2201,15 +2201,14 @@ * the current directory. * * If there is already a directory with the given name, a numeric suffix is - * added to ensure a fresh directory is created. This means that you can't - * be sure your capture directory is actually named |aPath|. + * added to ensure a fresh directory is created. * * |aFlags| is a set of flags from |webrender::render_api::CaptureBits|. * * If there is already a sequence capture in progress, stop it and start a new * one, with the new path and flags. */ - void wrStartCaptureSequence(in ACString aPath, in uint32_t aFlags); + void wrStartCaptureSequence(in uint32_t aFlags); /** * Stop a capture begun with |wrStartCaptureSequence|. diff -Nru thunderbird-140.9.0esr/dom/ipc/BrowserBridgeParent.cpp thunderbird-140.10.0esr/dom/ipc/BrowserBridgeParent.cpp --- thunderbird-140.9.0esr/dom/ipc/BrowserBridgeParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/BrowserBridgeParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -287,6 +287,9 @@ return IPC_FAIL(this, "Embedder doc shouldn't change from one doc to another"); } + if (aDoc && aDoc->Manager() != Manager()) { + return IPC_FAIL(this, "Embedder doc not managed by our PBrowser"); + } if (!aDoc && mEmbedderAccessibleDoc && !mEmbedderAccessibleDoc->IsShutdown()) { // We're clearing the embedder doc, so remove the pending child doc addition diff -Nru thunderbird-140.9.0esr/dom/ipc/BrowserParent.cpp thunderbird-140.10.0esr/dom/ipc/BrowserParent.cpp --- thunderbird-140.9.0esr/dom/ipc/BrowserParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/BrowserParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2287,6 +2287,12 @@ } } } + // SetFocus may have run script (blur handlers) that destroyed this + // actor. Callers hold a strong reference to us to reading + // mIsDestroyed is safe, but do not send an IPC message in that case. + if (mIsDestroyed) { + return false; + } } return Manager()->IsInputPriorityEventEnabled() ? PBrowserParent::SendHandleTap( diff -Nru thunderbird-140.9.0esr/dom/ipc/BrowserParent.h thunderbird-140.10.0esr/dom/ipc/BrowserParent.h --- thunderbird-140.9.0esr/dom/ipc/BrowserParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/BrowserParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -590,6 +590,9 @@ bool SendSelectionEvent(mozilla::WidgetSelectionEvent& aEvent); + // TODO(bug 2028623): Mark this function and callers as MOZ_CAN_RUN_SCRIPT. + // Current callers hold a strong reference to `this` but MOZ_CAN_RUN_SCRIPT + // would enforce that via static analysis. MOZ_CAN_RUN_SCRIPT_BOUNDARY bool SendHandleTap( TapType aType, const LayoutDevicePoint& aPoint, Modifiers aModifiers, const ScrollableLayerGuid& aGuid, uint64_t aInputBlockId, diff -Nru thunderbird-140.9.0esr/dom/ipc/ClonedErrorHolder.cpp thunderbird-140.10.0esr/dom/ipc/ClonedErrorHolder.cpp --- thunderbird-140.9.0esr/dom/ipc/ClonedErrorHolder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/ClonedErrorHolder.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -174,7 +174,12 @@ bool ClonedErrorHolder::WriteStructuredClone(JSContext* aCx, JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) { - auto& data = mStack.BufferData(); + const auto& data = mStack.BufferData(); + CheckedUint32 dataSize(data.Size()); + if (!dataSize.isValid()) { + return false; + } + return JS_WriteUint32Pair(aWriter, SCTAG_DOM_CLONED_ERROR_OBJECT, 0) && WriteStringPair(aWriter, mName, mMessage) && WriteStringPair(aWriter, mFilename, mSourceLine) && @@ -183,7 +188,7 @@ JS_WriteUint32Pair(aWriter, mTokenOffset, mErrorNumber) && JS_WriteUint32Pair(aWriter, uint32_t(mType), uint32_t(mExnType)) && JS_WriteUint32Pair(aWriter, mCode, uint32_t(mResult)) && - JS_WriteUint32Pair(aWriter, data.Size(), + JS_WriteUint32Pair(aWriter, dataSize.value(), JS_STRUCTURED_CLONE_VERSION) && data.ForEachDataChunk([&](const char* aData, size_t aSize) { return JS_WriteBytes(aWriter, aData, aSize); diff -Nru thunderbird-140.9.0esr/dom/ipc/ContentParent.cpp thunderbird-140.10.0esr/dom/ipc/ContentParent.cpp --- thunderbird-140.9.0esr/dom/ipc/ContentParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/ContentParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -4413,22 +4413,21 @@ const bool& aMinimizeMemoryUsage, const Maybe& aDMDFile) { // This automatically cancels the previous request. mMemoryReportRequest = MakeUnique(aGeneration); - // If we run the callback in response to a reply, then by definition |this| - // is still alive, so the ref pointer is redundant, but it seems easier - // to hold a strong reference than to worry about that. RefPtr self(this); - PContentParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&, self](const uint32_t& aGeneration2) { - if (self->mMemoryReportRequest) { - self->mMemoryReportRequest->Finish(aGeneration2); - self->mMemoryReportRequest = nullptr; - } - }, - [&, self](mozilla::ipc::ResponseRejectReason) { - self->mMemoryReportRequest = nullptr; - }); - return IPC_OK(); + PContentParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [self](uint32_t aGeneration2) { + if (self->mMemoryReportRequest) { + self->mMemoryReportRequest->Finish(aGeneration2); + self->mMemoryReportRequest = nullptr; + } + }, + [self](mozilla::ipc::ResponseRejectReason) { + self->mMemoryReportRequest = nullptr; + }); + return true; } mozilla::ipc::IPCResult ContentParent::RecvAddMemoryReport( diff -Nru thunderbird-140.9.0esr/dom/ipc/PBrowser.ipdl thunderbird-140.10.0esr/dom/ipc/PBrowser.ipdl --- thunderbird-140.9.0esr/dom/ipc/PBrowser.ipdl 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/PBrowser.ipdl 2026-04-21 14:52:52.000000000 +0000 @@ -30,6 +30,7 @@ include PBackgroundSharedTypes; include "mozilla/AntiTrackingIPCUtils.h"; +include "mozilla/EnumSet.h"; include "mozilla/dom/BindingIPCUtils.h"; include "mozilla/dom/CSPMessageUtils.h"; include "mozilla/dom/DocShellMessageUtils.h"; @@ -62,7 +63,7 @@ using mozilla::WindowsHandle from "mozilla/ipc/IPCTypes.h"; using class mozilla::WidgetCompositionEvent from "ipc/nsGUIEventIPC.h"; using struct mozilla::widget::IMENotification from "mozilla/widget/IMEData.h"; -using struct mozilla::widget::IMENotificationRequests from "mozilla/widget/IMEData.h"; +using mozilla::widget::IMENotificationRequests from "mozilla/widget/IMEData.h"; using struct mozilla::widget::IMEState from "mozilla/widget/IMEData.h"; using struct mozilla::widget::InputContext from "mozilla/widget/IMEData.h"; using struct mozilla::widget::InputContextAction from "mozilla/widget/IMEData.h"; diff -Nru thunderbird-140.9.0esr/dom/ipc/RefMessageBodyService.cpp thunderbird-140.10.0esr/dom/ipc/RefMessageBodyService.cpp --- thunderbird-140.9.0esr/dom/ipc/RefMessageBodyService.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/RefMessageBodyService.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -45,12 +45,28 @@ MOZ_DIAGNOSTIC_ASSERT(sService == nullptr); } -RefMessageBodyService::~RefMessageBodyService() { +MozExternalRefCountType RefMessageBodyService::AddRef() { + MOZ_ASSERT(int32_t(mRefCnt) >= 0, "illegal refcnt"); + nsrefcnt cnt = ++mRefCnt; + NS_LOG_ADDREF(this, cnt, "RefMessageBodyService", sizeof(*this)); + return cnt; +} + +MozExternalRefCountType RefMessageBodyService::Release() { StaticMutexAutoLock lock(sRefMessageBodyServiceMutex); + nsrefcnt cnt = --mRefCnt; + NS_LOG_RELEASE(this, cnt, "RefMessageBodyService"); + if (cnt > 0) { + return cnt; + } MOZ_DIAGNOSTIC_ASSERT(sService == this); sService = nullptr; + delete this; + return 0; } +RefMessageBodyService::~RefMessageBodyService() = default; + const nsID RefMessageBodyService::Register( already_AddRefed aBody, ErrorResult& aRv) { RefPtr body = aBody; diff -Nru thunderbird-140.9.0esr/dom/ipc/RefMessageBodyService.h thunderbird-140.10.0esr/dom/ipc/RefMessageBodyService.h --- thunderbird-140.9.0esr/dom/ipc/RefMessageBodyService.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/RefMessageBodyService.h 2026-04-21 14:52:52.000000000 +0000 @@ -107,7 +107,9 @@ class RefMessageBodyService final { public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RefMessageBodyService) + MozExternalRefCountType AddRef(); + MozExternalRefCountType Release(); + using HasThreadSafeRefCnt = std::true_type; static already_AddRefed GetOrCreate(); @@ -125,6 +127,9 @@ explicit RefMessageBodyService(const StaticMutexAutoLock& aProofOfLock); ~RefMessageBodyService(); + protected: + ::mozilla::ThreadSafeAutoRefCnt mRefCnt; + static RefMessageBodyService* GetOrCreateInternal( const StaticMutexAutoLock& aProofOfLock); diff -Nru thunderbird-140.9.0esr/dom/ipc/VsyncParent.cpp thunderbird-140.10.0esr/dom/ipc/VsyncParent.cpp --- thunderbird-140.9.0esr/dom/ipc/VsyncParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/VsyncParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -8,7 +8,6 @@ #include "mozilla/Unused.h" #include "nsThreadUtils.h" -#include "nsIThread.h" namespace mozilla::dom { diff -Nru thunderbird-140.9.0esr/dom/ipc/VsyncParent.h thunderbird-140.10.0esr/dom/ipc/VsyncParent.h --- thunderbird-140.9.0esr/dom/ipc/VsyncParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/ipc/VsyncParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -12,7 +12,7 @@ #include "nsCOMPtr.h" #include "mozilla/RefPtr.h" -class nsIThread; +#include "nsIThread.h" namespace mozilla::dom { @@ -22,7 +22,8 @@ class VsyncParent final : public PVsyncParent, public VsyncObserver { friend class PVsyncParent; - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncParent, override) + NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DELETE_ON_EVENT_TARGET( + VsyncParent, mInitialThread, override) public: VsyncParent(); diff -Nru thunderbird-140.9.0esr/dom/locks/LockRequestChild.cpp thunderbird-140.10.0esr/dom/locks/LockRequestChild.cpp --- thunderbird-140.9.0esr/dom/locks/LockRequestChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/locks/LockRequestChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -56,6 +56,7 @@ } void LockRequestChild::ActorDestroy(ActorDestroyReason aReason) { + Unfollow(); CastedManager()->NotifyRequestDestroy(); } @@ -109,7 +110,6 @@ mRequest.mPromise->MaybeReject(reason); } - Unfollow(); Send__delete__(this, true); } diff -Nru thunderbird-140.9.0esr/dom/media/ADTSDemuxer.cpp thunderbird-140.10.0esr/dom/media/ADTSDemuxer.cpp --- thunderbird-140.9.0esr/dom/media/ADTSDemuxer.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ADTSDemuxer.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -550,7 +550,7 @@ if (mInfo && streamLen > 0) { int64_t max = streamLen > aOffset ? streamLen - aOffset : 0; // Prevent blocking reads after successful initialization. - aSize = std::min(aSize, AssertedCast(max)); + aSize = static_cast(std::min(static_cast(aSize), max)); } uint32_t read = 0; diff -Nru thunderbird-140.9.0esr/dom/media/AsyncLogger.h thunderbird-140.10.0esr/dom/media/AsyncLogger.h --- thunderbird-140.9.0esr/dom/media/AsyncLogger.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/AsyncLogger.h 2026-04-21 14:52:52.000000000 +0000 @@ -44,9 +44,15 @@ size_t toCopy = strlen(aString); bool truncated = false; - if (toCopy > Available()) { + size_t availableBytes = Available(); + if (availableBytes == 0) { + // Treat nothing written as truncated + return true; + } + + if (toCopy >= availableBytes) { truncated = true; - toCopy = Available() - 1; + toCopy = availableBytes - 1; } memcpy(&(mMemory[mWriteIndex]), aString, toCopy); @@ -59,7 +65,7 @@ private: size_t Available() { - MOZ_ASSERT(mLength > mWriteIndex); + MOZ_ASSERT(mLength >= mWriteIndex); return mLength - mWriteIndex; } @@ -188,9 +194,10 @@ msg->data.mTimestamp = TimeStamp::Now(); msg->data.mDurationUs = (static_cast(aFrames) / aSampleRate) * 1e6; - size_t len = std::min(strlen(aName), std::size(msg->data.mName)); - memcpy(msg->data.mName, aName, len); - msg->data.mName[len] = 0; + StringWriter writer(msg->data.mName, std::size(msg->data.mName)); + size_t unused; + // Unused since we don't need to know the location of the new index + writer.AppendCString(aName, &unused); mMessageQueueProfiler.Push(msg); } } diff -Nru thunderbird-140.9.0esr/dom/media/BaseMediaResource.cpp thunderbird-140.10.0esr/dom/media/BaseMediaResource.cpp --- thunderbird-140.9.0esr/dom/media/BaseMediaResource.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/BaseMediaResource.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -141,27 +141,30 @@ } nsresult BaseMediaResource::ModifyLoadFlags(nsLoadFlags aFlags) { + RefPtr kungFuDeathGrip(this); + nsCOMPtr channel = mChannel; + nsCOMPtr loadGroup; - nsresult rv = mChannel->GetLoadGroup(getter_AddRefs(loadGroup)); + nsresult rv = channel->GetLoadGroup(getter_AddRefs(loadGroup)); MOZ_ASSERT(NS_SUCCEEDED(rv), "GetLoadGroup() failed!"); bool inLoadGroup = false; if (loadGroup) { nsresult status; - mChannel->GetStatus(&status); + channel->GetStatus(&status); - rv = loadGroup->RemoveRequest(mChannel, nullptr, status); + rv = loadGroup->RemoveRequest(channel, nullptr, status); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } inLoadGroup = true; } - rv = mChannel->SetLoadFlags(aFlags); + rv = channel->SetLoadFlags(aFlags); MOZ_ASSERT(NS_SUCCEEDED(rv), "SetLoadFlags() failed!"); if (inLoadGroup) { - rv = loadGroup->AddRequest(mChannel, nullptr); + rv = loadGroup->AddRequest(channel, nullptr); MOZ_ASSERT(NS_SUCCEEDED(rv), "AddRequest() failed!"); } diff -Nru thunderbird-140.9.0esr/dom/media/ExternalEngineStateMachine.cpp thunderbird-140.10.0esr/dom/media/ExternalEngineStateMachine.cpp --- thunderbird-140.9.0esr/dom/media/ExternalEngineStateMachine.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ExternalEngineStateMachine.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1367,6 +1367,13 @@ RefPtr ExternalEngineStateMachine::SetCDMProxy( CDMProxy* aProxy) { + if (!OnTaskQueue()) { + return InvokeAsync(OwnerThread(), __func__, + [self = RefPtr{this}, proxy = RefPtr{aProxy}, this]() { + return SetCDMProxy(proxy); + }); + } + AssertOnTaskQueue(); if (mState.IsShutdownEngine()) { return SetCDMPromise::CreateAndReject(NS_ERROR_FAILURE, __func__); } diff -Nru thunderbird-140.9.0esr/dom/media/MediaData.cpp thunderbird-140.10.0esr/dom/media/MediaData.cpp --- thunderbird-140.9.0esr/dom/media/MediaData.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/MediaData.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -123,8 +123,8 @@ MOZ_DIAGNOSTIC_ASSERT(mDataOffset <= mAudioData.Length(), "Data offset outside original buffer"); int64_t frameCountAfterTrim = (trimAfter - trimBefore).ToTicksAtRate(mRate); - if (frameCountAfterTrim > - AssertedCast(mAudioData.Length() / mChannels)) { + const size_t availFrames = (mAudioData.Length() - mDataOffset) / mChannels; + if (frameCountAfterTrim > AssertedCast(availFrames)) { // Accept rounding error caused by an imprecise time_base in the container, // that can cause a mismatch but not other kind of unexpected frame count. MOZ_RELEASE_ASSERT(!trimBefore.IsBase(mRate)); diff -Nru thunderbird-140.9.0esr/dom/media/MediaData.h thunderbird-140.10.0esr/dom/media/MediaData.h --- thunderbird-140.9.0esr/dom/media/MediaData.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/MediaData.h 2026-04-21 14:52:52.000000000 +0000 @@ -342,13 +342,13 @@ template const ReturnType* As() const { - MOZ_ASSERT(this->mType == ReturnType::sType); + MOZ_RELEASE_ASSERT(this->mType == ReturnType::sType); return static_cast(this); } template ReturnType* As() { - MOZ_ASSERT(this->mType == ReturnType::sType); + MOZ_RELEASE_ASSERT(this->mType == ReturnType::sType); return static_cast(this); } diff -Nru thunderbird-140.9.0esr/dom/media/MediaDecoderStateMachine.cpp thunderbird-140.10.0esr/dom/media/MediaDecoderStateMachine.cpp --- thunderbird-140.9.0esr/dom/media/MediaDecoderStateMachine.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/MediaDecoderStateMachine.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1129,11 +1129,10 @@ OwnerThread(), __func__, [this, isAudio, master = RefPtr{mMaster}]() mutable -> void { AUTO_PROFILER_LABEL( - nsPrintfCString( - "LoopingDecodingState::RequestDataFromStartPosition(%s)::" - "SeekResolved", - isAudio ? "audio" : "video") - .get(), + isAudio ? "LoopingDecodingState::" + "RequestDataFromStartPosition(audio)::SeekResolved" + : "LoopingDecodingState::" + "RequestDataFromStartPosition(video)::SeekResolved", MEDIA_PLAYBACK); if (auto& state = master->mStateObj; state && @@ -1168,11 +1167,10 @@ [this, isAudio, master = RefPtr{mMaster}]( const SeekRejectValue& aReject) mutable -> void { AUTO_PROFILER_LABEL( - nsPrintfCString("LoopingDecodingState::" - "RequestDataFromStartPosition(%s)::" - "SeekRejected", - isAudio ? "audio" : "video") - .get(), + isAudio ? "LoopingDecodingState::" + "RequestDataFromStartPosition(audio)::SeekRejected" + : "LoopingDecodingState::" + "RequestDataFromStartPosition(video)::SeekRejected", MEDIA_PLAYBACK); if (auto& state = master->mStateObj; state && diff -Nru thunderbird-140.9.0esr/dom/media/eme/MediaEncryptedEvent.cpp thunderbird-140.10.0esr/dom/media/eme/MediaEncryptedEvent.cpp --- thunderbird-140.9.0esr/dom/media/eme/MediaEncryptedEvent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/eme/MediaEncryptedEvent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -28,7 +28,8 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaEncryptedEvent, Event) - mozilla::DropJSObjects(tmp); + tmp->mInitData = nullptr; + tmp->mRawInitData.Clear(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaEncryptedEvent) diff -Nru thunderbird-140.9.0esr/dom/media/eme/MediaKeyMessageEvent.cpp thunderbird-140.10.0esr/dom/media/eme/MediaKeyMessageEvent.cpp --- thunderbird-140.9.0esr/dom/media/eme/MediaKeyMessageEvent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/eme/MediaKeyMessageEvent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -31,7 +31,8 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaKeyMessageEvent, Event) - mozilla::DropJSObjects(tmp); + tmp->mMessage = nullptr; + tmp->mRawMessage.Clear(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeyMessageEvent) diff -Nru thunderbird-140.9.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp thunderbird-140.10.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp --- thunderbird-140.9.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/eme/mediafoundation/WMFCDMProxy.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -103,10 +103,12 @@ mCDM->Init(params)->Then( mMainThread, __func__, [self = RefPtr{this}, this, aPromiseId](const bool) { + RETURN_IF_SHUTDOWN(); MOZ_ASSERT(mCDM->Id() > 0); mKeys->OnCDMCreated(aPromiseId, mCDM->Id()); }, [self = RefPtr{this}, this, aPromiseId](const nsresult rv) { + RETURN_IF_SHUTDOWN(); RejectPromiseWithStateError( aPromiseId, nsLiteralCString("WMFCDMProxy::Init: WMFCDM init error")); @@ -315,6 +317,7 @@ mProxyCallback = nullptr; } mIsShutdown = true; + mKeys.Clear(); } void WMFCDMProxy::OnSessionMessage(const nsAString& aSessionId, diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallback.h thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallback.h --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallback.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallback.h 2026-04-21 14:52:53.000000000 +0000 @@ -26,7 +26,7 @@ bool aSuccessful) = 0; virtual void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) = 0; + cdm::KeyStatus aKeyStatus) = 0; virtual void ResolvePromise(uint32_t aPromiseId) = 0; @@ -34,7 +34,7 @@ const nsCString& aErrorMessage) = 0; virtual void SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, + cdm::MessageType aMessageType, nsTArray&& aMessage) = 0; virtual void SessionKeysChange( diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -55,8 +55,9 @@ std::move(aException), aErrorMessage); } -static dom::MediaKeyMessageType ToDOMMessageType(uint32_t aMessageType) { - switch (static_cast(aMessageType)) { +static dom::MediaKeyMessageType ToDOMMessageType( + cdm::MessageType aMessageType) { + switch (aMessageType) { case cdm::kLicenseRequest: return dom::MediaKeyMessageType::License_request; case cdm::kLicenseRenewal: @@ -71,7 +72,7 @@ } void ChromiumCDMCallbackProxy::SessionMessage(const nsACString& aSessionId, - uint32_t aMessageType, + cdm::MessageType aMessageType, nsTArray&& aMessage) { DispatchToMainThread("ChromiumCDMProxy::OnSessionMessage", &ChromiumCDMProxy::OnSessionMessage, @@ -79,8 +80,8 @@ ToDOMMessageType(aMessageType), std::move(aMessage)); } -static dom::MediaKeyStatus ToDOMMediaKeyStatus(uint32_t aStatus) { - switch (static_cast(aStatus)) { +static dom::MediaKeyStatus ToDOMMediaKeyStatus(cdm::KeyStatus aStatus) { + switch (aStatus) { case cdm::kUsable: return dom::MediaKeyStatus::Usable; case cdm::kInternalError: @@ -101,7 +102,7 @@ } void ChromiumCDMCallbackProxy::ResolvePromiseWithKeyStatus( - uint32_t aPromiseId, uint32_t aKeyStatus) { + uint32_t aPromiseId, cdm::KeyStatus aKeyStatus) { DispatchToMainThread("ChromiumCDMProxy::OnResolvePromiseWithKeyStatus", &ChromiumCDMProxy::OnResolvePromiseWithKeyStatus, aPromiseId, ToDOMMediaKeyStatus(aKeyStatus)); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMCallbackProxy.h 2026-04-21 14:52:52.000000000 +0000 @@ -12,7 +12,7 @@ namespace mozilla { -class ChromiumCDMCallbackProxy : public ChromiumCDMCallback { +class ChromiumCDMCallbackProxy final : public ChromiumCDMCallback { public: ChromiumCDMCallbackProxy(ChromiumCDMProxy* aProxy, nsIEventTarget* aMainThread) @@ -24,14 +24,15 @@ bool aSuccessful) override; void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) override; + cdm::KeyStatus aKeyStatus) override; void ResolvePromise(uint32_t aPromiseId) override; void RejectPromise(uint32_t aPromiseId, ErrorResult&& aException, const nsCString& aErrorMessage) override; - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, nsTArray&& aMessage) override; void SessionKeysChange( diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMChild.cpp thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -9,6 +9,7 @@ #include "WidevineFileIO.h" #include "WidevineVideoFrame.h" #include "GMPLog.h" +#include "GMPMessageUtils.h" #include "GMPPlatform.h" #include "mozilla/Unused.h" #include "nsPrintfCString.h" @@ -28,6 +29,35 @@ GMP_LOG_DEBUG("ChromiumCDMChild:: ctor this=%p", this); } +cdm::Exception ChromiumCDMChild::ClampException(cdm::Exception aValue) const { + if (NS_WARN_IF(!IPC::CDMExceptionEnumValidator::IsLegalValue(aValue))) { + GMP_LOG_DEBUG("ChromiumCDMChild::ClampException: unhandled %" PRIu32, + aValue); + return cdm::Exception::kExceptionInvalidStateError; + } + return aValue; +} + +cdm::Status ChromiumCDMChild::ClampStatus(cdm::Status aValue, + cdm::Status aFallback) const { + if (NS_WARN_IF(!IPC::CDMStatusEnumValidator::IsLegalValue(aValue))) { + GMP_LOG_DEBUG("ChromiumCDMChild::ClampStatus: unhandled %" PRIu32, aValue); + return aFallback; + } + return aValue; +} + +cdm::KeyStatus ChromiumCDMChild::ClampKeyStatus(cdm::KeyStatus aValue) const { + if (NS_WARN_IF(!IPC::CDMKeyStatusEnumValidator::IsLegalValue(aValue))) { + // TODO(aosmond): When we switch to Host_12/KeyStatus_2, we should return + // cdm::KeyStatus_2::kUsableInFuture. + GMP_LOG_DEBUG("ChromiumCDMChild::ClampKeyStatus: unhandled %" PRIu32, + aValue); + return cdm::KeyStatus::kInternalError; + } + return aValue; +} + void ChromiumCDMChild::Init(cdm::ContentDecryptionModule_11* aCDM, const nsACString& aStorageId) { MOZ_ASSERT(IsOnMessageLoopThread()); @@ -200,7 +230,7 @@ aPromiseId, aKeyStatus); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnResolveKeyStatusPromise", &ChromiumCDMChild::SendOnResolvePromiseWithKeyStatus, - aPromiseId, static_cast(aKeyStatus)); + aPromiseId, ClampKeyStatus(aKeyStatus)); } bool ChromiumCDMChild::OnResolveNewSessionPromiseInternal( @@ -252,7 +282,7 @@ aPromiseId, aException, aSystemCode, aErrorMessage); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnRejectPromise", &ChromiumCDMChild::SendOnRejectPromise, aPromiseId, - static_cast(aException), aSystemCode, + ClampException(aException), aSystemCode, nsCString(aErrorMessage, aErrorMessageSize)); } @@ -264,12 +294,19 @@ GMP_LOG_DEBUG("ChromiumCDMChild::OnSessionMessage(sid=%s, type=%" PRIu32 " size=%" PRIu32 ")", aSessionId, aMessageType, aMessageSize); + if (NS_WARN_IF( + !IPC::CDMMessageTypeEnumValidator::IsLegalValue(aMessageType))) { + GMP_LOG_DEBUG( + "ChromiumCDMChild::OnSessionMessage: unhandled message %" PRIu32, + aMessageType); + return; + } CopyableTArray message; message.AppendElements(aMessage, aMessageSize); CallOnMessageLoopThread("gmp::ChromiumCDMChild::OnSessionMessage", &ChromiumCDMChild::SendOnSessionMessage, - nsCString(aSessionId, aSessionIdSize), - static_cast(aMessageType), message); + nsCString(aSessionId, aSessionIdSize), aMessageType, + message); } static auto ToString(const cdm::KeyInformation* aKeysInfo, @@ -294,6 +331,15 @@ keys.SetCapacity(aKeysInfoCount); for (uint32_t i = 0; i < aKeysInfoCount; i++) { const cdm::KeyInformation& key = aKeysInfo[i]; + if (NS_WARN_IF(!IPC::CDMKeyStatusEnumValidator::IsLegalValue(key.status))) { + // TODO(aosmond): When we switch to Host_12/KeyStatus_2, we should use + // cdm::KeyStatus_2::kUsableInFuture. + GMP_LOG_DEBUG( + "ChromiumCDMChild::OnSessionKeysChange: unhandled key status " + "%" PRIu32, + key.status); + continue; + } nsTArray kid; kid.AppendElements(key.key_id, key.key_id_size); keys.AppendElement(CDMKeyInformation(kid, key.status, key.system_code)); @@ -383,7 +429,15 @@ } void ChromiumCDMChild::ActorDestroy(ActorDestroyReason aReason) { + mInitPromise.RejectIfExists(NS_ERROR_ABORT, __func__); + + if (mCDM) { + mCDM->Destroy(); + mCDM = nullptr; + } + mPlugin = nullptr; + mDestroyed = true; } void ChromiumCDMChild::PurgeShmems() { @@ -557,33 +611,41 @@ return IPC_OK(); } -static void InitInputBuffer(const CDMInputBuffer& aBuffer, +static bool InitInputBuffer(const CDMInputBuffer& aBuffer, nsTArray& aSubSamples, cdm::InputBuffer_2& aInputBuffer) { aInputBuffer.data = aBuffer.mData().get(); aInputBuffer.data_size = aBuffer.mData().Size(); - if (aBuffer.mEncryptionScheme() != cdm::EncryptionScheme::kUnencrypted) { - MOZ_ASSERT(aBuffer.mEncryptionScheme() == cdm::EncryptionScheme::kCenc || - aBuffer.mEncryptionScheme() == cdm::EncryptionScheme::kCbcs); - aInputBuffer.key_id = aBuffer.mKeyId().Elements(); - aInputBuffer.key_id_size = aBuffer.mKeyId().Length(); - - aInputBuffer.iv = aBuffer.mIV().Elements(); - aInputBuffer.iv_size = aBuffer.mIV().Length(); - - aSubSamples.SetCapacity(aBuffer.mClearBytes().Length()); - for (size_t i = 0; i < aBuffer.mCipherBytes().Length(); i++) { - aSubSamples.AppendElement(cdm::SubsampleEntry{aBuffer.mClearBytes()[i], - aBuffer.mCipherBytes()[i]}); - } - aInputBuffer.subsamples = aSubSamples.Elements(); - aInputBuffer.num_subsamples = aSubSamples.Length(); - aInputBuffer.encryption_scheme = aBuffer.mEncryptionScheme(); + switch (aBuffer.mEncryptionScheme()) { + case cdm::EncryptionScheme::kCenc: + case cdm::EncryptionScheme::kCbcs: + aInputBuffer.key_id = aBuffer.mKeyId().Elements(); + aInputBuffer.key_id_size = aBuffer.mKeyId().Length(); + + aInputBuffer.iv = aBuffer.mIV().Elements(); + aInputBuffer.iv_size = aBuffer.mIV().Length(); + + aSubSamples.SetCapacity(aBuffer.mClearBytes().Length()); + for (size_t i = 0; i < aBuffer.mCipherBytes().Length(); i++) { + aSubSamples.AppendElement(cdm::SubsampleEntry{ + aBuffer.mClearBytes()[i], aBuffer.mCipherBytes()[i]}); + } + aInputBuffer.subsamples = aSubSamples.Elements(); + aInputBuffer.num_subsamples = aSubSamples.Length(); + break; + case cdm::EncryptionScheme::kUnencrypted: + break; + default: + GMP_LOG_ERROR("InitInputBuffer: Unhandled encryption scheme %" PRIu32, + static_cast(aBuffer.mEncryptionScheme())); + return false; } + aInputBuffer.encryption_scheme = aBuffer.mEncryptionScheme(); aInputBuffer.pattern.crypt_byte_block = aBuffer.mCryptByteBlock(); aInputBuffer.pattern.skip_byte_block = aBuffer.mSkipByteBlock(); aInputBuffer.timestamp = aBuffer.mTimestamp(); + return true; } bool ChromiumCDMChild::HasShmemOfSize(size_t aSize) const { @@ -638,14 +700,17 @@ cdm::InputBuffer_2 input = {}; nsTArray subsamples; - InitInputBuffer(aBuffer, subsamples, input); + if (!InitInputBuffer(aBuffer, subsamples, input)) { + (void)SendDecryptFailed(aId, cdm::kDecryptError); + return IPC_OK(); + } WidevineDecryptedBlock output; cdm::Status status = mCDM->Decrypt(input, &output); // CDM should have allocated a cdm::Buffer for output. if (status != cdm::kSuccess || !output.DecryptedBuffer()) { - Unused << SendDecryptFailed(aId, status); + Unused << SendDecryptFailed(aId, ClampStatus(status, cdm::kDecryptError)); return IPC_OK(); } @@ -695,7 +760,8 @@ cdm::Status status = mCDM->InitializeVideoDecoder(config); GMP_LOG_DEBUG("ChromiumCDMChild::RecvInitializeVideoDecoder() status=%u", status); - Unused << SendOnDecoderInitDone(status); + Unused << SendOnDecoderInitDone( + ClampStatus(status, cdm::Status::kInitializationError)); mDecoderInitialized = status == cdm::kSuccess; return IPC_OK(); } @@ -729,15 +795,22 @@ aBuffer.mTimestamp()); MOZ_ASSERT(mDecoderInitialized); + RefPtr self = this; + auto autoDeallocateShmem = + MakeScopeExit([&, self] { self->DeallocShmem(aBuffer.mData()); }); + if (!mCDM) { GMP_LOG_DEBUG("ChromiumCDMChild::RecvDecryptAndDecodeFrame() no CDM"); Unused << SendDecodeFailed(cdm::kDecodeError); return IPC_OK(); } - RefPtr self = this; - auto autoDeallocateShmem = - MakeScopeExit([&, self] { self->DeallocShmem(aBuffer.mData()); }); + cdm::InputBuffer_2 input = {}; + nsTArray subsamples; + if (!InitInputBuffer(aBuffer, subsamples, input)) { + (void)SendDecodeFailed(cdm::kDecodeError); + return IPC_OK(); + } // The output frame may not have the same timestamp as the frame we put in. // We may need to input a number of frames before we receive output. The @@ -746,10 +819,6 @@ // on output. mFrameDurations.Insert(aBuffer.mTimestamp(), aBuffer.mDuration()); - cdm::InputBuffer_2 input = {}; - nsTArray subsamples; - InitInputBuffer(aBuffer, subsamples, input); - WidevineVideoFrame frame; cdm::Status rv = mCDM->DecryptAndDecodeFrame(input, &frame); GMP_LOG_DEBUG("ChromiumCDMChild::RecvDecryptAndDecodeFrame() t=%" PRId64 @@ -783,7 +852,7 @@ // CDM didn't set a frame buffer on the sample, report it as an error. [[fallthrough]]; default: - Unused << SendDecodeFailed(rv); + Unused << SendDecodeFailed(ClampStatus(rv, cdm::kDecodeError)); break; } @@ -852,14 +921,6 @@ MOZ_ASSERT(!mDecoderInitialized); - mInitPromise.RejectIfExists(NS_ERROR_ABORT, __func__); - - if (mCDM) { - mCDM->Destroy(); - mCDM = nullptr; - } - mDestroyed = true; - Unused << Send__delete__(this); return IPC_OK(); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMChild.h thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMChild.h --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMChild.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMChild.h 2026-04-21 14:52:52.000000000 +0000 @@ -71,6 +71,10 @@ protected: ~ChromiumCDMChild(); + cdm::Exception ClampException(cdm::Exception aValue) const; + cdm::Status ClampStatus(cdm::Status aValue, cdm::Status aFallback) const; + cdm::KeyStatus ClampKeyStatus(cdm::KeyStatus aValue) const; + bool OnResolveNewSessionPromiseInternal(uint32_t aPromiseId, const nsACString& aSessionId); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMParent.cpp thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMParent.cpp --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -78,6 +78,9 @@ ->Then( GetCurrentSerialEventTarget(), __func__, [self, aCDMCallback](bool aSuccess) { + if (self->mIsShutdown) { + return; + } if (!aSuccess) { GMP_LOG_DEBUG( "ChromiumCDMParent::Init() failed with callback from " @@ -424,7 +427,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnResolvePromiseWithKeyStatus( - const uint32_t& aPromiseId, const uint32_t& aKeyStatus) { + const uint32_t& aPromiseId, const cdm::KeyStatus& aKeyStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG( "ChromiumCDMParent::RecvOnResolvePromiseWithKeyStatus(this=%p, " @@ -532,12 +535,12 @@ RejectPromise(aPromiseId, std::move(rv), aErrorMessage); } -static ErrorResult ToErrorResult(uint32_t aException, +static ErrorResult ToErrorResult(cdm::Exception aException, const nsCString& aErrorMessage) { // XXXbz could we have a CopyableErrorResult sent to us with a better error // message? ErrorResult rv; - switch (static_cast(aException)) { + switch (aException) { case cdm::Exception::kExceptionNotSupportedError: rv.ThrowNotSupportedError(aErrorMessage); break; @@ -559,7 +562,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnRejectPromise( - const uint32_t& aPromiseId, const uint32_t& aException, + const uint32_t& aPromiseId, const cdm::Exception& aException, const uint32_t& aSystemCode, const nsCString& aErrorMessage) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); RejectPromise(aPromiseId, ToErrorResult(aException, aErrorMessage), @@ -568,7 +571,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnSessionMessage( - const nsCString& aSessionId, const uint32_t& aMessageType, + const nsCString& aSessionId, const cdm::MessageType& aMessageType, nsTArray&& aMessage) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvOnSessionMessage(this=%p, sid=%s)", @@ -653,8 +656,8 @@ return IPC_OK(); } -DecryptStatus ToDecryptStatus(uint32_t aStatus) { - switch (static_cast(aStatus)) { +DecryptStatus ToDecryptStatus(cdm::Status aStatus) { + switch (aStatus) { case cdm::kSuccess: return DecryptStatus::Ok; case cdm::kNoKey: @@ -664,8 +667,8 @@ } } -ipc::IPCResult ChromiumCDMParent::RecvDecryptFailed(const uint32_t& aId, - const uint32_t& aStatus) { +ipc::IPCResult ChromiumCDMParent::RecvDecryptFailed( + const uint32_t& aId, const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptFailed(this=%p, id=%" PRIu32 ", status=%" PRIu32 ")", @@ -687,7 +690,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvDecryptedShmem(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, ipc::Shmem&& aShmem) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptedShmem(this=%p, id=%" PRIu32 @@ -717,7 +720,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvDecryptedData(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, nsTArray&& aData) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecryptedData(this=%p, id=%" PRIu32 @@ -1093,7 +1096,7 @@ return v.forget(); } -ipc::IPCResult ChromiumCDMParent::RecvDecodeFailed(const uint32_t& aStatus) { +ipc::IPCResult ChromiumCDMParent::RecvDecodeFailed(const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG("ChromiumCDMParent::RecvDecodeFailed(this=%p status=%" PRIu32 ")", @@ -1114,7 +1117,7 @@ RESULT_DETAIL( "ChromiumCDMParent::RecvDecodeFailed with status %s (%" PRIu32 ")", - cdm::EnumValueToString(cdm::Status(aStatus)), aStatus)), + cdm::EnumValueToString(aStatus), aStatus)), __func__); return IPC_OK(); } @@ -1211,7 +1214,7 @@ } ipc::IPCResult ChromiumCDMParent::RecvOnDecoderInitDone( - const uint32_t& aStatus) { + const cdm::Status& aStatus) { MOZ_ASSERT(mGMPThread->IsOnCurrentThread()); GMP_LOG_DEBUG( "ChromiumCDMParent::RecvOnDecoderInitDone(this=%p, status=%" PRIu32 ")", @@ -1220,15 +1223,15 @@ MOZ_ASSERT(mInitVideoDecoderPromise.IsEmpty()); return IPC_OK(); } - if (aStatus == static_cast(cdm::kSuccess)) { + if (aStatus == cdm::kSuccess) { mInitVideoDecoderPromise.ResolveIfExists(TrackInfo::kVideoTrack, __func__); } else { mVideoDecoderInitialized = false; mInitVideoDecoderPromise.RejectIfExists( - MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, - RESULT_DETAIL( - "CDM init decode failed with status %s (%" PRIu32 ")", - cdm::EnumValueToString(cdm::Status(aStatus)), aStatus)), + MediaResult( + NS_ERROR_DOM_MEDIA_FATAL_ERR, + RESULT_DETAIL("CDM init decode failed with status %s (%" PRIu32 ")", + cdm::EnumValueToString(aStatus), aStatus)), __func__); } return IPC_OK(); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMParent.h thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMParent.h --- thunderbird-140.9.0esr/dom/media/gmp/ChromiumCDMParent.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/ChromiumCDMParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -106,19 +106,19 @@ ~ChromiumCDMParent() = default; ipc::IPCResult Recv__delete__() override; - ipc::IPCResult RecvOnResolvePromiseWithKeyStatus(const uint32_t& aPromiseId, - const uint32_t& aKeyStatus); + ipc::IPCResult RecvOnResolvePromiseWithKeyStatus( + const uint32_t& aPromiseId, const cdm::KeyStatus& aKeyStatus); ipc::IPCResult RecvOnResolveNewSessionPromise(const uint32_t& aPromiseId, const nsCString& aSessionId); ipc::IPCResult RecvResolveLoadSessionPromise(const uint32_t& aPromiseId, const bool& aSuccessful); ipc::IPCResult RecvOnResolvePromise(const uint32_t& aPromiseId); ipc::IPCResult RecvOnRejectPromise(const uint32_t& aPromiseId, - const uint32_t& aError, + const cdm::Exception& aError, const uint32_t& aSystemCode, const nsCString& aErrorMessage); ipc::IPCResult RecvOnSessionMessage(const nsCString& aSessionId, - const uint32_t& aMessageType, + const cdm::MessageType& aMessageType, nsTArray&& aMessage); ipc::IPCResult RecvOnSessionKeysChange( const nsCString& aSessionId, nsTArray&& aKeysInfo); @@ -127,18 +127,19 @@ ipc::IPCResult RecvOnSessionClosed(const nsCString& aSessionId); ipc::IPCResult RecvOnQueryOutputProtectionStatus(); ipc::IPCResult RecvDecryptedShmem(const uint32_t& aId, - const uint32_t& aStatus, + const cdm::Status& aStatus, ipc::Shmem&& aData); - ipc::IPCResult RecvDecryptedData(const uint32_t& aId, const uint32_t& aStatus, + ipc::IPCResult RecvDecryptedData(const uint32_t& aId, + const cdm::Status& aStatus, nsTArray&& aData); ipc::IPCResult RecvDecryptFailed(const uint32_t& aId, - const uint32_t& aStatus); - ipc::IPCResult RecvOnDecoderInitDone(const uint32_t& aStatus); + const cdm::Status& aStatus); + ipc::IPCResult RecvOnDecoderInitDone(const cdm::Status& aStatus); ipc::IPCResult RecvDecodedShmem(const CDMVideoFrame& aFrame, ipc::Shmem&& aShmem); ipc::IPCResult RecvDecodedData(const CDMVideoFrame& aFrame, nsTArray&& aData); - ipc::IPCResult RecvDecodeFailed(const uint32_t& aStatus); + ipc::IPCResult RecvDecodeFailed(const cdm::Status& aStatus); ipc::IPCResult RecvShutdown(); ipc::IPCResult RecvResetVideoDecoderComplete(); ipc::IPCResult RecvDrainComplete(); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPChild.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -71,6 +71,7 @@ GMPChild::GMPChild() : mGMPMessageLoop(MessageLoop::current()), mGMPLoader(nullptr) { + MOZ_ASSERT(NS_IsMainThread()); GMP_CHILD_LOG_DEBUG("GMPChild ctor"); nsDebugImpl::SetMultiprocessMode("GMP"); } @@ -584,8 +585,6 @@ mGMPLoader->Shutdown(); } - ShutdownPlatformAPI(); - if (AbnormalShutdown == aWhy) { NS_WARNING("Abnormal shutdown of GMP process!"); ProcessChild::QuickExit(); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPContentChild.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPContentChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPContentChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPContentChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -57,7 +57,8 @@ auto vdc = static_cast(aActor); void* vd = nullptr; - GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_DECODER, &vdc->Host(), &vd); + GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_DECODER, + static_cast(vdc), &vd); if (err != GMPNoErr || !vd) { return IPC_FAIL(this, "GMPGetAPI call failed trying to construct decoder."); } @@ -72,7 +73,8 @@ auto vec = static_cast(aActor); void* ve = nullptr; - GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_ENCODER, &vec->Host(), &ve); + GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_ENCODER, + static_cast(vec), &ve); if (err != GMPNoErr || !ve) { return IPC_FAIL(this, "GMPGetAPI call failed trying to construct encoder."); } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPMessageUtils.h thunderbird-140.10.0esr/dom/media/gmp/GMPMessageUtils.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPMessageUtils.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPMessageUtils.h 2026-04-21 14:52:53.000000000 +0000 @@ -92,6 +92,34 @@ cdm::HdcpVersion, cdm::HdcpVersion::kHdcpVersionNone, cdm::HdcpVersion::kHdcpVersion2_3> {}; +using CDMStatusEnumValidator = + ContiguousEnumValidatorInclusive; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMExceptionEnumValidator = ContiguousEnumValidatorInclusive< + cdm::Exception, cdm::Exception::kExceptionTypeError, + cdm::Exception::kExceptionQuotaExceededError>; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMKeyStatusEnumValidator = + ContiguousEnumValidatorInclusive; +template <> +struct ParamTraits + : public EnumSerializer {}; + +using CDMMessageTypeEnumValidator = ContiguousEnumValidatorInclusive< + cdm::MessageType, cdm::MessageType::kLicenseRequest, + cdm::MessageType::kIndividualizationRequest>; +template <> +struct ParamTraits + : public EnumSerializer {}; + template <> struct ParamTraits { typedef GMPSimulcastStream paramType; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPPlatform.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPPlatform.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPPlatform.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPPlatform.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -10,8 +10,6 @@ #include "GMPChild.h" #include "mozilla/Mutex.h" #include "mozilla/ReentrantMonitor.h" -#include "mozilla/StaticMonitor.h" -#include "nsTArray.h" #include "nsThreadUtils.h" #include "base/task.h" #include "base/thread.h" @@ -25,18 +23,8 @@ namespace mozilla::gmp { -static MessageLoop* sMainLoop = nullptr; static GMPChild* sChild = nullptr; -static StaticMonitor sMainLoopMonitor; -static nsTArray>* sMainLoopPendingEvents - MOZ_GUARDED_BY(sMainLoopMonitor) = nullptr; -static bool sMainLoopHasPendingProcess MOZ_GUARDED_BY(sMainLoopMonitor) = false; - -static bool IsOnChildMainThread() { - return sMainLoop && sMainLoop == MessageLoop::current(); -} - // We just need a refcounted wrapper for GMPTask objects. class GMPRunnable final : public Runnable { public: @@ -58,11 +46,8 @@ class GMPSyncRunnable final : public Runnable { public: - GMPSyncRunnable(GMPTask* aTask, MessageLoop* aMessageLoop) - : Runnable("mozilla::gmp::GMPSyncRunnable"), - mDone(false), - mTask(aTask), - mMonitor("GMPSyncRunnable") { + explicit GMPSyncRunnable(GMPTask* aTask) + : Runnable("mozilla::gmp::GMPSyncRunnable"), mTask(aTask) { MOZ_ASSERT(mTask); } @@ -71,7 +56,7 @@ // 1) Nobody should be blocking the main thread. // 2) This prevents deadlocks when doing sync calls to main which if the // main thread tries to do a sync call back to the calling thread. - MOZ_ASSERT(!IsOnChildMainThread()); + MOZ_ASSERT(!NS_IsMainThread()); MonitorAutoLock lock(mMonitor); while (!mDone) { @@ -90,9 +75,9 @@ } private: - bool mDone MOZ_GUARDED_BY(mMonitor); + bool mDone MOZ_GUARDED_BY(mMonitor) = false; GMPTask* mTask; - Monitor mMonitor; + Monitor mMonitor{"GMPSyncRunnable"}; }; class GMPThreadImpl final : public GMPThread { @@ -105,8 +90,8 @@ void Join() override; private: - Mutex mMutex MOZ_UNANNOTATED; - base::Thread mThread MOZ_GUARDED_BY(mMutex); + Mutex mMutex{"GMPThreadImpl"}; + base::Thread mThread MOZ_GUARDED_BY(mMutex){"GMPThread"}; }; GMPErr CreateThread(GMPThread** aThread) { @@ -119,77 +104,29 @@ return GMPNoErr; } -bool SpinPendingGmpEventsUntil(const SpinPendingPredicate& aPred, - uint32_t aTimeoutMs) { - MOZ_ASSERT(IsOnChildMainThread()); - - auto timeout = TimeDuration::FromMilliseconds(aTimeoutMs); - - while (!aPred()) { - nsTArray> pendingEvents; - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - while (sMainLoopPendingEvents->IsEmpty()) { - if (lock.Wait(timeout) == CVStatus::Timeout) { - return false; - } - } - pendingEvents = std::move(*sMainLoopPendingEvents); - } - - for (auto& event : pendingEvents) { - event->Run(); - } - } - - return true; -} - -static void ProcessPendingGmpEvents() { - MOZ_ASSERT(IsOnChildMainThread()); - - nsTArray> pendingEvents; - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - pendingEvents = std::move(*sMainLoopPendingEvents); - sMainLoopHasPendingProcess = false; - } - - for (auto& event : pendingEvents) { - event->Run(); - } -} - -static void QueueForMainThread(RefPtr&& aRunnable) { - StaticMonitorAutoLock lock(sMainLoopMonitor); - sMainLoopPendingEvents->AppendElement(std::move(aRunnable)); - if (!sMainLoopHasPendingProcess) { - sMainLoop->PostTask(NewRunnableFunction( - "mozilla::gmp::ProcessPendingGmpEvents", &ProcessPendingGmpEvents)); - sMainLoopHasPendingProcess = true; +GMPErr RunOnMainThread(GMPTask* aTask) { + if (!aTask) { + return GMPGenericErr; } - lock.Notify(); -} -GMPErr RunOnMainThread(GMPTask* aTask) { - if (!aTask || !sMainLoop) { + if (NS_FAILED(NS_DispatchToMainThread(MakeAndAddRef(aTask)))) { return GMPGenericErr; } - RefPtr r = new GMPRunnable(aTask); - QueueForMainThread(std::move(r)); return GMPNoErr; } GMPErr SyncRunOnMainThread(GMPTask* aTask) { - if (!aTask || !sMainLoop || IsOnChildMainThread()) { + if (!aTask || NS_IsMainThread()) { return GMPGenericErr; } - RefPtr r = new GMPSyncRunnable(aTask, sMainLoop); - QueueForMainThread(RefPtr{r}); - r->WaitUntilDone(); + RefPtr r = new GMPSyncRunnable(aTask); + if (NS_FAILED(NS_DispatchToMainThread(r))) { + return GMPGenericErr; + } + r->WaitUntilDone(); return GMPNoErr; } @@ -204,7 +141,7 @@ void Destroy() override; private: - ReentrantMonitor mMonitor MOZ_UNANNOTATED; + ReentrantMonitor mMonitor{"gmp-mutex"}; }; GMPErr CreateMutex(GMPMutex** aMutex) { @@ -233,7 +170,7 @@ } GMPErr SetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS) { - if (!aTask || !sMainLoop || !IsOnChildMainThread()) { + if (!aTask || !NS_IsMainThread()) { return GMPGenericErr; } GMPTimerChild* timers = sChild->GetGMPTimers(); @@ -250,20 +187,10 @@ } void InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild) { - if (!sMainLoop) { - sMainLoop = MessageLoop::current(); - } if (!sChild) { sChild = aChild; } - { - StaticMonitorAutoLock lock(sMainLoopMonitor); - if (!sMainLoopPendingEvents) { - sMainLoopPendingEvents = new nsTArray>(); - } - } - aPlatformAPI.version = 0; aPlatformAPI.createthread = &CreateThread; aPlatformAPI.runonmainthread = &RunOnMainThread; @@ -274,14 +201,6 @@ aPlatformAPI.getcurrenttime = &GetClock; } -void ShutdownPlatformAPI() { - StaticMonitorAutoLock lock(sMainLoopMonitor); - if (sMainLoopPendingEvents) { - delete sMainLoopPendingEvents; - sMainLoopPendingEvents = nullptr; - } -} - void SendFOGData(ipc::ByteBuf&& buf) { if (sChild) { sChild->SendFOGData(std::move(buf)); @@ -299,9 +218,7 @@ } #endif -GMPThreadImpl::GMPThreadImpl() : mMutex("GMPThreadImpl"), mThread("GMPThread") { - MOZ_COUNT_CTOR(GMPThread); -} +GMPThreadImpl::GMPThreadImpl() { MOZ_COUNT_CTOR(GMPThread); } GMPThreadImpl::~GMPThreadImpl() { MOZ_COUNT_DTOR(GMPThread); } @@ -331,9 +248,7 @@ delete this; } -GMPMutexImpl::GMPMutexImpl() : mMonitor("gmp-mutex") { - MOZ_COUNT_CTOR(GMPMutexImpl); -} +GMPMutexImpl::GMPMutexImpl() { MOZ_COUNT_CTOR(GMPMutexImpl); } GMPMutexImpl::~GMPMutexImpl() { MOZ_COUNT_DTOR(GMPMutexImpl); } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPPlatform.h thunderbird-140.10.0esr/dom/media/gmp/GMPPlatform.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPPlatform.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPPlatform.h 2026-04-21 14:52:53.000000000 +0000 @@ -6,9 +6,8 @@ #ifndef GMPPlatform_h_ #define GMPPlatform_h_ -#include "mozilla/RefPtr.h" #include "gmp-platform.h" -#include +#include "mozilla/RefPtr.h" #include "mozilla/gmp/PGMPChild.h" namespace mozilla { @@ -25,7 +24,6 @@ class GMPChild; void InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild); -void ShutdownPlatformAPI(); GMPErr RunOnMainThread(GMPTask* aTask); @@ -33,24 +31,6 @@ GMPErr SetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS); -/** - * This is intended to be used by encoders/decoders that will make a GMP call - * that is a synchronous post to the GMP worker thread. Because the GMP worker - * threads can synchronously callback to the main thread, this has the potential - * for a deadlock. If the encoder/decoder tracks any outstanding requests that - * will result in a synchronous callback to the main thread, we can simply spin - * the event loop on those callbacks until they are completed. Then we can - * safefully make our own synchronous call to the GMP worker thread without fear - * of a deadlock. - * - * Note that each encoder/decoder has its own worker thread, so assuming we - * drain the synchronous events for that specific encoder/decoder, we know there - * are no more forthcoming to cause us to deadlock. - */ -using SpinPendingPredicate = std::function; -bool SpinPendingGmpEventsUntil(const SpinPendingPredicate& aPred, - uint32_t aTimeoutMs); - void SendFOGData(ipc::ByteBuf&& buf); #ifdef XP_WIN diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPService.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPService.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPService.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPService.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -459,12 +459,10 @@ RefPtr parent = wrapper->mParent; UniquePtr callback(rawCallback); GMPVideoDecoderParent* actor = nullptr; - GMPVideoHostImpl* host = nullptr; if (parent && NS_SUCCEEDED(parent->GetGMPVideoDecoder(&actor))) { - host = &(actor->Host()); actor->SetCrashHelper(helper); } - callback->Done(actor, host); + callback->Done(actor, actor); }, [rawCallback] { UniquePtr callback(rawCallback); @@ -499,12 +497,10 @@ RefPtr parent = wrapper->mParent; UniquePtr callback(rawCallback); GMPVideoEncoderParent* actor = nullptr; - GMPVideoHostImpl* host = nullptr; if (parent && NS_SUCCEEDED(parent->GetGMPVideoEncoder(&actor))) { - host = &(actor->Host()); actor->SetCrashHelper(helper); } - callback->Done(actor, host); + callback->Done(actor, actor); }, [rawCallback] { UniquePtr callback(rawCallback); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPSharedMemManager.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPSharedMemManager.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPSharedMemManager.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPSharedMemManager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -63,7 +63,9 @@ ipc::Shmem&& aMem) { MOZ_ASSERT(MgrIsOnOwningThread()); - if (!aMem.IsWritable()) { + if (!aMem.IsWritable() || !MgrCanSend()) { + // Either the shmem is not allocated, or the actor is already dead and it + // will get freed when the Shmem reference goes away. return; } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPSharedMemManager.h thunderbird-140.10.0esr/dom/media/gmp/GMPSharedMemManager.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPSharedMemManager.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPSharedMemManager.h 2026-04-21 14:52:52.000000000 +0000 @@ -33,6 +33,7 @@ protected: virtual bool MgrIsOnOwningThread() const = 0; + virtual bool MgrCanSend() const = 0; static constexpr size_t kMaxPools = 2; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPStorageChild.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPStorageChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPStorageChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPStorageChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -33,57 +33,117 @@ GMPRecordClient* aClient) : mName(aName), mClient(aClient), mOwner(aOwner) {} -GMPErr GMPRecordImpl::Open() { return mOwner->Open(this); } +RefPtr GMPRecordImpl::GetOwner() { + RecursiveMutexAutoLock lock(mMutex); + return RefPtr{mOwner}; +} + +GMPErr GMPRecordImpl::Open() { + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Open(this); + } + return GMPClosedErr; +} void GMPRecordImpl::OpenComplete(GMPErr aStatus) { - mClient->OpenComplete(aStatus); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->OpenComplete(aStatus); + } } -GMPErr GMPRecordImpl::Read() { return mOwner->Read(this); } +GMPErr GMPRecordImpl::Read() { + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Read(this); + } + return GMPClosedErr; +} void GMPRecordImpl::ReadComplete(GMPErr aStatus, const uint8_t* aBytes, uint32_t aLength) { - mClient->ReadComplete(aStatus, aBytes, aLength); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->ReadComplete(aStatus, aBytes, aLength); + } } GMPErr GMPRecordImpl::Write(const uint8_t* aData, uint32_t aDataSize) { - return mOwner->Write(this, aData, aDataSize); + // The IPDL actor might be destroyed on another thread, releasing the owner, + // so take a strong reference to ensure it stays alive long enough. + if (auto owner = GetOwner()) { + return owner->Write(this, aData, aDataSize); + } + return GMPClosedErr; } void GMPRecordImpl::WriteComplete(GMPErr aStatus) { - mClient->WriteComplete(aStatus); + // While we know mClient is not yet destroyed if the pointer is still valid + // while holding the lock, be careful to note that it may be destroyed by the + // plugin after the callback returns. + RecursiveMutexAutoLock lock(mMutex); + if (mClient) { + mClient->WriteComplete(aStatus); + } } GMPErr GMPRecordImpl::Close() { RefPtr kungfuDeathGrip(this); // Delete our self reference. Release(); - mOwner->Close(this->Name()); + + // We need to only clear mClient within the lock to avoid destroying it while + // a callback is in progress. Since we have no control over the plugins on + // when they choose to call Close, we must support this being re-entrant (e.g. + // call Close from the OpenComplete, ReadComplete or WriteComplete callbacks). + RefPtr owner; + { + RecursiveMutexAutoLock lock(mMutex); + owner = RefPtr{mOwner}; + mClient = nullptr; + } + + if (owner) { + owner->Close(this->Name()); + } return GMPNoErr; } -GMPStorageChild::GMPStorageChild(GMPChild* aPlugin) - : mMonitor("GMPStorageChild"), mPlugin(aPlugin), mShutdown(false) { +void GMPRecordImpl::DestroyOwner() { + RecursiveMutexAutoLock lock(mMutex); + mOwner = nullptr; +} + +GMPStorageChild::GMPStorageChild(GMPChild* aPlugin) : mPlugin(aPlugin) { MOZ_ASSERT(ON_GMP_THREAD()); } GMPErr GMPStorageChild::CreateRecord(const nsCString& aRecordName, GMPRecord** aOutRecord, GMPRecordClient* aClient) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } - MOZ_ASSERT(aRecordName.Length() && aOutRecord); + MOZ_ASSERT(!aRecordName.IsEmpty()); + MOZ_ASSERT(aOutRecord); if (HasRecord(aRecordName)) { return GMPRecordInUse; } - RefPtr record(new GMPRecordImpl(this, aRecordName, aClient)); + auto record = MakeRefPtr(this, aRecordName, aClient); mRecords.InsertOrUpdate(aRecordName, RefPtr{record}); // Addrefs // The GMPRecord holds a self reference until the GMP calls Close() on @@ -95,23 +155,24 @@ } bool GMPStorageChild::HasRecord(const nsCString& aRecordName) { - mMonitor.AssertCurrentThreadOwns(); return mRecords.Contains(aRecordName); } already_AddRefed GMPStorageChild::GetRecord( const nsCString& aRecordName) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); + if (NS_WARN_IF(mShutdown)) { + return nullptr; + } RefPtr record; mRecords.Get(aRecordName, getter_AddRefs(record)); return record.forget(); } GMPErr GMPStorageChild::Open(GMPRecordImpl* aRecord) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -126,10 +187,9 @@ } GMPErr GMPStorageChild::Read(GMPRecordImpl* aRecord) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -149,10 +209,9 @@ return GMPQuotaExceededErr; } - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (mShutdown) { - NS_WARNING("GMPStorage used after it's been shutdown!"); + if (NS_WARN_IF(mShutdown)) { return GMPClosedErr; } @@ -167,15 +226,13 @@ } GMPErr GMPStorageChild::Close(const nsCString& aRecordName) { - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); - if (!HasRecord(aRecordName)) { + if (!mRecords.Remove(aRecordName)) { // Already closed. return GMPClosedErr; } - mRecords.Remove(aRecordName); - if (!mShutdown) { CALL_ON_GMP_THREAD(SendClose, aRecordName); } @@ -185,46 +242,26 @@ mozilla::ipc::IPCResult GMPStorageChild::RecvOpenComplete( const nsCString& aRecordName, const GMPErr& aStatus) { - // We don't need a lock to read |mShutdown| since it is only changed in - // the GMP thread. - if (mShutdown) { - return IPC_OK(); - } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->OpenComplete(aStatus); } - record->OpenComplete(aStatus); return IPC_OK(); } mozilla::ipc::IPCResult GMPStorageChild::RecvReadComplete( const nsCString& aRecordName, const GMPErr& aStatus, nsTArray&& aBytes) { - if (mShutdown) { - return IPC_OK(); - } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->ReadComplete(aStatus, aBytes.Elements(), aBytes.Length()); } - record->ReadComplete(aStatus, aBytes.Elements(), aBytes.Length()); return IPC_OK(); } mozilla::ipc::IPCResult GMPStorageChild::RecvWriteComplete( const nsCString& aRecordName, const GMPErr& aStatus) { - if (mShutdown) { - return IPC_OK(); + if (RefPtr record = GetRecord(aRecordName)) { + record->WriteComplete(aStatus); } - RefPtr record = GetRecord(aRecordName); - if (!record) { - // Not fatal. - return IPC_OK(); - } - record->WriteComplete(aStatus); return IPC_OK(); } @@ -232,11 +269,26 @@ // Block any new storage requests, and thus any messages back to the // parent. We don't delete any objects here, as that may invalidate // GMPRecord pointers held by the GMP. - MonitorAutoLock lock(mMonitor); + MutexAutoLock lock(mMutex); mShutdown = true; return IPC_OK(); } +void GMPStorageChild::ActorDestroy(ActorDestroyReason aWhy) { + nsRefPtrHashtable records; + { + MutexAutoLock lock(mMutex); + mShutdown = true; + records = std::move(mRecords); + } + + // We know that any other thread that may be using the owner has a strong + // reference to it, so it is safe to clear our own reference here. + for (auto& record : records) { + record.GetData()->DestroyOwner(); + } +} + } // namespace mozilla::gmp // avoid redefined macro in unified build diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPStorageChild.h thunderbird-140.10.0esr/dom/media/gmp/GMPStorageChild.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPStorageChild.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPStorageChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -7,6 +7,8 @@ #define GMPStorageChild_h_ #include "mozilla/gmp/PGMPStorageChild.h" +#include "mozilla/Mutex.h" +#include "mozilla/RecursiveMutex.h" #include "gmp-storage.h" #include "nsTHashtable.h" #include "nsRefPtrHashtable.h" @@ -19,13 +21,15 @@ class GMPChild; class GMPStorageChild; -class GMPRecordImpl : public GMPRecord { +class GMPRecordImpl final : public GMPRecord { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPRecordImpl) GMPRecordImpl(GMPStorageChild* aOwner, const nsCString& aName, GMPRecordClient* aClient); + void DestroyOwner(); + // GMPRecord. GMPErr Open() override; GMPErr Read() override; @@ -39,13 +43,16 @@ void WriteComplete(GMPErr aStatus); private: + RefPtr GetOwner(); + ~GMPRecordImpl() = default; + RecursiveMutex mMutex{"GMPRecordImpl"}; const nsCString mName; - GMPRecordClient* const mClient; - GMPStorageChild* const mOwner; + GMPRecordClient* mClient MOZ_GUARDED_BY(mMutex); + GMPStorageChild* mOwner MOZ_GUARDED_BY(mMutex); }; -class GMPStorageChild : public PGMPStorageChild { +class GMPStorageChild final : public PGMPStorageChild { friend class PGMPStorageChild; public: @@ -65,8 +72,10 @@ GMPErr Close(const nsCString& aRecordName); + void ActorDestroy(ActorDestroyReason aWhy) override; + private: - bool HasRecord(const nsCString& aRecordName); + bool HasRecord(const nsCString& aRecordName) MOZ_REQUIRES(mMutex); already_AddRefed GetRecord(const nsCString& aRecordName); protected: @@ -83,10 +92,11 @@ mozilla::ipc::IPCResult RecvShutdown(); private: - Monitor mMonitor MOZ_UNANNOTATED; - nsRefPtrHashtable mRecords; + Mutex mMutex{"GMPStorageChild"}; + nsRefPtrHashtable mRecords + MOZ_GUARDED_BY(mMutex); GMPChild* mPlugin; - bool mShutdown; + bool mShutdown MOZ_GUARDED_BY(mMutex) = false; }; } // namespace mozilla::gmp diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPTypes.ipdlh thunderbird-140.10.0esr/dom/media/gmp/GMPTypes.ipdlh --- thunderbird-140.9.0esr/dom/media/gmp/GMPTypes.ipdlh 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPTypes.ipdlh 2026-04-21 14:52:52.000000000 +0000 @@ -6,6 +6,7 @@ include "GMPMessageUtils.h"; using cdm::EncryptionScheme from "GMPSanitizedExports.h"; +using cdm::KeyStatus from "GMPSanitizedExports.h"; using GMPBufferType from "gmp-video-codec.h"; namespace mozilla { @@ -92,7 +93,7 @@ struct CDMKeyInformation { uint8_t[] mKeyId; - uint32_t mStatus; + KeyStatus mStatus; uint32_t mSystemCode; }; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPUtils.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPUtils.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPUtils.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPUtils.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -256,30 +256,23 @@ } } -bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame) { - MOZ_ASSERT(aEncodedFrame); - MOZ_ASSERT(IsOnGMPThread()); - - uint8_t* encodedBuffer = aEncodedFrame->Buffer(); - uint32_t encodedSize = aEncodedFrame->Size(); - GMPBufferType encodedType = aEncodedFrame->BufferType(); - - if (NS_WARN_IF(!encodedBuffer)) { - GMP_LOG_ERROR("GMP plugin returned null buffer"); - return false; - } - +bool AdjustOpenH264NALUSequence(uint8_t* aBuffer, uint32_t aSize, + GMPBufferType aType) { // Libwebrtc's RtpPacketizerH264 expects a 3- or 4-byte NALU start sequence // before the start of the NALU payload. {0,0,1} or {0,0,0,1}. We set this // in-place. Any other length of the length field we reject. - - const int sizeNumBytes = SizeNumBytes(encodedType); + const uint32_t sizeNumBytes = static_cast(SizeNumBytes(aType)); + if (sizeNumBytes > aSize) { + return false; + } uint32_t unitOffset = 0; uint32_t unitSize = 0; - // Make sure we don't read past the end of the buffer getting the size - while (unitOffset + sizeNumBytes < encodedSize) { - uint8_t* unitBuffer = encodedBuffer + unitOffset; - switch (encodedType) { + // Make sure we don't read past the end of the buffer getting the size. + // Subtraction form avoids uint32_t wraparound: aSize - sizeNumBytes + // cannot underflow (checked above). + while (unitOffset < aSize - sizeNumBytes) { + uint8_t* unitBuffer = aBuffer + unitOffset; + switch (aType) { case GMP_BufferLength24: { #if MOZ_LITTLE_ENDIAN() unitSize = (static_cast(*unitBuffer)) | @@ -296,7 +289,7 @@ // sequence to the NALU size per the GMP protocol. We mitigate this by // letting it through as this is what libwebrtc already expects and // scans for. - unitSize = encodedSize - 3; + unitSize = aSize - 3; break; } memcpy(unitBuffer, startSequence, 3); @@ -314,41 +307,54 @@ // sequence to the NALU size per the GMP protocol. We mitigate this by // letting it through as this is what libwebrtc already expects and // scans for. - unitSize = encodedSize - 4; + unitSize = aSize - 4; break; } memcpy(unitBuffer, startSequence, 4); break; } default: - GMP_LOG_ERROR("GMP plugin returned type we cannot handle (%d)", - encodedType); + GMP_LOG_ERROR("GMP plugin returned type we cannot handle (%d)", aType); return false; } - MOZ_ASSERT(unitSize != 0); - MOZ_ASSERT(unitOffset + sizeNumBytes + unitSize <= encodedSize); - if (unitSize == 0 || unitOffset + sizeNumBytes + unitSize > encodedSize) { + // Loop invariant: unitOffset + sizeNumBytes <= aSize, so + // aSize - unitOffset - sizeNumBytes cannot underflow. + const uint32_t remaining = aSize - unitOffset - sizeNumBytes; + if (unitSize == 0 || unitSize > remaining) { // XXX Should we kill the plugin for returning extra bytes? Probably GMP_LOG_ERROR( "GMP plugin returned badly formatted encoded data: " - "unitOffset=%u, sizeNumBytes=%d, unitSize=%u, size=%u", - unitOffset, sizeNumBytes, unitSize, encodedSize); + "unitOffset=%u, sizeNumBytes=%u, unitSize=%u, size=%u", + unitOffset, sizeNumBytes, unitSize, aSize); return false; } unitOffset += sizeNumBytes + unitSize; } - if (unitOffset != encodedSize) { + if (unitOffset != aSize) { // At most 3 bytes can be left over, depending on buffertype - GMP_LOG_DEBUG("GMP plugin returned %u extra bytes", - encodedSize - unitOffset); + GMP_LOG_DEBUG("GMP plugin returned %u extra bytes", aSize - unitOffset); } return true; } +bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame) { + MOZ_ASSERT(aEncodedFrame); + MOZ_ASSERT(IsOnGMPThread()); + + uint8_t* encodedBuffer = aEncodedFrame->Buffer(); + if (NS_WARN_IF(!encodedBuffer)) { + GMP_LOG_ERROR("GMP plugin returned null buffer"); + return false; + } + + return AdjustOpenH264NALUSequence(encodedBuffer, aEncodedFrame->Size(), + aEncodedFrame->BufferType()); +} + MediaResult ToMediaResult(GMPErr aErr, const nsACString& aMessage) { nsPrintfCString msg("%s (GMPErr:%x)", aMessage.Data(), aErr); switch (aErr) { diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPUtils.h thunderbird-140.10.0esr/dom/media/gmp/GMPUtils.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPUtils.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPUtils.h 2026-04-21 14:52:52.000000000 +0000 @@ -7,6 +7,7 @@ #define GMPUtils_h_ #include "gmp-errors.h" +#include "gmp-video-codec.h" #include "MediaResult.h" #include "mozilla/AbstractThread.h" #include "mozilla/RefPtr.h" @@ -83,6 +84,9 @@ // I420 format, padded so that the width and height are multiples of 16. size_t I420FrameBufferSizePadded(int32_t aWidth, int32_t aHeight); +bool AdjustOpenH264NALUSequence(uint8_t* aBuffer, uint32_t aSize, + GMPBufferType aType); + bool AdjustOpenH264NALUSequence(GMPVideoEncodedFrame* aEncodedFrame); MediaResult ToMediaResult(GMPErr aErr, const nsACString& aMessage); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -4,23 +4,34 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "GMPVideoDecoderChild.h" -#include "GMPVideoi420FrameImpl.h" + #include "GMPContentChild.h" #include #include "mozilla/Unused.h" -#include "mozilla/StaticPrefs_media.h" #include "GMPPlatform.h" #include "GMPVideoEncodedFrameImpl.h" +#include "GMPVideoi420FrameImpl.h" +#include "mozilla/StaticPrefs_media.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" #include "runnable_utils.h" namespace mozilla::gmp { GMPVideoDecoderChild::GMPVideoDecoderChild(GMPContentChild* aPlugin) - : mPlugin(aPlugin), mVideoDecoder(nullptr), mVideoHost(this) { + : mPlugin(aPlugin), mVideoDecoder(nullptr) { MOZ_ASSERT(mPlugin); } -GMPVideoDecoderChild::~GMPVideoDecoderChild() = default; +GMPVideoDecoderChild::~GMPVideoDecoderChild() { + // Since any outstanding synchronous runnables require a strong reference to + // ourselves, we know that when we are freed, they must have all successfully + // dispatched. As such, it should now be safe to free the plugin and join with + // the worker thread. + if (mVideoDecoder) { + mVideoDecoder->DecodingComplete(); + } +} bool GMPVideoDecoderChild::MgrIsOnOwningThread() const { return !mPlugin || mPlugin->GMPMessageLoop() == MessageLoop::current(); @@ -32,8 +43,6 @@ mVideoDecoder = aDecoder; } -GMPVideoHostImpl& GMPVideoDecoderChild::Host() { return mVideoHost; } - void GMPVideoDecoderChild::Decoded(GMPVideoi420Frame* aDecodedFrame) { if (!aDecodedFrame) { MOZ_CRASH("Not given a decoded frame!"); @@ -48,11 +57,9 @@ auto df = static_cast(aDecodedFrame); - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem inputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Encoded, &inputShmem)) { - Unused << SendReturnShmem(std::move(inputShmem)); - } + ipc::Shmem inputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Encoded, &inputShmem)) { + Unused << SendReturnShmem(std::move(inputShmem)); } GMPVideoi420FrameData frameData; @@ -102,8 +109,17 @@ } void GMPVideoDecoderChild::DrainComplete() { - MOZ_ASSERT(mOutstandingDrain, "DrainComplete without Drain!"); - mOutstandingDrain = false; + if (!mDrainSelfRef) { + MOZ_ASSERT_UNREACHABLE("DrainComplete without Drain!"); + return; + } + + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + NS_ProxyRelease("GMPVideoDecoderChild::DrainComplete", + GetMainThreadSerialEventTarget(), mDrainSelfRef.forget(), + /* aAlwaysProxy */ true); if (NS_WARN_IF(!mPlugin)) { return; @@ -115,8 +131,17 @@ } void GMPVideoDecoderChild::ResetComplete() { - MOZ_ASSERT(mOutstandingReset, "ResetComplete without Reset!"); - mOutstandingReset = false; + if (!mResetSelfRef) { + MOZ_ASSERT_UNREACHABLE("ResetComplete without Reset!"); + return; + } + + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + NS_ProxyRelease("GMPVideoDecoderChild::ResetComplete", + GetMainThreadSerialEventTarget(), mResetSelfRef.forget(), + /* aAlwaysProxy */ true); if (NS_WARN_IF(!mPlugin)) { return; @@ -153,12 +178,7 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvGiveShmem( ipc::Shmem&& aOutputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aOutputShmem)); - } else { - DeallocShmem(aOutputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aOutputShmem)); return IPC_OK(); } @@ -171,8 +191,8 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - auto* f = new GMPVideoEncodedFrameImpl(aInputFrame, std::move(aInputShmem), - &mVideoHost); + auto* f = + new GMPVideoEncodedFrameImpl(aInputFrame, std::move(aInputShmem), this); // Ignore any return code. It is OK for this to fail without killing the // process. @@ -187,14 +207,14 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - if (mOutstandingReset) { + if (mResetSelfRef) { MOZ_ASSERT_UNREACHABLE("Already has outstanding reset!"); return IPC_OK(); } // Ignore any return code. It is OK for this to fail without killing the // process. - mOutstandingReset = true; + mResetSelfRef = this; mVideoDecoder->Reset(); return IPC_OK(); @@ -205,42 +225,24 @@ return IPC_FAIL(this, "!mVideoDecoder"); } - if (mOutstandingDrain) { + if (mDrainSelfRef) { MOZ_ASSERT_UNREACHABLE("Already has outstanding drain!"); return IPC_OK(); } // Ignore any return code. It is OK for this to fail without killing the // process. - mOutstandingDrain = true; + mDrainSelfRef = this; mVideoDecoder->Drain(); return IPC_OK(); } void GMPVideoDecoderChild::ActorDestroy(ActorDestroyReason why) { - // If there are no encoded frames, then we know that OpenH264 has destroyed - // any outstanding references to its pending decode frames. This means it - // should be safe to destroy the decoder since there should not be any pending - // sync callbacks. - if (!SpinPendingGmpEventsUntil( - [&]() -> bool { - return mOutstandingDrain || mOutstandingReset || - mVideoHost.IsEncodedFramesEmpty(); - }, - StaticPrefs::media_gmp_coder_shutdown_timeout_ms())) { - NS_WARNING("Timed out waiting for synchronous events!"); - } - - if (mVideoDecoder) { - // Ignore any return code. It is OK for this to fail without killing the - // process. - mVideoDecoder->DecodingComplete(); - mVideoDecoder = nullptr; - } - - mVideoHost.DoneWithAPI(); - + // We don't destroy the video decoder from the plugin here because there may + // be outstanding synchronous runnables. They hold a strong reference to + // ourselves, so we can wait for our destructor to be called first. + MgrPurgeShmems(); mPlugin = nullptr; } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderChild.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderChild.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -19,7 +19,7 @@ class GMPVideoDecoderChild final : public PGMPVideoDecoderChild, public GMPVideoDecoderCallback, - public GMPSharedMemManager { + public GMPVideoHostImpl { friend class PGMPVideoDecoderChild; public: @@ -30,7 +30,6 @@ explicit GMPVideoDecoderChild(GMPContentChild* aPlugin); void Init(GMPVideoDecoder* aDecoder); - GMPVideoHostImpl& Host(); // GMPVideoDecoderCallback void Decoded(GMPVideoi420Frame* decodedFrame) override; @@ -42,8 +41,13 @@ void Error(GMPErr aError) override; // GMPSharedMemManager + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } private: virtual ~GMPVideoDecoderChild(); @@ -63,9 +67,8 @@ GMPContentChild* mPlugin; GMPVideoDecoder* mVideoDecoder; - GMPVideoHostImpl mVideoHost; - bool mOutstandingDrain = false; - bool mOutstandingReset = false; + RefPtr mDrainSelfRef; + RefPtr mResetSelfRef; }; } // namespace mozilla::gmp diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -37,7 +37,6 @@ mIsAwaitingDrainComplete(false), mPlugin(aPlugin), mCallback(nullptr), - mVideoHost(this), mPluginId(aPlugin->GetPluginId()), mPluginType(aPlugin->GetPluginType()), mFrameCount(0) { @@ -50,8 +49,6 @@ return !mPlugin || mPlugin->GMPEventTarget()->IsOnCurrentThread(); } -GMPVideoHostImpl& GMPVideoDecoderParent::Host() { return mVideoHost; } - // Note: may be called via Terminated() void GMPVideoDecoderParent::Close() { GMP_LOG_DEBUG("GMPVideoDecoderParent[%p]::Close()", this); @@ -133,12 +130,10 @@ } if (mDecodedShmemSize > 0) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem outputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Decoded, mDecodedShmemSize, - &outputShmem)) { - Unused << SendGiveShmem(std::move(outputShmem)); - } + ipc::Shmem outputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Decoded, mDecodedShmemSize, + &outputShmem)) { + Unused << SendGiveShmem(std::move(outputShmem)); } } @@ -280,7 +275,7 @@ mPlugin->VideoDecoderDestroyed(this); mPlugin = nullptr; } - mVideoHost.ActorDestroyed(); + MgrPurgeShmems(); MaybeDisconnect(aWhy == AbnormalShutdown); } @@ -319,12 +314,7 @@ mozilla::ipc::IPCResult GMPVideoDecoderParent::RecvReturnShmem( ipc::Shmem&& aInputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aInputShmem)); - } else { - DeallocShmem(aInputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aInputShmem)); return IPC_OK(); } @@ -332,7 +322,7 @@ const GMPVideoi420FrameData& aDecodedFrame, ipc::Shmem&& aDecodedShmem) { if (HandleDecoded(aDecodedFrame, aDecodedShmem.Size())) { auto* f = new GMPVideoi420FrameImpl(aDecodedFrame, std::move(aDecodedShmem), - &mVideoHost); + this); mCallback->Decoded(f); } else { DeallocShmem(aDecodedShmem); @@ -346,7 +336,7 @@ if (HandleDecoded(aDecodedFrame, aDecodedArray.Length())) { mDecodedShmemSize = std::max(mDecodedShmemSize, aDecodedArray.Length()); auto* f = new GMPVideoi420FrameImpl(aDecodedFrame, std::move(aDecodedArray), - &mVideoHost); + this); mCallback->Decoded(f); } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderParent.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoDecoderParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoDecoderParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -23,7 +23,7 @@ class GMPVideoDecoderParent final : public PGMPVideoDecoderParent, public GMPVideoDecoderProxy, - public GMPSharedMemManager, + public GMPVideoHostImpl, public GMPCrashHelperHolder { friend class PGMPVideoDecoderParent; @@ -34,7 +34,6 @@ explicit GMPVideoDecoderParent(GMPContentParent* aPlugin); - GMPVideoHostImpl& Host(); nsresult Shutdown(); // GMPVideoDecoder @@ -58,9 +57,14 @@ return AllocShmem(aSize, aMem); } - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -99,7 +103,6 @@ bool mIsAwaitingDrainComplete; RefPtr mPlugin; RefPtr mCallback; - GMPVideoHostImpl mVideoHost; const uint32_t mPluginId; GMPPluginType mPluginType = GMPPluginType::Unknown; int32_t mFrameCount; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -7,7 +7,9 @@ #include "GMPVideoHost.h" #include "mozilla/gmp/GMPTypes.h" #include "mozilla/Unused.h" -#include "GMPSharedMemManager.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" +#include "nsXULAppAPI.h" namespace mozilla::gmp { @@ -23,7 +25,6 @@ mHost(aHost), mBufferType(GMP_BufferSingle) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl( @@ -41,7 +42,6 @@ mShmemBuffer(std::move(aShmemBuffer)), mBufferType(aFrameData.mBufferType()) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl( @@ -59,13 +59,17 @@ mArrayBuffer(std::move(aArrayBuffer)), mBufferType(aFrameData.mBufferType()) { MOZ_ASSERT(aHost); - aHost->EncodedFrameCreated(this); } GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl() { DestroyBuffer(); - if (mHost) { - mHost->EncodedFrameDestroyed(this); + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + if (XRE_IsGMPluginProcess()) { + NS_ProxyRelease("GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl", + GetMainThreadSerialEventTarget(), mHost.forget(), + /* aAlwaysProxy */ true); } } @@ -73,18 +77,20 @@ return kGMPEncodedVideoFrame; } -void GMPVideoEncodedFrameImpl::DoneWithAPI() { - DestroyBuffer(); - - // Do this after destroying the buffer because destruction - // involves deallocation, which requires a host. - mHost = nullptr; -} - /* static */ bool GMPVideoEncodedFrameImpl::CheckFrameData( const GMPVideoEncodedFrameData& aFrameData, size_t aBufferSize) { - return aFrameData.mSize() <= aBufferSize; + if (aFrameData.mTemporalLayerId() < -1 || + aFrameData.mTemporalLayerId() >= 4) { + // Valid temporal layer IDs are -1 which denotes that no layer ID was set, + // and 0-3 to denote up to the max number of layers supported for sending by + // libwebrtc (4), see webrtc::kMaxTemporalStreams. + return false; + } + // 100 MB is far beyond any legitimate single encoded video frame. + static constexpr uint32_t kMaxFrameSize = 100u * 1024u * 1024u; + return aFrameData.mSize() <= aBufferSize && + aFrameData.mSize() <= kMaxFrameSize; } void GMPVideoEncodedFrameImpl::RelinquishFrameData( @@ -129,9 +135,8 @@ } void GMPVideoEncodedFrameImpl::DestroyBuffer() { - if (mHost && mShmemBuffer.IsWritable()) { - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Encoded, - std::move(mShmemBuffer)); + if (mShmemBuffer.IsWritable()) { + mHost->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(mShmemBuffer)); } mShmemBuffer = ipc::Shmem(); mArrayBuffer.Clear(); @@ -142,8 +147,8 @@ DestroyBuffer(); } else if (aSize > AllocatedSize()) { DestroyBuffer(); - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Encoded, aSize, - &mShmemBuffer) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Encoded, aSize, + &mShmemBuffer) && !mArrayBuffer.SetLength(aSize, fallible)) { return GMPAllocErr; } @@ -212,18 +217,13 @@ return; } - if (!mHost) { - return; - } - if (!mArrayBuffer.IsEmpty()) { Unused << mArrayBuffer.SetLength(aNewSize, fallible); return; } ipc::Shmem new_mem; - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Encoded, aNewSize, - &new_mem) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Encoded, aNewSize, &new_mem) && !mArrayBuffer.SetLength(aNewSize, fallible)) { return; } @@ -232,8 +232,7 @@ if (new_mem.IsWritable()) { memcpy(new_mem.get(), mShmemBuffer.get(), mSize); } - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Encoded, - std::move(mShmemBuffer)); + mHost->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(mShmemBuffer)); } mShmemBuffer = new_mem; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncodedFrameImpl.h 2026-04-21 14:52:53.000000000 +0000 @@ -57,10 +57,6 @@ GMPVideoHostImpl* aHost); virtual ~GMPVideoEncodedFrameImpl(); - // This is called during a normal destroy sequence, which is - // when a consumer is finished or during XPCOM shutdown. - void DoneWithAPI(); - static bool CheckFrameData(const GMPVideoEncodedFrameData& aFrameData, size_t aBufferSize); @@ -116,7 +112,7 @@ uint32_t mSize; int32_t mTemporalLayerId = -1; bool mCompleteFrame; - GMPVideoHostImpl* mHost; + RefPtr mHost; nsTArray mArrayBuffer; ipc::Shmem mShmemBuffer; GMPBufferType mBufferType; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -15,11 +15,19 @@ namespace mozilla::gmp { GMPVideoEncoderChild::GMPVideoEncoderChild(GMPContentChild* aPlugin) - : mPlugin(aPlugin), mVideoEncoder(nullptr), mVideoHost(this) { + : mPlugin(aPlugin), mVideoEncoder(nullptr) { MOZ_ASSERT(mPlugin); } -GMPVideoEncoderChild::~GMPVideoEncoderChild() = default; +GMPVideoEncoderChild::~GMPVideoEncoderChild() { + // Since any outstanding synchronous runnables require a strong reference to + // ourselves, we know that when we are freed, they must have all successfully + // dispatched. As such, it should now be safe to free the plugin and join with + // the worker thread. + if (mVideoEncoder) { + mVideoEncoder->EncodingComplete(); + } +} bool GMPVideoEncoderChild::MgrIsOnOwningThread() const { return !mPlugin || mPlugin->GMPMessageLoop() == MessageLoop::current(); @@ -31,8 +39,6 @@ mVideoEncoder = aEncoder; } -GMPVideoHostImpl& GMPVideoEncoderChild::Host() { return mVideoHost; } - void GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame, const uint8_t* aCodecSpecificInfo, uint32_t aCodecSpecificInfoLength) { @@ -45,11 +51,9 @@ auto ef = static_cast(aEncodedFrame); - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem inputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Decoded, &inputShmem)) { - Unused << SendReturnShmem(std::move(inputShmem)); - } + ipc::Shmem inputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Decoded, &inputShmem)) { + Unused << SendReturnShmem(std::move(inputShmem)); } nsTArray codecSpecific; @@ -114,12 +118,7 @@ mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvGiveShmem( ipc::Shmem&& aOutputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aOutputShmem)); - } else { - DeallocShmem(aOutputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Encoded, std::move(aOutputShmem)); return IPC_OK(); } @@ -134,8 +133,8 @@ // The `this` destroyed callback outlives the frame, because `mVideoEncoder` // is responsible for destroying the frame, and we outlive `mVideoEncoder`. - auto* f = new GMPVideoi420FrameImpl(aInputFrame, std::move(aInputShmem), - &mVideoHost, HostReportPolicy::Destroyed); + auto* f = new GMPVideoi420FrameImpl(aInputFrame, std::move(aInputShmem), this, + HostReportPolicy::Destroyed); // Ignore any return code. It is OK for this to fail without killing the // process. @@ -186,25 +185,10 @@ } void GMPVideoEncoderChild::ActorDestroy(ActorDestroyReason why) { - // If there are no decoded frames, then we know that OpenH264 has destroyed - // any outstanding references to its pending encode frames. This means it - // should be safe to destroy the encoder since there should not be any pending - // sync callbacks. - if (!SpinPendingGmpEventsUntil( - [&]() -> bool { return mVideoHost.IsDecodedFramesEmpty(); }, - StaticPrefs::media_gmp_coder_shutdown_timeout_ms())) { - NS_WARNING("Timed out waiting for synchronous events!"); - } - - if (mVideoEncoder) { - // Ignore any return code. It is OK for this to fail without killing the - // process. - mVideoEncoder->EncodingComplete(); - mVideoEncoder = nullptr; - } - - mVideoHost.DoneWithAPI(); - + // We don't destroy the video encoder from the plugin here because there may + // be outstanding synchronous runnables. They hold a strong reference to + // ourselves, so we can wait for our destructor to be called first. + MgrPurgeShmems(); mPlugin = nullptr; } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderChild.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderChild.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderChild.h 2026-04-21 14:52:52.000000000 +0000 @@ -19,7 +19,7 @@ class GMPVideoEncoderChild final : public PGMPVideoEncoderChild, public GMPVideoEncoderCallback, - public GMPSharedMemManager { + public GMPVideoHostImpl { friend class PGMPVideoEncoderChild; public: @@ -30,7 +30,6 @@ explicit GMPVideoEncoderChild(GMPContentChild* aPlugin); void Init(GMPVideoEncoder* aEncoder); - GMPVideoHostImpl& Host(); // GMPVideoEncoderCallback void Encoded(GMPVideoEncodedFrame* aEncodedFrame, @@ -39,10 +38,15 @@ void Error(GMPErr aError) override; // GMPSharedMemManager - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } void MgrDecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame) override; protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -67,7 +71,6 @@ GMPContentChild* mPlugin; GMPVideoEncoder* mVideoEncoder; - GMPVideoHostImpl mVideoHost; uint64_t mLatestEncodedTimestamp = 0; }; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -41,7 +41,6 @@ mActorDestroyed(false), mPlugin(aPlugin), mCallback(nullptr), - mVideoHost(this), mPluginId(aPlugin->GetPluginId()) { MOZ_ASSERT(mPlugin); } @@ -50,8 +49,6 @@ return !mPlugin || mPlugin->GMPEventTarget()->IsOnCurrentThread(); } -GMPVideoHostImpl& GMPVideoEncoderParent::Host() { return mVideoHost; } - // Note: may be called via Terminated() void GMPVideoEncoderParent::Close() { GMP_LOG_DEBUG("%s::%s: %p", __CLASS__, __FUNCTION__, this); @@ -77,7 +74,6 @@ if (mIsOpen) { NS_WARNING("Trying to re-init an in-use GMP video encoder!"); return GMPGenericErr; - ; } MOZ_ASSERT(mPlugin->GMPEventTarget()->IsOnCurrentThread()); @@ -120,12 +116,10 @@ } if (mEncodedShmemSize > 0) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - ipc::Shmem outputShmem; - if (memMgr->MgrTakeShmem(GMPSharedMemClass::Encoded, mEncodedShmemSize, - &outputShmem)) { - Unused << SendGiveShmem(std::move(outputShmem)); - } + ipc::Shmem outputShmem; + if (MgrTakeShmem(GMPSharedMemClass::Encoded, mEncodedShmemSize, + &outputShmem)) { + Unused << SendGiveShmem(std::move(outputShmem)); } } @@ -227,18 +221,13 @@ mPlugin->VideoEncoderDestroyed(this); mPlugin = nullptr; } - mVideoHost.ActorDestroyed(); // same as DoneWithAPI + MgrPurgeShmems(); MaybeDisconnect(aWhy == AbnormalShutdown); } mozilla::ipc::IPCResult GMPVideoEncoderParent::RecvReturnShmem( ipc::Shmem&& aInputShmem) { - if (GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr()) { - memMgr->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aInputShmem)); - } else { - DeallocShmem(aInputShmem); - } - + MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(aInputShmem)); return IPC_OK(); } @@ -247,8 +236,8 @@ nsTArray&& aCodecSpecificInfo) { if (mCallback && GMPVideoEncodedFrameImpl::CheckFrameData( aEncodedFrame, aEncodedShmem.Size())) { - auto* f = new GMPVideoEncodedFrameImpl( - aEncodedFrame, std::move(aEncodedShmem), &mVideoHost); + auto* f = new GMPVideoEncodedFrameImpl(aEncodedFrame, + std::move(aEncodedShmem), this); mCallback->Encoded(f, aCodecSpecificInfo); f->Destroy(); } else { @@ -263,8 +252,8 @@ if (mCallback && GMPVideoEncodedFrameImpl::CheckFrameData( aEncodedFrame, aEncodedData.Length())) { mEncodedShmemSize = std::max(mEncodedShmemSize, aEncodedData.Length()); - auto* f = new GMPVideoEncodedFrameImpl( - aEncodedFrame, std::move(aEncodedData), &mVideoHost); + auto* f = new GMPVideoEncodedFrameImpl(aEncodedFrame, + std::move(aEncodedData), this); mCallback->Encoded(f, aCodecSpecificInfo); f->Destroy(); } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderParent.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoEncoderParent.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoEncoderParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -22,7 +22,7 @@ class GMPVideoEncoderParent final : public GMPVideoEncoderProxy, public PGMPVideoEncoderParent, - public GMPSharedMemManager, + public GMPVideoHostImpl, public GMPCrashHelperHolder { friend class PGMPVideoEncoderParent; @@ -33,7 +33,6 @@ explicit GMPVideoEncoderParent(GMPContentParent* aPlugin); - GMPVideoHostImpl& Host(); void Shutdown(); // GMPVideoEncoderProxy @@ -55,9 +54,14 @@ return AllocShmem(aSize, aMem); } - void MgrDeallocShmem(Shmem& aMem) override { DeallocShmem(aMem); } + void MgrDeallocShmem(Shmem& aMem) override { + if (CanSend()) { + DeallocShmem(aMem); + } + } protected: + bool MgrCanSend() const override { return CanSend(); } bool MgrIsOnOwningThread() const override; private: @@ -83,7 +87,6 @@ bool mActorDestroyed; RefPtr mPlugin; RefPtr mCallback; - GMPVideoHostImpl mVideoHost; const uint32_t mPluginId; }; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoHost.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoHost.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoHost.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoHost.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -12,17 +12,12 @@ namespace mozilla::gmp { -GMPVideoHostImpl::GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr) - : mSharedMemMgr(aSharedMemMgr) {} +GMPVideoHostImpl::GMPVideoHostImpl() = default; GMPVideoHostImpl::~GMPVideoHostImpl() = default; GMPErr GMPVideoHostImpl::CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) { - if (!mSharedMemMgr) { - return GMPGenericErr; - } - if (!aFrame) { return GMPGenericErr; } @@ -43,10 +38,6 @@ } GMPErr GMPVideoHostImpl::CreatePlane(GMPPlane** aPlane) { - if (!mSharedMemMgr) { - return GMPGenericErr; - } - if (!aPlane) { return GMPGenericErr; } @@ -59,43 +50,4 @@ return GMPNoErr; } -GMPSharedMemManager* GMPVideoHostImpl::SharedMemMgr() { return mSharedMemMgr; } - -// XXX This should merge with ActorDestroyed -void GMPVideoHostImpl::DoneWithAPI() { ActorDestroyed(); } - -void GMPVideoHostImpl::ActorDestroyed() { - for (uint32_t i = mEncodedFrames.Length(); i > 0; i--) { - mEncodedFrames[i - 1]->DoneWithAPI(); - mEncodedFrames.RemoveElementAt(i - 1); - } - for (uint32_t i = mDecodedFrames.Length(); i > 0; i--) { - mDecodedFrames[i - 1]->DoneWithAPI(); - mDecodedFrames.RemoveElementAt(i - 1); - } - mSharedMemMgr->MgrPurgeShmems(); - mSharedMemMgr = nullptr; -} - -void GMPVideoHostImpl::EncodedFrameCreated( - GMPVideoEncodedFrameImpl* aEncodedFrame) { - mEncodedFrames.AppendElement(aEncodedFrame); -} - -void GMPVideoHostImpl::EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame) { - MOZ_ALWAYS_TRUE(mEncodedFrames.RemoveElement(aFrame)); -} - -void GMPVideoHostImpl::DecodedFrameCreated( - GMPVideoi420FrameImpl* aDecodedFrame) { - mDecodedFrames.AppendElement(aDecodedFrame); -} - -void GMPVideoHostImpl::DecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame) { - MOZ_ALWAYS_TRUE(mDecodedFrames.RemoveElement(aFrame)); - if (mSharedMemMgr && aFrame->mReportPolicy == HostReportPolicy::Destroyed) { - mSharedMemMgr->MgrDecodedFrameDestroyed(aFrame); - } -} - } // namespace mozilla::gmp diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoHost.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoHost.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoHost.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoHost.h 2026-04-21 14:52:52.000000000 +0000 @@ -6,51 +6,29 @@ #ifndef GMPVideoHost_h_ #define GMPVideoHost_h_ +#include "GMPSharedMemManager.h" +#include "gmp-video-frame.h" #include "gmp-video-host.h" #include "gmp-video-plane.h" -#include "gmp-video-frame.h" #include "nsTArray.h" namespace mozilla::gmp { -class GMPSharedMemManager; class GMPVideoEncodedFrameImpl; class GMPVideoi420FrameImpl; -class GMPVideoHostImpl : public GMPVideoHost { +class GMPVideoHostImpl : public GMPVideoHost, public GMPSharedMemManager { public: - explicit GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr); - virtual ~GMPVideoHostImpl(); - - // Used for shared memory allocation and deallocation. - GMPSharedMemManager* SharedMemMgr(); - void DoneWithAPI(); - void ActorDestroyed(); - void EncodedFrameCreated(GMPVideoEncodedFrameImpl* aEncodedFrame); - void EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame); - void DecodedFrameCreated(GMPVideoi420FrameImpl* aDecodedFrame); - void DecodedFrameDestroyed(GMPVideoi420FrameImpl* aFrame); - - bool IsEncodedFramesEmpty() const { return mEncodedFrames.IsEmpty(); } - - bool IsDecodedFramesEmpty() const { return mDecodedFrames.IsEmpty(); } + NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING // GMPVideoHost GMPErr CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) override; GMPErr CreatePlane(GMPPlane** aPlane) override; - private: - // All shared memory allocations have to be made by an IPDL actor. - // This is a reference to the owning actor. If this reference is - // null then the actor has died and all allocations must fail. - GMPSharedMemManager* mSharedMemMgr; - - // We track all of these things because they need to handle further - // allocations through us and we need to notify them when they - // can't use us any more. - nsTArray mEncodedFrames; - nsTArray mDecodedFrames; + protected: + GMPVideoHostImpl(); + virtual ~GMPVideoHostImpl(); }; } // namespace mozilla::gmp diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp thunderbird-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -8,7 +8,9 @@ #include "mozilla/gmp/GMPTypes.h" #include "mozilla/CheckedInt.h" #include "GMPVideoHost.h" -#include "GMPSharedMemManager.h" +#include "nsProxyRelease.h" +#include "nsThreadUtils.h" +#include "nsXULAppAPI.h" namespace mozilla::gmp { @@ -48,7 +50,6 @@ mTimestamp(0ll), mDuration(0ll) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::GMPVideoi420FrameImpl( @@ -67,7 +68,6 @@ mUpdatedTimestamp(aFrameData.mUpdatedTimestamp()), mDuration(aFrameData.mDuration()) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::GMPVideoi420FrameImpl( @@ -86,22 +86,23 @@ mUpdatedTimestamp(aFrameData.mUpdatedTimestamp()), mDuration(aFrameData.mDuration()) { MOZ_ASSERT(aHost); - aHost->DecodedFrameCreated(this); } GMPVideoi420FrameImpl::~GMPVideoi420FrameImpl() { - DestroyBuffer(); - if (mHost) { - mHost->DecodedFrameDestroyed(this); + if (mReportPolicy == HostReportPolicy::Destroyed) { + mHost->MgrDecodedFrameDestroyed(this); + } + if (mShmemBuffer.IsWritable()) { + mHost->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(mShmemBuffer)); + } + // Proxy release to ensure that any synchronous runnables from the plugin can + // first unblock the worker thread. If we destroy the plugin once this + // reference is freed, we won't be blocked trying to join the worker thread. + if (XRE_IsGMPluginProcess()) { + NS_ProxyRelease("GMPVideoi420FrameImpl::~GMPVideoi420FrameImpl", + GetMainThreadSerialEventTarget(), mHost.forget(), + /* aAlwaysProxy */ true); } -} - -void GMPVideoi420FrameImpl::DoneWithAPI() { - DestroyBuffer(); - - // Do this after destroying the buffer because destruction - // involves deallocation, which requires a host. - mHost = nullptr; } void GMPVideoi420FrameImpl::InitFrameData(GMPVideoi420FrameData& aFrameData) { @@ -156,6 +157,9 @@ // This implies a bug or serious error on the child size. Ignore this frame // if so. Note: Size() greater than expected is also an error, but with no // negative consequences + if (aFrameData.mWidth() <= 0 || aFrameData.mHeight() <= 0) { + return false; + } int32_t half_width = (aFrameData.mWidth() + 1) / 2; int32_t half_height = (aFrameData.mHeight() + 1) / 2; @@ -309,10 +313,6 @@ return GMPNoErr; } - if (!mHost) { - return GMPGenericErr; - } - if (!mArrayBuffer.IsEmpty()) { if (!mArrayBuffer.SetLength(aNewSize, fallible)) { return GMPAllocErr; @@ -321,8 +321,7 @@ } ipc::Shmem new_mem; - if (!mHost->SharedMemMgr()->MgrTakeShmem(GMPSharedMemClass::Decoded, aNewSize, - &new_mem) && + if (!mHost->MgrTakeShmem(GMPSharedMemClass::Decoded, aNewSize, &new_mem) && !mArrayBuffer.SetLength(aNewSize, fallible)) { return GMPAllocErr; } @@ -331,8 +330,7 @@ if (new_mem.IsWritable()) { memcpy(new_mem.get(), mShmemBuffer.get(), aNewSize); } - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Decoded, - std::move(mShmemBuffer)); + mHost->MgrGiveShmem(GMPSharedMemClass::Decoded, std::move(mShmemBuffer)); } mShmemBuffer = new_mem; @@ -340,15 +338,6 @@ return GMPNoErr; } -void GMPVideoi420FrameImpl::DestroyBuffer() { - if (mHost && mShmemBuffer.IsWritable()) { - mHost->SharedMemMgr()->MgrGiveShmem(GMPSharedMemClass::Decoded, - std::move(mShmemBuffer)); - } - mShmemBuffer = ipc::Shmem(); - mArrayBuffer.Clear(); -} - GMPErr GMPVideoi420FrameImpl::CreateEmptyFrame(int32_t aWidth, int32_t aHeight, int32_t aStride_y, int32_t aStride_u, diff -Nru thunderbird-140.9.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h thunderbird-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h --- thunderbird-140.9.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/GMPVideoi420FrameImpl.h 2026-04-21 14:52:53.000000000 +0000 @@ -37,10 +37,6 @@ HostReportPolicy aReportPolicy = HostReportPolicy::None); virtual ~GMPVideoi420FrameImpl(); - // This is called during a normal destroy sequence, which is - // when a consumer is finished or during XPCOM shutdown. - void DoneWithAPI(); - static bool CheckFrameData(const GMPVideoi420FrameData& aFrameData, size_t aBufferSize); @@ -106,13 +102,12 @@ bool CheckDimensions(int32_t aWidth, int32_t aHeight, int32_t aStride_y, int32_t aStride_u, int32_t aStride_v); GMPErr MaybeResize(int32_t aNewSize); - void DestroyBuffer(); public: const HostReportPolicy mReportPolicy; protected: - GMPVideoHostImpl* mHost; + RefPtr mHost; nsTArray mArrayBuffer; ipc::Shmem mShmemBuffer; GMPFramePlane mYPlane; diff -Nru thunderbird-140.9.0esr/dom/media/gmp/PChromiumCDM.ipdl thunderbird-140.10.0esr/dom/media/gmp/PChromiumCDM.ipdl --- thunderbird-140.9.0esr/dom/media/gmp/PChromiumCDM.ipdl 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/PChromiumCDM.ipdl 2026-04-21 14:52:52.000000000 +0000 @@ -9,7 +9,11 @@ include "GMPMessageUtils.h"; include "ChromiumCDMParent.h"; +using cdm::Exception from "GMPSanitizedExports.h"; +using cdm::KeyStatus from "GMPSanitizedExports.h"; using cdm::HdcpVersion from "GMPSanitizedExports.h"; +using cdm::MessageType from "GMPSanitizedExports.h"; +using cdm::Status from "GMPSanitizedExports.h"; namespace mozilla { namespace gmp { @@ -78,19 +82,19 @@ async __delete__(); // cdm::Host_11 - async OnResolvePromiseWithKeyStatus(uint32_t aPromiseId, uint32_t aKeyStatus); + async OnResolvePromiseWithKeyStatus(uint32_t aPromiseId, KeyStatus aKeyStatus); async OnResolveNewSessionPromise(uint32_t aPromiseId, nsCString aSessionId); async OnResolvePromise(uint32_t aPromiseId); async OnRejectPromise(uint32_t aPromiseId, - uint32_t aException, + Exception aException, uint32_t aSystemCode, nsCString aErrorMessage); async OnSessionMessage(nsCString aSessionId, - uint32_t aMessageType, + MessageType aMessageType, uint8_t[] aMessage); async OnSessionKeysChange(nsCString aSessionId, @@ -106,16 +110,16 @@ async ResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccessful); // Return values of cdm::ContentDecryptionModule_10::Decrypt - async DecryptedShmem(uint32_t aId, uint32_t aStatus, Shmem aData); - async DecryptedData(uint32_t aId, uint32_t aStatus, uint8_t[] aData); - async DecryptFailed(uint32_t aId, uint32_t aStatus); + async DecryptedShmem(uint32_t aId, Status aStatus, Shmem aData); + async DecryptedData(uint32_t aId, Status aStatus, uint8_t[] aData); + async DecryptFailed(uint32_t aId, Status aStatus); - async OnDecoderInitDone(uint32_t aStatus); + async OnDecoderInitDone(Status aStatus); // Return values of cdm::ContentDecryptionModule_10::DecryptAndDecodeFrame async DecodedShmem(CDMVideoFrame aFrame, Shmem aData); async DecodedData(CDMVideoFrame aFrame, uint8_t[] aData); - async DecodeFailed(uint32_t aStatus); + async DecodeFailed(Status aStatus); async ResetVideoDecoderComplete(); diff -Nru thunderbird-140.9.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp thunderbird-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp --- thunderbird-140.9.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -16,25 +16,27 @@ namespace mozilla { void WidevineFileIO::Open(const char* aFilename, uint32_t aFilenameLength) { + DestroyRecord(); + mName = std::string(aFilename, aFilename + aFilenameLength); - GMPRecord* record = nullptr; - GMPErr err = sPlatform->createrecord(aFilename, aFilenameLength, &record, + GMPErr err = sPlatform->createrecord(aFilename, aFilenameLength, &mRecord, static_cast(this)); if (GMP_FAILED(err)) { GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' GMPCreateRecord failed", mName.c_str()); + DestroyRecord(); mClient->OnOpenComplete(cdm::FileIOClient::Status::kError); return; } - if (GMP_FAILED(record->Open())) { + if (GMP_FAILED(mRecord->Open())) { GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' record open failed", mName.c_str()); + DestroyRecord(); mClient->OnOpenComplete(cdm::FileIOClient::Status::kError); return; } GMP_LOG_DEBUG("WidevineFileIO::Open() '%s'", mName.c_str()); - mRecord = record; } void WidevineFileIO::Read() { @@ -58,12 +60,16 @@ mRecord->Write(aData, aDataSize); } -void WidevineFileIO::Close() { - GMP_LOG_DEBUG("WidevineFileIO::Close() '%s'", mName.c_str()); +void WidevineFileIO::DestroyRecord() { if (mRecord) { mRecord->Close(); mRecord = nullptr; } +} + +void WidevineFileIO::Close() { + GMP_LOG_DEBUG("WidevineFileIO::Close() '%s'", mName.c_str()); + DestroyRecord(); delete this; } diff -Nru thunderbird-140.9.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h thunderbird-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h --- thunderbird-140.9.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp/widevine-adapter/WidevineFileIO.h 2026-04-21 14:52:52.000000000 +0000 @@ -13,10 +13,9 @@ namespace mozilla { -class WidevineFileIO : public cdm::FileIO, public GMPRecordClient { +class WidevineFileIO final : public cdm::FileIO, public GMPRecordClient { public: - explicit WidevineFileIO(cdm::FileIOClient* aClient) - : mClient(aClient), mRecord(nullptr) {} + explicit WidevineFileIO(cdm::FileIOClient* aClient) : mClient(aClient) {} // cdm::FileIO void Open(const char* aFilename, uint32_t aFilenameLength) override; @@ -31,8 +30,10 @@ void WriteComplete(GMPErr aStatus) override; private: + void DestroyRecord(); + cdm::FileIOClient* mClient; - GMPRecord* mRecord; + GMPRecord* mRecord = nullptr; std::string mName; }; diff -Nru thunderbird-140.9.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp thunderbird-140.10.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp --- thunderbird-140.9.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -392,9 +392,9 @@ callback_->Decoded(frame); } - void Reset() override {} + void Reset() override { callback_->ResetComplete(); } - void Drain() override {} + void Drain() override { callback_->DrainComplete(); } void DecodingComplete() override { delete this; } diff -Nru thunderbird-140.9.0esr/dom/media/gtest/TestCDMStorage.cpp thunderbird-140.10.0esr/dom/media/gtest/TestCDMStorage.cpp --- thunderbird-140.9.0esr/dom/media/gtest/TestCDMStorage.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/gtest/TestCDMStorage.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -1109,7 +1109,8 @@ SchedulerGroup::Dispatch(task.forget()); } - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, const nsTArray& aMessage) { MonitorAutoLock mon(mMonitor); @@ -1162,14 +1163,15 @@ bool aSuccessful) override {} void ResolvePromiseWithKeyStatus(uint32_t aPromiseId, - uint32_t aKeyStatus) override {} + cdm::KeyStatus aKeyStatus) override {} void ResolvePromise(uint32_t aPromiseId) override {} void RejectPromise(uint32_t aPromiseId, ErrorResult&& aError, const nsCString& aErrorMessage) override {} - void SessionMessage(const nsACString& aSessionId, uint32_t aMessageType, + void SessionMessage(const nsACString& aSessionId, + cdm::MessageType aMessageType, nsTArray&& aMessage) override { mRunner->SessionMessage(aSessionId, aMessageType, std::move(aMessage)); } diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RDDChild.cpp thunderbird-140.10.0esr/dom/media/ipc/RDDChild.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RDDChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RDDChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -86,25 +86,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PRDDChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { - if (RDDChild* child = rddpm->GetRDDChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PRDDChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { + if (RDDChild* child = rddpm->GetRDDChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { - if (RDDChild* child = rddpm->GetRDDChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (RDDProcessManager* rddpm = RDDProcessManager::Get()) { + if (RDDChild* child = rddpm->GetRDDChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteAudioDecoder.cpp thunderbird-140.10.0esr/dom/media/ipc/RemoteAudioDecoder.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RemoteAudioDecoder.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteAudioDecoder.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -72,6 +72,11 @@ IPCResult RemoteAudioDecoderParent::RecvConstruct( ConstructResolver&& aResolver) { + if (mDecoder || mShutdown) { + aResolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return IPC_OK(); + } + auto params = CreateDecoderParams{ mAudioInfo, mOptions, CreateDecoderParams::WrapperSet({/* No wrapper */}), mMediaEngineId, mTrackingId}; @@ -86,6 +91,11 @@ return; } MOZ_ASSERT(aValue.ResolveValue()); + if (self->mDecoder || self->mShutdown) { + aValue.ResolveValue()->Shutdown(); + resolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return; + } self->mDecoder = new MediaDataDecoderProxy(aValue.ResolveValue().forget(), do_AddRef(self->mDecodeTaskQueue.get())); diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderManagerChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -27,6 +27,7 @@ #include "mozilla/MozPromise.h" #include "mozilla/StaticPrefs_media.h" #include "mozilla/StaticPtr.h" +#include "mozilla/layers/ImageDataSerializer.h" #include "nsContentUtils.h" #include "nsIObserver.h" #include "nsPrintfCString.h" @@ -43,6 +44,8 @@ #define LOG(msg, ...) \ MOZ_LOG(gRemoteDecodeLog, LogLevel::Debug, (msg, ##__VA_ARGS__)) +#define LOGE(msg, ...) \ + MOZ_LOG(gRemoteDecodeLog, LogLevel::Error, (msg, ##__VA_ARGS__)) using namespace layers; using namespace gfx; @@ -840,6 +843,31 @@ return PRemoteDecoderManagerChild::DeallocShmem(aShmem); } +static already_AddRefed GetSurfaceForDescriptor( + const SurfaceDescriptor& aDescriptor) { + const auto& sdb = aDescriptor.get_SurfaceDescriptorBuffer(); + const auto& shmem = sdb.data().get_Shmem(); + const auto& rgb = sdb.desc().get_RGBDescriptor(); + const uint32_t stride = ImageDataSerializer::GetRGBStride(rgb); + const size_t requiredSize = + ImageDataSerializer::ComputeRGBBufferSize(rgb.size(), rgb.format()); + if (shmem.Size() < requiredSize) { + LOGE("Shmem too small for required buffer size"); + return nullptr; + } + + return gfx::Factory::CreateWrappingDataSourceSurface( + shmem.get(), stride, rgb.size(), rgb.format()); +} + +static void DestroySurfaceDescriptor(ipc::IShmemAllocator* aAllocator, + SurfaceDescriptor* aSurface) { + MOZ_ASSERT(aSurface); + const SurfaceDescriptorBuffer& desc = aSurface->get_SurfaceDescriptorBuffer(); + aAllocator->DeallocShmem(desc.data().get_Shmem()); + *aSurface = SurfaceDescriptor(); +} + struct SurfaceDescriptorUserData { SurfaceDescriptorUserData(RemoteDecoderManagerChild* aAllocator, SurfaceDescriptor& aSD) @@ -875,14 +903,20 @@ }); SyncRunnable::DispatchToThread(managerThread, task); - if (!IsSurfaceDescriptorValid(sd)) { + if (sd.type() != SurfaceDescriptor::TSurfaceDescriptorBuffer) { + LOGE("Unexpected SurfaceDescriptor type in Readback"); + return nullptr; + } + auto& sdb = sd.get_SurfaceDescriptorBuffer(); + if (sdb.data().type() != MemoryOrShmem::TShmem) { + LOGE("Unexpected SurfaceDescriptorBuffer data type in Readback"); return nullptr; } RefPtr source = GetSurfaceForDescriptor(sd); if (!source) { DestroySurfaceDescriptor(this, &sd); - NS_WARNING("Failed to map SurfaceDescriptor in Readback"); + LOGE("Failed to map SurfaceDescriptor in Readback"); return nullptr; } @@ -932,5 +966,6 @@ } #undef LOG +#undef LOGE } // namespace mozilla diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderParent.cpp thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderParent.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -43,6 +43,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvInit( InitResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Init()->Then( mManagerThread, __func__, @@ -143,6 +148,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvFlush( FlushResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Flush()->Then( mManagerThread, __func__, @@ -162,6 +172,11 @@ mozilla::ipc::IPCResult RemoteDecoderParent::RecvDrain( DrainResolver&& aResolver) { MOZ_ASSERT(OnManagerThread()); + if (!mDecoder) { + aResolver(MediaResult(NS_ERROR_ABORT, __func__)); + return IPC_OK(); + } + RefPtr self = this; mDecoder->Drain()->Then( mManagerThread, __func__, @@ -203,13 +218,16 @@ }); } mDecoder = nullptr; + mShutdown = true; return IPC_OK(); } mozilla::ipc::IPCResult RemoteDecoderParent::RecvSetSeekThreshold( const TimeUnit& aTime) { MOZ_ASSERT(OnManagerThread()); - mDecoder->SetSeekThreshold(aTime); + if (mDecoder) { + mDecoder->SetSeekThreshold(aTime); + } return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderParent.h thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderParent.h --- thunderbird-140.9.0esr/dom/media/ipc/RemoteDecoderParent.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteDecoderParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -61,6 +61,8 @@ // Only be used on Windows when the media engine playback is enabled. const Maybe mMediaEngineId; + bool mShutdown = false; + private: void DecodeNextSample(const RefPtr& aData, size_t aIndex, MediaDataDecoder::DecodedData&& aOutput, diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteMediaData.cpp thunderbird-140.10.0esr/dom/media/ipc/RemoteMediaData.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RemoteMediaData.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteMediaData.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -312,6 +312,14 @@ audioData->mDuration = sample.mBase.duration(); audioData->mOriginalTime = sample.mOriginalTime; audioData->mTrimWindow = sample.mTrimWindow; + CheckedInt requiredLen = + CheckedInt(sample.mDataOffset) + + CheckedInt(sample.mFrames) * CheckedInt(sample.mChannels); + if (!requiredLen.isValid() || + requiredLen.value() > audioData->mAudioData.Length()) { + NS_WARNING("Malformed RemoteAudioData"); + return nullptr; + } audioData->mFrames = sample.mFrames; audioData->mDataOffset = sample.mDataOffset; return audioData.forget(); diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteVideoDecoder.cpp thunderbird-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.cpp --- thunderbird-140.9.0esr/dom/media/ipc/RemoteVideoDecoder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -32,18 +32,18 @@ using namespace ipc; using namespace gfx; -layers::TextureForwarder* KnowsCompositorVideo::GetTextureForwarder() { - auto* vbc = VideoBridgeChild::GetSingleton(); +RefPtr KnowsCompositorVideo::GetTextureForwarder() { + auto vbc = VideoBridgeChild::GetSingleton(); return (vbc && vbc->CanSend()) ? vbc : nullptr; } layers::LayersIPCActor* KnowsCompositorVideo::GetLayersIPCActor() { - return GetTextureForwarder(); + return GetTextureForwarder().get(); } /* static */ already_AddRefed KnowsCompositorVideo::TryCreateForIdentifier( const layers::TextureFactoryIdentifier& aIdentifier) { - VideoBridgeChild* child = VideoBridgeChild::GetSingleton(); + auto child = VideoBridgeChild::GetSingleton(); if (!child) { return nullptr; } @@ -151,6 +151,11 @@ IPCResult RemoteVideoDecoderParent::RecvConstruct( ConstructResolver&& aResolver) { + if (mDecoder || mShutdown) { + aResolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return IPC_OK(); + } + auto imageContainer = MakeRefPtr( layers::ImageUsageType::RemoteVideoDecoder, layers::ImageContainer::SYNCHRONOUS); @@ -175,6 +180,11 @@ return; } MOZ_ASSERT(aValue.ResolveValue()); + if (self->mDecoder || self->mShutdown) { + aValue.ResolveValue()->Shutdown(); + resolver(MediaResult(NS_ERROR_ALREADY_INITIALIZED, __func__)); + return; + } self->mDecoder = new MediaDataDecoderProxy(aValue.ResolveValue().forget(), do_AddRef(self->mDecodeTaskQueue.get())); diff -Nru thunderbird-140.9.0esr/dom/media/ipc/RemoteVideoDecoder.h thunderbird-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.h --- thunderbird-140.9.0esr/dom/media/ipc/RemoteVideoDecoder.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/ipc/RemoteVideoDecoder.h 2026-04-21 14:52:53.000000000 +0000 @@ -19,7 +19,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override) - layers::TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; layers::LayersIPCActor* GetLayersIPCActor() override; static already_AddRefed TryCreateForIdentifier( diff -Nru thunderbird-140.9.0esr/dom/media/platforms/MediaCodecsSupport.cpp thunderbird-140.10.0esr/dom/media/platforms/MediaCodecsSupport.cpp --- thunderbird-140.9.0esr/dom/media/platforms/MediaCodecsSupport.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/MediaCodecsSupport.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -22,15 +22,14 @@ namespace mozilla::media { static StaticAutoPtr sInstance; -static StaticMutex sInitMutex; -static StaticMutex sUpdateMutex; +static StaticMutex sMutex; #define CODEC_SUPPORT_LOG(msg, ...) \ MOZ_LOG(sPDMLog, LogLevel::Debug, ("MediaCodecsSupport, " msg, ##__VA_ARGS__)) void MCSInfo::AddSupport(const MediaCodecsSupported& aSupport) { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't add codec support without a MCSInfo instance!"); return; @@ -39,8 +38,8 @@ } MediaCodecsSupported MCSInfo::GetSupport() { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec support without a MCSInfo instance!"); return MediaCodecsSupported{}; @@ -49,8 +48,8 @@ } void MCSInfo::ResetSupport() { - StaticMutexAutoLock lock(sUpdateMutex); - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't reset codec support without a MCSInfo instance!"); return; @@ -103,7 +102,8 @@ nsCString& aSupportString, const MediaCodecsSupported& aSupportedCodecs) { CodecDefinition supportInfo; aSupportString = ""_ns; - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec support string w/o a MCSInfo instance!"); return; @@ -142,8 +142,7 @@ } } -MCSInfo* MCSInfo::GetInstance() { - StaticMutexAutoLock lock(sInitMutex); +MCSInfo* MCSInfo::GetInstance(const StaticMutexAutoLock& /* unused */) { if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { CODEC_SUPPORT_LOG("In XPCOM shutdown - not returning MCSInfo instance!"); return nullptr; @@ -168,13 +167,10 @@ } GetMainThreadSerialEventTarget()->Dispatch( - NS_NewRunnableFunction("MCSInfo::MCSInfo", [&] { - // Ensure hash tables freed on shutdown + NS_NewRunnableFunction("MCSInfo::MCSInfo", [] { RunOnShutdown( - [&] { - mHashTableMCS.reset(); - mHashTableString.reset(); - mHashTableCodec.reset(); + [] { + StaticMutexAutoLock lock(sMutex); sInstance = nullptr; }, ShutdownPhase::XPCOMShutdown); @@ -183,7 +179,8 @@ CodecDefinition MCSInfo::GetCodecDefinition(const MediaCodec& aCodec) { CodecDefinition info; - MCSInfo* instance = GetInstance(); + StaticMutexAutoLock lock(sMutex); + MCSInfo* instance = GetInstance(lock); if (!instance) { CODEC_SUPPORT_LOG("Can't get codec definition without a MCSInfo instance!"); } else if (!instance->mHashTableCodec->Get(aCodec, &info)) { diff -Nru thunderbird-140.9.0esr/dom/media/platforms/MediaCodecsSupport.h thunderbird-140.10.0esr/dom/media/platforms/MediaCodecsSupport.h --- thunderbird-140.9.0esr/dom/media/platforms/MediaCodecsSupport.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/MediaCodecsSupport.h 2026-04-21 14:52:52.000000000 +0000 @@ -196,7 +196,7 @@ private: MCSInfo(); - static MCSInfo* GetInstance(); + static MCSInfo* GetInstance(const StaticMutexAutoLock& /* unused */); // Returns a codec definition by MIME type name ("media/vp9") // or "common" name ("VP9") diff -Nru thunderbird-140.9.0esr/dom/media/platforms/agnostic/bytestreams/H265.cpp thunderbird-140.10.0esr/dom/media/platforms/agnostic/bytestreams/H265.cpp --- thunderbird-140.9.0esr/dom/media/platforms/agnostic/bytestreams/H265.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/agnostic/bytestreams/H265.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -630,6 +630,8 @@ if (aStRpsIdx != 0) { inter_ref_pic_set_prediction_flag = aReader.ReadBit(); } + const uint32_t spsMaxDecPicBufferingMinus1 = + aSPS.sps_max_dec_pic_buffering_minus1[aSPS.sps_max_sub_layers_minus1]; if (inter_ref_pic_set_prediction_flag) { int delta_idx_minus1 = 0; if (aStRpsIdx == aSPS.num_short_term_ref_pic_sets) { @@ -707,11 +709,20 @@ } } curStRefPicSet.num_positive_pics = i; + // 7.4.8 - num_negative_pics shall be in the range of 0 to + // sps_max_dec_pic_buffering_minus1[sps_max_sub_layers_minus1], inclusive. + // num_positive_pics shall be in the range of 0 to + // sps_max_dec_pic_buffering_minus1[sps_max_sub_layers_minus1] - + // num_negative_pics, inclusive. + IN_RANGE_OR_RETURN(curStRefPicSet.num_negative_pics, 0, + spsMaxDecPicBufferingMinus1); + CheckedUint32 maxPositivePics{spsMaxDecPicBufferingMinus1}; + maxPositivePics -= curStRefPicSet.num_negative_pics; + IN_RANGE_OR_RETURN(curStRefPicSet.num_positive_pics, 0, + maxPositivePics.value()); } else { curStRefPicSet.num_negative_pics = aReader.ReadUE(); curStRefPicSet.num_positive_pics = aReader.ReadUE(); - const uint32_t spsMaxDecPicBufferingMinus1 = - aSPS.sps_max_dec_pic_buffering_minus1[aSPS.sps_max_sub_layers_minus1]; IN_RANGE_OR_RETURN(curStRefPicSet.num_negative_pics, 0, spsMaxDecPicBufferingMinus1); CheckedUint32 maxPositivePics{spsMaxDecPicBufferingMinus1}; @@ -748,6 +759,9 @@ // (7-71) curStRefPicSet.numDeltaPocs = curStRefPicSet.num_negative_pics + curStRefPicSet.num_positive_pics; + // 7.4.8 - NumDeltaPocs = num_negative_pics + num_positive_pics counts DPB + // entries, bounded by sps_max_dec_pic_buffering_minus1. + IN_RANGE_OR_RETURN(curStRefPicSet.numDeltaPocs, 0, spsMaxDecPicBufferingMinus1); return Ok(); } diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -162,7 +162,8 @@ } else if (aFrame->format == AV_SAMPLE_FMT_FLTP) { // Planar audio data. Pack it into something we can understand. AudioDataValue* tmp = audio.get(); - AudioDataValue** data = reinterpret_cast(aFrame->data); + AudioDataValue** data = + reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = data[channel][frame]; @@ -181,7 +182,7 @@ // Planar audio data. Convert it from S16 to 32 bits float // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - int16_t** data = reinterpret_cast(aFrame->data); + int16_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); @@ -200,7 +201,7 @@ // Planar audio data. Convert it from S32 to 32 bits float // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - int32_t** data = reinterpret_cast(aFrame->data); + int32_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); @@ -219,7 +220,7 @@ // Planar audio data. Convert it from u8 to the expected sample-format // and pack it into something we can understand. AudioDataValue* tmp = audio.get(); - uint8_t** data = reinterpret_cast(aFrame->data); + uint8_t** data = reinterpret_cast(aFrame->extended_data); for (uint32_t frame = 0; frame < aNumAFrames; frame++) { for (uint32_t channel = 0; channel < aNumChannels; channel++) { *tmp++ = ConvertAudioSample(data[channel][frame]); diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -300,10 +300,9 @@ aSamples.Length()); } else { MOZ_ASSERT(mCodecContext->sample_fmt == AV_SAMPLE_FMT_FLTP); - for (uint32_t i = 0; i < mConfig.mNumberOfChannels; i++) { - DeinterleaveAndConvertBuffer(aSamples.data(), mFrame->nb_samples, - mConfig.mNumberOfChannels, mFrame->data); - } + DeinterleaveAndConvertBuffer(aSamples.data(), mFrame->nb_samples, + mConfig.mNumberOfChannels, + mFrame->extended_data); } // Now send the AVFrame to ffmpeg for encoding, same code for audio and video. diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -12,6 +12,7 @@ namespace mozilla { +StaticMutex FFmpegRuntimeLinker::sMutex; FFmpegRuntimeLinker::LinkStatus FFmpegRuntimeLinker::sLinkStatus = LinkStatus_INIT; const char* FFmpegRuntimeLinker::sLinkStatusLibraryName = ""; @@ -65,6 +66,7 @@ /* static */ bool FFmpegRuntimeLinker::Init() { + StaticMutexAutoLock lock(sMutex); if (sLinkStatus != LinkStatus_INIT) { return sLinkStatus == LinkStatus_SUCCEEDED; } @@ -248,6 +250,7 @@ } /* static */ const char* FFmpegRuntimeLinker::LinkStatusString() { + StaticMutexAutoLock lock(sMutex); switch (sLinkStatus) { case LinkStatus_INIT: return "Libavcodec not initialized yet"; diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h 2026-04-21 14:52:52.000000000 +0000 @@ -9,12 +9,13 @@ #include "PlatformDecoderModule.h" #include "PlatformEncoderModule.h" +#include "mozilla/StaticMutex.h" namespace mozilla { class FFmpegRuntimeLinker { public: - static bool Init(); + static bool Init() MOZ_EXCLUDES(sMutex); static already_AddRefed CreateDecoder(); static already_AddRefed CreateEncoder(); enum LinkStatus { @@ -32,14 +33,21 @@ LinkStatus_INVALID_CANDIDATE, // Found some lib with unexpected contents. LinkStatus_NOT_FOUND, // Haven't found any library with an expected name. }; - static LinkStatus LinkStatusCode() { return sLinkStatus; } + static LinkStatus LinkStatusCode() { + StaticMutexAutoLock lock(sMutex); + return sLinkStatus; + } static const char* LinkStatusString(); // Library name to which the sLinkStatus applies, or "" if not applicable. - static const char* LinkStatusLibraryName() { return sLinkStatusLibraryName; } + static const char* LinkStatusLibraryName() { + StaticMutexAutoLock lock(sMutex); + return sLinkStatusLibraryName; + } private: - static LinkStatus sLinkStatus; - static const char* sLinkStatusLibraryName; + static StaticMutex sMutex; + static LinkStatus sLinkStatus MOZ_GUARDED_BY(sMutex); + static const char* sLinkStatusLibraryName MOZ_GUARDED_BY(sMutex); }; } // namespace mozilla diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -7,6 +7,7 @@ #include "FFmpegLog.h" #include "PlatformDecoderModule.h" #include "prlink.h" +#include "mozilla/DataMutex.h" #include "mozilla/gfx/gfxVars.h" #include "mozilla/widget/DMABufDevice.h" @@ -17,8 +18,8 @@ static int (*vaTerminate)(void* dpy); static void* (*vaGetDisplayDRM)(int fd); -static VADisplayHolder* sDisplayHolder; -static StaticMutex sDisplayHolderMutex; +MOZ_RUNINIT static StaticDataMutex> + sDisplayHolder("VADisplayHolder::sDisplayHolder"); void VALibWrapper::Link() { #define VA_FUNC_OPTION_SILENT(func) \ @@ -102,10 +103,11 @@ /* static */ RefPtr VADisplayHolder::GetSingleton() { - StaticMutexAutoLock lock(sDisplayHolderMutex); + auto weakInstance = sDisplayHolder.Lock(); - if (sDisplayHolder) { - return RefPtr{sDisplayHolder}; + RefPtr instance(*weakInstance); + if (instance) { + return instance; } UniqueFileHandle drmFd{widget::GetDMABufDevice()->OpenDRMFd()}; @@ -125,21 +127,9 @@ return nullptr; } - RefPtr displayHolder = - new VADisplayHolder(std::move(display), std::move(drmFd)); - sDisplayHolder = displayHolder; - - return displayHolder; -} - -void VADisplayHolder::MaybeDestroy() { - StaticMutexAutoLock lock(sDisplayHolderMutex); - MOZ_ASSERT(int32_t(mRefCnt) >= 0, "dup release"); - if (mRefCnt == 0) { - // No new reference added before the lock was taken. - sDisplayHolder = nullptr; - delete this; - } + instance = new VADisplayHolder(std::move(display), std::move(drmFd)); + *weakInstance = instance; + return instance; } void VADisplayHolder::VADisplayDeleter::operator()(VADisplay aDisplay) { diff -Nru thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h --- thunderbird-140.9.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/platforms/ffmpeg/VALibWrapper.h 2026-04-21 14:52:52.000000000 +0000 @@ -6,6 +6,7 @@ #define DOM_MEDIA_PLATFORMS_FFMPEG_VALIBWRAPPER_H_ #include "mozilla/Attributes.h" +#include "mozilla/ThreadSafeWeakPtr.h" #include "mozilla/Types.h" #include "mozilla/UniquePtrExtensions.h" #include "nsISupportsImpl.h" @@ -55,14 +56,15 @@ PRLibrary* mVALibDrm; }; -class VADisplayHolder { +class VADisplayHolder final + : public SupportsThreadSafeWeakPtr { public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DESTROY(VADisplayHolder, - MaybeDestroy()) + MOZ_DECLARE_REFCOUNTED_TYPENAME(VADisplayHolder) static RefPtr GetSingleton(); VADisplay Display() const { return mDisplay.get(); } + ~VADisplayHolder(); private: struct VADisplayDeleter { @@ -72,9 +74,6 @@ using UniqueVADisplay = std::unique_ptr; VADisplayHolder(UniqueVADisplay aDisplay, UniqueFileHandle aDRMFd); - ~VADisplayHolder(); - - void MaybeDestroy(); // mDRMFd is declared before mDisplay, so that mDRMFd is closed after // mDisplay is terminated. diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -81,43 +81,35 @@ } } -MediaSystemResourceManager::MediaSystemResourceManager() - : mReentrantMonitor("MediaSystemResourceManager.mReentrantMonitor"), - mShutDown(false), - mChild(nullptr) { +MediaSystemResourceManager::MediaSystemResourceManager() { MOZ_ASSERT(InImageBridgeChildThread()); - OpenIPC(); + if (auto imageBridge = ImageBridgeChild::GetSingleton()) { + if (auto* child = + imageBridge->SendPMediaSystemResourceManagerConstructor()) { + mChild = static_cast(child); + mChild->SetManager(this); + } + } } MediaSystemResourceManager::~MediaSystemResourceManager() { - MOZ_ASSERT(IsIpcClosed()); -} - -void MediaSystemResourceManager::OpenIPC() { - MOZ_ASSERT(InImageBridgeChildThread()); MOZ_ASSERT(!mChild); - - media::PMediaSystemResourceManagerChild* child = - ImageBridgeChild::GetSingleton() - ->SendPMediaSystemResourceManagerConstructor(); - mChild = static_cast(child); - mChild->SetManager(this); } void MediaSystemResourceManager::CloseIPC() { MOZ_ASSERT(InImageBridgeChildThread()); - if (!mChild) { - return; + if (mChild) { + mChild->Destroy(); + mChild = nullptr; } - mChild->Destroy(); - mChild = nullptr; - mShutDown = true; } -void MediaSystemResourceManager::OnIpcClosed() { mChild = nullptr; } +void MediaSystemResourceManager::OnIpcClosed() { + MOZ_ASSERT(InImageBridgeChildThread()); -bool MediaSystemResourceManager::IsIpcClosed() { return mChild ? true : false; } + mChild = nullptr; +} void MediaSystemResourceManager::Register(MediaSystemResourceClient* aClient) { ReentrantMonitorAutoEnter mon(mReentrantMonitor); @@ -245,7 +237,7 @@ void MediaSystemResourceManager::DoAcquire(uint32_t aId) { MOZ_ASSERT(InImageBridgeChildThread()); - if (mShutDown || !mChild) { + if (!mChild) { HandleAcquireResult(aId, false); return; } @@ -294,10 +286,9 @@ void MediaSystemResourceManager::DoRelease(uint32_t aId) { MOZ_ASSERT(InImageBridgeChildThread()); - if (mShutDown || !mChild) { - return; + if (mChild) { + mChild->SendRelease(aId); } - mChild->SendRelease(aId); } void MediaSystemResourceManager::RecvResponse(uint32_t aId, bool aSuccess) { diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManager.h thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.h --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManager.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManager.h 2026-04-21 14:52:52.000000000 +0000 @@ -55,9 +55,7 @@ MediaSystemResourceManager(); virtual ~MediaSystemResourceManager(); - void OpenIPC(); void CloseIPC(); - bool IsIpcClosed(); void DoAcquire(uint32_t aId); @@ -65,13 +63,13 @@ void HandleAcquireResult(uint32_t aId, bool aSuccess); - ReentrantMonitor mReentrantMonitor MOZ_UNANNOTATED; + ReentrantMonitor mReentrantMonitor{ + "MediaSystemResourceManager.mReentrantMonitor"}; - bool mShutDown; + media::MediaSystemResourceManagerChild* mChild = nullptr; - media::MediaSystemResourceManagerChild* mChild; - - nsTHashMap mResourceClients; + nsTHashMap mResourceClients + MOZ_GUARDED_BY(mReentrantMonitor); static StaticRefPtr sSingleton; }; diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -27,6 +27,7 @@ MOZ_ASSERT(!mDestroyed); if (mManager) { mManager->OnIpcClosed(); + mManager = nullptr; } mDestroyed = true; } @@ -35,7 +36,7 @@ if (mDestroyed) { return; } - SendRemoveResourceManager(); + Send__delete__(this); // WARNING: |this| is dead, hands off } diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -52,15 +52,6 @@ return IPC_OK(); } -mozilla::ipc::IPCResult -MediaSystemResourceManagerParent::RecvRemoveResourceManager() { - IProtocol* mgr = Manager(); - if (!PMediaSystemResourceManagerParent::Send__delete__(this)) { - return IPC_FAIL_NO_REASON(mgr); - } - return IPC_OK(); -} - void MediaSystemResourceManagerParent::ActorDestroy( ActorDestroyReason aReason) { MOZ_ASSERT(!mDestroyed); diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceManagerParent.h 2026-04-21 14:52:52.000000000 +0000 @@ -31,8 +31,6 @@ mozilla::ipc::IPCResult RecvRelease(const uint32_t& aId); - mozilla::ipc::IPCResult RecvRemoveResourceManager(); - private: void ActorDestroy(ActorDestroyReason aActorDestroyReason) override; diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceService.cpp thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.cpp --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceService.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -18,12 +18,11 @@ StaticRefPtr MediaSystemResourceService::sSingleton; /* static */ -MediaSystemResourceService* MediaSystemResourceService::Get() { - if (sSingleton) { - return sSingleton; +already_AddRefed MediaSystemResourceService::Get() { + if (!sSingleton) { + Init(); } - Init(); - return sSingleton; + return do_AddRef(sSingleton); } /* static */ @@ -35,6 +34,7 @@ /* static */ void MediaSystemResourceService::Shutdown() { + MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread()); if (sSingleton) { sSingleton->Destroy(); sSingleton = nullptr; diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceService.h thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.h --- thunderbird-140.9.0esr/dom/media/systemservices/MediaSystemResourceService.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/MediaSystemResourceService.h 2026-04-21 14:52:53.000000000 +0000 @@ -26,7 +26,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceService) - static MediaSystemResourceService* Get(); + static already_AddRefed Get(); static void Init(); static void Shutdown(); diff -Nru thunderbird-140.9.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl thunderbird-140.10.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl --- thunderbird-140.9.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/systemservices/PMediaSystemResourceManager.ipdl 2026-04-21 14:52:52.000000000 +0000 @@ -21,16 +21,11 @@ child: async Response(uint32_t aId, bool aSuccess); - async __delete__(); parent: async Acquire(uint32_t aId, MediaSystemResourceType aResourceType, bool aWillWait); async Release(uint32_t aId); - - /** - * Asynchronously tell the parent side to remove the PMediaSystemResourceManager. - */ - async RemoveResourceManager(); + async __delete__(); }; } // namespace media diff -Nru thunderbird-140.9.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp thunderbird-140.10.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp --- thunderbird-140.9.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webaudio/AudioBufferSourceNode.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -169,10 +169,14 @@ if (mResamplerOutRate == aOutRate) { return; } - if (speex_resampler_set_rate(mResampler, mBufferSampleRate, aOutRate) != - RESAMPLER_ERR_SUCCESS) { - NS_ASSERTION(false, "speex_resampler_set_rate failed"); - return; + int result = + speex_resampler_set_rate(mResampler, mBufferSampleRate, aOutRate); + if (result != RESAMPLER_ERR_SUCCESS) { + WEB_AUDIO_API_LOG("speex_resampler_set_rate failed: %i", result); + // mResampler den_rate and num_rate might have been updated, despite + // the error, in which case the resampler will output zeros but + // still consume input. Continue below to update mBeginProcessing + // for any change in resampler behavior. } } diff -Nru thunderbird-140.9.0esr/dom/media/webcodecs/AudioData.cpp thunderbird-140.10.0esr/dom/media/webcodecs/AudioData.cpp --- thunderbird-140.9.0esr/dom/media/webcodecs/AudioData.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webcodecs/AudioData.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -401,6 +401,7 @@ template void CopySamples(Span aSource, Span aDest, uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { if (IsInterleaved(aSourceFormat) && IsInterleaved(aCopyToSpec.mFormat)) { @@ -409,12 +410,12 @@ MOZ_ASSERT(aSource.Length() - aCopyToSpec.mFrameOffset >= aCopyToSpec.mFrameCount); // This turns into a regular memcpy if the types are in fact equal - ConvertAudioSamples(aSource.data() + aCopyToSpec.mFrameOffset, aDest.data(), - aCopyToSpec.mFrameCount * aSourceChannelCount); + ConvertAudioSamples( + aSource.data() + aCopyToSpec.mFrameOffset * aSourceChannelCount, + aDest.data(), aCopyToSpec.mFrameCount * aSourceChannelCount); return; } if (IsInterleaved(aSourceFormat) && !IsInterleaved(aCopyToSpec.mFormat)) { - DebugOnly sourceFrameCount = aSource.Length() / aSourceChannelCount; MOZ_ASSERT(aDest.Length() >= aCopyToSpec.mFrameCount); MOZ_ASSERT(aSource.Length() - aCopyToSpec.mFrameOffset >= aCopyToSpec.mFrameCount); @@ -438,11 +439,10 @@ aCopyToSpec.mFrameOffset * aSourceChannelCount >= aCopyToSpec.mFrameCount * aSourceChannelCount); size_t writeIndex = 0; - // Scan the source linearly and put each sample at the right position in the - // destination interleaved buffer. - size_t readIndex = 0; for (size_t channel = 0; channel < aSourceChannelCount; channel++) { writeIndex = channel; + size_t readIndex = + channel * aSourceFramesPerChannel + aCopyToSpec.mFrameOffset; for (size_t i = 0; i < aCopyToSpec.mFrameCount; i++) { aDest[writeIndex] = ConvertAudioSample(aSource[readIndex]); readIndex++; @@ -453,8 +453,7 @@ } if (!IsInterleaved(aSourceFormat) && !IsInterleaved(aCopyToSpec.mFormat)) { // Planar to Planar / convert + copy from the right index in the source. - size_t framePerPlane = aSource.Length() / aSourceChannelCount; - size_t offset = aCopyToSpec.mPlaneIndex * framePerPlane; + size_t offset = aCopyToSpec.mPlaneIndex * aSourceFramesPerChannel; MOZ_ASSERT(aDest.Length() >= aCopyToSpec.mFrameCount, "Destination buffer too small"); MOZ_ASSERT(aSource.Length() >= offset + aCopyToSpec.mFrameCount, @@ -516,22 +515,26 @@ void CopySamples(DataSpanType& aSource, DataSpanType& aDest, uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { aSource.match([&](auto& src) { aDest.match([&](auto& dst) { - CopySamples(src, dst, aSourceChannelCount, aSourceFormat, aCopyToSpec); + CopySamples(src, dst, aSourceChannelCount, aSourceFramesPerChannel, + aSourceFormat, aCopyToSpec); }); }); } void DoCopy(Span aSource, Span aDest, const uint32_t aSourceChannelCount, + uint32_t aSourceFramesPerChannel, const AudioSampleFormat aSourceFormat, const CopyToSpec& aCopyToSpec) { DataSpanType source = GetDataSpan(aSource, aSourceFormat); DataSpanType dest = GetDataSpan(aDest, aCopyToSpec.mFormat); - CopySamples(source, dest, aSourceChannelCount, aSourceFormat, aCopyToSpec); + CopySamples(source, dest, aSourceChannelCount, aSourceFramesPerChannel, + aSourceFormat, aCopyToSpec); } // https://w3c.github.io/webcodecs/#dom-audiodata-copyto @@ -588,7 +591,7 @@ // Now a couple layers of macros to type the pointers and perform the actual // copy. ProcessTypedArraysFixed(aDestination, [&](const Span& aData) { - DoCopy(mResource->Data(), aData, mNumberOfChannels, + DoCopy(mResource->Data(), aData, mNumberOfChannels, mNumberOfFrames, mAudioSampleFormat.value(), copyToSpec); }); } @@ -714,7 +717,8 @@ CopyToSpec spec(mNumberOfFrames, 0, 0, AudioSampleFormat::F32); - DoCopy(data, storage, mNumberOfChannels, mAudioSampleFormat.value(), spec); + DoCopy(data, storage, mNumberOfChannels, mNumberOfFrames, + mAudioSampleFormat.value(), spec); return MakeRefPtr( 0, media::TimeUnit::FromMicroseconds(mTimestamp), std::move(buf), diff -Nru thunderbird-140.9.0esr/dom/media/webcodecs/ImageDecoder.cpp thunderbird-140.10.0esr/dom/media/webcodecs/ImageDecoder.cpp --- thunderbird-140.9.0esr/dom/media/webcodecs/ImageDecoder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webcodecs/ImageDecoder.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -340,7 +340,7 @@ return; } - ImageTrack* track = mTracks->GetDefaultTrack(); + RefPtr track = mTracks->GetDefaultTrack(); if (!track) { return; } @@ -410,19 +410,31 @@ // 4. Resolve promise with result. for (const auto& i : resolved) { - ImageDecodeResult result; - result.mImage = track->GetDecodedFrame(i.mFrameIndex); - // TODO(aosmond): progressive images - result.mComplete = true; - i.mPromise->MaybeResolve(result); + if (!mClosed) { + ImageDecodeResult result; + result.mImage = track->GetDecodedFrame(i.mFrameIndex); + // TODO(aosmond): progressive images + result.mComplete = true; + i.mPromise->MaybeResolve(result); + } else { + i.mPromise->MaybeRejectWithAbortError("Closed decoder"_ns); + } } for (const auto& i : rejectedRange) { - i.mPromise->MaybeRejectWithRangeError("No more frames available"_ns); + if (!mClosed) { + i.mPromise->MaybeRejectWithRangeError("No more frames available"_ns); + } else { + i.mPromise->MaybeRejectWithAbortError("Closed decoder"_ns); + } } for (const auto& i : rejectedState) { - i.mPromise->MaybeRejectWithInvalidStateError("Error decoding frame"_ns); + if (!mClosed) { + i.mPromise->MaybeRejectWithInvalidStateError("Error decoding frame"_ns); + } else { + i.mPromise->MaybeRejectWithAbortError("Closed decoder"_ns); + } } } @@ -994,8 +1006,13 @@ } void ImageDecoder::Close(const MediaResult& aResult) { + RefPtr kungFuDeathGrip(this); MOZ_LOG(gWebCodecsLog, LogLevel::Debug, ("ImageDecoder %p Close", this)); + if (mClosed) { + return; + } + // 10.2.5. Algorithms - Close ImageDecoder (with exception) mClosed = true; mTypeNotSupported = aResult.Code() == NS_ERROR_DOM_NOT_SUPPORTED_ERR; diff -Nru thunderbird-140.9.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp thunderbird-140.10.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp --- thunderbird-140.9.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webcodecs/ImageDecoderReadRequest.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -60,6 +60,7 @@ MOZ_LOG(gWebCodecsLog, LogLevel::Debug, ("ImageDecoderReadRequest %p Destroy", this)); + RefPtr self(this); if (aCancel) { // Ensure we stop reading from the ReadableStream. Cancel(); @@ -160,8 +161,6 @@ return; } - RefPtr self(this); - AutoJSAPI jsapi; if (!jsapi.Init(mDecoder->GetParentObject())) { MOZ_LOG(gWebCodecsLog, LogLevel::Debug, diff -Nru thunderbird-140.9.0esr/dom/media/webcodecs/VideoFrame.cpp thunderbird-140.10.0esr/dom/media/webcodecs/VideoFrame.cpp --- thunderbird-140.9.0esr/dom/media/webcodecs/VideoFrame.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webcodecs/VideoFrame.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -2793,11 +2793,11 @@ return false; } - auto copyPlane = [&](const uint8_t* aPlaneData) { + auto copyPlane = [&](const uint8_t* aPlaneData, int32_t aSourceStride) { MOZ_ASSERT(aPlaneData); CheckedInt offset(aRect.Y()); - offset *= Stride(aPlane); + offset *= aSourceStride; offset += aRect.X() * mFormat->SampleBytes(aPlane); if (!offset.isValid()) { return false; @@ -2812,37 +2812,38 @@ aPlaneData += offset.value(); for (int32_t row = 0; row < aRect.Height(); ++row) { PodCopy(aPlaneDest.data(), aPlaneData, elementsBytes.value()); - aPlaneData += Stride(aPlane); + aPlaneData += aSourceStride; // Spec asks to move `aDestinationStride` bytes instead of - // `Stride(aPlane)` forward. + // `aSourceStride` forward. aPlaneDest = aPlaneDest.From(aDestinationStride); } return true; }; if (mImage->GetFormat() == ImageFormat::PLANAR_YCBCR) { + const auto* data = mImage->AsPlanarYCbCrImage()->GetData(); switch (aPlane) { case Format::Plane::Y: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mYChannel); + return copyPlane(data->mYChannel, data->mYStride); case Format::Plane::U: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mCbChannel); + return copyPlane(data->mCbChannel, data->mCbCrStride); case Format::Plane::V: - return copyPlane(mImage->AsPlanarYCbCrImage()->GetData()->mCrChannel); + return copyPlane(data->mCrChannel, data->mCbCrStride); case Format::Plane::A: MOZ_ASSERT(mFormat->PixelFormat() == VideoPixelFormat::I420A); - MOZ_ASSERT(mImage->AsPlanarYCbCrImage()->GetData()->mAlpha); - return copyPlane( - mImage->AsPlanarYCbCrImage()->GetData()->mAlpha->mChannel); + MOZ_ASSERT(data->mAlpha); + return copyPlane(data->mAlpha->mChannel, data->mYStride); } MOZ_ASSERT_UNREACHABLE("invalid plane"); } if (mImage->GetFormat() == ImageFormat::NV_IMAGE) { + const auto* data = mImage->AsNVImage()->GetData(); switch (aPlane) { case Format::Plane::Y: - return copyPlane(mImage->AsNVImage()->GetData()->mYChannel); + return copyPlane(data->mYChannel, data->mYStride); case Format::Plane::UV: - return copyPlane(mImage->AsNVImage()->GetData()->mCbChannel); + return copyPlane(data->mCbChannel, data->mCbCrStride); case Format::Plane::V: case Format::Plane::A: MOZ_ASSERT_UNREACHABLE("invalid plane"); @@ -2916,7 +2917,7 @@ return false; } - return copyPlane(tempMap.GetData()); + return copyPlane(tempMap.GetData(), tempMap.GetStride()); } #undef LOGW diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp thunderbird-140.10.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1868,7 +1868,11 @@ } nsresult PeerConnectionImpl::OnAlpnNegotiated(bool aPrivacyRequested) { - PC_AUTO_ENTER_API_CALL(false); + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (IsClosed()) { + return NS_OK; // Nod and smile + } MOZ_DIAGNOSTIC_ASSERT(!mRequestedPrivacy || (*mRequestedPrivacy == PrincipalPrivacy::Private) == aPrivacyRequested); @@ -1885,6 +1889,12 @@ void PeerConnectionImpl::OnDtlsStateChange(const std::string& aTransportId, TransportLayer::State aState) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (IsClosed()) { + return; + } + nsCString key(aTransportId.data(), aTransportId.size()); RefPtr dtlsTransport = mTransportIdToRTCDtlsTransport.Get(key); @@ -3314,8 +3324,16 @@ void PeerConnectionImpl::IceConnectionStateChange( const std::string& aTransportId, dom::RTCIceTransportState domState) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + + // Let connection be the RTCPeerConnection object associated with this ICE + // Agent. + RefPtr connection(this); + // If connection.[[IsClosed]] is true, abort these steps. - PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); + if (IsClosed()) { + return; + } CSFLogDebug(LOGTAG, "IceConnectionStateChange: %s %d (%p)", aTransportId.c_str(), static_cast(domState), this); @@ -3475,6 +3493,9 @@ void PeerConnectionImpl::OnCandidateFound(const std::string& aTransportId, const CandidateInfo& aCandidateInfo) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + if (mStunAddrsRequest && !aCandidateInfo.mMDNSAddress.empty()) { MOZ_ASSERT(!aCandidateInfo.mActualAddress.empty()); @@ -3507,8 +3528,13 @@ void PeerConnectionImpl::IceGatheringStateChange( const std::string& aTransportId, dom::RTCIceGathererState state) { + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread"); + RefPtr kungFuDeathGrip(this); + // If connection.[[IsClosed]] is true, abort these steps. - PC_AUTO_ENTER_API_CALL_VOID_RETURN(false); + if (IsClosed()) { + return; + } CSFLogWarn(LOGTAG, "IceGatheringStateChange: %s %d (%p)", aTransportId.c_str(), static_cast(state), this); diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -17,9 +17,6 @@ #include "jsapi/RTCRtpScriptTransform.h" #include "mozilla/dom/RTCRtpScriptTransformer.h" #include "mozilla/dom/RTCEncodedAudioFrameBinding.h" -#include "nsWrapperCache.h" -#include "nsISupports.h" -#include "nsCycleCollectionParticipant.h" #include "nsIGlobalObject.h" #include "nsContentUtils.h" #include "mozilla/HoldDropJSObjects.h" @@ -30,21 +27,11 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase, - mOwner) -NS_IMPL_ADDREF_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) -NS_IMPL_RELEASE_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedAudioFrame) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY -NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) - RTCEncodedAudioFrame::RTCEncodedAudioFrame( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), - mOwner(aOwner) { + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter, aOwner) { mMetadata.mSynchronizationSource.Construct(mFrame->GetSsrc()); mMetadata.mPayloadType.Construct(mFrame->GetPayloadType()); // send frames are derived directly from TransformableFrameInterface, not @@ -64,16 +51,6 @@ mMetadata.mSequenceNumber.Construct(*optionalSeqNum); } } - - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::HoldJSObjects(this); -} - -RTCEncodedAudioFrame::~RTCEncodedAudioFrame() { - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::DropJSObjects(this); } JSObject* RTCEncodedAudioFrame::WrapObject(JSContext* aCx, @@ -81,10 +58,6 @@ return RTCEncodedAudioFrame_Binding::Wrap(aCx, this, aGivenProto); } -nsIGlobalObject* RTCEncodedAudioFrame::GetParentObject() const { - return mGlobal; -} - void RTCEncodedAudioFrame::GetMetadata( RTCEncodedAudioFrameMetadata& aMetadata) const { aMetadata = mMetadata; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h 2026-04-21 14:52:52.000000000 +0000 @@ -25,17 +25,10 @@ std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner); - // nsISupports - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedAudioFrame, - RTCEncodedFrameBase) - // webidl (timestamp and data accessors live in base class) JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; - nsIGlobalObject* GetParentObject() const; - void GetMetadata(RTCEncodedAudioFrameMetadata& aMetadata) const; bool CheckOwner(RTCRtpScriptTransformer* aOwner) const override; @@ -43,8 +36,7 @@ bool IsVideo() const override { return false; } private: - virtual ~RTCEncodedAudioFrame(); - RefPtr mOwner; + virtual ~RTCEncodedAudioFrame() = default; RTCEncodedAudioFrameMetadata mMetadata; }; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -7,8 +7,10 @@ #include "jsapi/RTCEncodedFrameBase.h" #include "js/GCAPI.h" +#include "mozilla/HoldDropJSObjects.h" #include "nsIGlobalObject.h" #include "mozilla/dom/ScriptSettings.h" +#include "mozilla/dom/RTCRtpScriptTransformer.h" #include "js/ArrayBuffer.h" namespace mozilla::dom { @@ -17,46 +19,57 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCEncodedFrameBase) using ::ImplCycleCollectionUnlink; tmp->DetachData(); - NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner, mGlobal) NS_IMPL_CYCLE_COLLECTION_UNLINK(mData) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCEncodedFrameBase) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner, mGlobal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBERS(mData) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCEncodedFrameBase) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedFrameBase) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END RTCEncodedFrameBase::RTCEncodedFrameBase( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, - uint64_t aCounter) + uint64_t aCounter, + RTCRtpScriptTransformer* aOwner) : mGlobal(aGlobal), mFrame(std::move(aFrame)), mCounter(aCounter), - mTimestamp(mFrame->GetTimestamp()) { + mTimestamp(mFrame->GetTimestamp()), + mOwner(aOwner) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mGlobal))) { return; } + mozilla::HoldJSObjects(this); + // Avoid a copy mData = JS::NewArrayBufferWithUserOwnedContents( jsapi.cx(), mFrame->GetData().size(), (void*)(mFrame->GetData().data())); } -RTCEncodedFrameBase::~RTCEncodedFrameBase() { DetachData(); } +RTCEncodedFrameBase::~RTCEncodedFrameBase() { + DetachData(); + mData = nullptr; + mozilla::DropJSObjects(this); +} void RTCEncodedFrameBase::DetachData() { // We might have handled this in unlink already - if (mGlobal) { + if (mGlobal && mData) { AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mGlobal))) { return; @@ -69,6 +82,10 @@ } } +nsIGlobalObject* RTCEncodedFrameBase::GetParentObject() const { + return mGlobal; +} + unsigned long RTCEncodedFrameBase::Timestamp() const { return mTimestamp; } void RTCEncodedFrameBase::SetData(const ArrayBuffer& aData) { diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2026-04-21 14:52:52.000000000 +0000 @@ -24,12 +24,15 @@ explicit RTCEncodedFrameBase( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, - uint64_t aCounter); + uint64_t aCounter, + RTCRtpScriptTransformer* aOwner); // nsISupports NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCEncodedFrameBase) + nsIGlobalObject* GetParentObject() const; + // Common webidl for RTCEncodedVideoFrame/RTCEncodedAudioFrame unsigned long Timestamp() const; @@ -53,6 +56,7 @@ std::unique_ptr mFrame; const uint64_t mCounter = 0; const unsigned long mTimestamp = 0; + RefPtr mOwner; JS::Heap mData; }; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -16,9 +16,6 @@ #include "jsapi/RTCEncodedFrameBase.h" #include "mozilla/dom/RTCEncodedVideoFrameBinding.h" #include "mozilla/dom/RTCRtpScriptTransformer.h" -#include "nsWrapperCache.h" -#include "nsISupports.h" -#include "nsCycleCollectionParticipant.h" #include "nsIGlobalObject.h" #include "nsContentUtils.h" #include "mozilla/RefPtr.h" @@ -29,21 +26,11 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase, - mOwner) -NS_IMPL_ADDREF_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) -NS_IMPL_RELEASE_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedVideoFrame) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY -NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) - RTCEncodedVideoFrame::RTCEncodedVideoFrame( nsIGlobalObject* aGlobal, std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), - mOwner(aOwner) { + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter, aOwner) { const auto& videoFrame( static_cast(*mFrame)); mType = videoFrame.IsKeyFrame() ? RTCEncodedVideoFrameType::Key @@ -85,21 +72,11 @@ mozilla::HoldJSObjects(this); } -RTCEncodedVideoFrame::~RTCEncodedVideoFrame() { - // Base class needs this, but can't do it itself because of an assertion in - // the cycle-collector. - mozilla::DropJSObjects(this); -} - JSObject* RTCEncodedVideoFrame::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { return RTCEncodedVideoFrame_Binding::Wrap(aCx, this, aGivenProto); } -nsIGlobalObject* RTCEncodedVideoFrame::GetParentObject() const { - return mGlobal; -} - RTCEncodedVideoFrameType RTCEncodedVideoFrame::Type() const { return mType; } void RTCEncodedVideoFrame::GetMetadata( diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h --- thunderbird-140.9.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h 2026-04-21 14:52:52.000000000 +0000 @@ -7,7 +7,6 @@ #ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ #define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ -#include "mozilla/RefPtr.h" #include "nsIGlobalObject.h" #include "jsapi/RTCEncodedFrameBase.h" #include "mozilla/dom/RTCEncodedVideoFrameBinding.h" @@ -26,17 +25,10 @@ std::unique_ptr aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner); - // nsISupports - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedVideoFrame, - RTCEncodedFrameBase) - // webidl (timestamp and data accessors live in base class) JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; - nsIGlobalObject* GetParentObject() const; - RTCEncodedVideoFrameType Type() const; void GetMetadata(RTCEncodedVideoFrameMetadata& aMetadata); @@ -50,8 +42,7 @@ Maybe Rid() const; private: - virtual ~RTCEncodedVideoFrame(); - RefPtr mOwner; + virtual ~RTCEncodedVideoFrame() = default; RTCEncodedVideoFrameType mType; RTCEncodedVideoFrameMetadata mMetadata; Maybe mRid; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -1385,13 +1385,13 @@ } mCall->UnregisterConduit(this); - mDecoderFactory->DisconnectAll(); - mEncoderFactory->DisconnectAll(); { MutexAutoLock lock(mMutex); DeleteSendStream(); DeleteRecvStream(); } + mDecoderFactory->DisconnectAll(); + mEncoderFactory->DisconnectAll(); return GenericPromise::CreateAndResolve(true, __func__); }); diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcGmpVideoCodec.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -672,7 +672,8 @@ } if (mCodecParams.mTemporalLayerNum > 1) { - int temporalIdx = std::max(0, aEncodedFrame->GetTemporalLayerId()); + int temporalIdx = std::clamp(aEncodedFrame->GetTemporalLayerId(), 0, + mCodecParams.mTemporalLayerNum - 1); unit.SetTemporalIndex(temporalIdx); info.codecSpecific.H264.temporal_idx = temporalIdx; info.scalability_mode = GmpCodecParamsToScalabilityMode(mCodecParams); @@ -1047,9 +1048,10 @@ CheckedInt32 length = (CheckedInt32(aDecodedFrame->Stride(kGMPYPlane)) * aDecodedFrame->Height()) + - (aDecodedFrame->Stride(kGMPVPlane) + aDecodedFrame->Stride(kGMPUPlane)) * - ((aDecodedFrame->Height() + 1) / 2); - int32_t size = length.value(); + (CheckedInt32(aDecodedFrame->Stride(kGMPVPlane)) + + aDecodedFrame->Stride(kGMPUPlane)) * + ((aDecodedFrame->Height() + 1) / 2); + int32_t size = length.isValid() ? length.value() : 0; MOZ_RELEASE_ASSERT(length.isValid() && size > 0); // Don't use MakeUniqueFallible here, because UniquePtr isn't copyable, and diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -474,8 +474,8 @@ CheckedInt64 time = TimeUnitToFrames(frame->mTime, cricket::kVideoCodecClockrate); if (!time.isValid()) { - self->mError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, - "invalid timestamp from encoder"); + mError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, + "invalid timestamp from encoder"); break; } image.SetRtpTimestamp(time.value()); @@ -487,11 +487,12 @@ frame->mKeyframe); LOG_V("Send encoded image"); - self->mCallback->OnEncodedImage(image, &mCodecSpecific); - self->mBitrateAdjuster.Update(image.size()); + mCallback->OnEncodedImage(image, &mCodecSpecific); + mBitrateAdjuster.Update(image.size()); } }, [self = RefPtr(this)](const MediaResult& aError) { + MutexAutoLock lock(self->mCallbackMutex); self->mError = aError; }); return WEBRTC_VIDEO_CODEC_OK; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcMediaDataEncoderCodec.h 2026-04-21 14:52:52.000000000 +0000 @@ -60,9 +60,10 @@ const RefPtr mFactory; RefPtr mEncoder; - Mutex mCallbackMutex MOZ_UNANNOTATED; // Protects mCallback and mError. - webrtc::EncodedImageCallback* mCallback = nullptr; - MediaResult mError = NS_OK; + Mutex mCallbackMutex; + webrtc::EncodedImageCallback* mCallback MOZ_GUARDED_BY(mCallbackMutex) = + nullptr; + MediaResult mError MOZ_GUARDED_BY(mCallbackMutex) = NS_OK; VideoInfo mInfo; webrtc::CodecParameterMap mFormatParams; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -38,8 +38,11 @@ // Get an external decoder auto gmpDecoder = WrapUnique(GmpVideoCodec::CreateDecoder(mPCHandle, mTrackingId)); - mCreatedGmpPluginEvent.Forward(*gmpDecoder->InitPluginEvent()); - mReleasedGmpPluginEvent.Forward(*gmpDecoder->ReleasePluginEvent()); + { + MutexAutoLock lock(mGmpPluginMutex); + mCreatedGmpPluginEvent.Forward(*gmpDecoder->InitPluginEvent()); + mReleasedGmpPluginEvent.Forward(*gmpDecoder->ReleasePluginEvent()); + } decoder.reset(gmpDecoder.release()); break; } @@ -132,8 +135,11 @@ // get an external encoder auto gmpEncoder = WrapUnique(GmpVideoCodec::CreateEncoder(aFormat, mPCHandle)); - mCreatedGmpPluginEvent.Forward(*gmpEncoder->InitPluginEvent()); - mReleasedGmpPluginEvent.Forward(*gmpEncoder->ReleasePluginEvent()); + { + MutexAutoLock lock(mGmpPluginMutex); + mCreatedGmpPluginEvent.Forward(*gmpEncoder->InitPluginEvent()); + mReleasedGmpPluginEvent.Forward(*gmpEncoder->ReleasePluginEvent()); + } encoder.reset(gmpEncoder.release()); break; } diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h --- thunderbird-140.9.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/libwebrtcglue/WebrtcVideoCodecFactory.h 2026-04-21 14:52:52.000000000 +0000 @@ -22,6 +22,7 @@ public: explicit GmpPluginNotifier(nsCOMPtr aOwningThread) : mOwningThread(std::move(aOwningThread)), + mGmpPluginMutex("GmpPluginNotifier::mGmpPluginMutex"), mCreatedGmpPluginEvent(mOwningThread), mReleasedGmpPluginEvent(mOwningThread) {} @@ -29,6 +30,7 @@ void DisconnectAll() override { MOZ_ASSERT(mOwningThread->IsOnCurrentThread()); + MutexAutoLock lock(mGmpPluginMutex); mCreatedGmpPluginEvent.DisconnectAll(); mReleasedGmpPluginEvent.DisconnectAll(); } @@ -43,6 +45,7 @@ protected: const nsCOMPtr mOwningThread; + Mutex mGmpPluginMutex MOZ_UNANNOTATED; MediaEventForwarder mCreatedGmpPluginEvent; MediaEventForwarder mReleasedGmpPluginEvent; }; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp thunderbird-140.10.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp --- thunderbird-140.9.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/nr_socket_prsock.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -532,7 +532,7 @@ int nr_transport_addr_get_addrstring_and_port(const nr_transport_addr* addr, nsACString* host, int32_t* port) { int r, _status; - char addr_string[64]; + char addr_string[256]; // We cannot directly use |nr_transport_addr.as_string| because it contains // more than ip address, therefore, we need to explicity convert it diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c --- thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/ice/ice_parser.c 2026-04-21 14:52:53.000000000 +0000 @@ -94,8 +94,10 @@ len = c - *str; tmp = RMALLOC(len + 1); - if (!tmp) + if (!tmp) { + *out = 0; ABORT(R_NO_MEMORY); + } memcpy(tmp, *str, len); tmp[len] = '\0'; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c --- thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/net/transport_addr.c 2026-04-21 14:52:52.000000000 +0000 @@ -281,6 +281,9 @@ int _status; if (addr->fqdn[0]) { + if (maxlen <= (int)(strlen(addr->fqdn))) { + ABORT(R_BAD_ARGS); + } strncpy(str, addr->fqdn, maxlen); } else { const char* res; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c --- thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.c 2026-04-21 14:52:52.000000000 +0000 @@ -832,6 +832,16 @@ return(_status); } +static void nr_stun_client_ctx_destroy_final(NR_SOCKET s, int b, void *cb_arg) + { + nr_stun_client_ctx *ctx=(nr_stun_client_ctx*)cb_arg; + RFREE(ctx->nonce); + RFREE(ctx->realm); + + RFREE(ctx->label); + RFREE(ctx); + } + int nr_stun_client_ctx_destroy(nr_stun_client_ctx **ctxp) { nr_stun_client_ctx *ctx; @@ -843,13 +853,7 @@ *ctxp=0; nr_stun_client_reset(ctx); - - RFREE(ctx->nonce); - RFREE(ctx->realm); - - RFREE(ctx->label); - RFREE(ctx); - + NR_ASYNC_TIMER_SET(0, nr_stun_client_ctx_destroy_final, ctx, &ctx->destroy_timer_handle); return(0); } diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h --- thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_client_ctx.h 2026-04-21 14:52:52.000000000 +0000 @@ -176,6 +176,7 @@ UINT4 mapped_addr_check_mask; /* What checks to run on mapped addresses */ int timeout_ms; struct timeval timer_set; + void *destroy_timer_handle; NR_async_cb finished_cb; void *cb_arg; nr_stun_message *request; diff -Nru thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c --- thunderbird-140.9.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_proc.c 2026-04-21 14:52:53.000000000 +0000 @@ -156,7 +156,7 @@ /* unrecognized attribute */ /* should never happen, but truncate if it ever were to occur */ - if (unknown_attributes.num_attributes > NR_STUN_MAX_UNKNOWN_ATTRIBUTES) + if (unknown_attributes.num_attributes >= NR_STUN_MAX_UNKNOWN_ATTRIBUTES) break; unknown_attributes.attribute[unknown_attributes.num_attributes++] = attr->type; diff -Nru thunderbird-140.9.0esr/dom/media/webvtt/TextTrack.cpp thunderbird-140.10.0esr/dom/media/webvtt/TextTrack.cpp --- thunderbird-140.9.0esr/dom/media/webvtt/TextTrack.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/media/webvtt/TextTrack.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -79,6 +79,7 @@ } void TextTrack::SetMode(TextTrackMode aValue) { + RefPtr kungFuDeathGrip = this; if (mMode == aValue) { return; } diff -Nru thunderbird-140.9.0esr/dom/network/TCPServerSocketParent.cpp thunderbird-140.10.0esr/dom/network/TCPServerSocketParent.cpp --- thunderbird-140.9.0esr/dom/network/TCPServerSocketParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/TCPServerSocketParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -25,6 +25,11 @@ void TCPServerSocketParent::ReleaseIPDLReference() { MOZ_ASSERT(mIPCOpen); + NS_ASSERTION(mIPCOpen, + "ReleaseIPDLReference called without matching AddIPDLReference"); + if (!mIPCOpen) { + return; + } mIPCOpen = false; this->Release(); } @@ -70,8 +75,9 @@ if (mNeckoParent) { if (mNeckoParent->SendPTCPSocketConstructor(socket, host, port)) { - // Call |AddIPDLReference| after the consructor message is sent - // successfully, otherwise |socket| could be leaked. + // Call |AddIPDLReference| only on success; on failure IPDL calls + // DeallocPTCPSocketParent which calls ReleaseIPDLReference, guarded + // against the unbalanced case. socket->AddIPDLReference(); mozilla::Unused << PTCPServerSocketParent::SendCallbackAccept( diff -Nru thunderbird-140.9.0esr/dom/network/TCPSocket.cpp thunderbird-140.10.0esr/dom/network/TCPSocket.cpp --- thunderbird-140.9.0esr/dom/network/TCPSocket.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/TCPSocket.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -10,6 +10,7 @@ #include "TCPSocketParent.h" #include "mozilla/BasePrincipal.h" #include "mozilla/ErrorResult.h" +#include "mozilla/StaticPrefs_dom.h" #include "mozilla/SyncRunnable.h" #include "mozilla/dom/RootedDictionary.h" #include "mozilla/dom/ScriptSettings.h" @@ -1163,6 +1164,10 @@ /* static */ bool TCPSocket::ShouldTCPSocketExist(JSContext* aCx, JSObject* aGlobal) { + if (XRE_IsContentProcess() && + !StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return false; + } JS::Rooted global(aCx, aGlobal); return nsContentUtils::ObjectPrincipal(global)->IsSystemPrincipal(); } diff -Nru thunderbird-140.9.0esr/dom/network/TCPSocketParent.cpp thunderbird-140.10.0esr/dom/network/TCPSocketParent.cpp --- thunderbird-140.9.0esr/dom/network/TCPSocketParent.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/TCPSocketParent.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -56,6 +56,11 @@ void TCPSocketParentBase::ReleaseIPDLReference() { MOZ_ASSERT(mIPCOpen); + NS_ASSERTION(mIPCOpen, + "ReleaseIPDLReference called without matching AddIPDLReference"); + if (!mIPCOpen) { + return; + } mIPCOpen = false; this->Release(); } @@ -78,6 +83,9 @@ mozilla::ipc::IPCResult TCPSocketParent::RecvOpen( const nsString& aHost, const uint16_t& aPort, const bool& aUseSSL, const bool& aUseArrayBuffers) { + if (!StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return IPC_FAIL(this, "tcp socket not enabled"); + } mSocket = new TCPSocket(nullptr, aHost, aPort, aUseSSL, aUseArrayBuffers); mSocket->SetSocketBridgeParent(this); NS_ENSURE_SUCCESS(mSocket->Init(nullptr), IPC_OK()); diff -Nru thunderbird-140.9.0esr/dom/network/UDPSocket.cpp thunderbird-140.10.0esr/dom/network/UDPSocket.cpp --- thunderbird-140.9.0esr/dom/network/UDPSocket.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/UDPSocket.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -159,6 +159,8 @@ return; } + RefPtr kungFuDeathGrip(this); + if (mOpened) { if (mReadyState == SocketReadyState::Opening) { // reject openedPromise with AbortError if socket is closed without error diff -Nru thunderbird-140.9.0esr/dom/network/UDPSocketParent.cpp thunderbird-140.10.0esr/dom/network/UDPSocketParent.cpp --- thunderbird-140.9.0esr/dom/network/UDPSocketParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/UDPSocketParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -307,6 +307,10 @@ return IPC_OK(); } + if (!mFilter && aData.type() == UDPData::TIPCStream) { + return IPC_FAIL(this, "IPCStream payload requires a filter"); + } + nsresult rv; if (mFilter) { if (aAddr.type() != UDPSocketAddr::TNetAddr) { diff -Nru thunderbird-140.9.0esr/dom/network/tests/chrome.toml thunderbird-140.10.0esr/dom/network/tests/chrome.toml --- thunderbird-140.9.0esr/dom/network/tests/chrome.toml 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/network/tests/chrome.toml 2026-04-21 14:52:52.000000000 +0000 @@ -1,4 +1,5 @@ [DEFAULT] +prefs = ["dom.tcpsocket_in_child.enabled=true"] support-files = [ "tcpsocket_test.sys.mjs", "test_tcpsocket_client_and_server_basics.js", diff -Nru thunderbird-140.9.0esr/dom/reporting/ReportingHeader.cpp thunderbird-140.10.0esr/dom/reporting/ReportingHeader.cpp --- thunderbird-140.9.0esr/dom/reporting/ReportingHeader.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/reporting/ReportingHeader.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -8,6 +8,7 @@ #include #include "js/Array.h" // JS::GetArrayLength, JS::IsArrayObject +#include "js/GCAPI.h" #include "js/JSON.h" #include "js/PropertyAndElement.h" // JS_GetElement #include "mozilla/dom/ReportingBinding.h" @@ -345,7 +346,7 @@ return nullptr; } - dom::ReportingHeaderValue data; + RootedDictionary data(cx); if (!data.Init(cx, jsonValue)) { LogToConsoleInvalidJSON(aChannel, aURI); return nullptr; diff -Nru thunderbird-140.9.0esr/dom/script/ScriptElement.cpp thunderbird-140.10.0esr/dom/script/ScriptElement.cpp --- thunderbird-140.9.0esr/dom/script/ScriptElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/script/ScriptElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -85,12 +85,18 @@ void ScriptElement::CharacterDataChanged(nsIContent* aContent, const CharacterDataChangeInfo&) { + if (!nsContentUtils::IsInSameAnonymousTree(GetAsContent(), aContent)) { + return; + } MaybeProcessScript(); } void ScriptElement::AttributeChanged(Element* aElement, int32_t aNameSpaceID, nsAtom* aAttribute, int32_t aModType, const nsAttrValue* aOldValue) { + if (aElement != GetAsContent()) { + return; + } // https://html.spec.whatwg.org/#script-processing-model // When a script element el that is not parser-inserted experiences one of the // events listed in the following list, the user agent must immediately @@ -116,10 +122,17 @@ } void ScriptElement::ContentAppended(nsIContent* aFirstNewContent) { + if (!nsContentUtils::IsInSameAnonymousTree(GetAsContent(), + aFirstNewContent)) { + return; + } MaybeProcessScript(); } void ScriptElement::ContentInserted(nsIContent* aChild) { + if (!nsContentUtils::IsInSameAnonymousTree(GetAsContent(), aChild)) { + return; + } MaybeProcessScript(); } diff -Nru thunderbird-140.9.0esr/dom/security/nsCSPUtils.cpp thunderbird-140.10.0esr/dom/security/nsCSPUtils.cpp --- thunderbird-140.9.0esr/dom/security/nsCSPUtils.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/security/nsCSPUtils.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1333,10 +1333,14 @@ // Step 1.4. If directive’s value contains a source expression that is an // ASCII case-insensitive match for the "'strict-dynamic'" keyword-source: + if (hasStrictDynamicKeyword) { + // GetParserCreatedScript() isn't set for XSLT. + if (aLoadInfo->InternalContentPolicyType() == + nsIContentPolicy::TYPE_XSLT) { + CSPUTILSLOG((" Blocked XSLT by default with 'strict-dynamic'")); + return false; + } - // XXX I don't think we should apply strict-dynamic to XSLT. - if (hasStrictDynamicKeyword && aLoadInfo->InternalContentPolicyType() != - nsIContentPolicy::TYPE_XSLT) { // Step 1.4.1 If the request’s parser metadata is "parser-inserted", // return "Blocked". Otherwise, return "Allowed". if (aLoadInfo->GetParserCreatedScript()) { diff -Nru thunderbird-140.9.0esr/dom/serviceworkers/ServiceWorkerOp.cpp thunderbird-140.10.0esr/dom/serviceworkers/ServiceWorkerOp.cpp --- thunderbird-140.9.0esr/dom/serviceworkers/ServiceWorkerOp.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/serviceworkers/ServiceWorkerOp.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1694,10 +1694,10 @@ // https://w3c.github.io/ServiceWorker/#on-fetch-request-algorithm Step 26: If // eventHandled is not null, then resolve eventHandled. // - // mRespondWithPromiseHolder will resolve a MozPromise that will resolve on - // the worker owner's thread, so it's fine to resolve the mHandled promise now - // because content will not interfere with respondWith getting the Response to - // where it's going. + // Take an immutable snapshot of the headers now, while still on the worker + // thread. + ir->SnapshotUnfilteredHeaders(); + mHandled->MaybeResolveWithUndefined(); mRespondWithPromiseHolder.Resolve( FetchEventRespondWithResult(std::make_tuple( diff -Nru thunderbird-140.9.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp thunderbird-140.10.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp --- thunderbird-140.9.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/serviceworkers/ServiceWorkerRegistrationChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -18,7 +18,8 @@ mIPCWorkerRef = nullptr; if (mOwner) { - mOwner->RevokeActor(this); + RefPtr owner = mOwner; + owner->RevokeActor(this); MOZ_DIAGNOSTIC_ASSERT(!mOwner); } } diff -Nru thunderbird-140.9.0esr/dom/smil/SMILCSSValueType.cpp thunderbird-140.10.0esr/dom/smil/SMILCSSValueType.cpp --- thunderbird-140.9.0esr/dom/smil/SMILCSSValueType.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/smil/SMILCSSValueType.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -438,7 +438,7 @@ } RefPtr computedStyle = - nsComputedDOMStyle::GetComputedStyle(aTargetElement); + nsComputedDOMStyle::GetComputedStyleNoFlush(aTargetElement); if (!computedStyle) { return; } diff -Nru thunderbird-140.9.0esr/dom/streams/QueueWithSizes.h thunderbird-140.10.0esr/dom/streams/QueueWithSizes.h --- thunderbird-140.9.0esr/dom/streams/QueueWithSizes.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/QueueWithSizes.h 2026-04-21 14:52:53.000000000 +0000 @@ -8,8 +8,8 @@ #define mozilla_dom_QueueWithSizes_h #include -#include "js/TypeDecls.h" -#include "js/Value.h" + +#include "jsapi.h" #include "mozilla/ErrorResult.h" #include "mozilla/UniquePtr.h" #include "nsTArray.h" @@ -83,8 +83,9 @@ // https://streams.spec.whatwg.org/#dequeue-value template -inline void DequeueValue(QueueContainingClass aContainer, - JS::MutableHandle aResultValue) { +inline void DequeueValue(JSContext* aCx, QueueContainingClass aContainer, + JS::MutableHandle aResultValue, + ErrorResult& aRv) { // Step 1. Implicit via template instantiation. // Step 2. MOZ_ASSERT(!aContainer->Queue().isEmpty()); @@ -104,12 +105,18 @@ // Step 7. aResultValue.set(valueWithSize->mValue); + valueWithSize.reset(); + if (!JS_WrapValue(aCx, aResultValue)) { + aResultValue.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } } // https://streams.spec.whatwg.org/#peek-queue-value template -inline void PeekQueueValue(QueueContainingClass aContainer, - JS::MutableHandle aResultValue) { +inline void PeekQueueValue(JSContext* aCx, QueueContainingClass aContainer, + JS::MutableHandle aResultValue, + ErrorResult& aRv) { // Step 1. Assert: container has [[queue]] and [[queueTotalSize]] internal // slots. // Step 2. Assert: container.[[queue]] is not empty. @@ -120,6 +127,11 @@ // Step 4. Return valueWithSize’s value. aResultValue.set(valueWithSize->mValue); + valueWithSize = nullptr; + if (!JS_WrapValue(aCx, aResultValue)) { + aResultValue.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } } // https://streams.spec.whatwg.org/#reset-queue diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableByteStreamController.cpp thunderbird-140.10.0esr/dom/streams/ReadableByteStreamController.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableByteStreamController.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableByteStreamController.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -1448,14 +1448,15 @@ return; } + RefPtr stream(aController->Stream()); + // Step 3.3. For each filledPullInto of filledPullIntos, for (auto& filledPullInto : filledPullIntos) { // Step 3.3.1. Perform ! // ReadableByteStreamControllerCommitPullIntoDescriptor(controller.[[stream]], // filledPullInto). ReadableByteStreamControllerCommitPullIntoDescriptor( - aCx, MOZ_KnownLive(aController->Stream()), - MOZ_KnownLive(filledPullInto), aRv); + aCx, stream, MOZ_KnownLive(filledPullInto), aRv); if (aRv.Failed()) { return; } diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStream.cpp thunderbird-140.10.0esr/dom/streams/ReadableStream.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStream.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStream.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -112,6 +112,16 @@ return ReadableStream_Binding::Wrap(aCx, this, aGivenProto); } +void ReadableStream::GetStoredError(JSContext* aCx, + JS::MutableHandle aStoredError, + ErrorResult& aRv) const { + aStoredError.set(mStoredError); + if (!JS_WrapValue(aCx, aStoredError)) { + aStoredError.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + ReadableStreamDefaultReader* ReadableStream::GetDefaultReader() { return mReader->AsDefault(); } @@ -586,7 +596,12 @@ // Step 3. if (aStream->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, aStream->StoredError()); + JS::Rooted storedError(aCx); + aStream->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + return Promise::CreateRejected(aStream->GetParentObject(), storedError, aRv); } @@ -892,13 +907,21 @@ return nullptr; } - JS::Rooted reason1(aCx, mTeeState->Reason1()); + JS::Rooted reason1(aCx); + mTeeState->GetReason1(aCx, &reason1, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 0, reason1)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; } - JS::Rooted reason2(aCx, mTeeState->Reason2()); + JS::Rooted reason2(aCx); + mTeeState->GetReason2(aCx, &reason2, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 1, reason2)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStream.h thunderbird-140.10.0esr/dom/streams/ReadableStream.h --- thunderbird-140.9.0esr/dom/streams/ReadableStream.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStream.h 2026-04-21 14:52:52.000000000 +0000 @@ -103,7 +103,9 @@ ReaderState State() const { return mState; } void SetState(const ReaderState& aState) { mState = aState; } - JS::Value StoredError() const { return mStoredError; } + void GetStoredError(JSContext* aCx, JS::MutableHandle aStoredError, + ErrorResult& aRv) const; + JS::Value UnsafeStoredError() const { return mStoredError; } void SetStoredError(JS::Handle aStoredError) { mStoredError = aStoredError; } diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStreamBYOBReader.cpp thunderbird-140.10.0esr/dom/streams/ReadableStreamBYOBReader.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStreamBYOBReader.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStreamBYOBReader.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -188,7 +188,11 @@ // Step 4. If stream.[[state]] is "errored", perform readIntoRequest’s error // steps given stream.[[storedError]]. if (stream->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return; + } aReadIntoRequest->ErrorSteps(aCx, error, aRv); return; diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStreamDefaultController.cpp thunderbird-140.10.0esr/dom/streams/ReadableStreamDefaultController.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStreamDefaultController.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStreamDefaultController.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -616,7 +616,10 @@ if (!mQueue.isEmpty()) { // Step 2.1 JS::Rooted chunk(aCx); - DequeueValue(this, &chunk); + DequeueValue(aCx, this, &chunk, aRv); + if (aRv.Failed()) { + return; + } // Step 2.2 if (CloseRequested() && mQueue.isEmpty()) { diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStreamDefaultReader.cpp thunderbird-140.10.0esr/dom/streams/ReadableStreamDefaultReader.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStreamDefaultReader.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStreamDefaultReader.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -89,7 +89,8 @@ // Step 5.1 Implicit // Step 5.2 JS::RootingContext* rcx = RootingCx(); - JS::Rooted rootedError(rcx, aStream->StoredError()); + // MaybeReject will wrap the value for us. + JS::Rooted rootedError(rcx, aStream->UnsafeStoredError()); aReader->ClosedPromise()->MaybeReject(rootedError); // Step 5.3 @@ -224,7 +225,11 @@ } case ReadableStream::ReaderState::Errored: { - JS::Rooted storedError(aCx, stream->StoredError()); + JS::Rooted storedError(aCx); + stream->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return; + } aRequest->ErrorSteps(aCx, storedError, aRv); return; } diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStreamPipeTo.cpp thunderbird-140.10.0esr/dom/streams/ReadableStreamPipeTo.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStreamPipeTo.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStreamPipeTo.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -259,7 +259,8 @@ // Step 1. Errors must be propagated forward: if source.[[state]] is or // becomes "errored", then if (source->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, source->StoredError()); + JS::Rooted storedError(aCx); + source->GetStoredError(aCx, &storedError, IgnoredErrorResult()); OnSourceErrored(aCx, storedError); return true; } @@ -267,7 +268,8 @@ // Step 2. Errors must be propagated backward: if dest.[[state]] is or becomes // "errored", then if (dest->State() == WritableStream::WriterState::Errored) { - JS::Rooted storedError(aCx, dest->StoredError()); + JS::Rooted storedError(aCx); + dest->GetStoredError(aCx, &storedError, IgnoredErrorResult()); OnDestErrored(aCx, storedError); return true; } @@ -457,15 +459,20 @@ } void ResolvedCallback(JSContext* aCx, JS::Handle aValue, - ErrorResult&) override { + ErrorResult& aRv) override { // https://streams.spec.whatwg.org/#rs-pipeTo-shutdown-with-action // Step 5. Upon fulfillment of p, finalize, passing along originalError if // it was given. - JS::Rooted> error(aCx); + JS::Rooted> maybeError(aCx); if (mHasError) { - error = Some(mError); + JS::Rooted error(aCx, mError); + if (!JS_WrapValue(aCx, &error)) { + aRv.StealExceptionFromJSContext(aCx); + return; + } + maybeError = Some(error.get()); } - mPipeToPump->Finalize(aCx, error); + mPipeToPump->Finalize(aCx, maybeError); } void RejectedCallback(JSContext* aCx, JS::Handle aReason, diff -Nru thunderbird-140.9.0esr/dom/streams/ReadableStreamTee.cpp thunderbird-140.10.0esr/dom/streams/ReadableStreamTee.cpp --- thunderbird-140.9.0esr/dom/streams/ReadableStreamTee.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/ReadableStreamTee.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -292,13 +292,21 @@ return nullptr; } - JS::Rooted reason1(aCx, mTeeState->Reason1()); + JS::Rooted reason1(aCx); + mTeeState->GetReason1(aCx, &reason1, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 0, reason1)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; } - JS::Rooted reason2(aCx, mTeeState->Reason2()); + JS::Rooted reason2(aCx); + mTeeState->GetReason2(aCx, &reason2, aRv); + if (aRv.Failed()) { + return nullptr; + } if (!JS_SetElement(aCx, compositeReason, 1, reason2)) { aRv.StealExceptionFromJSContext(aCx); return nullptr; diff -Nru thunderbird-140.9.0esr/dom/streams/TeeState.cpp thunderbird-140.10.0esr/dom/streams/TeeState.cpp --- thunderbird-140.9.0esr/dom/streams/TeeState.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/TeeState.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -36,6 +36,24 @@ "cloneForBranch2 path is not implemented."); } +void TeeState::GetReason1(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const { + aReason.set(mReason1); + if (!JS_WrapValue(aCx, aReason)) { + aReason.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + +void TeeState::GetReason2(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const { + aReason.set(mReason2); + if (!JS_WrapValue(aCx, aReason)) { + aReason.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + already_AddRefed TeeState::Create(ReadableStream* aStream, bool aCloneForBranch2, ErrorResult& aRv) { diff -Nru thunderbird-140.9.0esr/dom/streams/TeeState.h thunderbird-140.10.0esr/dom/streams/TeeState.h --- thunderbird-140.9.0esr/dom/streams/TeeState.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/TeeState.h 2026-04-21 14:52:53.000000000 +0000 @@ -82,10 +82,12 @@ return aBranch == TeeBranch::Branch1 ? Canceled1() : Canceled2(); } - JS::Value Reason1() const { return mReason1; } + void GetReason1(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const; void SetReason1(JS::Handle aReason1) { mReason1 = aReason1; } - JS::Value Reason2() const { return mReason2; } + void GetReason2(JSContext* aCx, JS::MutableHandle aReason, + ErrorResult& aRv) const; void SetReason2(JS::Handle aReason2) { mReason2 = aReason2; } void SetReason(TeeBranch aBranch, JS::Handle aReason) { diff -Nru thunderbird-140.9.0esr/dom/streams/TransformStream.cpp thunderbird-140.10.0esr/dom/streams/TransformStream.cpp --- thunderbird-140.9.0esr/dom/streams/TransformStream.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/TransformStream.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -265,8 +265,12 @@ // Step 3: If state is "erroring", throw // writable.[[storedError]]. if (state == WritableStream::WriterState::Erroring) { - JS::Rooted storedError(aCx, - writable->StoredError()); + JS::Rooted storedError(aCx); + writable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; @@ -361,8 +365,12 @@ // readable.[[storedError]]. if (aReadable->State() == ReadableStream::ReaderState::Errored) { - JS::Rooted storedError(aCx, - aReadable->StoredError()); + JS::Rooted storedError(aCx); + aReadable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; @@ -389,8 +397,12 @@ } // Step 5.2.2: Throw readable.[[storedError]]. - JS::Rooted storedError(aCx, - aReadable->StoredError()); + JS::Rooted storedError(aCx); + aReadable->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return nullptr; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return nullptr; diff -Nru thunderbird-140.9.0esr/dom/streams/TransformStreamDefaultController.cpp thunderbird-140.10.0esr/dom/streams/TransformStreamDefaultController.cpp --- thunderbird-140.9.0esr/dom/streams/TransformStreamDefaultController.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/TransformStreamDefaultController.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -125,7 +125,12 @@ TransformStreamErrorWritableAndUnblockWrite(aCx, stream, error, aRv); // Step 5.2: Throw stream.[[readable]].[[storedError]]. - JS::Rooted storedError(aCx, stream->Readable()->StoredError()); + JS::Rooted storedError(aCx); + stream->Readable()->GetStoredError(aCx, &storedError, aRv); + if (aRv.Failed()) { + return; + } + aRv.MightThrowJSException(); aRv.ThrowJSException(aCx, storedError); return; diff -Nru thunderbird-140.9.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp thunderbird-140.10.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp --- thunderbird-140.9.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -222,10 +222,10 @@ NS_IMETHODIMP InputStreamHolder::OnInputStreamReady( nsIAsyncInputStream* aStream) { mAsyncWaitWorkerRef = nullptr; - mAsyncWaitAlgorithms = nullptr; // We may get called back after ::Shutdown() - if (mCallback) { - return mCallback->OnInputStreamReady(aStream); + if (RefPtr callback = + mAsyncWaitAlgorithms.forget()) { + return callback->OnInputStreamReady(aStream); } return NS_ERROR_FAILURE; } @@ -448,8 +448,10 @@ // But we do not use pullSize but use byteWritten here, since nsIInputStream // does not guarantee to read as much as it told in Available(). MOZ_DIAGNOSTIC_ASSERT(pullSize == bytesWritten); - ReadableByteStreamControllerRespond( - aCx, MOZ_KnownLive(mStream->Controller()->AsByte()), bytesWritten, aRv); + RefPtr byteController( + mStream->Controller()->AsByte()); + MOZ_ASSERT(byteController); + ReadableByteStreamControllerRespond(aCx, byteController, bytesWritten, aRv); } // Step 9. Otherwise, else { @@ -483,8 +485,10 @@ // Step 9.2. Perform ? // ReadableByteStreamControllerEnqueue(stream.[[controller]], view). - ReadableByteStreamControllerEnqueue( - aCx, MOZ_KnownLive(mStream->Controller()->AsByte()), view, aRv); + RefPtr byteController( + mStream->Controller()->AsByte()); + MOZ_ASSERT(byteController); + ReadableByteStreamControllerEnqueue(aCx, byteController, view, aRv); } } diff -Nru thunderbird-140.9.0esr/dom/streams/WritableStream.cpp thunderbird-140.10.0esr/dom/streams/WritableStream.cpp --- thunderbird-140.9.0esr/dom/streams/WritableStream.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/WritableStream.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -79,6 +79,16 @@ return WritableStream_Binding::Wrap(aCx, this, aGivenProto); } +void WritableStream::GetStoredError(JSContext* aCx, + JS::MutableHandle aStoredError, + ErrorResult& aRv) const { + aStoredError.set(mStoredError); + if (!JS_WrapValue(aCx, aStoredError)) { + aStoredError.setUndefined(); + aRv.StealExceptionFromJSContext(aCx); + } +} + // https://streams.spec.whatwg.org/#writable-stream-deal-with-rejection void WritableStream::DealWithRejection(JSContext* aCx, JS::Handle aError, @@ -140,6 +150,10 @@ // Step 9. Let abortRequest be stream.[[pendingAbortRequest]]. RefPtr abortPromise = mPendingAbortRequestPromise; JS::Rooted abortReason(aCx, mPendingAbortRequestReason); + if (!JS_WrapValue(aCx, &abortReason)) { + aRv.StealExceptionFromJSContext(aCx); + return; + } bool abortWasAlreadyErroring = mPendingAbortRequestWasAlreadyErroring; // Step 10. Set stream.[[pendingAbortRequest]] to undefined. diff -Nru thunderbird-140.9.0esr/dom/streams/WritableStream.h thunderbird-140.10.0esr/dom/streams/WritableStream.h --- thunderbird-140.9.0esr/dom/streams/WritableStream.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/WritableStream.h 2026-04-21 14:52:52.000000000 +0000 @@ -89,7 +89,9 @@ WriterState State() const { return mState; } void SetState(const WriterState& aState) { mState = aState; } - JS::Value StoredError() const { return mStoredError; } + void GetStoredError(JSContext* aCx, JS::MutableHandle aStoredError, + ErrorResult& aRv) const; + JS::Value UnsafeStoredError() const { return mStoredError; } void SetStoredError(JS::Handle aStoredError) { mStoredError = aStoredError; } diff -Nru thunderbird-140.9.0esr/dom/streams/WritableStreamDefaultController.cpp thunderbird-140.10.0esr/dom/streams/WritableStreamDefaultController.cpp --- thunderbird-140.9.0esr/dom/streams/WritableStreamDefaultController.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/WritableStreamDefaultController.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -256,7 +256,10 @@ // Step 3. Perform ! DequeueValue(controller). JS::Rooted value(aCx); - DequeueValue(aController, &value); + DequeueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 4. Assert: controller.[[queue]] is empty. MOZ_ASSERT(aController->Queue().isEmpty()); @@ -334,7 +337,10 @@ // Step 4.4. Perform ! DequeueValue(controller). JS::Rooted value(aCx); - DequeueValue(aController, &value); + DequeueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 4.5. If ! WritableStreamCloseQueuedOrInFlight(stream) is // false and state is "writable", @@ -417,7 +423,10 @@ // Step 8. Let value be ! PeekQueueValue(controller). JS::Rooted value(aCx); - PeekQueueValue(aController, &value); + PeekQueueValue(aCx, aController, &value, aRv); + if (aRv.Failed()) { + return; + } // Step 9. If value is the close sentinel, perform ! // WritableStreamDefaultControllerProcessClose(controller). diff -Nru thunderbird-140.9.0esr/dom/streams/WritableStreamDefaultWriter.cpp thunderbird-140.10.0esr/dom/streams/WritableStreamDefaultWriter.cpp --- thunderbird-140.9.0esr/dom/streams/WritableStreamDefaultWriter.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/streams/WritableStreamDefaultWriter.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -302,7 +302,11 @@ // Step 7. If state is "errored", return a promise rejected with // stream.[[storedError]]. if (state == WritableStream::WriterState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } @@ -318,7 +322,11 @@ // Step 9. If state is "erroring", return a promise rejected with // stream.[[storedError]]. if (state == WritableStream::WriterState::Erroring) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } @@ -402,7 +410,9 @@ // Step 6.1. Set writer.[[readyPromise]] to a promise rejected with // stream.[[storedError]]. - JS::Rooted storedError(RootingCx(), aStream->StoredError()); + // MaybeReject will wrap the value. + JS::Rooted storedError(RootingCx(), + aStream->UnsafeStoredError()); RefPtr readyPromise = Promise::CreateInfallible(aWriter->GetParentObject()); readyPromise->MaybeReject(storedError); @@ -440,7 +450,9 @@ MOZ_ASSERT(state == WritableStream::WriterState::Errored); // Step 8.2. Step Let storedError be stream.[[storedError]]. - JS::Rooted storedError(RootingCx(), aStream->StoredError()); + // MaybeReject will wrap the value. + JS::Rooted storedError(RootingCx(), + aStream->UnsafeStoredError()); // Step 8.3. Set writer.[[readyPromise]] to a promise rejected with // storedError. @@ -527,7 +539,11 @@ // Step 5. If state is "errored", // return a promise rejected with stream.[[storedError]]. if (state == WritableStream::WriterState::Errored) { - JS::Rooted error(aCx, stream->StoredError()); + JS::Rooted error(aCx); + stream->GetStoredError(aCx, &error, aRv); + if (aRv.Failed()) { + return nullptr; + } return Promise::CreateRejected(aWriter->GetParentObject(), error, aRv); } diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGLength.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGLength.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGLength.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGLength.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -84,8 +84,8 @@ // cycle collected), so we that don't leave behind a pointer to // free / soon-to-be-free memory. if (nsCOMPtr lengthList = do_QueryInterface(mOwner)) { - MOZ_ASSERT(lengthList->mItems[mListIndex] == this, - "Clearing out the wrong list index...?"); + MOZ_RELEASE_ASSERT(lengthList->mItems[mListIndex] == this, + "Clearing out the wrong list index...?"); lengthList->mItems[mListIndex] = nullptr; } diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGLength.h thunderbird-140.10.0esr/dom/svg/DOMSVGLength.h --- thunderbird-140.9.0esr/dom/svg/DOMSVGLength.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGLength.h 2026-04-21 14:52:52.000000000 +0000 @@ -133,7 +133,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGLengthList.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGLengthList.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGLengthList.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGLengthList.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -197,9 +197,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGLength::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGLength::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -222,6 +221,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeLengthListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGNumber.h thunderbird-140.10.0esr/dom/svg/DOMSVGNumber.h --- thunderbird-140.9.0esr/dom/svg/DOMSVGNumber.h 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGNumber.h 2026-04-21 14:52:52.000000000 +0000 @@ -109,7 +109,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGNumberList.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGNumberList.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGNumberList.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGNumberList.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -185,9 +185,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGNumber::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGNumber::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -208,6 +207,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeNumberListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGPoint.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGPoint.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGPoint.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGPoint.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -200,8 +200,8 @@ // cycle collected), so we that don't leave behind a pointer to // free / soon-to-be-free memory. if (nsCOMPtr pointList = do_QueryInterface(mOwner)) { - MOZ_ASSERT(pointList->mItems[mListIndex] == this, - "Clearing out the wrong list index...?"); + MOZ_RELEASE_ASSERT(pointList->mItems[mListIndex] == this, + "Clearing out the wrong list index...?"); pointList->mItems[mListIndex] = nullptr; } diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGPoint.h thunderbird-140.10.0esr/dom/svg/DOMSVGPoint.h --- thunderbird-140.9.0esr/dom/svg/DOMSVGPoint.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGPoint.h 2026-04-21 14:52:53.000000000 +0000 @@ -118,7 +118,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGPointList.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGPointList.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGPointList.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGPointList.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -253,9 +253,8 @@ return nullptr; } - aIndex = std::min(aIndex, LengthNoFlush()); - if (aIndex >= DOMSVGPoint::MaxListIndex()) { - aRv.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGPoint::MaxListIndex()) { + aRv.ThrowIndexSizeError("List too long"); return nullptr; } @@ -280,6 +279,8 @@ } } + aIndex = std::min(aIndex, LengthNoFlush()); + AutoChangePointListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(aIndex); diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGTransform.h thunderbird-140.10.0esr/dom/svg/DOMSVGTransform.h --- thunderbird-140.9.0esr/dom/svg/DOMSVGTransform.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGTransform.h 2026-04-21 14:52:53.000000000 +0000 @@ -99,7 +99,10 @@ } /// This method is called to notify this object that its list index changed. - void UpdateListIndex(uint32_t aListIndex) { mListIndex = aListIndex; } + void UpdateListIndex(uint32_t aListIndex) { + MOZ_RELEASE_ASSERT(aListIndex <= MaxListIndex()); + mListIndex = aListIndex; + } /** * This method is called to notify this DOM object that it is about to be diff -Nru thunderbird-140.9.0esr/dom/svg/DOMSVGTransformList.cpp thunderbird-140.10.0esr/dom/svg/DOMSVGTransformList.cpp --- thunderbird-140.9.0esr/dom/svg/DOMSVGTransformList.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/DOMSVGTransformList.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -190,9 +190,8 @@ return nullptr; } - index = std::min(index, LengthNoFlush()); - if (index >= DOMSVGTransform::MaxListIndex()) { - error.ThrowIndexSizeError("Index out of range"); + if (LengthNoFlush() >= DOMSVGTransform::MaxListIndex()) { + error.ThrowIndexSizeError("List too long"); return nullptr; } @@ -215,6 +214,8 @@ } } + index = std::min(index, LengthNoFlush()); + AutoChangeTransformListNotifier notifier(this); // Now that we know we're inserting, keep animVal list in sync as necessary. MaybeInsertNullInAnimValListAt(index); diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEBlendElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEBlendElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEBlendElement.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEBlendElement.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -21,26 +21,26 @@ } SVGEnumMapping SVGFEBlendElement::sModeMap[] = { - {nsGkAtoms::normal, SVG_FEBLEND_MODE_NORMAL}, - {nsGkAtoms::multiply, SVG_FEBLEND_MODE_MULTIPLY}, - {nsGkAtoms::screen, SVG_FEBLEND_MODE_SCREEN}, - {nsGkAtoms::darken, SVG_FEBLEND_MODE_DARKEN}, - {nsGkAtoms::lighten, SVG_FEBLEND_MODE_LIGHTEN}, - {nsGkAtoms::overlay, SVG_FEBLEND_MODE_OVERLAY}, - {nsGkAtoms::colorDodge, SVG_FEBLEND_MODE_COLOR_DODGE}, - {nsGkAtoms::colorBurn, SVG_FEBLEND_MODE_COLOR_BURN}, - {nsGkAtoms::hardLight, SVG_FEBLEND_MODE_HARD_LIGHT}, - {nsGkAtoms::softLight, SVG_FEBLEND_MODE_SOFT_LIGHT}, - {nsGkAtoms::difference, SVG_FEBLEND_MODE_DIFFERENCE}, - {nsGkAtoms::exclusion, SVG_FEBLEND_MODE_EXCLUSION}, - {nsGkAtoms::hue, SVG_FEBLEND_MODE_HUE}, - {nsGkAtoms::saturation, SVG_FEBLEND_MODE_SATURATION}, - {nsGkAtoms::color, SVG_FEBLEND_MODE_COLOR}, - {nsGkAtoms::luminosity, SVG_FEBLEND_MODE_LUMINOSITY}, + {nsGkAtoms::normal, uint8_t(SVGFEBlendMode::Normal)}, + {nsGkAtoms::multiply, uint8_t(SVGFEBlendMode::Multiply)}, + {nsGkAtoms::screen, uint8_t(SVGFEBlendMode::Screen)}, + {nsGkAtoms::darken, uint8_t(SVGFEBlendMode::Darken)}, + {nsGkAtoms::lighten, uint8_t(SVGFEBlendMode::Lighten)}, + {nsGkAtoms::overlay, uint8_t(SVGFEBlendMode::Overlay)}, + {nsGkAtoms::colorDodge, uint8_t(SVGFEBlendMode::ColorDodge)}, + {nsGkAtoms::colorBurn, uint8_t(SVGFEBlendMode::ColorBurn)}, + {nsGkAtoms::hardLight, uint8_t(SVGFEBlendMode::HardLight)}, + {nsGkAtoms::softLight, uint8_t(SVGFEBlendMode::SoftLight)}, + {nsGkAtoms::difference, uint8_t(SVGFEBlendMode::Difference)}, + {nsGkAtoms::exclusion, uint8_t(SVGFEBlendMode::Exclusion)}, + {nsGkAtoms::hue, uint8_t(SVGFEBlendMode::Hue)}, + {nsGkAtoms::saturation, uint8_t(SVGFEBlendMode::Saturation)}, + {nsGkAtoms::color, uint8_t(SVGFEBlendMode::Color)}, + {nsGkAtoms::luminosity, uint8_t(SVGFEBlendMode::Luminosity)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEBlendElement::sEnumInfo[1] = { - {nsGkAtoms::mode, sModeMap, SVG_FEBLEND_MODE_NORMAL}}; + {nsGkAtoms::mode, sModeMap, uint8_t(SVGFEBlendMode::Normal)}}; SVGElement::StringInfo SVGFEBlendElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -71,9 +71,8 @@ SVGFilterInstance* aInstance, const IntRect& aFilterSubregion, const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { - uint32_t mode = mEnumAttributes[MODE].GetAnimValue(); BlendAttributes attributes; - attributes.mBlendMode = mode; + attributes.mBlendMode = SVGFEBlendMode(mEnumAttributes[MODE].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(attributes))); } diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEColorMatrixElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEColorMatrixElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEColorMatrixElement.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEColorMatrixElement.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -25,14 +25,15 @@ } SVGEnumMapping SVGFEColorMatrixElement::sTypeMap[] = { - {nsGkAtoms::matrix, SVG_FECOLORMATRIX_TYPE_MATRIX}, - {nsGkAtoms::saturate, SVG_FECOLORMATRIX_TYPE_SATURATE}, - {nsGkAtoms::hueRotate, SVG_FECOLORMATRIX_TYPE_HUE_ROTATE}, - {nsGkAtoms::luminanceToAlpha, SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA}, + {nsGkAtoms::matrix, uint8_t(SVGFEColorMatrixType::Matrix)}, + {nsGkAtoms::saturate, uint8_t(SVGFEColorMatrixType::Saturate)}, + {nsGkAtoms::hueRotate, uint8_t(SVGFEColorMatrixType::HueRotate)}, + {nsGkAtoms::luminanceToAlpha, + uint8_t(SVGFEColorMatrixType::LuminanceToAlpha)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEColorMatrixElement::sEnumInfo[1] = { - {nsGkAtoms::type, sTypeMap, SVG_FECOLORMATRIX_TYPE_MATRIX}}; + {nsGkAtoms::type, sTypeMap, uint8_t(SVGFEColorMatrixType::Matrix)}}; SVGElement::StringInfo SVGFEColorMatrixElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -70,15 +71,16 @@ SVGFilterInstance* aInstance, const IntRect& aFilterSubregion, const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGFEColorMatrixType type = + SVGFEColorMatrixType(mEnumAttributes[TYPE].GetAnimValue()); const SVGNumberList& values = mNumberListAttributes[VALUES].GetAnimValue(); ColorMatrixAttributes atts; if (!mNumberListAttributes[VALUES].IsExplicitlySet() && - (type == SVG_FECOLORMATRIX_TYPE_MATRIX || - type == SVG_FECOLORMATRIX_TYPE_SATURATE || - type == SVG_FECOLORMATRIX_TYPE_HUE_ROTATE)) { - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX; + (type == SVGFEColorMatrixType::Matrix || + type == SVGFEColorMatrixType::Saturate || + type == SVGFEColorMatrixType::HueRotate)) { + atts.mType = SVGFEColorMatrixType::Matrix; static const auto identityMatrix = std::array{ // clang-format off 1, 0, 0, 0, 0, diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEComponentTransferElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEComponentTransferElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEComponentTransferElement.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEComponentTransferElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -68,7 +68,7 @@ if (childForChannel[i]) { childForChannel[i]->ComputeAttributes(i, atts); } else { - atts.mTypes[i] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[i] = SVGFEComponentTransferType::Identity; } } return FilterPrimitiveDescription(AsVariant(std::move(atts))); diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFECompositeElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFECompositeElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFECompositeElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFECompositeElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -27,17 +27,18 @@ {nsGkAtoms::k4, 0}}; SVGEnumMapping SVGFECompositeElement::sOperatorMap[] = { - {nsGkAtoms::over, SVG_FECOMPOSITE_OPERATOR_OVER}, - {nsGkAtoms::in, SVG_FECOMPOSITE_OPERATOR_IN}, - {nsGkAtoms::out, SVG_FECOMPOSITE_OPERATOR_OUT}, - {nsGkAtoms::atop, SVG_FECOMPOSITE_OPERATOR_ATOP}, - {nsGkAtoms::xor_, SVG_FECOMPOSITE_OPERATOR_XOR}, - {nsGkAtoms::arithmetic, SVG_FECOMPOSITE_OPERATOR_ARITHMETIC}, - {nsGkAtoms::lighter, SVG_FECOMPOSITE_OPERATOR_LIGHTER}, + {nsGkAtoms::over, uint8_t(SVGFECompositeOperator::Over)}, + {nsGkAtoms::in, uint8_t(SVGFECompositeOperator::In)}, + {nsGkAtoms::out, uint8_t(SVGFECompositeOperator::Out)}, + {nsGkAtoms::atop, uint8_t(SVGFECompositeOperator::Atop)}, + {nsGkAtoms::xor_, uint8_t(SVGFECompositeOperator::Xor)}, + {nsGkAtoms::arithmetic, uint8_t(SVGFECompositeOperator::Arithmetic)}, + {nsGkAtoms::lighter, uint8_t(SVGFECompositeOperator::Lighter)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFECompositeElement::sEnumInfo[1] = { - {nsGkAtoms::_operator, sOperatorMap, SVG_FECOMPOSITE_OPERATOR_OVER}}; + {nsGkAtoms::_operator, sOperatorMap, + uint8_t(SVGFECompositeOperator::Over)}}; SVGElement::StringInfo SVGFECompositeElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -89,10 +90,10 @@ const nsTArray& aInputsAreTainted, nsTArray>& aInputImages) { CompositeAttributes atts; - uint32_t op = mEnumAttributes[OPERATOR].GetAnimValue(); - atts.mOperator = op; + atts.mOperator = + SVGFECompositeOperator(mEnumAttributes[OPERATOR].GetAnimValue()); - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + if (atts.mOperator == SVGFECompositeOperator::Arithmetic) { std::array k; GetAnimatedNumberValues(&k[0], &k[1], &k[2], &k[3], nullptr); atts.mCoefficients.AppendElements(Span(k)); diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEConvolveMatrixElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -42,13 +42,13 @@ {nsGkAtoms::preserveAlpha, false}}; SVGEnumMapping SVGFEConvolveMatrixElement::sEdgeModeMap[] = { - {nsGkAtoms::duplicate, SVG_EDGEMODE_DUPLICATE}, - {nsGkAtoms::wrap, SVG_EDGEMODE_WRAP}, - {nsGkAtoms::none, SVG_EDGEMODE_NONE}, + {nsGkAtoms::duplicate, uint8_t(SVGEdgeMode::Duplicate)}, + {nsGkAtoms::wrap, uint8_t(SVGEdgeMode::Wrap)}, + {nsGkAtoms::none, uint8_t(SVGEdgeMode::None)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEConvolveMatrixElement::sEnumInfo[1] = { - {nsGkAtoms::edgeMode, sEdgeModeMap, SVG_EDGEMODE_DUPLICATE}}; + {nsGkAtoms::edgeMode, sEdgeModeMap, uint8_t(SVGEdgeMode::Duplicate)}}; SVGElement::StringInfo SVGFEConvolveMatrixElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -174,7 +174,7 @@ if (divisor == 0) divisor = 1; } - uint32_t edgeMode = mEnumAttributes[EDGEMODE].GetAnimValue(); + SVGEdgeMode edgeMode = SVGEdgeMode(mEnumAttributes[EDGEMODE].GetAnimValue()); bool preserveAlpha = mBooleanAttributes[PRESERVEALPHA].GetAnimValue(); float bias = mNumberAttributes[BIAS].GetAnimValue(); diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEDisplacementMapElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEDisplacementMapElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEDisplacementMapElement.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEDisplacementMapElement.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -26,15 +26,15 @@ }; SVGEnumMapping SVGFEDisplacementMapElement::sChannelMap[] = { - {nsGkAtoms::R, SVG_CHANNEL_R}, - {nsGkAtoms::G, SVG_CHANNEL_G}, - {nsGkAtoms::B, SVG_CHANNEL_B}, - {nsGkAtoms::A, SVG_CHANNEL_A}, + {nsGkAtoms::R, uint8_t(SVGChannel::R)}, + {nsGkAtoms::G, uint8_t(SVGChannel::G)}, + {nsGkAtoms::B, uint8_t(SVGChannel::B)}, + {nsGkAtoms::A, uint8_t(SVGChannel::A)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEDisplacementMapElement::sEnumInfo[2] = { - {nsGkAtoms::xChannelSelector, sChannelMap, SVG_CHANNEL_A}, - {nsGkAtoms::yChannelSelector, sChannelMap, SVG_CHANNEL_A}}; + {nsGkAtoms::xChannelSelector, sChannelMap, uint8_t(SVGChannel::A)}, + {nsGkAtoms::yChannelSelector, sChannelMap, uint8_t(SVGChannel::A)}}; SVGElement::StringInfo SVGFEDisplacementMapElement::sStringInfo[3] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -84,12 +84,10 @@ float scale = aInstance->GetPrimitiveNumber(SVGContentUtils::XY, &mNumberAttributes[SCALE]); - uint32_t xChannel = mEnumAttributes[CHANNEL_X].GetAnimValue(); - uint32_t yChannel = mEnumAttributes[CHANNEL_Y].GetAnimValue(); DisplacementMapAttributes atts; atts.mScale = scale; - atts.mXChannel = xChannel; - atts.mYChannel = yChannel; + atts.mXChannel = SVGChannel(mEnumAttributes[CHANNEL_X].GetAnimValue()); + atts.mYChannel = SVGChannel(mEnumAttributes[CHANNEL_Y].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(atts))); } diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFEMorphologyElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFEMorphologyElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFEMorphologyElement.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFEMorphologyElement.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -25,12 +25,13 @@ {nsGkAtoms::radius, 0, 0}}; SVGEnumMapping SVGFEMorphologyElement::sOperatorMap[] = { - {nsGkAtoms::erode, SVG_OPERATOR_ERODE}, - {nsGkAtoms::dilate, SVG_OPERATOR_DILATE}, + {nsGkAtoms::erode, uint8_t(SVGMorphologyOperator::Erode)}, + {nsGkAtoms::dilate, uint8_t(SVGMorphologyOperator::Dilate)}, {nullptr, 0}}; SVGElement::EnumInfo SVGFEMorphologyElement::sEnumInfo[1] = { - {nsGkAtoms::_operator, sOperatorMap, SVG_OPERATOR_ERODE}}; + {nsGkAtoms::_operator, sOperatorMap, + uint8_t(SVGMorphologyOperator::Erode)}}; SVGElement::StringInfo SVGFEMorphologyElement::sStringInfo[2] = { {nsGkAtoms::result, kNameSpaceID_None, true}, @@ -97,7 +98,8 @@ GetRXY(&rx, &ry, *aInstance); MorphologyAttributes atts; atts.mRadii = Size(rx, ry); - atts.mOperator = (uint32_t)mEnumAttributes[OPERATOR].GetAnimValue(); + atts.mOperator = + SVGMorphologyOperator(mEnumAttributes[OPERATOR].GetAnimValue()); return FilterPrimitiveDescription(AsVariant(std::move(atts))); } diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFETurbulenceElement.cpp thunderbird-140.10.0esr/dom/svg/SVGFETurbulenceElement.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFETurbulenceElement.cpp 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFETurbulenceElement.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -37,8 +37,8 @@ {nsGkAtoms::numOctaves, 1}}; SVGEnumMapping SVGFETurbulenceElement::sTypeMap[] = { - {nsGkAtoms::fractalNoise, SVG_TURBULENCE_TYPE_FRACTALNOISE}, - {nsGkAtoms::turbulence, SVG_TURBULENCE_TYPE_TURBULENCE}, + {nsGkAtoms::fractalNoise, uint8_t(SVGTurbulenceType::FractalNoise)}, + {nsGkAtoms::turbulence, uint8_t(SVGTurbulenceType::Turbulence)}, {nullptr, 0}}; SVGEnumMapping SVGFETurbulenceElement::sStitchTilesMap[] = { @@ -47,7 +47,7 @@ {nullptr, 0}}; SVGElement::EnumInfo SVGFETurbulenceElement::sEnumInfo[2] = { - {nsGkAtoms::type, sTypeMap, SVG_TURBULENCE_TYPE_TURBULENCE}, + {nsGkAtoms::type, sTypeMap, uint8_t(SVGTurbulenceType::Turbulence)}, {nsGkAtoms::stitchTiles, sStitchTilesMap, SVG_STITCHTYPE_NOSTITCH}}; SVGElement::StringInfo SVGFETurbulenceElement::sStringInfo[1] = { @@ -100,13 +100,14 @@ float seed = mNumberAttributes[OCTAVES].GetAnimValue(); uint32_t octaves = std::clamp(mIntegerAttributes[OCTAVES].GetAnimValue(), 0, MAX_OCTAVES); - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGTurbulenceType type = + SVGTurbulenceType(mEnumAttributes[TYPE].GetAnimValue()); uint16_t stitch = mEnumAttributes[STITCHTILES].GetAnimValue(); if (fX == 0 && fY == 0) { // A base frequency of zero results in transparent black for // type="turbulence" and in 50% alpha 50% gray for type="fractalNoise". - if (type == SVG_TURBULENCE_TYPE_TURBULENCE) { + if (type == SVGTurbulenceType::Turbulence) { return FilterPrimitiveDescription(); } FloodAttributes atts; diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFilters.cpp thunderbird-140.10.0esr/dom/svg/SVGFilters.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFilters.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFilters.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -146,15 +146,15 @@ {nsGkAtoms::offset, 0}}; SVGEnumMapping SVGComponentTransferFunctionElement::sTypeMap[] = { - {nsGkAtoms::identity, SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY}, - {nsGkAtoms::table, SVG_FECOMPONENTTRANSFER_TYPE_TABLE}, - {nsGkAtoms::discrete, SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE}, - {nsGkAtoms::linear, SVG_FECOMPONENTTRANSFER_TYPE_LINEAR}, - {nsGkAtoms::gamma, SVG_FECOMPONENTTRANSFER_TYPE_GAMMA}, + {nsGkAtoms::identity, uint8_t(SVGFEComponentTransferType::Identity)}, + {nsGkAtoms::table, uint8_t(SVGFEComponentTransferType::Table)}, + {nsGkAtoms::discrete, uint8_t(SVGFEComponentTransferType::Discrete)}, + {nsGkAtoms::linear, uint8_t(SVGFEComponentTransferType::Linear)}, + {nsGkAtoms::gamma, uint8_t(SVGFEComponentTransferType::Gamma)}, {nullptr, 0}}; SVGElement::EnumInfo SVGComponentTransferFunctionElement::sEnumInfo[1] = { - {nsGkAtoms::type, sTypeMap, SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY}}; + {nsGkAtoms::type, sTypeMap, uint8_t(SVGFEComponentTransferType::Identity)}}; //---------------------------------------------------------------------- // nsSVGFilterPrimitiveChildElement methods @@ -210,7 +210,8 @@ void SVGComponentTransferFunctionElement::ComputeAttributes( int32_t aChannel, ComponentTransferAttributes& aAttributes) { - uint32_t type = mEnumAttributes[TYPE].GetAnimValue(); + SVGFEComponentTransferType type = + SVGFEComponentTransferType(mEnumAttributes[TYPE].GetAnimValue()); float slope, intercept, amplitude, exponent, offset; GetAnimatedNumberValues(&slope, &intercept, &litude, &exponent, &offset, @@ -219,16 +220,16 @@ const SVGNumberList& tableValues = mNumberListAttributes[TABLEVALUES].GetAnimValue(); - aAttributes.mTypes[aChannel] = (uint8_t)type; + aAttributes.mTypes[aChannel] = type; switch (type) { - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { aAttributes.mValues[aChannel].SetLength(2); aAttributes.mValues[aChannel][kComponentTransferSlopeIndex] = slope; aAttributes.mValues[aChannel][kComponentTransferInterceptIndex] = intercept; break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { aAttributes.mValues[aChannel].SetLength(3); aAttributes.mValues[aChannel][kComponentTransferAmplitudeIndex] = amplitude; @@ -236,14 +237,16 @@ aAttributes.mValues[aChannel][kComponentTransferOffsetIndex] = offset; break; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Discrete: + case SVGFEComponentTransferType::Table: { if (!tableValues.IsEmpty()) { aAttributes.mValues[aChannel].AppendElements(&tableValues[0], tableValues.Length()); } break; } + default: + break; } } diff -Nru thunderbird-140.9.0esr/dom/svg/SVGFragmentIdentifier.cpp thunderbird-140.10.0esr/dom/svg/SVGFragmentIdentifier.cpp --- thunderbird-140.9.0esr/dom/svg/SVGFragmentIdentifier.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/svg/SVGFragmentIdentifier.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -152,7 +152,7 @@ MOZ_ASSERT(aDocument->GetRootElement()->IsSVGElement(nsGkAtoms::svg), "expecting an SVG root element"); - auto* rootElement = SVGSVGElement::FromNode(aDocument->GetRootElement()); + RefPtr rootElement = SVGSVGElement::FromNode(aDocument->GetRootElement()); const auto* viewElement = SVGViewElement::FromNodeOrNull(aDocument->GetElementById(aAnchorName)); diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -14,17 +14,11 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(AuthenticatorAssertionResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse) - tmp->mAuthenticatorDataCachedObj = nullptr; - tmp->mSignatureCachedObj = nullptr; - tmp->mUserHandleCachedObj = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mAuthenticatorDataCachedObj) - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mSignatureCachedObj) - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mUserHandleCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED( @@ -39,16 +33,7 @@ AuthenticatorAssertionResponse::AuthenticatorAssertionResponse( nsPIDOMWindowInner* aParent) - : AuthenticatorResponse(aParent), - mAuthenticatorDataCachedObj(nullptr), - mSignatureCachedObj(nullptr), - mUserHandleCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -AuthenticatorAssertionResponse::~AuthenticatorAssertionResponse() { - mozilla::DropJSObjects(this); -} + : AuthenticatorResponse(aParent) {} JSObject* AuthenticatorAssertionResponse::WrapObject( JSContext* aCx, JS::Handle aGivenProto) { @@ -57,14 +42,7 @@ void AuthenticatorAssertionResponse::GetAuthenticatorData( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mAuthenticatorDataCachedObj) { - mAuthenticatorDataCachedObj = - ArrayBuffer::Create(aCx, mAuthenticatorData, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mAuthenticatorDataCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mAuthenticatorData, aRv)); } void AuthenticatorAssertionResponse::SetAuthenticatorData( @@ -74,13 +52,7 @@ void AuthenticatorAssertionResponse::GetSignature( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mSignatureCachedObj) { - mSignatureCachedObj = ArrayBuffer::Create(aCx, mSignature, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mSignatureCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mSignature, aRv)); } void AuthenticatorAssertionResponse::SetSignature( @@ -96,13 +68,7 @@ if (mUserHandle.IsEmpty()) { aValue.set(nullptr); } else { - if (!mUserHandleCachedObj) { - mUserHandleCachedObj = ArrayBuffer::Create(aCx, mUserHandle, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mUserHandleCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mUserHandle, aRv)); } } diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAssertionResponse.h thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.h --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAssertionResponse.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAssertionResponse.h 2026-04-21 14:52:53.000000000 +0000 @@ -26,7 +26,7 @@ explicit AuthenticatorAssertionResponse(nsPIDOMWindowInner* aParent); protected: - ~AuthenticatorAssertionResponse() override; + ~AuthenticatorAssertionResponse() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -51,11 +51,8 @@ private: nsTArray mAuthenticatorData; - JS::Heap mAuthenticatorDataCachedObj; nsTArray mSignature; - JS::Heap mSignatureCachedObj; nsTArray mUserHandle; - JS::Heap mUserHandleCachedObj; }; } // namespace mozilla::dom diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -6,7 +6,6 @@ #include "AuthrsBridge_ffi.h" #include "mozilla/Base64.h" -#include "mozilla/HoldDropJSObjects.h" #include "mozilla/dom/AuthenticatorAttestationResponse.h" #include "mozilla/dom/WebAuthenticationBinding.h" @@ -15,13 +14,11 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(AuthenticatorAttestationResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED( AuthenticatorAttestationResponse, AuthenticatorResponse) - tmp->mAttestationObjectCachedObj = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(AuthenticatorAttestationResponse, AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mAttestationObjectCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED( @@ -38,13 +35,7 @@ AuthenticatorAttestationResponse::AuthenticatorAttestationResponse( nsPIDOMWindowInner* aParent) - : AuthenticatorResponse(aParent), mAttestationObjectCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -AuthenticatorAttestationResponse::~AuthenticatorAttestationResponse() { - mozilla::DropJSObjects(this); -} + : AuthenticatorResponse(aParent) {} JSObject* AuthenticatorAttestationResponse::WrapObject( JSContext* aCx, JS::Handle aGivenProto) { @@ -53,14 +44,7 @@ void AuthenticatorAttestationResponse::GetAttestationObject( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mAttestationObjectCachedObj) { - mAttestationObjectCachedObj = - ArrayBuffer::Create(aCx, mAttestationObject, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mAttestationObjectCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mAttestationObject, aRv)); } void AuthenticatorAttestationResponse::SetAttestationObject( diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAttestationResponse.h thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.h --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorAttestationResponse.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorAttestationResponse.h 2026-04-21 14:52:53.000000000 +0000 @@ -27,7 +27,7 @@ explicit AuthenticatorAttestationResponse(nsPIDOMWindowInner* aParent); protected: - ~AuthenticatorAttestationResponse() override; + ~AuthenticatorAttestationResponse() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -58,7 +58,6 @@ nsTArray mAttestationObject; nsCOMPtr mAttestationObjectParsed; - JS::Heap mAttestationObjectCachedObj; nsTArray mTransports; }; diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorResponse.cpp thunderbird-140.10.0esr/dom/webauthn/AuthenticatorResponse.cpp --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorResponse.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorResponse.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -12,8 +12,7 @@ namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WITH_JS_MEMBERS( - AuthenticatorResponse, (mParent), (mClientDataJSONCachedObj)) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AuthenticatorResponse, mParent) NS_IMPL_CYCLE_COLLECTING_ADDREF(AuthenticatorResponse) NS_IMPL_CYCLE_COLLECTING_RELEASE(AuthenticatorResponse) @@ -24,25 +23,15 @@ NS_INTERFACE_MAP_END AuthenticatorResponse::AuthenticatorResponse(nsPIDOMWindowInner* aParent) - : mParent(aParent), mClientDataJSONCachedObj(nullptr) { - // Call HoldJSObjects() in subclasses. -} + : mParent(aParent) {} -AuthenticatorResponse::~AuthenticatorResponse() { - // Call DropJSObjects() in subclasses. -} +AuthenticatorResponse::~AuthenticatorResponse() = default; nsISupports* AuthenticatorResponse::GetParentObject() const { return mParent; } void AuthenticatorResponse::GetClientDataJSON( JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mClientDataJSONCachedObj) { - mClientDataJSONCachedObj = ArrayBuffer::Create(aCx, mClientDataJSON, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mClientDataJSONCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mClientDataJSON, aRv)); } void AuthenticatorResponse::SetClientDataJSON(const nsCString& aBuffer) { diff -Nru thunderbird-140.9.0esr/dom/webauthn/AuthenticatorResponse.h thunderbird-140.10.0esr/dom/webauthn/AuthenticatorResponse.h --- thunderbird-140.9.0esr/dom/webauthn/AuthenticatorResponse.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/AuthenticatorResponse.h 2026-04-21 14:52:52.000000000 +0000 @@ -21,7 +21,7 @@ class AuthenticatorResponse : public nsISupports, public nsWrapperCache { public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AuthenticatorResponse) + NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(AuthenticatorResponse) explicit AuthenticatorResponse(nsPIDOMWindowInner* aParent); @@ -43,7 +43,6 @@ private: nsCOMPtr mParent; - JS::Heap mClientDataJSONCachedObj; }; } // namespace mozilla::dom diff -Nru thunderbird-140.9.0esr/dom/webauthn/MacOSWebAuthnService.mm thunderbird-140.10.0esr/dom/webauthn/MacOSWebAuthnService.mm --- thunderbird-140.9.0esr/dom/webauthn/MacOSWebAuthnService.mm 2026-03-20 19:18:31.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/MacOSWebAuthnService.mm 2026-04-21 14:52:52.000000000 +0000 @@ -319,8 +319,9 @@ } uint32_t count = prfEvalByCredIds.Length(); - NSData* keys[count]; - ASAuthorizationPublicKeyCredentialPRFAssertionInputValues* objects[count]; + NSMutableArray* keys = [NSMutableArray arrayWithCapacity:count]; + NSMutableArray* + objects = [NSMutableArray arrayWithCapacity:count]; for (size_t i = 0; i < count; i++) { NSData* saltInput1 = [NSData dataWithBytes:prfEvalByCredFirsts[i].Elements() length:prfEvalByCredFirsts[i].Length()]; @@ -329,15 +330,15 @@ saltInput2 = [NSData dataWithBytes:prfEvalByCredSeconds[i].Elements() length:prfEvalByCredSeconds[i].Length()]; } - keys[i] = [NSData dataWithBytes:prfEvalByCredIds[i].Elements() - length:prfEvalByCredIds[i].Length()]; - objects[i] = - [[ASAuthorizationPublicKeyCredentialPRFAssertionInputValues alloc] - initWithSaltInput1:saltInput1 - saltInput2:saltInput2]; + [keys addObject:[NSData dataWithBytes:prfEvalByCredIds[i].Elements() + length:prfEvalByCredIds[i].Length()]]; + [objects + addObject:[[ASAuthorizationPublicKeyCredentialPRFAssertionInputValues + alloc] initWithSaltInput1:saltInput1 + saltInput2:saltInput2]]; } - return [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count]; + return [NSDictionary dictionaryWithObjects:objects forKeys:keys]; } @implementation MacOSAuthenticatorRequestDelegate { diff -Nru thunderbird-140.9.0esr/dom/webauthn/PublicKeyCredential.cpp thunderbird-140.10.0esr/dom/webauthn/PublicKeyCredential.cpp --- thunderbird-140.9.0esr/dom/webauthn/PublicKeyCredential.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/PublicKeyCredential.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/Base64.h" -#include "mozilla/HoldDropJSObjects.h" #include "mozilla/Preferences.h" #include "mozilla/StaticPrefs_security.h" #include "mozilla/dom/AuthenticatorResponse.h" @@ -28,12 +27,12 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(PublicKeyCredential) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PublicKeyCredential, Credential) - tmp->mRawIdCachedObj = nullptr; + NS_IMPL_CYCLE_COLLECTION_UNLINK(mAttestationResponse) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mAssertionResponse) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PublicKeyCredential, Credential) NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mRawIdCachedObj) NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PublicKeyCredential, @@ -49,11 +48,7 @@ NS_INTERFACE_MAP_END_INHERITING(Credential) PublicKeyCredential::PublicKeyCredential(nsPIDOMWindowInner* aParent) - : Credential(aParent), mRawIdCachedObj(nullptr) { - mozilla::HoldJSObjects(this); -} - -PublicKeyCredential::~PublicKeyCredential() { mozilla::DropJSObjects(this); } + : Credential(aParent) {} JSObject* PublicKeyCredential::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { @@ -63,13 +58,7 @@ void PublicKeyCredential::GetRawId(JSContext* aCx, JS::MutableHandle aValue, ErrorResult& aRv) { - if (!mRawIdCachedObj) { - mRawIdCachedObj = ArrayBuffer::Create(aCx, mRawId, aRv); - if (aRv.Failed()) { - return; - } - } - aValue.set(mRawIdCachedObj); + aValue.set(ArrayBuffer::Create(aCx, mRawId, aRv)); } void PublicKeyCredential::GetAuthenticatorAttachment( diff -Nru thunderbird-140.9.0esr/dom/webauthn/PublicKeyCredential.h thunderbird-140.10.0esr/dom/webauthn/PublicKeyCredential.h --- thunderbird-140.9.0esr/dom/webauthn/PublicKeyCredential.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/PublicKeyCredential.h 2026-04-21 14:52:52.000000000 +0000 @@ -27,7 +27,7 @@ explicit PublicKeyCredential(nsPIDOMWindowInner* aParent); protected: - ~PublicKeyCredential() override; + ~PublicKeyCredential() override = default; public: virtual JSObject* WrapObject(JSContext* aCx, @@ -97,7 +97,6 @@ private: nsTArray mRawId; - JS::Heap mRawIdCachedObj; Maybe mAuthenticatorAttachment; RefPtr mAttestationResponse; RefPtr mAssertionResponse; diff -Nru thunderbird-140.9.0esr/dom/webauthn/WebAuthnHandler.cpp thunderbird-140.10.0esr/dom/webauthn/WebAuthnHandler.cpp --- thunderbird-140.9.0esr/dom/webauthn/WebAuthnHandler.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/WebAuthnHandler.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -430,8 +430,6 @@ return promise.forget(); } -const size_t MAX_ALLOWED_CREDENTIALS = 20; - already_AddRefed WebAuthnHandler::GetAssertion( const PublicKeyCredentialRequestOptions& aOptions, const bool aConditionallyMediated, @@ -494,7 +492,7 @@ } // Abort the request if the allowCredentials set is too large - if (aOptions.mAllowCredentials.Length() > MAX_ALLOWED_CREDENTIALS) { + if (aOptions.mAllowCredentials.Length() > kWebAuthnMaxAllowedCredentials) { promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR); return promise.forget(); } diff -Nru thunderbird-140.9.0esr/dom/webauthn/WebAuthnTransactionParent.cpp thunderbird-140.10.0esr/dom/webauthn/WebAuthnTransactionParent.cpp --- thunderbird-140.9.0esr/dom/webauthn/WebAuthnTransactionParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/WebAuthnTransactionParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -386,6 +386,16 @@ return IPC_OK(); } + for (const WebAuthnExtension& ext : aTransactionInfo.Extensions()) { + if (ext.type() == WebAuthnExtension::TWebAuthnExtensionPrf) { + if (ext.get_WebAuthnExtensionPrf().evalByCredential().Length() > + kWebAuthnMaxAllowedCredentials) { + aResolver(NS_ERROR_DOM_NOT_ALLOWED_ERR); + return IPC_OK(); + } + } + } + nsCString clientDataJSON; rv = AssembleClientData(manager, "webauthn.get"_ns, aTransactionInfo.Challenge(), clientDataJSON); diff -Nru thunderbird-140.9.0esr/dom/webauthn/WebAuthnUtil.h thunderbird-140.10.0esr/dom/webauthn/WebAuthnUtil.h --- thunderbird-140.9.0esr/dom/webauthn/WebAuthnUtil.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webauthn/WebAuthnUtil.h 2026-04-21 14:52:53.000000000 +0000 @@ -12,6 +12,8 @@ namespace mozilla::dom { +static const size_t kWebAuthnMaxAllowedCredentials = 20; + bool IsValidAppId(const nsCOMPtr& aPrincipal, const nsCString& aAppId); diff -Nru thunderbird-140.9.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp thunderbird-140.10.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp --- thunderbird-140.9.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webbrowserpersist/WebBrowserPersistSerializeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -51,11 +51,14 @@ mozilla::ipc::IPCResult WebBrowserPersistSerializeParent::Recv__delete__( const nsACString& aContentType, const nsresult& aStatus) { + nsCOMPtr finish = std::move(mFinish); + if (!finish) { + return IPC_FAIL(this, "missing finish callback"); + } if (NS_SUCCEEDED(mOutputError)) { mOutputError = aStatus; } - mFinish->OnFinish(mDocument, mStream, aContentType, mOutputError); - mFinish = nullptr; + finish->OnFinish(mDocument, mStream, aContentType, mOutputError); return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/dom/webidl/WebAuthentication.webidl thunderbird-140.10.0esr/dom/webidl/WebAuthentication.webidl --- thunderbird-140.9.0esr/dom/webidl/WebAuthentication.webidl 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webidl/WebAuthentication.webidl 2026-04-21 14:52:53.000000000 +0000 @@ -12,9 +12,9 @@ [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface PublicKeyCredential : Credential { - [SameObject, Throws] readonly attribute ArrayBuffer rawId; - [SameObject] readonly attribute AuthenticatorResponse response; - readonly attribute DOMString? authenticatorAttachment; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer rawId; + [SameObject] readonly attribute AuthenticatorResponse response; + readonly attribute DOMString? authenticatorAttachment; AuthenticationExtensionsClientOutputs getClientExtensionResults(); [NewObject] static Promise isConditionalMediationAvailable(); [Throws, Pref="security.webauthn.enable_json_serialization_methods"] object toJSON(); @@ -140,25 +140,25 @@ [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer clientDataJSON; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer clientDataJSON; }; [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorAttestationResponse : AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer attestationObject; - sequence getTransports(); - [Throws] ArrayBuffer getAuthenticatorData(); - [Throws] ArrayBuffer? getPublicKey(); - [Throws] COSEAlgorithmIdentifier getPublicKeyAlgorithm(); + [SameObject, Throws, Cached] readonly attribute ArrayBuffer attestationObject; + sequence getTransports(); + [Throws] ArrayBuffer getAuthenticatorData(); + [Throws] ArrayBuffer? getPublicKey(); + [Throws] COSEAlgorithmIdentifier getPublicKeyAlgorithm(); }; [SecureContext, Pref="security.webauth.webauthn", Exposed=Window] interface AuthenticatorAssertionResponse : AuthenticatorResponse { - [SameObject, Throws] readonly attribute ArrayBuffer authenticatorData; - [SameObject, Throws] readonly attribute ArrayBuffer signature; - [SameObject, Throws] readonly attribute ArrayBuffer? userHandle; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer authenticatorData; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer signature; + [SameObject, Throws, Cached] readonly attribute ArrayBuffer? userHandle; }; dictionary PublicKeyCredentialParameters { diff -Nru thunderbird-140.9.0esr/dom/webtransport/parent/WebTransportParent.cpp thunderbird-140.10.0esr/dom/webtransport/parent/WebTransportParent.cpp --- thunderbird-140.9.0esr/dom/webtransport/parent/WebTransportParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/webtransport/parent/WebTransportParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -166,6 +166,9 @@ const nsACString& aReason) { LOG(("Close for %p received, code = %u, reason = %s", this, aCode, PromiseFlatCString(aReason).get())); + if (!mSessionReady) { + return IPC_FAIL(this, "Close received before session was ready"); + } { MutexAutoLock lock(mMutex); MOZ_ASSERT(!mClosed); diff -Nru thunderbird-140.9.0esr/dom/workers/MessageEventRunnable.cpp thunderbird-140.10.0esr/dom/workers/MessageEventRunnable.cpp --- thunderbird-140.9.0esr/dom/workers/MessageEventRunnable.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/MessageEventRunnable.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -19,10 +19,9 @@ StructuredCloneHolder(CloningSupported, TransferringSupported, StructuredCloneScope::SameProcess) {} -bool MessageEventRunnable::DispatchDOMEvent(JSContext* aCx, - WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, - bool aIsMainThread) { +bool MessageEventRunnable::DispatchDOMEvent( + JSContext* aCx, WorkerPrivate* aWorkerPrivate, + RefPtr aTarget, bool aIsMainThread) { nsCOMPtr parent = aTarget->GetParentObject(); // For some workers without window, parent is null and we try to find it @@ -117,7 +116,7 @@ bool MessageEventToParentRunnable::DispatchDOMEvent( JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread) { + RefPtr aTarget, bool aIsMainThread) { nsCOMPtr parent = aTarget->GetParentObject(); // For some workers without window, parent is null and we try to find it diff -Nru thunderbird-140.9.0esr/dom/workers/MessageEventRunnable.h thunderbird-140.10.0esr/dom/workers/MessageEventRunnable.h --- thunderbird-140.9.0esr/dom/workers/MessageEventRunnable.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/MessageEventRunnable.h 2026-04-21 14:52:53.000000000 +0000 @@ -23,7 +23,8 @@ explicit MessageEventRunnable(WorkerPrivate* aWorkerPrivate); bool DispatchDOMEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread); + RefPtr aTarget, + bool aIsMainThread); private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override; @@ -37,7 +38,8 @@ explicit MessageEventToParentRunnable(WorkerPrivate* aWorkerPrivate); bool DispatchDOMEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate, - DOMEventTargetHelper* aTarget, bool aIsMainThread); + RefPtr aTarget, + bool aIsMainThread); private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override; diff -Nru thunderbird-140.9.0esr/dom/workers/RuntimeService.cpp thunderbird-140.10.0esr/dom/workers/RuntimeService.cpp --- thunderbird-140.9.0esr/dom/workers/RuntimeService.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/RuntimeService.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1258,6 +1258,8 @@ } } else { if (!mNavigatorPropertiesLoaded) { + MutexAutoLock lock(mMutex); + if (NS_FAILED(Navigator::GetAppVersion( mNavigatorProperties.mAppVersion, aWorkerPrivate.GetDocument(), false /* aUsePrefOverriddenValue */)) || @@ -1692,6 +1694,11 @@ void RuntimeService::Cleanup() { AssertIsOnMainThread(); + if (mCleanedUp) { + return; + } + mCleanedUp = true; + if (!mShuttingDown) { Shutdown(); } @@ -1786,9 +1793,9 @@ obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID); mObserved = false; } - } - nsLayoutStatics::Release(); + nsLayoutStatics::Release(); + } } void RuntimeService::AddAllTopLevelWorkersToArray( @@ -1923,11 +1930,13 @@ void RuntimeService::UpdateAppVersionOverridePreference( const nsAString& aValue) { AssertIsOnMainThread(); + MutexAutoLock lock(mMutex); mNavigatorProperties.mAppVersionOverridden = aValue; } void RuntimeService::UpdatePlatformOverridePreference(const nsAString& aValue) { AssertIsOnMainThread(); + MutexAutoLock lock(mMutex); mNavigatorProperties.mPlatformOverridden = aValue; } @@ -1935,7 +1944,10 @@ const nsTArray& aLanguages) { MOZ_ASSERT(NS_IsMainThread()); - mNavigatorProperties.mLanguages = aLanguages.Clone(); + { + MutexAutoLock lock(mMutex); + mNavigatorProperties.mLanguages = aLanguages.Clone(); + } BroadcastAllWorkers( [&aLanguages](auto& worker) { worker.UpdateLanguages(aLanguages); }); } diff -Nru thunderbird-140.9.0esr/dom/workers/RuntimeService.h thunderbird-140.10.0esr/dom/workers/RuntimeService.h --- thunderbird-140.9.0esr/dom/workers/RuntimeService.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/RuntimeService.h 2026-04-21 14:52:53.000000000 +0000 @@ -54,7 +54,7 @@ } }; - mozilla::Mutex mMutex; + mutable mozilla::Mutex mMutex; // Protected by mMutex. nsClassHashtable mDomainMap @@ -77,12 +77,13 @@ }; private: - NavigatorProperties mNavigatorProperties; + NavigatorProperties mNavigatorProperties MOZ_GUARDED_BY(mMutex); // True when the observer service holds a reference to this object. bool mObserved; bool mShuttingDown; bool mNavigatorPropertiesLoaded; + bool mCleanedUp{false}; public: NS_DECL_ISUPPORTS @@ -112,7 +113,8 @@ void PropagateStorageAccessPermissionGranted( const nsPIDOMWindowInner& aWindow); - const NavigatorProperties& GetNavigatorProperties() const { + NavigatorProperties GetNavigatorProperties() const { + MutexAutoLock lock(mMutex); return mNavigatorProperties; } diff -Nru thunderbird-140.9.0esr/dom/workers/WorkerError.cpp thunderbird-140.10.0esr/dom/workers/WorkerError.cpp --- thunderbird-140.9.0esr/dom/workers/WorkerError.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/WorkerError.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -242,7 +242,7 @@ /* static */ void WorkerErrorReport::ReportError( JSContext* aCx, WorkerPrivate* aWorkerPrivate, bool aFireAtScope, - DOMEventTargetHelper* aTarget, UniquePtr aReport, + RefPtr aTarget, UniquePtr aReport, uint64_t aInnerWindowId, JS::Handle aException) { if (aWorkerPrivate) { aWorkerPrivate->AssertIsOnWorkerThread(); @@ -324,7 +324,7 @@ MOZ_ASSERT(globalScope->GetWrapperPreserveColor() == global); RefPtr event = ErrorEvent::Constructor( - aTarget ? aTarget : globalScope, u"error"_ns, init); + aTarget ? aTarget.get() : globalScope, u"error"_ns, init); event->SetTrusted(true); if (NS_FAILED(EventDispatcher::DispatchDOMEvent( diff -Nru thunderbird-140.9.0esr/dom/workers/WorkerError.h thunderbird-140.10.0esr/dom/workers/WorkerError.h --- thunderbird-140.9.0esr/dom/workers/WorkerError.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/WorkerError.h 2026-04-21 14:52:53.000000000 +0000 @@ -57,8 +57,8 @@ // TODO: Convert this to MOZ_CAN_RUN_SCRIPT (bug 1743443) MOZ_CAN_RUN_SCRIPT_BOUNDARY static void ReportError( JSContext* aCx, WorkerPrivate* aWorkerPrivate, bool aFireAtScope, - DOMEventTargetHelper* aTarget, UniquePtr aReport, - uint64_t aInnerWindowId, + RefPtr aTarget, + UniquePtr aReport, uint64_t aInnerWindowId, JS::Handle aException = JS::NullHandleValue); static void LogErrorToConsole(JSContext* aCx, WorkerErrorReport& aReport, diff -Nru thunderbird-140.9.0esr/dom/workers/WorkerNavigator.cpp thunderbird-140.10.0esr/dom/workers/WorkerNavigator.cpp --- thunderbird-140.9.0esr/dom/workers/WorkerNavigator.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/workers/WorkerNavigator.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -67,7 +67,7 @@ RuntimeService* rts = RuntimeService::GetService(); MOZ_ASSERT(rts); - const RuntimeService::NavigatorProperties& properties = + RuntimeService::NavigatorProperties properties = rts->GetNavigatorProperties(); RefPtr navigator = new WorkerNavigator(properties, aOnLine); diff -Nru thunderbird-140.9.0esr/dom/worklet/WorkletFetchHandler.cpp thunderbird-140.10.0esr/dom/worklet/WorkletFetchHandler.cpp --- thunderbird-140.9.0esr/dom/worklet/WorkletFetchHandler.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/worklet/WorkletFetchHandler.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -42,13 +42,13 @@ WorkletImpl* aWorkletImpl, const nsMainThreadPtrHandle& aHandlerRef, nsCOMPtr aURI, nsIURI* aReferrer, - const nsTArray& aLocalizedStrs) + nsTArray&& aLocalizedStrs) : Runnable("Worklet::StartModuleLoadRunnable"), mWorkletImpl(aWorkletImpl), mHandlerRef(aHandlerRef), mURI(std::move(aURI)), mReferrer(aReferrer), - mLocalizedStrs(aLocalizedStrs), + mLocalizedStrs(std::move(aLocalizedStrs)), mParentRuntime( JS_GetParentRuntime(CycleCollectedJSContext::Get()->Context())) { MOZ_ASSERT(NS_IsMainThread()); @@ -67,7 +67,7 @@ nsMainThreadPtrHandle mHandlerRef; nsCOMPtr mURI; nsCOMPtr mReferrer; - const nsTArray& mLocalizedStrs; + nsTArray mLocalizedStrs; JSRuntime* mParentRuntime; JS::ContextOptions mContextOptions; }; @@ -107,7 +107,7 @@ MOZ_ASSERT(moduleLoader); if (!moduleLoader->HasSetLocalizedStrings()) { - moduleLoader->SetLocalizedStrings(&mLocalizedStrs); + moduleLoader->SetLocalizedStrings(mLocalizedStrs.Clone()); } RefPtr loadContext = new WorkletLoadContext(mHandlerRef); @@ -338,7 +338,7 @@ nsIURI* referrer = doc->GetDocumentURIAsReferrer(); nsCOMPtr runnable = new StartModuleLoadRunnable( aWorklet->mImpl, handlerRef, std::move(resolvedURI), referrer, - aWorklet->GetLocalizedStrings()); + aWorklet->GetLocalizedStrings().Clone()); if (NS_FAILED(aWorklet->mImpl->SendControlMessage(runnable.forget()))) { return nullptr; diff -Nru thunderbird-140.9.0esr/dom/worklet/loader/WorkletModuleLoader.cpp thunderbird-140.10.0esr/dom/worklet/loader/WorkletModuleLoader.cpp --- thunderbird-140.9.0esr/dom/worklet/loader/WorkletModuleLoader.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/worklet/loader/WorkletModuleLoader.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -306,13 +306,12 @@ ResolveError aError, const nsAString& aSpecifier, nsAString& aResult) { uint8_t index = static_cast(aError); MOZ_ASSERT(index < static_cast(ResolveError::Length)); - MOZ_ASSERT(mLocalizedStrs); - MOZ_ASSERT(!mLocalizedStrs->IsEmpty()); - if (!mLocalizedStrs || NS_WARN_IF(mLocalizedStrs->IsEmpty())) { + MOZ_ASSERT(HasSetLocalizedStrings()); + if (NS_WARN_IF(mLocalizedStrs.IsEmpty())) { return NS_ERROR_FAILURE; } - const nsString& localizedStr = mLocalizedStrs->ElementAt(index); + const nsString& localizedStr = mLocalizedStrs.ElementAt(index); AutoTArray params; params.AppendElement(aSpecifier); diff -Nru thunderbird-140.9.0esr/dom/worklet/loader/WorkletModuleLoader.h thunderbird-140.10.0esr/dom/worklet/loader/WorkletModuleLoader.h --- thunderbird-140.9.0esr/dom/worklet/loader/WorkletModuleLoader.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/worklet/loader/WorkletModuleLoader.h 2026-04-21 14:52:53.000000000 +0000 @@ -55,9 +55,10 @@ void RemoveRequest(nsIURI* aURI); JS::loader::ModuleLoadRequest* GetRequest(nsIURI* aURI) const; - bool HasSetLocalizedStrings() const { return (bool)mLocalizedStrs; } - void SetLocalizedStrings(const nsTArray* aStrings) { - mLocalizedStrs = aStrings; + bool HasSetLocalizedStrings() const { return !mLocalizedStrs.IsEmpty(); } + void SetLocalizedStrings(nsTArray&& aStrings) { + MOZ_ASSERT(!aStrings.IsEmpty()); + mLocalizedStrs = std::move(aStrings); } private: @@ -104,7 +105,7 @@ // We get the localized strings on the main thread, and pass it to // WorkletModuleLoader. - const nsTArray* mLocalizedStrs = nullptr; + nsTArray mLocalizedStrs; }; } // namespace loader diff -Nru thunderbird-140.9.0esr/dom/xhr/XMLHttpRequestMainThread.cpp thunderbird-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.cpp --- thunderbird-140.9.0esr/dom/xhr/XMLHttpRequestMainThread.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -313,10 +313,7 @@ Abort(); } - if (mParseEndListener) { - mParseEndListener->SetIsStale(); - mParseEndListener = nullptr; - } + mParseEndListener = nullptr; MOZ_ASSERT(!mFlagSyncLooping, "we rather crash than hang"); mFlagSyncLooping = false; @@ -2507,6 +2504,7 @@ void XMLHttpRequestMainThread::ChangeStateToDoneInternal() { DEBUG_WORKERREFS; + RefPtr kungfuDeathGrip(this); DisconnectDoneNotifier(); StopProgressEventTimer(); diff -Nru thunderbird-140.9.0esr/dom/xhr/XMLHttpRequestMainThread.h thunderbird-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.h --- thunderbird-140.9.0esr/dom/xhr/XMLHttpRequestMainThread.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xhr/XMLHttpRequestMainThread.h 2026-04-21 14:52:53.000000000 +0000 @@ -47,6 +47,7 @@ #include "mozilla/dom/XMLHttpRequestEventTarget.h" #include "mozilla/dom/XMLHttpRequestString.h" #include "mozilla/Encoding.h" +#include "mozilla/WeakPtr.h" #ifdef Status /* Xlib headers insist on this for some reason... Nuke it because @@ -183,6 +184,7 @@ // Make sure that any non-DOM interfaces added here are also added to // nsXMLHttpRequestXPCOMifier. class XMLHttpRequestMainThread final : public XMLHttpRequest, + public SupportsWeakPtr, public nsIStreamListener, public nsIChannelEventSink, public nsIProgressEventSink, @@ -844,21 +846,18 @@ public: NS_DECL_ISUPPORTS NS_IMETHOD HandleEvent(Event* event) override { - if (mXHR) { - mXHR->OnBodyParseEnd(); + if (RefPtr xhr = mXHR.get()) { + xhr->OnBodyParseEnd(); } - mXHR = nullptr; return NS_OK; } explicit nsXHRParseEndListener(XMLHttpRequestMainThread* aXHR) : mXHR(aXHR) {} - void SetIsStale() { mXHR = nullptr; } - private: virtual ~nsXHRParseEndListener() = default; - XMLHttpRequestMainThread* mXHR; + WeakPtr mXHR; }; } // namespace dom diff -Nru thunderbird-140.9.0esr/dom/xml/nsXMLPrettyPrinter.cpp thunderbird-140.10.0esr/dom/xml/nsXMLPrettyPrinter.cpp --- thunderbird-140.9.0esr/dom/xml/nsXMLPrettyPrinter.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xml/nsXMLPrettyPrinter.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -179,6 +179,8 @@ } void nsXMLPrettyPrinter::NodeWillBeDestroyed(nsINode* aNode) { + MOZ_DIAGNOSTIC_ASSERT(mDocument == aNode); + mDocument->RemoveMutationObserver(this); mDocument = nullptr; NS_RELEASE_THIS(); } diff -Nru thunderbird-140.9.0esr/dom/xslt/xpath/txForwardContext.h thunderbird-140.10.0esr/dom/xslt/xpath/txForwardContext.h --- thunderbird-140.9.0esr/dom/xslt/xpath/txForwardContext.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xpath/txForwardContext.h 2026-04-21 14:52:53.000000000 +0000 @@ -21,7 +21,7 @@ private: txIMatchContext* mInner; - const txXPathNode& mContextNode; + txXPathNode mContextNode; RefPtr mContextSet; }; diff -Nru thunderbird-140.9.0esr/dom/xslt/xpath/txPathExpr.cpp thunderbird-140.10.0esr/dom/xslt/xpath/txPathExpr.cpp --- thunderbird-140.9.0esr/dom/xslt/xpath/txPathExpr.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xpath/txPathExpr.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -148,10 +148,10 @@ resNodes->addAndTransfer(newSet); bool filterWS; - rv = aContext->isStripSpaceAllowed(aNode, filterWS); + rv = aContext->isStripSpaceAllowed(eContext.getContextNode(), filterWS); NS_ENSURE_SUCCESS(rv, rv); - txXPathTreeWalker walker(aNode); + txXPathTreeWalker walker(eContext.getContextNode()); if (!walker.moveToFirstChild()) { return NS_OK; } diff -Nru thunderbird-140.9.0esr/dom/xslt/xslt/txInstructions.cpp thunderbird-140.10.0esr/dom/xslt/xslt/txInstructions.cpp --- thunderbird-140.9.0esr/dom/xslt/xslt/txInstructions.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xslt/txInstructions.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -47,26 +47,26 @@ } nsresult txApplyImportsStart::execute(txExecutionState& aEs) { - txExecutionState::TemplateRule* rule = aEs.getCurrentTemplateRule(); + txExecutionState::TemplateRule rule = *aEs.getCurrentTemplateRule(); // The frame is set to null when there is no current template rule, or // when the current template rule is a default template. However this // instruction isn't used in default templates. - if (!rule->mFrame) { + if (!rule.mFrame) { // XXX ErrorReport: apply-imports instantiated without a current rule return NS_ERROR_XSLT_EXECUTION_FAILURE; } - aEs.pushParamMap(rule->mParams); + aEs.pushParamMap(rule.mParams); txStylesheet::ImportFrame* frame = 0; - txExpandedName mode(rule->mModeNsId, rule->mModeLocalName); + txExpandedName mode(rule.mModeNsId, rule.mModeLocalName); txInstruction* templ; nsresult rv = aEs.mStylesheet->findTemplate(aEs.getEvalContext()->getContextNode(), - mode, &aEs, rule->mFrame, &templ, &frame); + mode, &aEs, rule.mFrame, &templ, &frame); NS_ENSURE_SUCCESS(rv, rv); - aEs.pushTemplateRule(frame, mode, rule->mParams); + aEs.pushTemplateRule(frame, mode, rule.mParams); rv = aEs.runTemplate(templ); if (NS_FAILED(rv)) { diff -Nru thunderbird-140.9.0esr/dom/xslt/xslt/txKey.h thunderbird-140.10.0esr/dom/xslt/xslt/txKey.h --- thunderbird-140.9.0esr/dom/xslt/xslt/txKey.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xslt/txKey.h 2026-04-21 14:52:53.000000000 +0000 @@ -69,11 +69,12 @@ using KeyType = const txIndexedKeyHashKey&; using KeyTypePointer = const txIndexedKeyHashKey*; - explicit txIndexedKeyHashEntry(KeyTypePointer aKey) - : mKey(*aKey), mIndexed(false) {} + explicit txIndexedKeyHashEntry(KeyTypePointer aKey) : mKey(*aKey) {} txIndexedKeyHashEntry(const txIndexedKeyHashEntry& entry) - : mKey(entry.mKey), mIndexed(entry.mIndexed) {} + : mKey(entry.mKey), + mIndexed(entry.mIndexed), + mIsBeingIndexed(entry.mIsBeingIndexed) {} bool KeyEquals(KeyTypePointer aKey) const; @@ -84,7 +85,8 @@ enum { ALLOW_MEMMOVE = true }; txIndexedKeyHashKey mKey; - bool mIndexed; + bool mIndexed = false; + bool mIsBeingIndexed = false; }; using txIndexedKeyHash = nsTHashtable; diff -Nru thunderbird-140.9.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp thunderbird-140.10.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp --- thunderbird-140.9.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xslt/txKeyFunctionCall.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -183,6 +183,13 @@ return NS_OK; } + // This means an xsl:key's match or use expression is (indirectly) + // looking up the same key. + // XSLT allows for recursion but prohibits circularity. + if (indexEntry->mIsBeingIndexed) { + return NS_ERROR_XSLT_BAD_RECURSION; + } + // The key needs to be indexed. txXSLKey* xslKey = mKeys.get(aKeyName); if (!xslKey) { @@ -190,10 +197,15 @@ return NS_ERROR_INVALID_ARG; } + indexEntry->mIsBeingIndexed = true; nsresult rv = xslKey->indexSubtreeRoot(aRoot, mKeyValues, aEs); NS_ENSURE_SUCCESS(rv, rv); + indexEntry = mIndexedKeys.GetEntry(indexKey); - indexEntry->mIndexed = true; + if (MOZ_LIKELY(indexEntry)) { + indexEntry->mIsBeingIndexed = false; + indexEntry->mIndexed = true; + } // Now that the key is indexed we can get its value. valueEntry = mKeyValues.GetEntry(valueKey); diff -Nru thunderbird-140.9.0esr/dom/xslt/xslt/txXSLTNumber.cpp thunderbird-140.10.0esr/dom/xslt/xslt/txXSLTNumber.cpp --- thunderbird-140.9.0esr/dom/xslt/xslt/txXSLTNumber.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/dom/xslt/xslt/txXSLTNumber.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -107,7 +107,7 @@ txPattern* countPattern = aCountPattern; UniquePtr newCountPattern; - const txXPathNode& currNode = aContext->getContextNode(); + txXPathNode currNode(aContext->getContextNode()); // Parse count- and from-attributes diff -Nru thunderbird-140.9.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp thunderbird-140.10.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp --- thunderbird-140.9.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/editor/libeditor/HTMLEditorDeleteHandler.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -3356,8 +3356,8 @@ return EditActionResult::HandledResult(); } - EditorRawDOMPoint newCaretPosition = - HTMLEditUtils::GetGoodCaretPointFor( + EditorDOMPoint newCaretPosition = + HTMLEditUtils::GetGoodCaretPointFor( *mLeafContentInOtherBlock, aDirectionAndAmount); if (MOZ_UNLIKELY(!newCaretPosition.IsInContentNode())) { NS_WARNING("HTMLEditUtils::GetGoodCaretPointFor() failed"); @@ -3381,6 +3381,8 @@ BlockInlineCheck::UseComputedDisplayOutsideStyle); } if (nextThingOfCaretPoint.ReachedBlockBoundary()) { + AutoTrackDOMPoint trackNewCaretPosition(aHTMLEditor.RangeUpdaterRef(), + &newCaretPosition); const EditorDOMPoint atBlockBoundary = nextThingOfCaretPoint.ReachedCurrentBlockBoundary() ? EditorDOMPoint::AtEndOf(*nextThingOfCaretPoint.ElementPtr()) @@ -3394,6 +3396,10 @@ "failed"); return afterLastVisibleThingOrError.propagateErr(); } + trackNewCaretPosition.Flush(StopTracking::Yes); + if (NS_WARN_IF(!newCaretPosition.IsSetAndValidInComposedDoc())) { + return Err(NS_ERROR_EDITOR_UNEXPECTED_DOM_TREE); + } } } rv = aHTMLEditor.CollapseSelectionTo(newCaretPosition); diff -Nru thunderbird-140.9.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js thunderbird-140.10.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js --- thunderbird-140.9.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/extensions/permissions/test/unit/test_permmanager_expiration.js 2026-04-21 14:52:53.000000000 +0000 @@ -23,20 +23,21 @@ let now = Number(Date.now()); - // add a permission with *now* expiration + // add a permission with *now* expiration (minus 10ms to ensure timing doesn't + // treat them as still valid) pm.addFromPrincipal( principal, "test/expiration-perm-exp", 1, pm.EXPIRE_TIME, - now + now - 10 ); pm.addFromPrincipal( principal, "test/expiration-session-exp", 1, pm.EXPIRE_SESSION, - now + now - 10 ); // add a permission with future expiration (100 milliseconds) diff -Nru thunderbird-140.9.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp thunderbird-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp --- thunderbird-140.9.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.cpp 2026-04-21 14:52:52.000000000 +0000 @@ -14,7 +14,17 @@ RemoteSpellcheckEngineChild::~RemoteSpellcheckEngineChild() { // null out the owner's SpellcheckEngineChild to prevent state corruption // during shutdown - mOwner->DeleteRemoteEngine(); + if (mOwner) { + mOwner->DeleteRemoteEngine(); + } +} + +void RemoteSpellcheckEngineChild::Destroy() { + if (mOwner) { + mOwner->DeleteRemoteEngine(); + mOwner = nullptr; + } + (void)RemoteSpellcheckEngineChild::Send__delete__(this); } RefPtr RemoteSpellcheckEngineChild::SetCurrentDictionaries( diff -Nru thunderbird-140.9.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h thunderbird-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h --- thunderbird-140.9.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/extensions/spellcheck/ipc/RemoteSpellCheckEngineChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -17,8 +17,11 @@ : public mozilla::PRemoteSpellcheckEngineChild { public: explicit RemoteSpellcheckEngineChild(mozSpellChecker* aOwner); + RemoteSpellcheckEngineChild() = delete; virtual ~RemoteSpellcheckEngineChild(); + void Destroy(); + RefPtr SetCurrentDictionaries( const nsTArray& aDictionaries); diff -Nru thunderbird-140.9.0esr/extensions/spellcheck/src/mozSpellChecker.cpp thunderbird-140.10.0esr/extensions/spellcheck/src/mozSpellChecker.cpp --- thunderbird-140.9.0esr/extensions/spellcheck/src/mozSpellChecker.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/extensions/spellcheck/src/mozSpellChecker.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -42,7 +42,7 @@ if (mEngine) { MOZ_ASSERT(XRE_IsContentProcess()); - RemoteSpellcheckEngineChild::Send__delete__(mEngine); + mEngine->Destroy(); MOZ_ASSERT(!mEngine); } } diff -Nru thunderbird-140.9.0esr/gfx/2d/2D.h thunderbird-140.10.0esr/gfx/2d/2D.h --- thunderbird-140.9.0esr/gfx/2d/2D.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/2d/2D.h 2026-04-21 14:52:53.000000000 +0000 @@ -1195,6 +1195,7 @@ explicit FTUserFontData(const char* aFilename) : mFilename(aFilename) {} const uint8_t* FontData() const { return mFontData; } + uint32_t FontDataLength() const { return mLength; } already_AddRefed CloneFace( int aFaceIndex = 0) override; diff -Nru thunderbird-140.9.0esr/gfx/2d/DrawTargetSkia.cpp thunderbird-140.10.0esr/gfx/2d/DrawTargetSkia.cpp --- thunderbird-140.9.0esr/gfx/2d/DrawTargetSkia.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/2d/DrawTargetSkia.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -260,6 +260,14 @@ return nullptr; } + // Wrapper surfaces (e.g. SourceSurfaceOffset) can hand back the inner + // SourceSurfaceSkia here; route it through GetImage so copy-on-write + // snapshots are detached/locked rather than borrowing a raw pixel pointer + // that can outlive the originating SkSurface. + if (dataSurface->GetType() == SurfaceType::SKIA) { + return static_cast(dataSurface.get())->GetImage(aLock); + } + DataSourceSurface::MappedSurface map; void (*releaseProc)(const void*, void*); if (dataSurface->GetType() == SurfaceType::DATA_SHARED_WRAPPER) { diff -Nru thunderbird-140.9.0esr/gfx/2d/FilterNodeSoftware.cpp thunderbird-140.10.0esr/gfx/2d/FilterNodeSoftware.cpp --- thunderbird-140.9.0esr/gfx/2d/FilterNodeSoftware.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/2d/FilterNodeSoftware.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -3475,7 +3475,8 @@ uint8_t colorC[4]; }; - Float dot = -aVectorToLight.DotProduct(mVectorFromFocusPointToLight); + Float dot = std::clamp( + -aVectorToLight.DotProduct(mVectorFromFocusPointToLight), 0.0f, 1.0f); if (!mPowCache.HasPowerTable()) { dot *= (dot >= mLimitingConeCos); color = aLightColor; @@ -3484,7 +3485,7 @@ colorC[B8G8R8A8_COMPONENT_BYTEOFFSET_B] *= dot; } else { color = aLightColor; - uint16_t doti = dot * (dot >= 0) * (1 << PowCache::sInputIntPrecisionBits); + uint16_t doti = dot * (1 << PowCache::sInputIntPrecisionBits); uint32_t tmp = mPowCache.Pow(doti) * (dot >= mLimitingConeCos); MOZ_ASSERT(tmp <= (1 << PowCache::sOutputIntPrecisionBits), "pow() result must not exceed 1.0"); @@ -3757,9 +3758,8 @@ if (halfwayLength > 0) { halfwayVector /= halfwayLength; } - Float dotNH = aNormal.DotProduct(halfwayVector); - uint16_t dotNHi = - uint16_t(dotNH * (dotNH >= 0) * (1 << PowCache::sInputIntPrecisionBits)); + Float dotNH = std::clamp(aNormal.DotProduct(halfwayVector), 0.0f, 1.0f); + uint16_t dotNHi = uint16_t(dotNH * (1 << PowCache::sInputIntPrecisionBits)); // The exponent for specular is in [1,128] range, so we don't need to check // and optimize for the "default power table" scenario here. MOZ_ASSERT(mPowCache.HasPowerTable()); diff -Nru thunderbird-140.9.0esr/gfx/2d/FilterProcessingScalar.cpp thunderbird-140.10.0esr/gfx/2d/FilterProcessingScalar.cpp --- thunderbird-140.9.0esr/gfx/2d/FilterProcessingScalar.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/2d/FilterProcessingScalar.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -267,8 +267,8 @@ uint8_t alpha = uint8_t(255.f * aValue); for (int32_t y = 0; y < aSize.height; y++) { for (int32_t x = 0; x < aSize.width; x++) { - int32_t inputIndex = y * aSourceStride; - int32_t targetIndex = y * aTargetStride; + int32_t inputIndex = y * aSourceStride + x; + int32_t targetIndex = y * aTargetStride + x; aTargetData[targetIndex] = FastDivideBy255(aSourceData[inputIndex] * alpha); } diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h thunderbird-140.10.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h --- thunderbird-140.9.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/include/GLSLANG/ShaderVars.h 2026-04-21 14:52:53.000000000 +0000 @@ -12,6 +12,7 @@ #include #include +#include #include #include diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h thunderbird-140.10.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h --- thunderbird-140.9.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/out/gen/angle/angle_commit.h 2026-04-21 14:52:53.000000000 +0000 @@ -1,5 +1,5 @@ -#define ANGLE_COMMIT_HASH "419cd2c3213b" +#define ANGLE_COMMIT_HASH "b0098a1ebdb0" #define ANGLE_COMMIT_HASH_SIZE 12 -#define ANGLE_COMMIT_DATE "2024-07-29 14:40:59 -0700" -#define ANGLE_COMMIT_POSITION 19739 +#define ANGLE_COMMIT_DATE "2026-04-09 15:03:30 +0200" +#define ANGLE_COMMIT_POSITION 19751 #define ANGLE_HAS_BINARY_LOADING diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h --- thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/BaseTypes.h 2026-04-21 14:52:53.000000000 +0000 @@ -1591,6 +1591,9 @@ case EvqLocalInvocationIndex: return "LocalInvocationIndex"; case EvqReadOnly: return "readonly"; case EvqWriteOnly: return "writeonly"; + case EvqCoherent: return "coherent"; + case EvqRestrict: return "restrict"; + case EvqVolatile: return "volatile"; case EvqGeometryIn: return "in"; case EvqGeometryOut: return "out"; case EvqPerVertexIn: return "gl_in"; diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp --- thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/Compiler.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -686,6 +686,14 @@ // Desktop GLSL shaders don't have precision, so don't expect them to be specified. mValidateASTOptions.validatePrecision = !IsDesktopGLSpec(mShaderSpec); + // Disallow expressions deemed too complex. + // This needs to be checked before other functions that will traverse the AST + // to prevent potential stack overflow crashes. + if (compileOptions.limitExpressionComplexity && !limitExpressionComplexity(root)) + { + return false; + } + if (!validateAST(root)) { return false; @@ -709,12 +717,6 @@ } } - // Disallow expressions deemed too complex. - if (compileOptions.limitExpressionComplexity && !limitExpressionComplexity(root)) - { - return false; - } - if (shouldRunLoopAndIndexingValidation(compileOptions) && !ValidateLimitations(root, mShaderType, &mSymbolTable, &mDiagnostics)) { diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp --- thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -790,6 +790,14 @@ return true; } +void TParseContext::checkIsValidExpressionStatement(const TSourceLoc &line, TIntermTyped *expr) +{ + if (expr->isInterfaceBlock()) + { + error(line, "expression statement is not allowed for interface blocks", ""); + } +} + // ESSL 3.00.5 sections 3.8 and 3.9. // If it starts "gl_" or contains two consecutive underscores, it's reserved. // Also checks for "webgl_" and "_webgl_" reserved identifiers if parsing a webgl shader. @@ -950,6 +958,13 @@ "constructor"); return false; } + if (argTyped->getBasicType() == EbtInterfaceBlock) + { + error(line, + "an interface block cannot be used as a constructor argument for this type", + "constructor"); + return false; + } if (argTyped->getType().isArray()) { error(line, "constructing from a non-dereferenced array", "constructor"); @@ -1335,9 +1350,6 @@ (*variable) = new TVariable(&symbolTable, identifier, type, symbolType); - ASSERT(type->getLayoutQualifier().index == -1 || - (isExtensionEnabled(TExtension::EXT_blend_func_extended) && - mShaderType == GL_FRAGMENT_SHADER && mShaderVersion >= 300)); if (type->getQualifier() == EvqFragmentOut) { if (type->getLayoutQualifier().index != -1 && type->getLayoutQualifier().location == -1) @@ -3377,7 +3389,10 @@ typeQualifier.line); checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line); - symbolTable.addInvariantVarying(*variable); + if (typeQualifier.invariant) + { + symbolTable.addInvariantVarying(*variable); + } TIntermSymbol *intermSymbol = new TIntermSymbol(variable); intermSymbol->setLine(identifierLoc); @@ -4458,6 +4473,11 @@ { const TIntermTyped *element = arg->getAsTyped(); ASSERT(element); + if (element->getType().isUnsizedArray()) + { + error(line, "constructing from an unsized array", "constructor"); + return false; + } size_t dimensionalityFromElement = element->getType().getNumArraySizes() + 1u; if (dimensionalityFromElement > type.getNumArraySizes()) { @@ -5197,14 +5217,12 @@ int TParseContext::checkIndexLessThan(bool outOfRangeIndexIsError, const TSourceLoc &location, int index, - int arraySize, + unsigned int arraySize, const char *reason) { - // Should not reach here with an unsized / runtime-sized array. - ASSERT(arraySize > 0); // A negative index should already have been checked. ASSERT(index >= 0); - if (index >= arraySize) + if (static_cast(index) >= arraySize) { std::stringstream reasonStream = sh::InitializeStream(); reasonStream << reason << " '" << index << "'"; @@ -6396,6 +6414,11 @@ TIntermTyped *right, const TSourceLoc &loc) { + if (left->getBasicType() == EbtVoid || right->getBasicType() == EbtVoid) + { + error(loc, "operation with void operands", GetOperatorString(op)); + return false; + } // Check opaque types are not allowed to be operands in expressions other than array indexing // and structure member selection. if (IsOpaqueType(left->getBasicType()) || IsOpaqueType(right->getBasicType())) @@ -6842,6 +6865,10 @@ "sequence operator is not allowed for void, arrays, or structs containing arrays", ","); } + if (left->isInterfaceBlock() || right->isInterfaceBlock()) + { + error(loc, "sequence operator is not allowed for interface blocks", ","); + } TIntermBinary *commaNode = TIntermBinary::CreateComma(left, right, mShaderVersion); markStaticReadIfSymbol(left); @@ -7345,8 +7372,8 @@ return CreateZeroNode(TType(EbtInt, EbpUndefined, EvqConst)); } -TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunctionLookup *fnCall, - const TSourceLoc &loc) +TIntermTyped *TParseContext::addNonConstructorFunctionCallImpl(TFunctionLookup *fnCall, + const TSourceLoc &loc) { // First check whether the function has been hidden by a variable name or struct typename by // using the symbol looked up in the lexical phase. If the function is not hidden, look for one @@ -7408,10 +7435,7 @@ { // Treat it like a built-in unary operator. TIntermNode *unaryParamNode = fnCall->arguments().front(); - TIntermTyped *callNode = - createUnaryMath(op, unaryParamNode->getAsTyped(), loc, fnCandidate); - ASSERT(callNode != nullptr); - return callNode; + return createUnaryMath(op, unaryParamNode->getAsTyped(), loc, fnCandidate); } TIntermAggregate *callNode = @@ -7436,7 +7460,17 @@ error(loc, "no matching overloaded function found", fnCall->name()); } } + return nullptr; +} +TIntermTyped *TParseContext::addNonConstructorFunctionCall(TFunctionLookup *fnCall, + const TSourceLoc &loc) +{ + TIntermTyped *result = addNonConstructorFunctionCallImpl(fnCall, loc); + if (result != nullptr) + { + return result; + } // Error message was already written. Put on an unused node for error recovery. return CreateZeroNode(TType(EbtFloat, EbpMedium, EvqConst)); } diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h --- thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/ParseContext.h 2026-04-21 14:52:53.000000000 +0000 @@ -129,6 +129,7 @@ // Check functions - the ones that return bool return false if an error was generated. + void checkIsValidExpressionStatement(const TSourceLoc &line, TIntermTyped *expr); bool checkIsNotReserved(const TSourceLoc &line, const ImmutableString &identifier); void checkPrecisionSpecified(const TSourceLoc &line, TPrecision precision, TBasicType type); bool checkCanBeLValue(const TSourceLoc &line, const char *op, TIntermTyped *node); @@ -538,7 +539,7 @@ int checkIndexLessThan(bool outOfRangeIndexIsError, const TSourceLoc &location, int index, - int arraySize, + unsigned int arraySize, const char *reason); bool declareVariable(const TSourceLoc &line, @@ -651,6 +652,7 @@ TIntermTyped *addMethod(TFunctionLookup *fnCall, const TSourceLoc &loc); TIntermTyped *addConstructor(TFunctionLookup *fnCall, const TSourceLoc &line); + TIntermTyped *addNonConstructorFunctionCallImpl(TFunctionLookup *fnCall, const TSourceLoc &loc); TIntermTyped *addNonConstructorFunctionCall(TFunctionLookup *fnCall, const TSourceLoc &loc); // Return either the original expression or the folded version of the expression in case the diff -Nru thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp --- thunderbird-140.9.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/checkout/src/compiler/translator/glslang_tab_autogen.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -862,9 +862,9 @@ 1330, 1333, 1336, 1339, 1342, 1350, 1358, 1366, 1374, 1382, 1390, 1400, 1410, 1420, 1423, 1430, 1437, 1444, 1447, 1455, 1455, 1458, 1458, 1464, 1467, 1473, 1476, 1483, 1487, 1493, 1496, 1502, 1506, 1510, 1511, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1527, 1531, 1531, 1531, 1538, 1539, - 1543, 1543, 1544, 1544, 1549, 1553, 1560, 1564, 1571, 1572, 1576, 1582, 1586, 1595, 1595, 1602, - 1605, 1611, 1615, 1621, 1621, 1626, 1626, 1630, 1630, 1638, 1641, 1647, 1650, 1656, 1660, 1667, - 1670, 1673, 1676, 1679, 1687, 1693, 1699, 1702, 1708, 1708}; + 1543, 1543, 1544, 1544, 1549, 1553, 1560, 1564, 1571, 1572, 1579, 1585, 1589, 1598, 1598, 1605, + 1608, 1614, 1618, 1624, 1624, 1629, 1629, 1633, 1633, 1641, 1644, 1650, 1653, 1659, 1663, 1670, + 1673, 1676, 1679, 1682, 1690, 1696, 1702, 1705, 1711, 1711}; #endif /** Accessing symbol of state STATE. */ @@ -4483,6 +4483,7 @@ case 297: /* expression_statement: expression SEMICOLON */ { + context->checkIsValidExpressionStatement((yyloc), (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermNode) = (yyvsp[-1].interm.intermTypedNode); } break; diff -Nru thunderbird-140.9.0esr/gfx/angle/cherry_picks.txt thunderbird-140.10.0esr/gfx/angle/cherry_picks.txt --- thunderbird-140.9.0esr/gfx/angle/cherry_picks.txt 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/angle/cherry_picks.txt 2026-04-21 14:52:53.000000000 +0000 @@ -1,4 +1,10 @@ -commit 419cd2c3213b594f8e2488bf48034fed20ace81d +commit b0098a1ebdb0400b515ff7a662685bda111e9e87 +Author: Emilio Cobos Álvarez +Date: Thu Apr 9 15:03:30 2026 +0200 + + Add a missing change to 7918168436578718b234bfd56da152e34a85af1d that is in Gecko. + +commit 442302a3b7ae7cca7f85524e6bb3d774a10b6fbc Author: Shahbaz Youssefi Date: Mon Mar 27 13:05:36 2023 -0400 @@ -15,6 +21,198 @@ Reviewed-by: Kenneth Russell Commit-Queue: Shahbaz Youssefi +commit 4f5c3dbc01f70efbaaed41743893ed2c8a7653cd +Author: Emilio Cobos Álvarez +Date: Thu Apr 9 13:40:10 2026 +0200 + + Add missing codegen from #27. + +commit be5a7593658365659dfc6384a95c44406e4e5d9e +Author: Kimmo Kinnunen +Date: Thu Oct 24 11:46:54 2024 +0300 + + Disallow discarded uniform block references + + Uniform block instances cannot be used by themselves, as there + is no way to refer to their type. Disallow the only typeless + access pattern, discarding via expression statement: + + uniform MyBlock { int x; } b; + void main() { + b; + 0, b; + } + + Explained as disallowed in newer GLSL 300: + https://github.com/KhronosGroup/WebGL/issues/3644 + + The comma expression form would ASSERT in CollectVariables. + + Bug: angleproject:42267026 + Change-Id: I6c8b835482fd551bd97576c1bd24f005874da6af + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5961498 + Reviewed-by: Alexey Knyazev + Reviewed-by: Geoff Lang + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Kimmo Kinnunen + +commit 329044148ea14623910a1b33a4f1fd81445fd21e +Author: Scott Marcy +Date: Thu May 30 11:36:58 2024 -0600 + + Fix stack overflow crash by traversing a too-deep AST + + This simply moves the check for a too-deep AST before the first attempts + to traverse the AST (i.e., `validateAST()`). + + Bug: angleproject:343505104 + Change-Id: Iafb658a30f74a666beab8c69745ca53d17d70dd3 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5585186 + Reviewed-by: Shahbaz Youssefi + Reviewed-by: Kimmo Kinnunen + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Scott M + +commit 28669be7c0129fa7ed117f730484db302a39bcb2 +Author: Nisha Jain +Date: Thu Mar 7 14:19:58 2024 +0200 + + Avoid asserts when const folding binary ops on void variables + + Fix asserts for example with / and % during constant folding when + the operands might be voids. + + Bug: angleproject:8592 + Change-Id: I22275642dbcdf9066940d3a94114e8daa5cbbe41 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5416376 + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Geoff Lang + Reviewed-by: Geoff Lang + Reviewed-by: Kimmo Kinnunen + +commit ebaab5cd66b66183175f8c5d5f72210afcba38ca +Author: Kimmo Kinnunen +Date: Fri Mar 8 14:26:56 2024 +0200 + + Check array index against unsigned array size + + Fix an assert during GLSL parsing when a very + large array (~1U) type is indexed. + + Bug: angleproject:8596 + Change-Id: I219ac5c8f3fa58aa4c7d679eade6f32b59eb1103 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5352653 + Auto-Submit: Kimmo Kinnunen + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + +commit 5a3f53d8bff0709e94e9b5c2a97684c9a012f6f6 +Author: Erica Li +Date: Fri Mar 8 12:40:09 2024 +0200 + + Avoid assert with multiple memory qualifiers + + Add missing qualifier strings. + + Bug: angleproject:8593 + Change-Id: I484571c33effd85d52712b4876f6a3a5c73d8fde + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5352255 + Reviewed-by: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Shahbaz Youssefi + +commit f95d411e7d0c5cfb4b0dfef2ecadb952cc92b06a +Author: Kimmo Kinnunen +Date: Tue Mar 5 21:42:32 2024 +0200 + + Ensure unary math op parse to an node on error + + Return the error node for ops like radians(). + The math op parse can fail in multiple ways. + + Fixed: angleproject:8583 + Change-Id: Ief7e150dffefe711f567d95c62d1023fc7fa1c91 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5344716 + Reviewed-by: Kenneth Russell + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Kenneth Russell + +commit 386e3783a143a5268df86bdf93cd10892419f395 +Author: Kimmo Kinnunen +Date: Mon Mar 4 14:43:10 2024 +0200 + + Fix layout(index=) parse assert on es 100 shaders + + Remove invalid assert about layout index qualifier being present only if + EXT_blend_func_extended is present. + + The layout qualifier gets parsed to support EXT_shader_framebuffer_fetch + in ES 100 shaders to support + "layout(incoherent) mediump vec4 gl_FragData[gl_MaxDrawBuffers]" + + Fixed: angleproject:8570 + Change-Id: I0d0d99bcc882a0befd97c2510dec4a8ccf1690bd + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5340249 + Reviewed-by: Kenneth Russell + Commit-Queue: Kenneth Russell + Auto-Submit: Kimmo Kinnunen + +commit abe9de5edc89a3db4188c8ddf52e61f6820ecebd +Author: Kimmo Kinnunen +Date: Fri Feb 16 22:28:18 2024 +0200 + + Fix ASSERT in non-global precise var decls + + Precise was treated as invariant. Precise can be + declared for non-global variables. + + Bug: angleproject:8550 + Change-Id: Ia0d00d67d0d1504b78294ee2256785fe3da3e399 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5300976 + Commit-Queue: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Reviewed-by: Shahbaz Youssefi + Reviewed-by: Kenneth Russell + +commit 718164d445a82bd24da61ff670deb5f1702fbfc3 +Author: Kimmo Kinnunen +Date: Tue Feb 13 17:54:12 2024 +0200 + + Uniform block reference in constuctors crash + + Passing uniform block instance name to a built-in constructor would + cause type confusion. Block this by failing to parse. + + Bug: angleproject:8533 + Change-Id: I5a676b41e2f3d766ece4ed472debc1c874753293 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5290897 + Commit-Queue: Shahbaz Youssefi + Reviewed-by: Shahbaz Youssefi + Commit-Queue: Kimmo Kinnunen + Auto-Submit: Kimmo Kinnunen + +commit a7ce496eaa3ac8f108190ca544e00024edead840 +Author: Kimmo Kinnunen +Date: Wed Feb 7 14:25:32 2024 +0200 + + Fix an assert on multidim array constructors + + Fail early instead of asserting when trying to parse a + multidimensional array constructor call with unsized + argument array argument. + + int A[]; + int B[int[][](A)]; + + Bug: angleproject:8519 + Change-Id: Iee2c70318eebd2def57ffab8db709d1076692922 + Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5272434 + Reviewed-by: Shahbaz Youssefi + Auto-Submit: Kimmo Kinnunen + Commit-Queue: Kimmo Kinnunen + Commit-Queue: Shahbaz Youssefi + commit 7918168436578718b234bfd56da152e34a85af1d Author: Kelsey Gilbert Date: Tue Jun 4 15:37:29 2024 -0700 diff -Nru thunderbird-140.9.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c thunderbird-140.10.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c --- thunderbird-140.9.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/cairo/cairo/src/cairo-cff-subset.c 2026-04-21 14:52:53.000000000 +0000 @@ -930,6 +930,8 @@ if (operand) { decode_integer (operand, &offset); p = ptr + offset; + if (unlikely (p < font->data || p > font->data_end)) + return CAIRO_INT_STATUS_UNSUPPORTED; status = cff_index_read (local_sub_index, &p, font->data_end); if (unlikely (status)) return status; @@ -1866,6 +1868,10 @@ } fd = font->fdselect[gid]; + if (fd < 0 || (unsigned int) fd >= font->num_fontdicts) { + free (reverse_map); + return CAIRO_INT_STATUS_UNSUPPORTED; + } if (reverse_map[fd] < 0) { font->fd_subset_map[font->num_subset_fontdicts] = fd; reverse_map[fd] = font->num_subset_fontdicts++; diff -Nru thunderbird-140.9.0esr/gfx/gl/GLBlitHelper.cpp thunderbird-140.10.0esr/gfx/gl/GLBlitHelper.cpp --- thunderbird-140.9.0esr/gfx/gl/GLBlitHelper.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/gl/GLBlitHelper.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -359,7 +359,7 @@ mTexUnits(texUnits), mTexTarget(texTarget), mOldTexUnit(mGL.GetIntAs(LOCAL_GL_ACTIVE_TEXTURE)) { - MOZ_RELEASE_ASSERT(texUnits >= 1); + MOZ_RELEASE_ASSERT(texUnits >= 1 && texUnits <= std::size(mOldTex)); GLenum texBinding; switch (mTexTarget) { @@ -944,6 +944,9 @@ case layers::SurfaceDescriptor::TSurfaceDescriptorDMABuf: { const auto& sd = asd.get_SurfaceDescriptorDMABuf(); RefPtr surface = DMABufSurface::CreateDMABufSurface(sd); + if (!surface) { + return false; + } return Blit(surface, destSize, destOrigin); } #endif @@ -1544,6 +1547,12 @@ const DrawBlitProg::YUVArgs* pYuvArgs = nullptr; const auto planes = surface->GetTextureCount(); + // The shaders used below currently only support 1-3 planes. + if (planes < 1 || planes > 3) { + gfxCriticalError() << "Unexpected DMABuf planes count: " << planes; + return false; + } + // - // Ensure textures for all planes have been created. diff -Nru thunderbird-140.9.0esr/gfx/gl/GLLibraryEGL.cpp thunderbird-140.10.0esr/gfx/gl/GLLibraryEGL.cpp --- thunderbird-140.9.0esr/gfx/gl/GLLibraryEGL.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/gl/GLLibraryEGL.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -810,7 +810,9 @@ const auto ret = std::make_shared(PrivateUseOnly{}, lib, display, isWarp); - lib.mActiveDisplays.insert({display, ret}); + // Insert if there is no existing display entry, or assign if there is an + // expired weak_ptr that failed to lock above and was awaiting removal. + lib.mActiveDisplays.insert_or_assign(display, ret); return ret; } @@ -858,6 +860,13 @@ EglDisplay::~EglDisplay() { StaticMutexAutoLock lock(GLLibraryEGL::sMutex); + // EglDisplay is being destructed, so its weak_ptr should be expired. If there + // is an entry that is still live, it means a new EGLDisplay was subsequently + // created that needs to use this display, so avoid terminating it. + const auto itr = mLib->mActiveDisplays.find(mDisplay); + if (itr != mLib->mActiveDisplays.end() && !itr->second.expired()) { + return; + } fTerminate(); mLib->mActiveDisplays.erase(mDisplay); } diff -Nru thunderbird-140.9.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh thunderbird-140.10.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh --- thunderbird-140.9.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/harfbuzz/src/hb-aat-layout-morx-table.hh 2026-04-21 14:52:53.000000000 +0000 @@ -987,9 +987,16 @@ { unsigned count = chain.get_subtable_count (); - unsigned size = sizeof (hb_aat_layout_chain_accelerator_t) - - HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t) + - count * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t); + unsigned product; + if (unlikely (hb_unsigned_mul_overflows (count, + sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), &product))) + return nullptr; + + unsigned size; + if (unlikely (hb_unsigned_add_overflows (sizeof (hb_aat_layout_chain_accelerator_t) - + HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), product, &size))) { + return nullptr; + } /* The following is a calloc because when we are collecting subtables, * some of them might be invalid and hence not collect; as a result, diff -Nru thunderbird-140.9.0esr/gfx/harfbuzz/src/moz.build thunderbird-140.10.0esr/gfx/harfbuzz/src/moz.build --- thunderbird-140.9.0esr/gfx/harfbuzz/src/moz.build 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/harfbuzz/src/moz.build 2026-04-21 14:52:53.000000000 +0000 @@ -131,12 +131,13 @@ DEFINES['HB_NO_UCD'] = True DEFINES['HB_NO_UNICODE_FUNCS'] = True -# On Android, we want to use harfbuzz's mmap support for file access, +# We want to use harfbuzz's mmap support for file access, # so we need to set the appropriate configuration flags as we're not # running harfbuzz's own configure script. -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': +if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'windows': DEFINES['HAVE_MMAP'] = 1 DEFINES['HAVE_SYS_MMAN_H'] = 1 + DEFINES['HAVE_UNISTD_H'] = 1 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['UNICODE'] = True diff -Nru thunderbird-140.9.0esr/gfx/ipc/CanvasShutdownManager.cpp thunderbird-140.10.0esr/gfx/ipc/CanvasShutdownManager.cpp --- thunderbird-140.9.0esr/gfx/ipc/CanvasShutdownManager.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/CanvasShutdownManager.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -31,10 +31,21 @@ CanvasShutdownManager::CanvasShutdownManager() = default; CanvasShutdownManager::~CanvasShutdownManager() = default; +std::vector> +CanvasShutdownManager::RefActiveCanvas() const { + std::vector> activeCanvas; + activeCanvas.reserve(mActiveCanvas.size()); + for (const auto& canvas : mActiveCanvas) { + activeCanvas.emplace_back(canvas); + } + return activeCanvas; +} + void CanvasShutdownManager::Destroy() { - std::set activeCanvas = std::move(mActiveCanvas); - for (const auto& i : activeCanvas) { - i->OnShutdown(); + auto activeCanvas = RefActiveCanvas(); + mActiveCanvas.clear(); + for (const auto& canvas : activeCanvas) { + canvas->OnShutdown(); } CanvasManagerChild::Shutdown(); @@ -121,17 +132,13 @@ } void CanvasShutdownManager::OnRemoteCanvasLost() { - // Note that the canvas cannot do anything that mutates our state. It will - // dispatch for anything that risks re-entrancy. - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { canvas->OnRemoteCanvasLost(); } } void CanvasShutdownManager::OnRemoteCanvasRestored() { - // Note that the canvas cannot do anything that mutates our state. It will - // dispatch for anything that risks re-entrancy. - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { canvas->OnRemoteCanvasRestored(); } } @@ -142,7 +149,7 @@ return; } - for (const auto& canvas : mActiveCanvas) { + for (const auto& canvas : RefActiveCanvas()) { auto* bufferProvider = canvas->GetBufferProvider(); if (!bufferProvider) { continue; diff -Nru thunderbird-140.9.0esr/gfx/ipc/CanvasShutdownManager.h thunderbird-140.10.0esr/gfx/ipc/CanvasShutdownManager.h --- thunderbird-140.9.0esr/gfx/ipc/CanvasShutdownManager.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/CanvasShutdownManager.h 2026-04-21 14:52:53.000000000 +0000 @@ -11,6 +11,7 @@ #include "mozilla/ThreadLocal.h" #include "mozilla/layers/LayersTypes.h" #include +#include namespace mozilla { namespace dom { @@ -44,6 +45,8 @@ ~CanvasShutdownManager(); void Destroy(); + std::vector> RefActiveCanvas() const; + static void MaybeRestoreRemoteCanvas(); RefPtr mWorkerRef; diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUChild.cpp thunderbird-140.10.0esr/gfx/ipc/GPUChild.cpp --- thunderbird-140.9.0esr/gfx/ipc/GPUChild.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -177,7 +177,8 @@ mozilla::ipc::IPCResult GPUChild::RecvCreateVRProcess() { // Make sure create VR process at the main process MOZ_ASSERT(XRE_IsParentProcess()); - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRProcessManager::Initialize(); VRProcessManager* vr = VRProcessManager::Get(); MOZ_ASSERT(vr, "VRProcessManager must be initialized first."); @@ -193,19 +194,20 @@ mozilla::ipc::IPCResult GPUChild::RecvShutdownVRProcess() { // Make sure stopping VR process at the main process MOZ_ASSERT(XRE_IsParentProcess()); - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRProcessManager::Shutdown(); } return IPC_OK(); } -mozilla::ipc::IPCResult GPUChild::RecvNotifyUiObservers( - const nsCString& aTopic) { +mozilla::ipc::IPCResult GPUChild::RecvFlushActiveCheckerboardReportsDone() { nsCOMPtr obsSvc = mozilla::services::GetObserverService(); MOZ_ASSERT(obsSvc); if (obsSvc) { - obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr); + obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard:Done", + nullptr); } return IPC_OK(); } @@ -288,25 +290,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PGPUChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (GPUProcessManager* gpm = GPUProcessManager::Get()) { - if (GPUChild* child = gpm->GetGPUChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PGPUChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (GPUProcessManager* gpm = GPUProcessManager::Get()) { + if (GPUChild* child = gpm->GetGPUChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (GPUProcessManager* gpm = GPUProcessManager::Get()) { - if (GPUChild* child = gpm->GetGPUChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (GPUProcessManager* gpm = GPUProcessManager::Get()) { + if (GPUChild* child = gpm->GetGPUChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUChild.h thunderbird-140.10.0esr/gfx/ipc/GPUChild.h --- thunderbird-140.9.0esr/gfx/ipc/GPUChild.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -79,7 +79,7 @@ void ActorDestroy(ActorDestroyReason aWhy) override; mozilla::ipc::IPCResult RecvGraphicsError(const nsCString& aError); - mozilla::ipc::IPCResult RecvNotifyUiObservers(const nsCString& aTopic); + mozilla::ipc::IPCResult RecvFlushActiveCheckerboardReportsDone(); mozilla::ipc::IPCResult RecvNotifyDeviceReset( const GPUDeviceData& aData, const DeviceResetReason& aReason, const DeviceResetDetectPlace& aPlace); diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUParent.cpp thunderbird-140.10.0esr/gfx/ipc/GPUParent.cpp --- thunderbird-140.9.0esr/gfx/ipc/GPUParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -655,12 +655,11 @@ return IPC_OK(); } -mozilla::ipc::IPCResult GPUParent::RecvNotifyGpuObservers( - const nsCString& aTopic) { +mozilla::ipc::IPCResult GPUParent::RecvFlushActiveCheckerboardReports() { nsCOMPtr obsSvc = mozilla::services::GetObserverService(); MOZ_ASSERT(obsSvc); if (obsSvc) { - obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr); + obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard", nullptr); } return IPC_OK(); } @@ -697,7 +696,8 @@ } mozilla::ipc::IPCResult GPUParent::RecvShutdownVR() { - if (StaticPrefs::dom_vr_process_enabled_AtStartup()) { + if (StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled()) { VRGPUChild::Shutdown(); } return IPC_OK(); diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUParent.h thunderbird-140.10.0esr/gfx/ipc/GPUParent.h --- thunderbird-140.9.0esr/gfx/ipc/GPUParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUParent.h 2026-04-21 14:52:53.000000000 +0000 @@ -95,7 +95,7 @@ const LayerTreeIdMapping& aMapping); mozilla::ipc::IPCResult RecvRemoveLayerTreeIdMapping( const LayerTreeIdMapping& aMapping); - mozilla::ipc::IPCResult RecvNotifyGpuObservers(const nsCString& aTopic); + mozilla::ipc::IPCResult RecvFlushActiveCheckerboardReports(); mozilla::ipc::IPCResult RecvRequestMemoryReport( const uint32_t& generation, const bool& anonymize, const bool& minimizeMemoryUsage, diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUProcessManager.cpp thunderbird-140.10.0esr/gfx/ipc/GPUProcessManager.cpp --- thunderbird-140.9.0esr/gfx/ipc/GPUProcessManager.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUProcessManager.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1640,12 +1640,11 @@ mListeners.RemoveElement(aListener); } -bool GPUProcessManager::NotifyGpuObservers(const char* aTopic) { +bool GPUProcessManager::FlushActiveCheckerboardReports() { if (NS_FAILED(EnsureGPUReady())) { return false; } - nsCString topic(aTopic); - mGPUChild->SendNotifyGpuObservers(topic); + mGPUChild->SendFlushActiveCheckerboardReports(); return true; } diff -Nru thunderbird-140.9.0esr/gfx/ipc/GPUProcessManager.h thunderbird-140.10.0esr/gfx/ipc/GPUProcessManager.h --- thunderbird-140.9.0esr/gfx/ipc/GPUProcessManager.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GPUProcessManager.h 2026-04-21 14:52:53.000000000 +0000 @@ -180,9 +180,9 @@ void AddListener(GPUProcessListener* aListener); void RemoveListener(GPUProcessListener* aListener); - // Send a message to the GPU process observer service to broadcast. Returns - // true if the message was sent, false if not. - bool NotifyGpuObservers(const char* aTopic); + // Send a message to the GPU process to flush any active checkerboard reports. + // Returns true if the message was sent, false if not. + bool FlushActiveCheckerboardReports(); // Kills the GPU process. Used in normal operation to recover from an error, // as well as for tests and diagnostics. diff -Nru thunderbird-140.9.0esr/gfx/ipc/GfxMessageUtils.h thunderbird-140.10.0esr/gfx/ipc/GfxMessageUtils.h --- thunderbird-140.9.0esr/gfx/ipc/GfxMessageUtils.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/GfxMessageUtils.h 2026-04-21 14:52:53.000000000 +0000 @@ -19,6 +19,7 @@ #include "gfxTelemetry.h" #include "gfxTypes.h" #include "ipc/EnumSerializer.h" +#include "mozilla/EnumTypeTraits.h" #include "ipc/IPCMessageUtilsSpecializations.h" #include "mozilla/gfx/CrossProcessPaint.h" #include "mozilla/gfx/FileHandleWrapper.h" @@ -259,6 +260,36 @@ mozilla::gfx::ColorSpace::SRGB, mozilla::gfx::ColorSpace::Max> {}; +template +using GfxEnumSerializer = + ContiguousEnumSerializerInclusive::min, + mozilla::ContiguousEnumValues::max>; + +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; +template <> +struct ParamTraits + : public GfxEnumSerializer {}; + template <> struct ParamTraits : public ContiguousEnumSerializerInclusive< diff -Nru thunderbird-140.9.0esr/gfx/ipc/PGPU.ipdl thunderbird-140.10.0esr/gfx/ipc/PGPU.ipdl --- thunderbird-140.9.0esr/gfx/ipc/PGPU.ipdl 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ipc/PGPU.ipdl 2026-04-21 14:52:53.000000000 +0000 @@ -104,9 +104,7 @@ // the GPU process. This blocks until one is available (i.e., Init has completed). async SimulateDeviceReset(); - // Have a message be broadcasted to the GPU process by the GPU process - // observer service. - async NotifyGpuObservers(nsCString aTopic); + async FlushActiveCheckerboardReports(); async RequestMemoryReport(uint32_t generation, bool anonymize, @@ -153,9 +151,7 @@ async CreateVRProcess(); async ShutdownVRProcess(); - // Have a message be broadcasted to the UI process by the UI process - // observer service. - async NotifyUiObservers(nsCString aTopic); + async FlushActiveCheckerboardReportsDone(); // Messages for reporting telemetry to the UI process. async AccumulateChildHistograms(HistogramAccumulation[] accumulations); diff -Nru thunderbird-140.9.0esr/gfx/layers/BufferTexture.cpp thunderbird-140.10.0esr/gfx/layers/BufferTexture.cpp --- thunderbird-140.9.0esr/gfx/layers/BufferTexture.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/BufferTexture.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -175,8 +175,8 @@ aYUVColorSpace, aColorRange, aSubsampling); return CreateInternal( - aAllocator ? aAllocator->GetTextureForwarder() : nullptr, descriptor, - gfx::BackendType::NONE, bufSize, aTextureFlags); + aAllocator ? aAllocator->GetTextureForwarder().get() : nullptr, + descriptor, gfx::BackendType::NONE, bufSize, aTextureFlags); } void BufferTextureData::FillInfo(TextureData::Info& aInfo) const { diff -Nru thunderbird-140.9.0esr/gfx/layers/D3D11ShareHandleImage.cpp thunderbird-140.10.0esr/gfx/layers/D3D11ShareHandleImage.cpp --- thunderbird-140.9.0esr/gfx/layers/D3D11ShareHandleImage.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/D3D11ShareHandleImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -141,8 +141,8 @@ } data->mColorSpace = mColorSpace; data->SetColorRange(mColorRange); - return MakeAndAddRef(data, mTextureFlags, - aAllocator->GetTextureForwarder()); + return MakeAndAddRef( + data, mTextureFlags, aAllocator->GetTextureForwarder().get()); } private: diff -Nru thunderbird-140.9.0esr/gfx/layers/D3D11YCbCrImage.cpp thunderbird-140.10.0esr/gfx/layers/D3D11YCbCrImage.cpp --- thunderbird-140.9.0esr/gfx/layers/D3D11YCbCrImage.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/D3D11YCbCrImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -81,7 +81,7 @@ hr = mDevice->CreateTexture2D(&newDesc, nullptr, getter_AddRefs(textureCr)); NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr); - TextureForwarder* forwarder = + RefPtr forwarder = aAllocator ? aAllocator->GetTextureForwarder() : nullptr; return TextureClient::CreateWithData( diff -Nru thunderbird-140.9.0esr/gfx/layers/DMABUFSurfaceImage.cpp thunderbird-140.10.0esr/gfx/layers/DMABUFSurfaceImage.cpp --- thunderbird-140.9.0esr/gfx/layers/DMABUFSurfaceImage.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/DMABUFSurfaceImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -65,7 +65,7 @@ BackendType backend = BackendType::NONE; mTextureClient = TextureClient::CreateWithData( DMABUFTextureData::Create(mSurface, backend), TextureFlags::DEFAULT, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); } return mTextureClient; } diff -Nru thunderbird-140.9.0esr/gfx/layers/DcompSurfaceImage.cpp thunderbird-140.10.0esr/gfx/layers/DcompSurfaceImage.cpp --- thunderbird-140.9.0esr/gfx/layers/DcompSurfaceImage.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/DcompSurfaceImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -34,7 +34,7 @@ KnowsCompositor* aKnowsCompositor) { RefPtr textureClient = MakeAndAddRef( new DcompSurfaceTexture(aHandle, aSize, aFormat), TextureFlags::NO_FLAGS, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); return textureClient.forget(); } @@ -106,7 +106,12 @@ return; } MOZ_ASSERT(mHandle); - MOZ_ASSERT(aImageKeys.length() == 1); + + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + auto method = aOp == TextureHost::ADD_IMAGE ? &wr::TransactionBuilder::AddExternalImage : &wr::TransactionBuilder::UpdateExternalImage; @@ -137,7 +142,10 @@ return; } LOG("DcompSurfaceHandleHost %p PushDisplayItems", this); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage( aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), diff -Nru thunderbird-140.9.0esr/gfx/layers/ImageDataSerializer.cpp thunderbird-140.10.0esr/gfx/layers/ImageDataSerializer.cpp --- thunderbird-140.9.0esr/gfx/layers/ImageDataSerializer.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ImageDataSerializer.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -330,6 +330,10 @@ return nullptr; } + if (!aBuffer) { + return nullptr; + } + layers::PlanarYCbCrData ycbcrData; ycbcrData.mYChannel = GetYChannel(aBuffer, aDescriptor); ycbcrData.mYStride = aDescriptor.yStride(); diff -Nru thunderbird-140.9.0esr/gfx/layers/MacIOSurfaceImage.cpp thunderbird-140.10.0esr/gfx/layers/MacIOSurfaceImage.cpp --- thunderbird-140.9.0esr/gfx/layers/MacIOSurfaceImage.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/MacIOSurfaceImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -27,7 +27,7 @@ IsDRM() ? TextureFlags::DRM_SOURCE : TextureFlags::DEFAULT; mTextureClient = TextureClient::CreateWithData( MacIOSurfaceTextureData::Create(mSurface, backend), flags, - aKnowsCompositor->GetTextureForwarder()); + aKnowsCompositor->GetTextureForwarder().get()); } return mTextureClient; } diff -Nru thunderbird-140.9.0esr/gfx/layers/RemoteTextureMap.cpp thunderbird-140.10.0esr/gfx/layers/RemoteTextureMap.cpp --- thunderbird-140.9.0esr/gfx/layers/RemoteTextureMap.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/RemoteTextureMap.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1305,7 +1305,7 @@ return false; } - auto* owner = GetTextureOwner(lock, aInfo.mOwnerId, aInfo.mForPid); + owner = GetTextureOwner(lock, aInfo.mOwnerId, aInfo.mForPid); // When owner is alreay unregistered, remote texture will not be pushed. if (!owner || owner->mIsContextLost) { // This could happen with IPC abnormal shutdown diff -Nru thunderbird-140.9.0esr/gfx/layers/ScreenshotGrabber.cpp thunderbird-140.10.0esr/gfx/layers/ScreenshotGrabber.cpp --- thunderbird-140.9.0esr/gfx/layers/ScreenshotGrabber.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ScreenshotGrabber.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -154,10 +154,14 @@ return; } + if (aWindowSize.IsEmpty() || mBufferSize.IsEmpty()) { + return; + } + Size windowSize(aWindowSize); float scale = std::min(mBufferSize.width / windowSize.width, mBufferSize.height / windowSize.height); - IntSize scaledSize = IntSize::Round(windowSize * scale); + IntSize scaledSize = Max(IntSize::Round(windowSize * scale), IntSize(1, 1)); RefPtr scaledTarget = ScaleDownWindowRenderSourceToSize( aWindow, scaledSize, windowRenderSource, 0); diff -Nru thunderbird-140.9.0esr/gfx/layers/SourceSurfaceSharedData.cpp thunderbird-140.10.0esr/gfx/layers/SourceSurfaceSharedData.cpp --- thunderbird-140.9.0esr/gfx/layers/SourceSurfaceSharedData.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/SourceSurfaceSharedData.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -83,9 +83,11 @@ auto computedStride = CheckedInt(mSize.width) * BytesPerPixel(mFormat); + auto computedLength = CheckedInt(mSize.height) * mStride; if (mSize.width < 0 || mSize.height < 0 || mStride < 0 || - !computedStride.isValid() || mStride < computedStride.value() || - !image::SurfaceCache::IsLegalSize(mSize) || + !computedStride.isValid() || computedStride.value() <= 0 || + mStride < computedStride.value() || !computedLength.isValid() || + computedLength.value() <= 0 || !image::SurfaceCache::IsLegalSize(mSize) || mBufHandle.Size() < GetAlignedDataLength()) { return false; } diff -Nru thunderbird-140.9.0esr/gfx/layers/apz/src/APZCTreeManager.cpp thunderbird-140.10.0esr/gfx/layers/apz/src/APZCTreeManager.cpp --- thunderbird-140.9.0esr/gfx/layers/apz/src/APZCTreeManager.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/apz/src/APZCTreeManager.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -216,8 +216,7 @@ } if (XRE_IsGPUProcess()) { if (gfx::GPUParent* gpu = gfx::GPUParent::GetSingleton()) { - nsCString topic("APZ:FlushActiveCheckerboard:Done"); - Unused << gpu->SendNotifyUiObservers(topic); + Unused << gpu->SendFlushActiveCheckerboardReportsDone(); } } else { MOZ_ASSERT(XRE_IsParentProcess()); diff -Nru thunderbird-140.9.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp thunderbird-140.10.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp --- thunderbird-140.9.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/apz/util/CheckerboardReportService.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -202,7 +202,7 @@ void CheckerboardReportService::FlushActiveReports() { MOZ_ASSERT(XRE_IsParentProcess()); gfx::GPUProcessManager* gpu = gfx::GPUProcessManager::Get(); - if (gpu && gpu->NotifyGpuObservers("APZ:FlushActiveCheckerboard")) { + if (gpu && gpu->FlushActiveCheckerboardReports()) { return; } diff -Nru thunderbird-140.9.0esr/gfx/layers/client/ImageClient.cpp thunderbird-140.10.0esr/gfx/layers/client/ImageClient.cpp --- thunderbird-140.9.0esr/gfx/layers/client/ImageClient.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/client/ImageClient.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -118,7 +118,7 @@ typedImage->GetOriginPos(), typedImage->GetHasAlpha(), typedImage->GetForceBT709ColorSpace(), typedImage->GetTransformOverride(), - aKnowsCompositor->GetTextureForwarder(), TextureFlags::DEFAULT); + aKnowsCompositor->GetTextureForwarder().get(), TextureFlags::DEFAULT); #endif } else { RefPtr surface = aImage->GetAsSourceSurface(); diff -Nru thunderbird-140.9.0esr/gfx/layers/client/TextureClient.cpp thunderbird-140.10.0esr/gfx/layers/client/TextureClient.cpp --- thunderbird-140.9.0esr/gfx/layers/client/TextureClient.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/client/TextureClient.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1180,8 +1180,8 @@ } bool TextureClient::InitIPDLActor(CompositableForwarder* aForwarder) { - MOZ_ASSERT(aForwarder && aForwarder->GetTextureForwarder()->GetThread() == - mAllocator->GetThread()); + RefPtr textureFwd = aForwarder->GetTextureForwarder(); + MOZ_ASSERT(aForwarder && textureFwd->GetThread() == mAllocator->GetThread()); if (mActor && !mActor->IPCOpen()) { return false; @@ -1189,7 +1189,6 @@ if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; - TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd != aForwarder) { // It's a bit iffy but right now ShadowLayerForwarder inherits // TextureForwarder even though it should not. @@ -1197,7 +1196,8 @@ // the CompositorBridgeChild. It's Ok for a texture to move from a // ShadowLayerForwarder to another, but not form a CompositorBridgeChild // to another (they use different channels). - if (currentTexFwd && currentTexFwd != aForwarder->GetTextureForwarder()) { + if (mActor->mTextureForwarder && + mActor->mTextureForwarder != textureFwd) { gfxCriticalError() << "Attempt to move a texture to a different channel CF."; MOZ_ASSERT_UNREACHABLE("unexpected to be called"); @@ -1211,8 +1211,7 @@ return false; } mActor->mCompositableForwarder = aForwarder; - mActor->mUsesImageBridge = - aForwarder->GetTextureForwarder()->UsesImageBridge(); + mActor->mUsesImageBridge = textureFwd->UsesImageBridge(); } return true; } @@ -1225,8 +1224,7 @@ } // Try external image id allocation. - mExternalImageId = - aForwarder->GetTextureForwarder()->GetNextExternalImageId(); + mExternalImageId = textureFwd->GetNextExternalImageId(); ReadLockDescriptor readLockDescriptor = null_t(); @@ -1238,7 +1236,7 @@ } } - PTextureChild* actor = aForwarder->GetTextureForwarder()->CreateTexture( + PTextureChild* actor = textureFwd->CreateTexture( desc, std::move(readLockDescriptor), aForwarder->GetCompositorBackendType(), GetFlags(), dom::ContentParentId(), mSerial, mExternalImageId); @@ -1254,7 +1252,7 @@ mActor = static_cast(actor); mActor->mCompositableForwarder = aForwarder; - mActor->mTextureForwarder = aForwarder->GetTextureForwarder(); + mActor->mTextureForwarder = textureFwd; mActor->mTextureClient = this; // If the TextureClient is already locked, we have to lock TextureChild's @@ -1268,13 +1266,11 @@ bool TextureClient::InitIPDLActor(KnowsCompositor* aKnowsCompositor, const dom::ContentParentId& aContentId) { + RefPtr textureFwd = aKnowsCompositor->GetTextureForwarder(); MOZ_ASSERT(aKnowsCompositor && - aKnowsCompositor->GetTextureForwarder()->GetThread() == - mAllocator->GetThread()); - TextureForwarder* fwd = aKnowsCompositor->GetTextureForwarder(); + textureFwd->GetThread() == mAllocator->GetThread()); if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; - TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd) { gfxCriticalError() @@ -1282,12 +1278,12 @@ return false; } - if (currentTexFwd && currentTexFwd != fwd) { + if (mActor->mTextureForwarder && mActor->mTextureForwarder != textureFwd) { gfxCriticalError() << "Attempt to move a texture to a different channel TF."; return false; } - mActor->mTextureForwarder = fwd; + mActor->mTextureForwarder = textureFwd; return true; } MOZ_ASSERT(!mActor || mActor->mDestroyed, @@ -1299,8 +1295,7 @@ } // Try external image id allocation. - mExternalImageId = - aKnowsCompositor->GetTextureForwarder()->GetNextExternalImageId(); + mExternalImageId = textureFwd->GetNextExternalImageId(); ReadLockDescriptor readLockDescriptor = null_t(); { @@ -1311,10 +1306,10 @@ } } - PTextureChild* actor = - fwd->CreateTexture(desc, std::move(readLockDescriptor), - aKnowsCompositor->GetCompositorBackendType(), - GetFlags(), aContentId, mSerial, mExternalImageId); + PTextureChild* actor = textureFwd->CreateTexture( + desc, std::move(readLockDescriptor), + aKnowsCompositor->GetCompositorBackendType(), GetFlags(), aContentId, + mSerial, mExternalImageId); if (!actor) { gfxCriticalNote << static_cast(desc.type()) << ", " << static_cast( @@ -1325,7 +1320,7 @@ } mActor = static_cast(actor); - mActor->mTextureForwarder = fwd; + mActor->mTextureForwarder = textureFwd; mActor->mTextureClient = this; // If the TextureClient is already locked, we have to lock TextureChild's @@ -1344,9 +1339,9 @@ KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - return TextureClient::CreateForDrawing(aAllocator->GetTextureForwarder(), - aFormat, aSize, aAllocator, aSelector, - aTextureFlags, aAllocFlags); + return TextureClient::CreateForDrawing( + aAllocator->GetTextureForwarder().get(), aFormat, aSize, aAllocator, + aSelector, aTextureFlags, aAllocFlags); } // static @@ -1419,8 +1414,8 @@ #endif if (data) { - return MakeAndAddRef(data, aTextureFlags, - aAllocator->GetTextureForwarder()); + return MakeAndAddRef( + data, aTextureFlags, aAllocator->GetTextureForwarder().get()); } // Fall back to using UpdateFromSurface @@ -1449,7 +1444,7 @@ gfx::BackendType aMoz2DBackend, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { return CreateForRawBufferAccess( - aAllocator->GetTextureForwarder(), aFormat, aSize, aMoz2DBackend, + aAllocator->GetTextureForwarder().get(), aFormat, aSize, aMoz2DBackend, aAllocator->GetCompositorBackendType(), aTextureFlags, aAllocFlags); } @@ -1518,7 +1513,7 @@ } return MakeAndAddRef(data, aTextureFlags, - aAllocator->GetTextureForwarder()); + aAllocator->GetTextureForwarder().get()); } TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, @@ -1721,7 +1716,9 @@ case ReadLockDescriptor::TUntrustedShmemSection: { const UntrustedShmemSection& untrusted = aDescriptor.get_UntrustedShmemSection(); - Maybe section = ShmemSection::FromUntrusted(untrusted); + size_t minSize = sizeof(ShmemTextureReadLock::ShmReadLockInfo); + Maybe section = + ShmemSection::FromUntrusted(untrusted, minSize); if (section.isNothing()) { return nullptr; } diff -Nru thunderbird-140.9.0esr/gfx/layers/composite/TextureHost.cpp thunderbird-140.10.0esr/gfx/layers/composite/TextureHost.cpp --- thunderbird-140.9.0esr/gfx/layers/composite/TextureHost.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/composite/TextureHost.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -123,9 +123,12 @@ ReadLockDescriptor&& aReadLock, LayersBackend aLayersBackend, TextureFlags aFlags, const dom::ContentParentId& aContentId, uint64_t aSerial, const wr::MaybeExternalImageId& aExternalImageId) { + MOZ_ASSERT(!(aFlags & TextureFlags::DEALLOCATE_CLIENT)); + + TextureFlags flags = aFlags & ~TextureFlags::DEALLOCATE_CLIENT; TextureParent* actor = new TextureParent(aAllocator, aContentId, aSerial, aExternalImageId); - if (!actor->Init(aSharedData, std::move(aReadLock), aLayersBackend, aFlags)) { + if (!actor->Init(aSharedData, std::move(aReadLock), aLayersBackend, flags)) { actor->ActorDestroy(ipc::IProtocol::ActorDestroyReason::FailedConstructor); delete actor; return nullptr; @@ -264,17 +267,19 @@ switch (data.type()) { case MemoryOrShmem::TShmem: { const ipc::Shmem& shmem = data.get_Shmem(); - const BufferDescriptor& desc = bufferDesc.desc(); if (!shmem.IsReadable()) { - // We failed to map the shmem so we can't verify its size. This - // should not be a fatal error, so just create the texture with - // nothing backing it. - result = new ShmemTextureHost(shmem, desc, aDeallocator, aFlags); - break; + // We failed to map the shmem so we can't verify its size. + // Attempting to construct a ShmemTextureHost with it will succeed, + // but the resulting object will have a null shmem and can't ever be + // locked or mapped -- it's not useful at all. We just return + // nullptr instead. + gfxCriticalError() << "Failed texture host with unmappable shmem."; + return nullptr; } size_t bufSize = shmem.Size(); size_t reqSize = SIZE_MAX; + const BufferDescriptor& desc = bufferDesc.desc(); switch (desc.type()) { case BufferDescriptor::TYCbCrDescriptor: { const YCbCrDescriptor& ycbcr = desc.get_YCbCrDescriptor(); @@ -506,6 +511,10 @@ } else { texture = new wr::RenderBufferTextureHost(GetBuffer(), GetBufferDescriptor()); + + if (auto* shmemTextureHost = AsShmemTextureHost()) { + shmemTextureHost->OnRenderTextureCreated(texture); + } } wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, @@ -538,7 +547,10 @@ : wr::ExternalImageType::Buffer(); if (GetFormat() != gfx::SurfaceFormat::YUV420) { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected keys lenght"); + return; + } wr::ImageDescriptor descriptor( GetSize(), @@ -547,7 +559,10 @@ (aResources.*method)(aImageKeys[0], descriptor, aExtID, imageType, 0, /* aNormalizedUvs */ false); } else { - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected keys lenght"); + return; + } const layers::YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor(); gfx::IntSize ySize = desc.display().Size(); @@ -578,13 +593,19 @@ bool useExternalSurface = aFlags.contains(PushDisplayItemFlag::SUPPORTS_EXTERNAL_BUFFER_TEXTURES); if (GetFormat() != gfx::SurfaceFormat::YUV420) { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, preferCompositorSurface, useExternalSurface); } else { - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } const YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor(); aBuilder.PushYCbCrPlanarImage( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], aImageKeys[2], @@ -714,6 +735,9 @@ NS_WARNING("BufferTextureHost: unsupported format!"); return nullptr; } + if (!GetBuffer()) { + return nullptr; + } if (mFormat == gfx::SurfaceFormat::YUV420) { result = ImageDataSerializer::DataSourceSurfaceFromYCbCrDescriptor( GetBuffer(), mDescriptor.get_YCbCrDescriptor(), aSurface); @@ -721,10 +745,29 @@ return nullptr; } } else { + auto stride = + ImageDataSerializer::GetRGBStride(mDescriptor.get_RGBDescriptor()); + + struct Closure { + RefPtr mEventTarget; + RefPtr mRunnable; + }; + + RefPtr eventTarget = CompositorThread(); + RefPtr runnable = + NS_NewRunnableFunction("BufferTextureHost::GetAsSurface::Runnable", + [self = RefPtr{this}]() {}); + + Closure* closure = new Closure{eventTarget.forget(), runnable.forget()}; + + auto destroyedCallback = [](void* aClosure) mutable { + auto* closure = static_cast(aClosure); + closure->mEventTarget->Dispatch(closure->mRunnable.forget()); + delete closure; + }; + result = gfx::Factory::CreateWrappingDataSourceSurface( - GetBuffer(), - ImageDataSerializer::GetRGBStride(mDescriptor.get_RGBDescriptor()), - mSize, mFormat); + GetBuffer(), stride, mSize, mFormat, destroyedCallback, closure); } return result.forget(); } @@ -734,8 +777,12 @@ ISurfaceAllocator* aDeallocator, TextureFlags aFlags) : BufferTextureHost(aDesc, aFlags), mDeallocator(aDeallocator) { + MOZ_ASSERT(!(mFlags & TextureFlags::DEALLOCATE_CLIENT)); + if (aShmem.IsReadable()) { - mShmem = MakeUnique(aShmem); + UniquePtr shmem = MakeUnique(aShmem); + mShmemDeallocRunnable = + new ShmemDeallocRunnable(mDeallocator, std::move(shmem)); } else { // This can happen if we failed to map the shmem on this process, perhaps // because it was big and we didn't have enough contiguous address space @@ -750,35 +797,69 @@ } ShmemTextureHost::~ShmemTextureHost() { - MOZ_ASSERT(!mShmem || (mFlags & TextureFlags::DEALLOCATE_CLIENT), - "Leaking our buffer"); DeallocateDeviceData(); MOZ_COUNT_DTOR(ShmemTextureHost); } -void ShmemTextureHost::DeallocateSharedData() { - if (mShmem) { - MOZ_ASSERT(mDeallocator, - "Shared memory would leak without a ISurfaceAllocator"); - mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); - mShmem = nullptr; +void ShmemTextureHost::DeallocateSharedData() {} + +void ShmemTextureHost::ForgetSharedData() {} + +void ShmemTextureHost::OnShutdown() { mShmemDeallocRunnable = nullptr; } + +ShmemTextureHost::ShmemDeallocRunnable::ShmemDeallocRunnable( + ISurfaceAllocator* aDeallocator, UniquePtr&& aShmem) + : Runnable("ShmemDeallocRunnable"), + mDeallocator(aDeallocator), + mShmem(std::move(aShmem)) {} + +nsresult ShmemTextureHost::ShmemDeallocRunnable::Run() { + if (!mDeallocator || !mShmem) { + return NS_OK; } + mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); + mShmem = nullptr; + return NS_OK; } -void ShmemTextureHost::ForgetSharedData() { - if (mShmem) { - mShmem = nullptr; +ShmemTextureHost::ShmemDeallocRunnable::~ShmemDeallocRunnable() { + if (!mDeallocator || !mShmem) { + return; } + mDeallocator->AsShmemAllocator()->DeallocShmem(*mShmem); } -void ShmemTextureHost::OnShutdown() { mShmem = nullptr; } +void ShmemTextureHost::OnRenderTextureCreated( + wr::RenderTextureHost* aRenderTexture) { + MOZ_ASSERT(aRenderTexture); + + if (!mShmemDeallocRunnable || !mShmemDeallocRunnable->GetShmem()) { + return; + } + + RefPtr eventTarget = GetCurrentSerialEventTarget(); + RefPtr runnable = mShmemDeallocRunnable; + + auto destroyedCallback = [eventTarget = std::move(eventTarget), + runnable = std::move(runnable)]() mutable { + eventTarget->Dispatch(runnable.forget()); + }; + + aRenderTexture->SetDestroyedCallback(destroyedCallback); +} uint8_t* ShmemTextureHost::GetBuffer() { - return mShmem ? mShmem->get() : nullptr; + if (mShmemDeallocRunnable && mShmemDeallocRunnable->GetShmem()) { + return mShmemDeallocRunnable->GetShmem()->get(); + } + return nullptr; } size_t ShmemTextureHost::GetBufferSize() { - return mShmem ? mShmem->Size() : 0; + if (mShmemDeallocRunnable && mShmemDeallocRunnable->GetShmem()) { + return mShmemDeallocRunnable->GetShmem()->Size(); + } + return 0; } MemoryTextureHost::MemoryTextureHost(uint8_t* aBuffer, diff -Nru thunderbird-140.9.0esr/gfx/layers/composite/TextureHost.h thunderbird-140.10.0esr/gfx/layers/composite/TextureHost.h --- thunderbird-140.9.0esr/gfx/layers/composite/TextureHost.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/composite/TextureHost.h 2026-04-21 14:52:53.000000000 +0000 @@ -50,6 +50,7 @@ namespace wr { class DisplayListBuilder; class TransactionBuilder; +class RenderTextureHost; } // namespace wr namespace layers { @@ -903,9 +904,25 @@ ShmemTextureHost* AsShmemTextureHost() override { return this; } + void OnRenderTextureCreated(wr::RenderTextureHost* aRenderTexture); + protected: - UniquePtr mShmem; + class ShmemDeallocRunnable final : public Runnable { + public: + ShmemDeallocRunnable(ISurfaceAllocator* aDeallocator, + UniquePtr&& aShmem); + NS_IMETHOD Run() override; + mozilla::ipc::Shmem* GetShmem() { return mShmem.get(); } + + protected: + virtual ~ShmemDeallocRunnable(); + + RefPtr mDeallocator; + UniquePtr mShmem; + }; + RefPtr mDeallocator; + RefPtr mShmemDeallocRunnable; }; /** diff -Nru thunderbird-140.9.0esr/gfx/layers/d3d11/TextureD3D11.cpp thunderbird-140.10.0esr/gfx/layers/d3d11/TextureD3D11.cpp --- thunderbird-140.9.0esr/gfx/layers/d3d11/TextureD3D11.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/d3d11/TextureD3D11.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -494,7 +494,8 @@ data->SetColorRange(aColorRange); RefPtr textureClient = MakeAndAddRef( - data, TextureFlags::NO_FLAGS, aKnowsCompositor->GetTextureForwarder()); + data, TextureFlags::NO_FLAGS, + aKnowsCompositor->GetTextureForwarder().get()); const auto textureId = GpuProcessD3D11TextureMap::GetNextTextureId(); data->SetGpuProcessTextureId(textureId); @@ -1338,7 +1339,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } wr::ImageDescriptor descriptor(mSize, GetFormat()); // Prefer TextureExternal unless the backend requires TextureRect. @@ -1357,7 +1361,11 @@ case gfx::SurfaceFormat::P010: case gfx::SurfaceFormat::P016: case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); + if (aImageKeys.length() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + MOZ_ASSERT(mSize.width % 2 == 0); MOZ_ASSERT(mSize.height % 2 == 0); @@ -1412,7 +1420,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -1427,7 +1438,10 @@ // it may be handled as if it was DXGI_FORMAT_P016. This is approximately // perceptually correct. However, due to rounding error, the precise // quantized value after sampling may be off by 1. - MOZ_ASSERT(aImageKeys.length() == 2); + if (aImageKeys.length() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushNV12Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], GetFormat() == gfx::SurfaceFormat::NV12 ? wr::ColorDepth::Color8 @@ -1515,8 +1529,13 @@ return; } + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } + MOZ_ASSERT(mHandles[0] && mHandles[1] && mHandles[2]); - MOZ_ASSERT(aImageKeys.length() == 3); + // Assume the chroma planes are rounded up if the luma plane is odd sized. MOZ_ASSERT((mSizeCbCr.width == mSizeY.width || mSizeCbCr.width == (mSizeY.width + 1) >> 1) && @@ -1560,7 +1579,10 @@ return; } - MOZ_ASSERT(aImageKeys.length() == 3); + if (aImageKeys.length() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushYCbCrPlanarImage( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], aImageKeys[2], diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp thunderbird-140.10.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/APZInputBridgeChild.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -205,7 +205,9 @@ aDoubleTapToZoomMetrics); return; } - dom::BrowserParent* tab = + // Hold strong reference to BrowserParent because SendHandleTap + // can run script via SetFocus. + RefPtr tab = dom::BrowserParent::GetBrowserParentFromLayersId(aGuid.mLayersId); if (tab) { #ifdef MOZ_WIDGET_ANDROID diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CanvasChild.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CanvasChild.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CanvasChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CanvasChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -142,20 +142,18 @@ } already_AddRefed GetDataSurface() final { - EnsureDataSurfaceOnMainThread(); + MutexAutoLock lock(mDataSurfaceLock); + EnsureDataSurfaceOnMainThread(lock); return do_AddRef(mDataSourceSurface); } void AttachSurface() { mDetached = false; } - void DetachSurface() { mDetached = true; } + void DetachSurface(bool aInvalidate = false) { + mDetached = true; - void InvalidateDataSurface() { - if (mDataSourceSurface && mMayInvalidate) { - // This must be the only reference to the data left. - MOZ_ASSERT(mDataSourceSurface->hasOneRef()); - mDataSourceSurface = - gfx::Factory::CopyDataSourceSurface(mDataSourceSurface); - mMayInvalidate = false; + if (aInvalidate) { + MutexAutoLock lock(mDataSurfaceLock); + InvalidateDataSurface(lock); } } @@ -165,6 +163,10 @@ } bool GetSurfaceDescriptor(SurfaceDescriptor& aDesc) final { + if (!NS_IsMainThread()) { + // Only allow recording surface upload optimization on main thread. + return false; + } static Atomic sNextExportID(0); if (!mExportID) { mExportID = gfx::ReferencePtr(++sNextExportID); @@ -177,11 +179,31 @@ } private: - void EnsureDataSurfaceOnMainThread() { - // The data can only be retrieved on the main thread. - if (!mDataSourceSurface && NS_IsMainThread()) { - mDataSourceSurface = mCanvasChild->GetDataSurface( - mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate); + void InvalidateDataSurface(const MutexAutoLock& aProofOfLock) + MOZ_REQUIRES(mDataSurfaceLock) { + // The data is about to be invalidated and must be copied before it is + // modified. + if (mDataSourceSurface && mMayInvalidate) { + mDataSourceSurface = + gfx::Factory::CopyDataSourceSurface(mDataSourceSurface); + mMayInvalidate = false; + } + } + + void EnsureDataSurfaceOnMainThread(const MutexAutoLock& aProofOfLock) + MOZ_REQUIRES(mDataSurfaceLock) { + if (NS_IsMainThread()) { + // The data can only be retrieved on the main thread. + if (!mDataSourceSurface) { + mDataSourceSurface = mCanvasChild->GetDataSurface( + mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate); + } + } else { + // If data is going to be accessed on another thread, then copy the data + // if necessary before access. This avoids the main thread accidentally + // trying to invalidate the data surface while the other thread is still + // accessing it. + InvalidateDataSurface(aProofOfLock); } } @@ -207,9 +229,11 @@ RefPtr mRecordedSurface; RefPtr mCanvasChild; RefPtr mRecorder; - RefPtr mDataSourceSurface; + Mutex mDataSurfaceLock{"SourceSurfaceCanvasRecording::mDataSurfaceLock"}; + RefPtr mDataSourceSurface + MOZ_GUARDED_BY(mDataSurfaceLock); + bool mMayInvalidate MOZ_GUARDED_BY(mDataSurfaceLock) = false; bool mDetached = false; - bool mMayInvalidate = false; ReferencePtr mExportID; }; @@ -679,10 +703,7 @@ bool aInvalidate) { if (auto* surface = static_cast(aSurface.get())) { - surface->DetachSurface(); - if (aInvalidate) { - surface->InvalidateDataSurface(); - } + surface->DetachSurface(aInvalidate); } } diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CanvasTranslator.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CanvasTranslator.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CanvasTranslator.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CanvasTranslator.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1587,11 +1587,36 @@ if (usedDescriptor.isSome() && usedDescriptor.ref() == aSurfaceDescriptor) { MOZ_ASSERT(usedSurf); MOZ_ASSERT(usedWrapper); - MOZ_ASSERT(aTextureHost->GetSize() == usedSurf->GetSize()); - // Since the data is the same as before, the DataSourceSurfaceWrapper can be - // reused. - return do_AddRef(usedWrapper); + auto* bufferTextureHost = aTextureHost->AsBufferTextureHost(); + if (bufferTextureHost) { + if (usedSurf->GetType() == gfx::SurfaceType::DATA_ALIGNED) { + // Buffer of DataSourceSurface is owned by DataSourceSurface + MOZ_ASSERT(aTextureHost->GetSize() == usedSurf->GetSize()); + if (aTextureHost->GetSize() == usedSurf->GetSize()) { + // Since the data is the same as before, the DataSourceSurfaceWrapper + // can be reused. + return do_AddRef(usedWrapper); + } else { + mUsedDataSurfaceForSurfaceDescriptor = nullptr; + mUsedWrapperForSurfaceDescriptor = nullptr; + mUsedSurfaceDescriptorForSurfaceDescriptor = Nothing(); + } + } else { + // Buffer of DataSourceSurface is owned by BufferTextureHost + if (bufferTextureHost->GetBuffer() && + bufferTextureHost->GetBuffer() == usedSurf->GetData() && + aTextureHost->GetSize() == usedSurf->GetSize() && + aTextureHost->GetFormat() == usedSurf->GetFormat()) { + // Since the data is the same as before, the DataSourceSurfaceWrapper + // can be reused. + return do_AddRef(usedWrapper); + } + mUsedDataSurfaceForSurfaceDescriptor = nullptr; + mUsedWrapperForSurfaceDescriptor = nullptr; + mUsedSurfaceDescriptorForSurfaceDescriptor = Nothing(); + } + } } usedWrapper = nullptr; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -19,6 +19,7 @@ #include "mozilla/Unused.h" #include "nsDebug.h" // for NS_WARNING, NS_ASSERTION #include "nsRegion.h" // for nsIntRegion +#include "nsTHashSet.h" namespace mozilla { namespace layers { @@ -126,6 +127,21 @@ } } +void CompositableParentManager::DestroyActors( + const nsTArray& aToDestroy) { + nsTHashSet seenTextureParents; + for (const auto& op : aToDestroy) { + if (op.type() == OpDestroy::TPTexture) { + PTextureParent* textureParent = op.get_PTexture().AsParent(); + if (!seenTextureParents.EnsureInserted(textureParent)) { + // Already destroyed this one in the current batch; skip. + continue; + } + } + DestroyActor(op); + } +} + RefPtr CompositableParentManager::AddCompositable( const CompositableHandle& aHandle, const TextureInfo& aInfo) { if (mCompositables.find(aHandle.Value()) != mCompositables.end()) { diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositableTransactionParent.h thunderbird-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.h --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositableTransactionParent.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositableTransactionParent.h 2026-04-21 14:52:53.000000000 +0000 @@ -28,6 +28,8 @@ void DestroyActor(const OpDestroy& aOp); + void DestroyActors(const nsTArray& aToDestroy); + void UpdateFwdTransactionId(uint64_t aTransactionId) { MOZ_ASSERT(mFwdTransactionId < aTransactionId); mFwdTransactionId = aTransactionId; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -391,7 +391,7 @@ PTextureChild* CompositorBridgeChild::AllocPTextureChild( const SurfaceDescriptor&, ReadLockDescriptor&, const LayersBackend&, - const TextureFlags&, const LayersId&, const uint64_t& aSerial, + const TextureFlags&, const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureClient::CreateIPDLActor(); } @@ -513,11 +513,11 @@ wr::MaybeExternalImageId& aExternalImageId) { PTextureChild* textureChild = AllocPTextureChild(aSharedData, aReadLock, aLayersBackend, aFlags, - LayersId{0} /* FIXME */, aSerial, aExternalImageId); + aSerial, aExternalImageId); - return SendPTextureConstructor( - textureChild, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, - LayersId{0} /* FIXME? */, aSerial, aExternalImageId); + return SendPTextureConstructor(textureChild, aSharedData, + std::move(aReadLock), aLayersBackend, aFlags, + aSerial, aExternalImageId); } already_AddRefed CompositorBridgeChild::GetCanvasChild() { diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeChild.h thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.h --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeChild.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeChild.h 2026-04-21 14:52:54.000000000 +0000 @@ -88,7 +88,7 @@ PTextureChild* AllocPTextureChild( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId); bool DeallocPTextureChild(PTextureChild* actor); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1693,8 +1693,7 @@ PTextureParent* CompositorBridgeParent::AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, - const wr::MaybeExternalImageId& aExternalImageId) { + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureHost::CreateIPDLActor( this, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, mCompositorManager->GetContentId(), aSerial, aExternalImageId); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeParent.h thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.h --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositorBridgeParent.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositorBridgeParent.h 2026-04-21 14:52:53.000000000 +0000 @@ -161,7 +161,7 @@ virtual PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aBackend, const TextureFlags& aTextureFlags, - const LayersId& id, const uint64_t& aSerial, + const uint64_t& aSerial, const MaybeExternalImageId& aExternalImageId) = 0; virtual bool DeallocPTextureParent(PTextureParent* aActor) = 0; @@ -316,7 +316,7 @@ PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) override; bool DeallocPTextureParent(PTextureParent* actor) override; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/CompositorThread.cpp thunderbird-140.10.0esr/gfx/layers/ipc/CompositorThread.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/CompositorThread.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/CompositorThread.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -136,7 +136,9 @@ ImageBridgeParent::Shutdown(); gfx::VRManagerParent::Shutdown(); - MediaSystemResourceService::Shutdown(); + CompositorThread()->Dispatch( + NS_NewRunnableFunction("MediaSystemResourceService::Shutdown", + []() { MediaSystemResourceService::Shutdown(); })); CompositorManagerParent::Shutdown(); gfx::gfxGradientCache::Shutdown(); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -211,6 +211,10 @@ mozilla::ipc::IPCResult ContentCompositorBridgeParent::RecvNotifyChildCreated( const LayersId& child, CompositorOptions* aOptions) { + if (NS_WARN_IF(!LayerTreeOwnerTracker::Get()->IsMapped(child, OtherPid()))) { + return IPC_OK(); + } + StaticMonitorAutoLock lock(CompositorBridgeParent::sIndirectLayerTreesLock); for (auto it = CompositorBridgeParent::sIndirectLayerTrees.begin(); it != CompositorBridgeParent::sIndirectLayerTrees.end(); it++) { @@ -381,32 +385,7 @@ PTextureParent* ContentCompositorBridgeParent::AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, - const wr::MaybeExternalImageId& aExternalImageId) { - CompositorBridgeParent::LayerTreeState* state = nullptr; - - StaticMonitorAutoLock lock(CompositorBridgeParent::sIndirectLayerTreesLock); - auto itr = CompositorBridgeParent::sIndirectLayerTrees.find(aId); - if (CompositorBridgeParent::sIndirectLayerTrees.end() != itr) { - state = &itr->second; - } - - TextureFlags flags = aFlags; - - LayersBackend actualBackend = LayersBackend::LAYERS_NONE; - if (!state) { - // The compositor was recreated, and we're receiving layers updates for a - // a layer manager that will soon be discarded or invalidated. We can't - // return null because this will mess up deserialization later and we'll - // kill the content process. Instead, we signal that the underlying - // TextureHost should not attempt to access the compositor. - flags |= TextureFlags::INVALID_COMPOSITOR; - } else if (actualBackend != LayersBackend::LAYERS_NONE && - aLayersBackend != actualBackend) { - gfxDevCrash(gfx::LogReason::PAllocTextureBackendMismatch) - << "Texture backend is wrong"; - } - + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) { return TextureHost::CreateIPDLActor( this, aSharedData, std::move(aReadLock), aLayersBackend, aFlags, mCompositorManager->GetContentId(), aSerial, aExternalImageId); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h thunderbird-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h --- thunderbird-140.9.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.h 2026-04-21 14:52:53.000000000 +0000 @@ -122,7 +122,7 @@ PTextureParent* AllocPTextureParent( const SurfaceDescriptor& aSharedData, ReadLockDescriptor& aReadLock, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const LayersId& aId, const uint64_t& aSerial, + const uint64_t& aSerial, const wr::MaybeExternalImageId& aExternalImageId) override; bool DeallocPTextureParent(PTextureParent* actor) override; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp thunderbird-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -18,6 +18,10 @@ mozilla::Atomic GfxMemoryImageReporter::sAmount(0); +RefPtr ISurfaceAllocator::GetTextureForwarder() { + return nullptr; +} + void HostIPCAllocator::SendPendingAsyncMessages() { if (mPendingAsyncMessage.empty()) { return; @@ -166,10 +170,13 @@ return; } + size_t headerSize = sizeof(ShmemSectionHeapAllocation); + MOZ_RELEASE_ASSERT(aShmemSection.offset() >= headerSize); + ShmemSectionHeapAllocation* allocHeader = reinterpret_cast( aShmemSection.shmem().get() + aShmemSection.offset() - - sizeof(ShmemSectionHeapAllocation)); + headerSize); MOZ_ASSERT(allocHeader->mSize == aShmemSection.size()); @@ -225,7 +232,11 @@ } Maybe ShmemSection::FromUntrusted( - const UntrustedShmemSection& aUntrusted) { + const UntrustedShmemSection& aUntrusted, size_t aMinimumSize) { + if (aUntrusted.size() < aMinimumSize) { + return Nothing(); + } + ShmemSection section; if (!section.Init(aUntrusted.shmem(), aUntrusted.offset(), aUntrusted.size())) { diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ISurfaceAllocator.h thunderbird-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.h --- thunderbird-140.9.0esr/gfx/layers/ipc/ISurfaceAllocator.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ISurfaceAllocator.h 2026-04-21 14:52:53.000000000 +0000 @@ -76,7 +76,7 @@ virtual CompositableForwarder* AsCompositableForwarder() { return nullptr; } - virtual TextureForwarder* GetTextureForwarder() { return nullptr; } + virtual RefPtr GetTextureForwarder(); virtual ClientIPCAllocator* AsClientAllocator() { return nullptr; } @@ -157,7 +157,7 @@ class ShmemSection { public: static Maybe FromUntrusted( - const UntrustedShmemSection& aUntrusted); + const UntrustedShmemSection& aUntrusted, size_t aMinSize); bool Init(const mozilla::ipc::Shmem& aShm, uint32_t offset, uint32_t size); UntrustedShmemSection AsUntrusted(); @@ -204,14 +204,6 @@ bool IsSurfaceDescriptorValid(const SurfaceDescriptor& aSurface); -already_AddRefed GetSurfaceForDescriptor( - const SurfaceDescriptor& aDescriptor); - -uint8_t* GetAddressFromDescriptor(const SurfaceDescriptor& aDescriptor); - -void DestroySurfaceDescriptor(mozilla::ipc::IShmemAllocator* aAllocator, - SurfaceDescriptor* aSurface); - class GfxMemoryImageReporter final : public nsIMemoryReporter { ~GfxMemoryImageReporter() = default; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ImageBridgeChild.h thunderbird-140.10.0esr/gfx/layers/ipc/ImageBridgeChild.h --- thunderbird-140.9.0esr/gfx/layers/ipc/ImageBridgeChild.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ImageBridgeChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -115,7 +115,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageBridgeChild, override); - TextureForwarder* GetTextureForwarder() override { return this; } + RefPtr GetTextureForwarder() override { return this; } LayersIPCActor* GetLayersIPCActor() override { return this; } /** diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/ImageBridgeParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/ImageBridgeParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/ImageBridgeParent.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/ImageBridgeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -181,22 +181,7 @@ ~AutoImageBridgeParentAsyncMessageSender() { mImageBridge->SendPendingAsyncMessages(); if (mToDestroy) { - // Iterate mToDestroy but de-duplicate it to avoid destroying the - // same texture parent actor twice. - nsTHashSet seenTextureParents; - for (const auto& op : *mToDestroy) { - // Peek inside the op (as DestroyActor does) to see if we are about - // to destroy a PTextureParent. - if (op.type() == OpDestroy::TPTexture) { - PTextureParent* textureParent = op.get_PTexture().AsParent(); - if (!seenTextureParents.EnsureInserted(textureParent)) { - // Already seen, so skip this one. - continue; - } - } - - mImageBridge->DestroyActor(op); - } + mImageBridge->DestroyActors(*mToDestroy); } } diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/KnowsCompositor.cpp thunderbird-140.10.0esr/gfx/layers/ipc/KnowsCompositor.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/KnowsCompositor.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/KnowsCompositor.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "KnowsCompositor.h" -#include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/ipc/ProtocolUtils.h" @@ -38,7 +37,7 @@ KnowsCompositorMediaProxy::~KnowsCompositorMediaProxy() = default; -TextureForwarder* KnowsCompositorMediaProxy::GetTextureForwarder() { +RefPtr KnowsCompositorMediaProxy::GetTextureForwarder() { return mThreadSafeAllocator->GetTextureForwarder(); } @@ -56,53 +55,4 @@ aSurface.type() != SurfaceDescriptor::Tnull_t; } -uint8_t* GetAddressFromDescriptor(const SurfaceDescriptor& aDescriptor) { - MOZ_ASSERT(IsSurfaceDescriptorValid(aDescriptor)); - MOZ_RELEASE_ASSERT( - aDescriptor.type() == SurfaceDescriptor::TSurfaceDescriptorBuffer, - "GFX: surface descriptor is not the right type."); - - auto memOrShmem = aDescriptor.get_SurfaceDescriptorBuffer().data(); - if (memOrShmem.type() == MemoryOrShmem::TShmem) { - return memOrShmem.get_Shmem().get(); - } else { - return reinterpret_cast(memOrShmem.get_uintptr_t()); - } -} - -already_AddRefed GetSurfaceForDescriptor( - const SurfaceDescriptor& aDescriptor) { - if (aDescriptor.type() != SurfaceDescriptor::TSurfaceDescriptorBuffer) { - return nullptr; - } - uint8_t* data = GetAddressFromDescriptor(aDescriptor); - auto rgb = - aDescriptor.get_SurfaceDescriptorBuffer().desc().get_RGBDescriptor(); - uint32_t stride = ImageDataSerializer::GetRGBStride(rgb); - return gfx::Factory::CreateWrappingDataSourceSurface(data, stride, rgb.size(), - rgb.format()); -} - -void DestroySurfaceDescriptor(ipc::IShmemAllocator* aAllocator, - SurfaceDescriptor* aSurface) { - MOZ_ASSERT(aSurface); - - SurfaceDescriptorBuffer& desc = aSurface->get_SurfaceDescriptorBuffer(); - switch (desc.data().type()) { - case MemoryOrShmem::TShmem: { - aAllocator->DeallocShmem(desc.data().get_Shmem()); - break; - } - case MemoryOrShmem::Tuintptr_t: { - uint8_t* ptr = (uint8_t*)desc.data().get_uintptr_t(); - GfxMemoryImageReporter::WillFree(ptr); - delete[] ptr; - break; - } - default: - MOZ_CRASH("surface type not implemented!"); - } - *aSurface = SurfaceDescriptor(); -} - } // namespace mozilla::layers diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/KnowsCompositor.h thunderbird-140.10.0esr/gfx/layers/ipc/KnowsCompositor.h --- thunderbird-140.9.0esr/gfx/layers/ipc/KnowsCompositor.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/KnowsCompositor.h 2026-04-21 14:52:53.000000000 +0000 @@ -183,7 +183,7 @@ /** * Helpers for finding other related interface. These are infallible. */ - virtual TextureForwarder* GetTextureForwarder() = 0; + virtual RefPtr GetTextureForwarder() = 0; virtual LayersIPCActor* GetLayersIPCActor() = 0; protected: @@ -215,7 +215,7 @@ explicit KnowsCompositorMediaProxy( const TextureFactoryIdentifier& aIdentifier); - TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; LayersIPCActor* GetLayersIPCActor() override; diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/PCompositorBridge.ipdl thunderbird-140.10.0esr/gfx/layers/ipc/PCompositorBridge.ipdl --- thunderbird-140.9.0esr/gfx/layers/ipc/PCompositorBridge.ipdl 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/PCompositorBridge.ipdl 2026-04-21 14:52:53.000000000 +0000 @@ -185,7 +185,7 @@ sync StopFrameTimeRecording(uint32_t startIndex) returns (float[] intervals); - async PTexture(SurfaceDescriptor aSharedData, ReadLockDescriptor aReadLock, LayersBackend aBackend, TextureFlags aTextureFlags, LayersId id, uint64_t aSerial, MaybeExternalImageId aExternalImageId); + async PTexture(SurfaceDescriptor aSharedData, ReadLockDescriptor aReadLock, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t aSerial, MaybeExternalImageId aExternalImageId); sync SyncWithCompositor(); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl thunderbird-140.10.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl --- thunderbird-140.9.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/PWebRenderBridge.ipdl 2026-04-21 14:52:53.000000000 +0000 @@ -79,7 +79,7 @@ // Start capturing each frame to disk. See // nsIDOMWindowUtils::wrStartCaptureSequence for documentation. - async StartCaptureSequence(nsCString aPath, uint32_t aFlags); + async StartCaptureSequence(uint32_t aFlags); // Stop the captures started by StartCaptureSequence. See // nsIDOMWindowUtils::wrStopCaptureSequence for documentation. diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/RemoteContentController.cpp thunderbird-140.10.0esr/gfx/layers/ipc/RemoteContentController.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/RemoteContentController.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/RemoteContentController.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -71,7 +71,9 @@ ("HandleTapOnMainThread(%d)", (int)aTapType)); MOZ_ASSERT(NS_IsMainThread()); - dom::BrowserParent* tab = + // Hold strong reference to BrowserParent because SendHandleTap + // can run script via SetFocus. + RefPtr tab = dom::BrowserParent::GetBrowserParentFromLayersId(aGuid.mLayersId); if (tab) { tab->SendHandleTap(aTapType, aPoint, aModifiers, aGuid, aInputBlockId, diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/SharedSurfacesParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -238,6 +238,11 @@ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread()); MOZ_ASSERT(aPid != base::GetCurrentProcId()); + if (aDesc.format() != SurfaceFormat::B8G8R8X8 && + aDesc.format() != SurfaceFormat::B8G8R8A8) { + return; + } + RefPtr surface = new SourceSurfaceSharedDataWrapper(); diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeChild.cpp thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -59,7 +59,7 @@ VideoBridgeChild::~VideoBridgeChild() = default; -VideoBridgeChild* VideoBridgeChild::GetSingleton() { +RefPtr VideoBridgeChild::GetSingleton() { StaticMutexAutoLock lock(sVideoBridgeLock); return sVideoBridge; } diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeChild.h thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.h --- thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeChild.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -25,7 +25,7 @@ static void StartupForGPUProcess(); static void Shutdown(); - static VideoBridgeChild* GetSingleton(); + static RefPtr GetSingleton(); // PVideoBridgeChild PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData, diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeParent.cpp thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.cpp --- thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeParent.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -99,16 +99,16 @@ MOZ_ASSERT(mCompositorThreadHolder->IsInThread()); - auto* actor = mTextureMap[aSerial]; - if (NS_WARN_IF(!actor)) { + const auto i = mTextureMap.find(aSerial); + if (NS_WARN_IF(i == mTextureMap.end())) { return nullptr; } - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } already_AddRefed VideoBridgeParent::LookupTexture( @@ -120,12 +120,12 @@ return nullptr; } - auto* actor = mTextureMap[aSerial]; - if (actor) { - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + auto i = mTextureMap.find(aSerial); + if (i != mTextureMap.end()) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } // We cannot block on the Compositor thread because that is the thread we get @@ -166,16 +166,16 @@ lock.Wait(); } - actor = mTextureMap[aSerial]; - if (!actor) { + i = mTextureMap.find(aSerial); + if (NS_WARN_IF(i == mTextureMap.end())) { return nullptr; } - if (NS_WARN_IF(aContentId != TextureHost::GetTextureContentId(actor))) { + if (NS_WARN_IF(aContentId != i->second.mContentId)) { return nullptr; } - return do_AddRef(TextureHost::AsTextureHost(actor)); + return do_AddRef(i->second.mTextureHost); } void VideoBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { @@ -259,13 +259,21 @@ } MonitorAutoLock lock(mMonitor); - mTextureMap[aSerial] = parent; + mTextureMap.insert( + {aSerial, {TextureHost::AsTextureHost(parent), aContentId}}); return parent; } bool VideoBridgeParent::DeallocPTextureParent(PTextureParent* actor) { - MonitorAutoLock lock(mMonitor); - mTextureMap.erase(TextureHost::GetTextureSerial(actor)); + RefPtr textureHost; + { + MonitorAutoLock lock(mMonitor); + auto i = mTextureMap.find(TextureHost::GetTextureSerial(actor)); + if (i != mTextureMap.end()) { + textureHost = std::move(i->second.mTextureHost); + mTextureMap.erase(i); + } + } return TextureHost::DestroyIPDLActor(actor); } diff -Nru thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeParent.h thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.h --- thunderbird-140.9.0esr/gfx/layers/ipc/VideoBridgeParent.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/ipc/VideoBridgeParent.h 2026-04-21 14:52:54.000000000 +0000 @@ -74,10 +74,15 @@ void DoUnregisterExternalImages(); + struct TextureHolder { + RefPtr mTextureHost; + dom::ContentParentId mContentId; + }; + Monitor mMonitor; RefPtr mCompositorThreadHolder MOZ_GUARDED_BY(mMonitor); - std::map mTextureMap MOZ_GUARDED_BY(mMonitor); + std::map mTextureMap MOZ_GUARDED_BY(mMonitor); bool mClosed; }; diff -Nru thunderbird-140.9.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp thunderbird-140.10.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp --- thunderbird-140.9.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/opengl/DMABUFTextureHostOGL.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -94,7 +94,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8X8: case gfx::SurfaceFormat::B8G8R8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. wr::ImageDescriptor descriptor(GetSize(), mSurface->GetFormat()); @@ -103,8 +106,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A8); @@ -118,8 +123,10 @@ break; } case gfx::SurfaceFormat::YUV420: { - MOZ_ASSERT(aImageKeys.length() == 3); - MOZ_ASSERT(mSurface->GetTextureCount() == 3); + if (aImageKeys.length() != 3 || mSurface->GetTextureCount() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A8); @@ -135,8 +142,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A16); @@ -150,8 +159,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetWidth(0), mSurface->GetHeight(0)), gfx::SurfaceFormat::A16); @@ -185,7 +196,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -194,8 +208,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the VAAPI H264 decoder // which only supports 8 bits color depth. aBuilder.PushNV12Image( @@ -206,8 +222,10 @@ break; } case gfx::SurfaceFormat::YUV420: { - MOZ_ASSERT(aImageKeys.length() == 3); - MOZ_ASSERT(mSurface->GetTextureCount() == 3); + if (aImageKeys.length() != 3 || mSurface->GetTextureCount() != 3) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the VAAPI vp8 decoder // which only supports 8 bits color depth. aBuilder.PushYCbCrPlanarImage( @@ -218,8 +236,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushP010Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -228,8 +248,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetTextureCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetTextureCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV16Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), diff -Nru thunderbird-140.9.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp thunderbird-140.10.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp --- thunderbird-140.9.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -124,8 +124,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // The internal pixel format of MacIOSurface is always BGRX or BGRA // format. auto format = GetFormat() == gfx::SurfaceFormat::B8G8R8A8 @@ -141,16 +143,20 @@ // converted RGB interleaving data or a YCbCr interleaving data depending // on the different platform setting. (e.g. It will be RGB at OpenGL 2.1 // and YCbCr at OpenGL 3.1) - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor(GetSize(), gfx::SurfaceFormat::B8G8R8X8); (aResources.*method)(aImageKeys[0], descriptor, aExtID, imageType, 0, /* aNormalizedUvs */ false); break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -166,8 +172,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -183,8 +191,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } wr::ImageDescriptor descriptor0( gfx::IntSize(mSurface->GetDevicePixelWidth(0), mSurface->GetDevicePixelHeight(0)), @@ -214,8 +224,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // We disable external compositing for RGB surfaces for now until // we've tested support more thoroughly. Bug 1667917. aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], @@ -226,8 +238,10 @@ break; } case gfx::SurfaceFormat::YUY2: { - MOZ_ASSERT(aImageKeys.length() == 1); - MOZ_ASSERT(mSurface->GetPlaneCount() == 0); + if (aImageKeys.length() != 1 || mSurface->GetPlaneCount() != 0) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } // Those images can only be generated at present by the Apple H264 decoder // which only supports 8 bits color depth. aBuilder.PushYCbCrInterleavedImage( @@ -238,8 +252,10 @@ break; } case gfx::SurfaceFormat::NV12: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV12Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color8, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -248,8 +264,10 @@ break; } case gfx::SurfaceFormat::P010: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushP010Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), @@ -258,8 +276,10 @@ break; } case gfx::SurfaceFormat::NV16: { - MOZ_ASSERT(aImageKeys.length() == 2); - MOZ_ASSERT(mSurface->GetPlaneCount() == 2); + if (aImageKeys.length() != 2 || mSurface->GetPlaneCount() != 2) { + MOZ_ASSERT_UNREACHABLE("unexpected key length or plane count"); + return; + } aBuilder.PushNV16Image( aBounds, aClip, true, aImageKeys[0], aImageKeys[1], wr::ColorDepth::Color10, wr::ToWrYuvColorSpace(GetYUVColorSpace()), diff -Nru thunderbird-140.9.0esr/gfx/layers/opengl/TextureHostOGL.cpp thunderbird-140.10.0esr/gfx/layers/opengl/TextureHostOGL.cpp --- thunderbird-140.9.0esr/gfx/layers/opengl/TextureHostOGL.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/opengl/TextureHostOGL.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -593,7 +593,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. @@ -627,7 +630,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -885,7 +891,10 @@ switch (GetFormat()) { case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8A8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. @@ -917,7 +926,10 @@ case gfx::SurfaceFormat::R8G8B8A8: case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8X8: { - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, @@ -1043,7 +1055,11 @@ gfx::SurfaceFormat format = GetFormat(); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected to be called"); + return; + } + // XXX Add RGBA handling. Temporary hack to avoid crash // With BGRA format setting, rendering works without problem. auto formatTmp = format == gfx::SurfaceFormat::R8G8B8A8 @@ -1063,7 +1079,10 @@ bool supportsExternalCompositing = SupportsExternalCompositing(aBuilder.GetBackendType()); - MOZ_ASSERT(aImageKeys.length() == 1); + if (aImageKeys.length() != 1) { + MOZ_ASSERT_UNREACHABLE("unexpected key length"); + return; + } aBuilder.PushImage(aBounds, aClip, true, false, aFilter, aImageKeys[0], !(mFlags & TextureFlags::NON_PREMULTIPLIED), wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp thunderbird-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp --- thunderbird-140.9.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -11,6 +11,32 @@ namespace mozilla { namespace layers { +AsyncImagePipelineOp::AsyncImagePipelineOp( + Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId, TextureHost* aTextureHost) + : mTag(aTag), + mAsyncImageManager(aAsyncImageManager), + mPipelineId(aPipelineId), + mTextureHost(aTextureHost) { + MOZ_ASSERT(mTag == Tag::ApplyAsyncImageForPipeline); +} + +AsyncImagePipelineOp::AsyncImagePipelineOp( + Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId) + : mTag(aTag), + mAsyncImageManager(aAsyncImageManager), + mPipelineId(aPipelineId) { + MOZ_ASSERT(mTag == Tag::RemoveAsyncImagePipeline); +} + +AsyncImagePipelineOp::~AsyncImagePipelineOp() = default; +AsyncImagePipelineOp::AsyncImagePipelineOp(AsyncImagePipelineOp&&) = default; +AsyncImagePipelineOp::AsyncImagePipelineOp(const AsyncImagePipelineOp&) = + default; + +AsyncImagePipelineOps::~AsyncImagePipelineOps() = default; + void AsyncImagePipelineOps::HandleOps(wr::TransactionBuilder& aTxn) { MOZ_ASSERT(!mList.empty()); @@ -18,7 +44,7 @@ auto& frontOp = mList.front(); switch (frontOp.mTag) { case AsyncImagePipelineOp::Tag::ApplyAsyncImageForPipeline: { - auto* manager = frontOp.mAsyncImageManager; + AsyncImagePipelineManager* manager = frontOp.mAsyncImageManager.get(); const auto& pipelineId = frontOp.mPipelineId; const auto& textureHost = frontOp.mTextureHost; @@ -26,7 +52,7 @@ break; } case AsyncImagePipelineOp::Tag::RemoveAsyncImagePipeline: { - auto* manager = frontOp.mAsyncImageManager; + AsyncImagePipelineManager* manager = frontOp.mAsyncImageManager.get(); const auto& pipelineId = frontOp.mPipelineId; manager->RemoveAsyncImagePipeline(pipelineId, /* aPendingOps */ nullptr, aTxn); diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/AsyncImagePipelineOp.h thunderbird-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.h --- thunderbird-140.9.0esr/gfx/layers/wr/AsyncImagePipelineOp.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/AsyncImagePipelineOp.h 2026-04-21 14:52:53.000000000 +0000 @@ -10,6 +10,7 @@ #include #include "mozilla/layers/TextureHost.h" +#include "mozilla/RefPtr.h" #include "mozilla/webrender/webrender_ffi.h" #include "Units.h" @@ -33,30 +34,26 @@ const Tag mTag; - AsyncImagePipelineManager* const mAsyncImageManager; + // Hold a strong reference: queued ops can outlive their owning + // WebRenderBridgeParent and be processed after StopAndClearResources frees + // the manager via a deferred remote-texture callback. + const RefPtr mAsyncImageManager; const wr::PipelineId mPipelineId; const CompositableTextureHostRef mTextureHost; + // Out-of-line so callers don't need the full AsyncImagePipelineManager type + // to instantiate ~RefPtr. + ~AsyncImagePipelineOp(); + AsyncImagePipelineOp(AsyncImagePipelineOp&&); + AsyncImagePipelineOp(const AsyncImagePipelineOp&); + private: - AsyncImagePipelineOp(const Tag aTag, - AsyncImagePipelineManager* aAsyncImageManager, + AsyncImagePipelineOp(Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, const wr::PipelineId& aPipelineId, - TextureHost* aTextureHost) - : mTag(aTag), - mAsyncImageManager(aAsyncImageManager), - mPipelineId(aPipelineId), - mTextureHost(aTextureHost) { - MOZ_ASSERT(mTag == Tag::ApplyAsyncImageForPipeline); - } + TextureHost* aTextureHost); - AsyncImagePipelineOp(const Tag aTag, - AsyncImagePipelineManager* aAsyncImageManager, - const wr::PipelineId& aPipelineId) - : mTag(aTag), - mAsyncImageManager(aAsyncImageManager), - mPipelineId(aPipelineId) { - MOZ_ASSERT(mTag == Tag::RemoveAsyncImagePipeline); - } + AsyncImagePipelineOp(Tag aTag, AsyncImagePipelineManager* aAsyncImageManager, + const wr::PipelineId& aPipelineId); public: static AsyncImagePipelineOp ApplyAsyncImageForPipeline( @@ -77,6 +74,9 @@ struct AsyncImagePipelineOps { explicit AsyncImagePipelineOps(wr::Transaction* aTransaction) : mTransaction(aTransaction) {} + // Out-of-line so callers don't need the full AsyncImagePipelineManager type + // to instantiate ~RefPtr for queued ops. + ~AsyncImagePipelineOps(); void HandleOps(wr::TransactionBuilder& aTxn); diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -341,7 +341,7 @@ return static_cast(Manager()); } -TextureForwarder* WebRenderBridgeChild::GetTextureForwarder() { +RefPtr WebRenderBridgeChild::GetTextureForwarder() { return static_cast(GetCompositorBridgeChild()); } @@ -575,9 +575,8 @@ void WebRenderBridgeChild::Capture() { this->SendCapture(); } -void WebRenderBridgeChild::StartCaptureSequence(const nsCString& aPath, - uint32_t aFlags) { - this->SendStartCaptureSequence(aPath, aFlags); +void WebRenderBridgeChild::StartCaptureSequence(uint32_t aFlags) { + this->SendStartCaptureSequence(aFlags); } void WebRenderBridgeChild::StopCaptureSequence() { diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeChild.h thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.h --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeChild.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeChild.h 2026-04-21 14:52:53.000000000 +0000 @@ -91,7 +91,7 @@ wr::PipelineId GetPipeline() { return mPipelineId; } // KnowsCompositor - TextureForwarder* GetTextureForwarder() override; + RefPtr GetTextureForwarder() override; LayersIPCActor* GetLayersIPCActor() override; void SyncWithCompositor( const Maybe& aWindowID = Nothing()) override; @@ -178,7 +178,7 @@ void DeallocResourceShmem(RefCountedShmem& aShm); void Capture(); - void StartCaptureSequence(const nsCString& path, uint32_t aFlags); + void StartCaptureSequence(uint32_t aFlags); void StopCaptureSequence(); bool SendEnsureConnected(TextureFactoryIdentifier* textureFactoryIdentifier, diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -315,21 +315,8 @@ mWebRenderBridgeParent->SendPendingAsyncMessages(); if (mActorsToDestroy) { // Destroy the actors after sending the async messages because the latter - // may contain references to some actors. De-duplicate the array to avoid - // destroying the same texture parent actor twice. - nsTHashSet seenTextureParents; - for (const auto& op : *mActorsToDestroy) { - // Peek inside the op (as DestroyActor does) to see if we are about - // to destroy a PTextureParent. - if (op.type() == OpDestroy::TPTexture) { - PTextureParent* textureParent = op.get_PTexture().AsParent(); - if (!seenTextureParents.EnsureInserted(textureParent)) { - // Already seen, so skip this one. - continue; - } - } - mWebRenderBridgeParent->DestroyActor(op); - } + // may contain references to some actors. + mWebRenderBridgeParent->DestroyActors(*mActorsToDestroy); } } @@ -477,8 +464,10 @@ wr::Vec mVec; void* Grow(void* aPtr, size_t aLength) { + // Only grow if capacity is insufficient. if (aLength > mVec.Capacity()) { - mVec.Reserve(aLength - mVec.Capacity()); + // Reserve() is relative to existing length. + mVec.Reserve(aLength - mVec.Length()); } return mVec.inner.data; } @@ -492,20 +481,17 @@ static bool ReadRawFont(const OpAddRawFont& aOp, wr::ShmSegmentsReader& aReader, wr::TransactionBuilder& aUpdates) { - wr::Vec sourceBytes; - Maybe> ptr = - aReader.GetReadPointerOrCopy(aOp.bytes(), sourceBytes); - if (ptr.isNothing()) { - gfxCriticalNote << "No read pointer from reader for sanitizing font " + wr::Vec source; + if (!aReader.Read(aOp.bytes(), source)) { + gfxCriticalNote << "Failed to read data for sanitizing font " << aOp.key().mHandle; return false; } - Range& source = ptr.ref(); // Attempt to sanitize the font before passing it along for updating. // Ensure that we're not strict here about font types, since any font that // failed generating a descriptor might end up here as raw font data. size_t lengthHint = gfxOTSContext::GuessSanitizedFontSize( - source.begin().get(), source.length(), false); + source.Data(), source.Length(), false); if (!lengthHint) { gfxCriticalNote << "Could not determine font type for sanitizing font " << aOp.key().mHandle; @@ -513,7 +499,7 @@ } gfxOTSExpandingMemoryStream output(lengthHint); gfxOTSContext otsContext; - if (!otsContext.Process(&output, source.begin().get(), source.length())) { + if (!otsContext.Process(&output, source.Data(), source.Length())) { gfxCriticalNote << "Failed sanitizing font " << aOp.key().mHandle; return false; } @@ -827,6 +813,14 @@ auto op = aIsUpdate ? TextureHost::UPDATE_IMAGE : TextureHost::ADD_IMAGE; WebRenderTextureHost* wrTexture = aTexture->AsWebRenderTextureHost(); if (wrTexture) { + if (wrTexture->NumSubTextures() != 1) { + gfxCriticalNote << "PushExternalImageForTexture: texture requires " + << wrTexture->NumSubTextures() + << " keys but only 1 provided for extId:" + << wr::AsUint64(aExtId); + return false; + } + Range keys(&aKey, 1); wrTexture->PushResourceUpdates(aResources, op, keys, wrTexture->GetExternalImageKey()); @@ -1264,9 +1258,7 @@ const TimeStamp& aFwdTime, nsTArray&& aPayloads, const bool& aRenderOffscreen) { if (mDestroyed) { - for (const auto& op : aToDestroy) { - DestroyActor(op); - } + DestroyActors(aToDestroy); wr::IpcResourceUpdateQueue::ReleaseShmems(this, aDisplayList.mSmallShmems); wr::IpcResourceUpdateQueue::ReleaseShmems(this, aDisplayList.mLargeShmems); return IPC_OK(); @@ -1402,9 +1394,7 @@ const TimeStamp& aTxnStartTime, const nsACString& aTxnURL, const TimeStamp& aFwdTime, nsTArray&& aPayloads) { if (mDestroyed) { - for (const auto& op : aToDestroy) { - DestroyActor(op); - } + DestroyActors(aToDestroy); if (aTransactionData) { wr::IpcResourceUpdateQueue::ReleaseShmems(this, aTransactionData->mSmallShmems); @@ -1898,6 +1888,12 @@ return; } + if (aPipelineId == mPipelineId) { + gfxCriticalNote << "Content attempted AddPipelineIdForCompositable on " + "root pipeline"; + return; + } + MOZ_ASSERT(mAsyncCompositables.find(wr::AsUint64(aPipelineId)) == mAsyncCompositables.end()); @@ -1954,6 +1950,12 @@ return; } + if (aPipelineId == mPipelineId) { + gfxCriticalNote << "Content attempted RemovePipelineIdForCompositable on " + "root pipeline"; + return; + } + auto it = mAsyncCompositables.find(wr::AsUint64(aPipelineId)); if (it == mAsyncCompositables.end()) { return; @@ -2150,9 +2152,9 @@ } mozilla::ipc::IPCResult WebRenderBridgeParent::RecvStartCaptureSequence( - const nsACString& aPath, const uint32_t& aFlags) { + const uint32_t& aFlags) { if (!mDestroyed) { - mApi->StartCaptureSequence(aPath, aFlags); + mApi->StartCaptureSequence(aFlags); } return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeParent.h thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.h --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderBridgeParent.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderBridgeParent.h 2026-04-21 14:52:53.000000000 +0000 @@ -146,7 +146,7 @@ const wr::RenderReasons& aReasons) override; mozilla::ipc::IPCResult RecvCapture() override; mozilla::ipc::IPCResult RecvStartCaptureSequence( - const nsACString& path, const uint32_t& aFlags) override; + const uint32_t& aFlags) override; mozilla::ipc::IPCResult RecvStopCaptureSequence() override; mozilla::ipc::IPCResult RecvSyncWithCompositor() override; diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderMessageUtils.h thunderbird-140.10.0esr/gfx/layers/wr/WebRenderMessageUtils.h --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderMessageUtils.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderMessageUtils.h 2026-04-21 14:52:53.000000000 +0000 @@ -11,8 +11,6 @@ #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtils.h" -#include "mozilla/IsEnumCase.h" -#include "mozilla/ParamTraits_IsEnumCase.h" #include "mozilla/ParamTraits_TiedFields.h" #include "mozilla/webrender/webrender_ffi.h" #include "mozilla/webrender/WebRenderTypes.h" @@ -178,42 +176,6 @@ return std::tie(a.flags, a.synthetic_italics, a.render_mode, a._padding); } -// - - -#if !(defined(XP_MACOSX) || defined(XP_WIN)) - -template <> -inline constexpr bool IsEnumCase( - const wr::FontLCDFilter raw) { - switch (raw) { - case wr::FontLCDFilter::None: - case wr::FontLCDFilter::Default: - case wr::FontLCDFilter::Light: - case wr::FontLCDFilter::Legacy: - case wr::FontLCDFilter::Sentinel: - return true; - } - return false; -} - -template <> -inline constexpr bool IsEnumCase(const wr::FontHinting raw) { - switch (raw) { - case wr::FontHinting::None: - case wr::FontHinting::Mono: - case wr::FontHinting::Light: - case wr::FontHinting::Normal: - case wr::FontHinting::LCD: - case wr::FontHinting::Sentinel: - return true; - } - return false; -} - -#endif // !(defined(XP_MACOSX) || defined(XP_WIN)) - -// - - template <> inline auto TiedFields( mozilla::wr::FontInstancePlatformOptions& a) { @@ -251,30 +213,6 @@ } template <> -inline constexpr bool IsEnumCase(const wr::OpacityType raw) { - switch (raw) { - case wr::OpacityType::Opaque: - case wr::OpacityType::HasAlphaChannel: - case wr::OpacityType::Sentinel: - return true; - } - return false; -} - -template <> -inline constexpr bool IsEnumCase( - const wr::FontRenderMode raw) { - switch (raw) { - case wr::FontRenderMode::Mono: - case wr::FontRenderMode::Alpha: - case wr::FontRenderMode::Subpixel: - case wr::FontRenderMode::Sentinel: - return true; - } - return false; -} - -template <> inline auto TiedFields( mozilla::wr::InternerSubReport& a) { #define _COMMA , @@ -374,11 +312,15 @@ template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; #endif // !(defined(XP_MACOSX) || defined(XP_WIN)) @@ -451,11 +393,15 @@ template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits - : public ParamTraits_IsEnumCase {}; + : public ContiguousEnumSerializer {}; template <> struct ParamTraits diff -Nru thunderbird-140.9.0esr/gfx/layers/wr/WebRenderScrollData.cpp thunderbird-140.10.0esr/gfx/layers/wr/WebRenderScrollData.cpp --- thunderbird-140.9.0esr/gfx/layers/wr/WebRenderScrollData.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/layers/wr/WebRenderScrollData.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -305,7 +305,11 @@ const WebRenderLayerScrollData* currentChild = &aParent.mLayerScrollData[currentChildIndex]; childDescendantCounts += currentChild->mDescendantCount; - currentChild->ValidateSubtree(aParent, aVisitCounts, currentChildIndex); + if (!currentChild->ValidateSubtree(aParent, aVisitCounts, + currentChildIndex)) { + // If a subtree is invalid, we are also invalid. + return false; + } // The current child's descendants come first in the array, and the next // element after that is our next child. diff -Nru thunderbird-140.9.0esr/gfx/ots/moz.yaml thunderbird-140.10.0esr/gfx/ots/moz.yaml --- thunderbird-140.9.0esr/gfx/ots/moz.yaml 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/moz.yaml 2026-04-21 14:52:53.000000000 +0000 @@ -10,8 +10,8 @@ url: https://github.com/khaledhosny/ots - release: 41136f2f0afc3db21a1f95b3348f62c5d6372b93 (2025-01-07T23:20:03Z). - revision: 41136f2f0afc3db21a1f95b3348f62c5d6372b93 + release: 35a4c35a46c01c172ef51a0da9a487e710c2d499 (2026-03-27T19:05:02Z). + revision: 35a4c35a46c01c172ef51a0da9a487e710c2d499 license: BSD-3-Clause license-file: LICENSE diff -Nru thunderbird-140.9.0esr/gfx/ots/ots-lz4.patch thunderbird-140.10.0esr/gfx/ots/ots-lz4.patch --- thunderbird-140.9.0esr/gfx/ots/ots-lz4.patch 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/ots-lz4.patch 2026-04-21 14:52:53.000000000 +0000 @@ -1,11 +1,7 @@ diff --git a/src/glat.cc b/src/glat.cc --- a/src/glat.cc +++ b/src/glat.cc -@@ -1,16 +1,16 @@ - // Copyright (c) 2009-2017 The OTS Authors. All rights reserved. - // Use of this source code is governed by a BSD-style license that can be - // found in the LICENSE file. - +@@ -5,7 +5,7 @@ #include "glat.h" #include "gloc.h" @@ -13,18 +9,8 @@ +#include "mozilla/Compression.h" #include #include - - namespace ots { - - // ----------------------------------------------------------------------------- - // OpenTypeGLAT_v1 - // ----------------------------------------------------------------------------- -@@ -212,24 +212,25 @@ bool OpenTypeGLAT_v3::Parse(const uint8_ - } - // decompressed table must be <= OTS_MAX_DECOMPRESSED_TABLE_SIZE - if (decompressed_size > OTS_MAX_DECOMPRESSED_TABLE_SIZE) { - return DropGraphite("Decompressed size exceeds %gMB: %gMB", - OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), + +@@ -217,14 +217,15 @@ bool OpenTypeGLAT_v3::Parse(const uint8_t* data, size_t length, decompressed_size / (1024.0 * 1024.0)); } std::unique_ptr decompressed(new uint8_t[decompressed_size]()); @@ -39,17 +25,12 @@ - decompressed_size); // output buffer size - if (ret < 0 || unsigned(ret) != decompressed_size) { - return DropGraphite("Decompression failed with error code %d", ret); -+ &outputSize); // return output size ++ &outputSize); // output buffer size + if (!ret || outputSize != decompressed_size) { + return DropGraphite("Decompression failed"); } return this->Parse(decompressed.get(), decompressed_size, true); - } - default: - return DropGraphite("Unknown compression scheme"); - } - if (this->compHead & RESERVED) { - Warning("Nonzero reserved"); + diff --git a/src/silf.cc b/src/silf.cc --- a/src/silf.cc +++ b/src/silf.cc @@ -71,7 +52,7 @@ bool OpenTypeSILF::Parse(const uint8_t* data, size_t length, bool prevent_decompression) { Buffer table(data, length); -@@ -45,24 +45,25 @@ bool OpenTypeSILF::Parse(const uint8_t* +@@ -45,24 +45,25 @@ bool OpenTypeSILF::Parse(const uint8_t* } // decompressed table must be <= OTS_MAX_DECOMPRESSED_TABLE_SIZE if (decompressed_size > OTS_MAX_DECOMPRESSED_TABLE_SIZE) { @@ -79,7 +60,7 @@ OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), decompressed_size / (1024.0 * 1024.0)); } - std::unique_ptr decompressed(new uint8_t[decompressed_size]()); + std::unique_ptr decompressed(new uint8_t[decompressed_size]()); - int ret = LZ4_decompress_safe_partial( + size_t outputSize = 0; + bool ret = mozilla::Compression::LZ4::decompressPartial( @@ -91,7 +72,7 @@ - decompressed_size); // output buffer size - if (ret < 0 || unsigned(ret) != decompressed_size) { - return DropGraphite("Decompression failed with error code %d", ret); -+ &outputSize); // return output size ++ &outputSize); // output buffer size + if (!ret || outputSize != decompressed_size) { + return DropGraphite("Decompression failed"); } @@ -101,4 +82,4 @@ return DropGraphite("Unknown compression scheme"); } } - if (!table.ReadU16(&this->numSub)) { + if (!table.ReadU16(&this->numSub)) { diff -Nru thunderbird-140.9.0esr/gfx/ots/src/cff.cc thunderbird-140.10.0esr/gfx/ots/src/cff.cc --- thunderbird-140.9.0esr/gfx/ots/src/cff.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/cff.cc 2026-04-21 14:52:53.000000000 +0000 @@ -214,7 +214,7 @@ // check number format uint8_t nibbles[2]; - nibbles[0] = (nibble & 0xf0) >> 8; + nibbles[0] = (nibble & 0xf0) >> 4; nibbles[1] = (nibble & 0x0f); for (unsigned i = 0; i < 2; ++i) { if (nibbles[i] == 0xd) { // reserved number @@ -311,7 +311,7 @@ if (!table.ReadU8(&b1)) { return OTS_FAILURE(); } - result = -(b0 - 251) * 256 + b1 - 108; + result = -(b0 - 251) * 256 - b1 - 108; } else { return OTS_FAILURE(); } @@ -556,7 +556,7 @@ return OTS_FAILURE(); } uint16_t k = out_cff->region_index_count.at(vsindex); - + if (operands.back().first > static_cast(0xffff) || operands.back().first < 0){ return OTS_FAILURE(); } @@ -899,6 +899,11 @@ if (type != DICT_DATA_TOPLEVEL) { return OTS_FAILURE(); } + // A CID-keyed font must have exactly one FDSelect; duplicates would + // make the validated fd_select map diverge from the serialized bytes. + if (!out_cff->fd_select.empty()) { + return OTS_FAILURE(); + } if (operands.size() != 1) { return OTS_FAILURE(); } @@ -1050,21 +1055,20 @@ if (operands.size() != 2) { return OTS_FAILURE(); } - if (operands.back().second != DICT_OPERAND_INTEGER) { + // We pass table.length() + 1 here because it's OK for private_offset to be equal to + // table.length(), provided private_length turns out to be zero. + if (!CheckOffset(operands.back(), table.length() + 1)) { return OTS_FAILURE(); } const int32_t private_offset = operands.back().first; operands.pop_back(); - if (operands.back().second != DICT_OPERAND_INTEGER) { + // The next operand is a length, not an offset, but we can usefully apply the same check: + // if it is negative or exceeds the table length, it cannot be valid. + if (!CheckOffset(operands.back(), table.length())) { return OTS_FAILURE(); } const int32_t private_length = operands.back().first; - if (private_offset > static_cast(table.length())) { - return OTS_FAILURE(); - } - if (private_length >= static_cast(table.length()) || private_length < 0) { - return OTS_FAILURE(); - } + // The offset & length were individually plausible; check that the combination doesn't overflow the table. if (private_length + private_offset > static_cast(table.length()) || private_length + private_offset < 0) { return OTS_FAILURE(); } diff -Nru thunderbird-140.9.0esr/gfx/ots/src/cff_charstring.cc thunderbird-140.10.0esr/gfx/ots/src/cff_charstring.cc --- thunderbird-140.9.0esr/gfx/ots/src/cff_charstring.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/cff_charstring.cc 2026-04-21 14:52:53.000000000 +0000 @@ -195,7 +195,7 @@ return OTS_FAILURE(); } result += v; - *out_number = result; + *out_number = static_cast(result); } else if (v <= 31) { *out_number = v; *out_is_operator = true; diff -Nru thunderbird-140.9.0esr/gfx/ots/src/cmap.cc thunderbird-140.10.0esr/gfx/ots/src/cmap.cc --- thunderbird-140.9.0esr/gfx/ots/src/cmap.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/cmap.cc 2026-04-21 14:52:53.000000000 +0000 @@ -314,8 +314,9 @@ return Error("format 12 subtable group endCharCode before startCharCode (0x%4X < 0x%4X)", groups[i].end_range, groups[i].start_range); } + // Maximum glyph ID must be less than num_glyphs. if ((groups[i].end_range - groups[i].start_range) + - groups[i].start_glyph_id > num_glyphs) { + groups[i].start_glyph_id >= num_glyphs) { return Error("bad format 12 subtable group startGlyphID (%d)", groups[i].start_glyph_id); } } diff -Nru thunderbird-140.9.0esr/gfx/ots/src/colr.cc thunderbird-140.10.0esr/gfx/ots/src/colr.cc --- thunderbird-140.9.0esr/gfx/ots/src/colr.cc 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/colr.cc 2026-04-21 14:52:53.000000000 +0000 @@ -788,9 +788,8 @@ } int32_t prevGlyphID = -1; - // We loop over the list twice, first to collect all the glyph IDs present, - // and then to check they can be parsed. - size_t saveOffset = subtable.offset(); + // We first collect all the glyph IDs present, and their paint offsets, + // then check they can all be parsed. for (auto i = 0u; i < numBaseGlyphPaintRecords; ++i) { uint16_t glyphID; uint32_t paintOffset; @@ -818,18 +817,9 @@ prevGlyphID = glyphID; } - subtable.set_offset(saveOffset); - for (auto i = 0u; i < numBaseGlyphPaintRecords; ++i) { - uint16_t glyphID; - uint32_t paintOffset; - - if (!subtable.ReadU16(&glyphID) || - !subtable.ReadU32(&paintOffset)) { - return OTS_FAILURE_MSG("Failed to read base glyph list"); - } - - if (!ParsePaint(font, data + paintOffset, length - paintOffset, state)) { - return OTS_FAILURE_MSG("Failed to parse paint for base glyph ID %u", glyphID); + for (const auto& [gid, rec] : state.baseGlyphMap) { + if (!ParsePaint(font, rec.first, rec.second, state)) { + return OTS_FAILURE_MSG("Failed to parse paint for base glyph ID %u", gid); } // After each base glyph record is fully processed, the visited set should be clear; diff -Nru thunderbird-140.9.0esr/gfx/ots/src/glat.cc thunderbird-140.10.0esr/gfx/ots/src/glat.cc --- thunderbird-140.9.0esr/gfx/ots/src/glat.cc 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/glat.cc 2026-04-21 14:52:53.000000000 +0000 @@ -223,7 +223,7 @@ table.remaining(), // input buffer size (input size + padding) reinterpret_cast(decompressed.get()), decompressed_size, // target output size - &outputSize); // return output size + &outputSize); // output buffer size if (!ret || outputSize != decompressed_size) { return DropGraphite("Decompression failed"); } diff -Nru thunderbird-140.9.0esr/gfx/ots/src/layout.cc thunderbird-140.10.0esr/gfx/ots/src/layout.cc --- thunderbird-140.9.0esr/gfx/ots/src/layout.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/layout.cc 2026-04-21 14:52:53.000000000 +0000 @@ -190,7 +190,7 @@ if (!subtable.ReadU16(&start_glyph)) { return OTS_FAILURE_MSG("Failed to read starting glyph of class definition"); } - if (start_glyph > num_glyphs) { + if (start_glyph >= num_glyphs) { return OTS_FAILURE_MSG("Bad starting glyph %d in class definition", start_glyph); } @@ -281,7 +281,7 @@ if (!subtable.ReadU16(&glyph)) { return OTS_FAILURE_MSG("Failed to read glyph %d in coverage", i); } - if (glyph > num_glyphs) { + if (glyph >= num_glyphs) { return OTS_FAILURE_MSG("bad glyph ID: %u", glyph); } } @@ -386,7 +386,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read glyph %d", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph %d for entry %d", glyph_id, i); } } @@ -662,7 +662,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read backtrack glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for bactrack glyph %d in chain rule subtable", glyph_id, i); } } @@ -679,7 +679,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read input glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for input glyph %d in chain rule subtable", glyph_id, i); } } @@ -693,7 +693,7 @@ if (!subtable.ReadU16(&glyph_id)) { return OTS_FAILURE_MSG("Failed to read lookahead glyph %d in chain rule subtable", i); } - if (glyph_id > num_glyphs) { + if (glyph_id >= num_glyphs) { return OTS_FAILURE_MSG("Bad glyph id %d for lookadhead glyph %d in chain rule subtable", glyph_id, i); } } diff -Nru thunderbird-140.9.0esr/gfx/ots/src/ots.cc thunderbird-140.10.0esr/gfx/ots/src/ots.cc --- thunderbird-140.9.0esr/gfx/ots/src/ots.cc 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/ots.cc 2026-04-21 14:52:53.000000000 +0000 @@ -1066,7 +1066,7 @@ void Table::Message(int level, const char *format, va_list va) { char msg[206] = { OTS_UNTAG(m_tag), ':', ' ' }; std::vsnprintf(msg + 6, 200, format, va); - m_font->file->context->Message(level, msg); + m_font->file->context->Message(level, "%s", msg); } bool Table::Error(const char *format, ...) { diff -Nru thunderbird-140.9.0esr/gfx/ots/src/silf.cc thunderbird-140.10.0esr/gfx/ots/src/silf.cc --- thunderbird-140.9.0esr/gfx/ots/src/silf.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/silf.cc 2026-04-21 14:52:53.000000000 +0000 @@ -49,14 +49,14 @@ OTS_MAX_DECOMPRESSED_TABLE_SIZE / (1024.0 * 1024.0), decompressed_size / (1024.0 * 1024.0)); } - std::unique_ptr decompressed(new uint8_t[decompressed_size]()); + std::unique_ptr decompressed(new uint8_t[decompressed_size]()); size_t outputSize = 0; bool ret = mozilla::Compression::LZ4::decompressPartial( reinterpret_cast(data + table.offset()), table.remaining(), // input buffer size (input size + padding) reinterpret_cast(decompressed.get()), decompressed_size, // target output size - &outputSize); // return output size + &outputSize); // output buffer size if (!ret || outputSize != decompressed_size) { return DropGraphite("Decompression failed"); } diff -Nru thunderbird-140.9.0esr/gfx/ots/src/variations.cc thunderbird-140.10.0esr/gfx/ots/src/variations.cc --- thunderbird-140.9.0esr/gfx/ots/src/variations.cc 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ots/src/variations.cc 2026-04-21 14:52:53.000000000 +0000 @@ -222,7 +222,8 @@ } if (tupleIndex & INTERMEDIATE_REGION) { - std::vector startTuple(axisCount); + std::vector startTuple; + startTuple.reserve(axisCount); for (unsigned axis = 0; axis < axisCount; axis++) { int16_t coordinate; if (!subtable.ReadS16(&coordinate)) { @@ -234,7 +235,8 @@ startTuple.push_back(coordinate); } - std::vector endTuple(axisCount); + std::vector endTuple; + endTuple.reserve(axisCount); for (unsigned axis = 0; axis < axisCount; axis++) { int16_t coordinate; if (!subtable.ReadS16(&coordinate)) { diff -Nru thunderbird-140.9.0esr/gfx/src/FilterSupport.cpp thunderbird-140.10.0esr/gfx/src/FilterSupport.cpp --- thunderbird-140.9.0esr/gfx/src/FilterSupport.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/src/FilterSupport.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -417,7 +417,7 @@ static const float hueRotateB = 0.283f; switch (aMatrixAttributes.mType) { - case SVG_FECOLORMATRIX_TYPE_MATRIX: { + case SVGFEColorMatrixType::Matrix: { if (aMatrixAttributes.mValues.Length() != 20) { return false; } @@ -426,7 +426,7 @@ break; } - case SVG_FECOLORMATRIX_TYPE_SATURATE: { + case SVGFEColorMatrixType::Saturate: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -441,7 +441,7 @@ break; } - case SVG_FECOLORMATRIX_TYPE_HUE_ROTATE: { + case SVGFEColorMatrixType::HueRotate: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -468,12 +468,12 @@ break; } - case SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA: { + case SVGFEColorMatrixType::LuminanceToAlpha: { PodCopy(aOutMatrix, luminanceToAlphaMatrix, 20); break; } - case SVG_FECOLORMATRIX_TYPE_SEPIA: { + case SVGFEColorMatrixType::Sepia: { if (aMatrixAttributes.mValues.Length() != 1) { return false; } @@ -532,10 +532,10 @@ RefPtr filter; - uint32_t type = aFunctionAttributes.mTypes[aInChannel]; + SVGFEComponentTransferType type = aFunctionAttributes.mTypes[aInChannel]; switch (type) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { const nsTArray& tableValues = aFunctionAttributes.mValues[aInChannel]; if (tableValues.Length() < 2) return; @@ -557,7 +557,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { const nsTArray& tableValues = aFunctionAttributes.mValues[aInChannel]; if (tableValues.Length() < 1) return; @@ -580,7 +580,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { static const LinearTransferAtts slopeAtt[4] = { ATT_LINEAR_TRANSFER_SLOPE_R, ATT_LINEAR_TRANSFER_SLOPE_G, ATT_LINEAR_TRANSFER_SLOPE_B, ATT_LINEAR_TRANSFER_SLOPE_A}; @@ -605,7 +605,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { static const GammaTransferAtts amplitudeAtt[4] = { ATT_GAMMA_TRANSFER_AMPLITUDE_R, ATT_GAMMA_TRANSFER_AMPLITUDE_G, ATT_GAMMA_TRANSFER_AMPLITUDE_B, ATT_GAMMA_TRANSFER_AMPLITUDE_A}; @@ -635,7 +635,7 @@ break; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: break; } @@ -678,12 +678,12 @@ } already_AddRefed operator()(const BlendAttributes& aBlend) { - uint32_t mode = aBlend.mBlendMode; + SVGFEBlendMode mode = aBlend.mBlendMode; RefPtr filter; - if (mode == SVG_FEBLEND_MODE_UNKNOWN) { + if (mode == SVGFEBlendMode::Unknown) { return nullptr; } - if (mode == SVG_FEBLEND_MODE_NORMAL) { + if (mode == SVGFEBlendMode::Normal) { filter = mDT->CreateFilter(FilterType::COMPOSITE); if (!filter) { return nullptr; @@ -695,25 +695,27 @@ if (!filter) { return nullptr; } - static const uint8_t blendModes[SVG_FEBLEND_MODE_LUMINOSITY + 1] = { - 0, - 0, - BLEND_MODE_MULTIPLY, - BLEND_MODE_SCREEN, - BLEND_MODE_DARKEN, - BLEND_MODE_LIGHTEN, - BLEND_MODE_OVERLAY, - BLEND_MODE_COLOR_DODGE, - BLEND_MODE_COLOR_BURN, - BLEND_MODE_HARD_LIGHT, - BLEND_MODE_SOFT_LIGHT, - BLEND_MODE_DIFFERENCE, - BLEND_MODE_EXCLUSION, - BLEND_MODE_HUE, - BLEND_MODE_SATURATION, - BLEND_MODE_COLOR, - BLEND_MODE_LUMINOSITY}; - filter->SetAttribute(ATT_BLEND_BLENDMODE, (uint32_t)blendModes[mode]); + static const uint8_t blendModes[] = {0, + 0, + BLEND_MODE_MULTIPLY, + BLEND_MODE_SCREEN, + BLEND_MODE_DARKEN, + BLEND_MODE_LIGHTEN, + BLEND_MODE_OVERLAY, + BLEND_MODE_COLOR_DODGE, + BLEND_MODE_COLOR_BURN, + BLEND_MODE_HARD_LIGHT, + BLEND_MODE_SOFT_LIGHT, + BLEND_MODE_DIFFERENCE, + BLEND_MODE_EXCLUSION, + BLEND_MODE_HUE, + BLEND_MODE_SATURATION, + BLEND_MODE_COLOR, + BLEND_MODE_LUMINOSITY}; + static_assert(std::size(blendModes) == + ContiguousEnumSize::value); + filter->SetAttribute(ATT_BLEND_BLENDMODE, + (uint32_t)blendModes[static_cast(mode)]); // The correct input order for both software and D2D filters is flipped // from our source order, so flip here. filter->SetInput(IN_BLEND_IN, mSources[1]); @@ -764,9 +766,10 @@ rx = std::min(rx, kMorphologyMaxRadius); ry = std::min(ry, kMorphologyMaxRadius); - MorphologyOperator op = aMorphology.mOperator == SVG_OPERATOR_ERODE - ? MORPHOLOGY_OPERATOR_ERODE - : MORPHOLOGY_OPERATOR_DILATE; + MorphologyOperator op = + aMorphology.mOperator == SVGMorphologyOperator::Erode + ? MORPHOLOGY_OPERATOR_ERODE + : MORPHOLOGY_OPERATOR_DILATE; RefPtr filter = mDT->CreateFilter(FilterType::MORPHOLOGY); if (!filter) { @@ -801,14 +804,14 @@ already_AddRefed operator()( const ComponentTransferAttributes& aComponentTransfer) { MOZ_ASSERT(aComponentTransfer.mTypes[0] != - SVG_FECOMPONENTTRANSFER_SAME_AS_R); + SVGFEComponentTransferType::SameAsR); MOZ_ASSERT(aComponentTransfer.mTypes[3] != - SVG_FECOMPONENTTRANSFER_SAME_AS_R); + SVGFEComponentTransferType::SameAsR); RefPtr filters[4]; // one for each FILTER_*_TRANSFER type for (int32_t i = 0; i < 4; i++) { int32_t inputIndex = (aComponentTransfer.mTypes[i] == - SVG_FECOMPONENTTRANSFER_SAME_AS_R) && + SVGFEComponentTransferType::SameAsR) && (i < 3) ? 0 : i; @@ -856,15 +859,17 @@ filter->SetAttribute(ATT_CONVOLVE_MATRIX_BIAS, aConvolveMatrix.mBias); filter->SetAttribute(ATT_CONVOLVE_MATRIX_TARGET, aConvolveMatrix.mTarget); filter->SetAttribute(ATT_CONVOLVE_MATRIX_SOURCE_RECT, mSourceRegions[0]); - uint32_t edgeMode = aConvolveMatrix.mEdgeMode; - static const uint8_t edgeModes[SVG_EDGEMODE_NONE + 1] = { - EDGE_MODE_NONE, // SVG_EDGEMODE_UNKNOWN - EDGE_MODE_DUPLICATE, // SVG_EDGEMODE_DUPLICATE - EDGE_MODE_WRAP, // SVG_EDGEMODE_WRAP - EDGE_MODE_NONE // SVG_EDGEMODE_NONE + static const uint8_t edgeModes[] = { + EDGE_MODE_NONE, // SVGEdgeMode::Unknown + EDGE_MODE_DUPLICATE, // SVGEdgeMode::Duplicate + EDGE_MODE_WRAP, // SVGEdgeMode::Wrap + EDGE_MODE_NONE // SVGEdgeMode::None }; - filter->SetAttribute(ATT_CONVOLVE_MATRIX_EDGE_MODE, - (uint32_t)edgeModes[edgeMode]); + static_assert(std::size(edgeModes) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_CONVOLVE_MATRIX_EDGE_MODE, + (uint32_t)edgeModes[static_cast(aConvolveMatrix.mEdgeMode)]); filter->SetAttribute(ATT_CONVOLVE_MATRIX_KERNEL_UNIT_LENGTH, aConvolveMatrix.mKernelUnitLength); filter->SetAttribute(ATT_CONVOLVE_MATRIX_PRESERVE_ALPHA, @@ -885,17 +890,21 @@ return nullptr; } filter->SetAttribute(ATT_DISPLACEMENT_MAP_SCALE, aDisplacementMap.mScale); - static const uint8_t channel[SVG_CHANNEL_A + 1] = { - COLOR_CHANNEL_R, // SVG_CHANNEL_UNKNOWN - COLOR_CHANNEL_R, // SVG_CHANNEL_R - COLOR_CHANNEL_G, // SVG_CHANNEL_G - COLOR_CHANNEL_B, // SVG_CHANNEL_B - COLOR_CHANNEL_A // SVG_CHANNEL_A + static const uint8_t channel[] = { + COLOR_CHANNEL_R, // SVGChannel::Unknown + COLOR_CHANNEL_R, // SVGChannel::R + COLOR_CHANNEL_G, // SVGChannel::G + COLOR_CHANNEL_B, // SVGChannel::B + COLOR_CHANNEL_A // SVGChannel::A }; - filter->SetAttribute(ATT_DISPLACEMENT_MAP_X_CHANNEL, - (uint32_t)channel[aDisplacementMap.mXChannel]); - filter->SetAttribute(ATT_DISPLACEMENT_MAP_Y_CHANNEL, - (uint32_t)channel[aDisplacementMap.mYChannel]); + static_assert(std::size(channel) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_DISPLACEMENT_MAP_X_CHANNEL, + (uint32_t)channel[static_cast(aDisplacementMap.mXChannel)]); + filter->SetAttribute( + ATT_DISPLACEMENT_MAP_Y_CHANNEL, + (uint32_t)channel[static_cast(aDisplacementMap.mYChannel)]); filter->SetInput(IN_DISPLACEMENT_MAP_IN, mSources[0]); filter->SetInput(IN_DISPLACEMENT_MAP_IN2, mSources[1]); return filter.forget(); @@ -912,13 +921,16 @@ filter->SetAttribute(ATT_TURBULENCE_NUM_OCTAVES, aTurbulence.mOctaves); filter->SetAttribute(ATT_TURBULENCE_STITCHABLE, aTurbulence.mStitchable); filter->SetAttribute(ATT_TURBULENCE_SEED, (uint32_t)aTurbulence.mSeed); - static const uint8_t type[SVG_TURBULENCE_TYPE_TURBULENCE + 1] = { - TURBULENCE_TYPE_FRACTAL_NOISE, // SVG_TURBULENCE_TYPE_UNKNOWN - TURBULENCE_TYPE_FRACTAL_NOISE, // SVG_TURBULENCE_TYPE_FRACTALNOISE - TURBULENCE_TYPE_TURBULENCE // SVG_TURBULENCE_TYPE_TURBULENCE + static const uint8_t type[] = { + TURBULENCE_TYPE_FRACTAL_NOISE, // SVGTurbulenceType::Unknown + TURBULENCE_TYPE_FRACTAL_NOISE, // SVGTurbulenceType::FractalNoise + TURBULENCE_TYPE_TURBULENCE // SVGTurbulenceType::Turbulence }; - filter->SetAttribute(ATT_TURBULENCE_TYPE, - (uint32_t)type[aTurbulence.mType]); + static_assert(std::size(type) == + ContiguousEnumSize::value); + filter->SetAttribute( + ATT_TURBULENCE_TYPE, + (uint32_t)type[static_cast(aTurbulence.mType)]); filter->SetAttribute( ATT_TURBULENCE_RECT, mDescription.PrimitiveSubregion() - aTurbulence.mOffset); @@ -928,8 +940,8 @@ already_AddRefed operator()( const CompositeAttributes& aComposite) { RefPtr filter; - uint32_t op = aComposite.mOperator; - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + SVGFECompositeOperator op = aComposite.mOperator; + if (op == SVGFECompositeOperator::Arithmetic) { const nsTArray& coefficients = aComposite.mCoefficients; static const float allZero[4] = {0, 0, 0, 0}; filter = mDT->CreateFilter(FilterType::ARITHMETIC_COMBINE); @@ -948,17 +960,20 @@ if (!filter) { return nullptr; } - static const uint8_t operators[SVG_FECOMPOSITE_OPERATOR_LIGHTER + 1] = { - COMPOSITE_OPERATOR_OVER, // SVG_FECOMPOSITE_OPERATOR_UNKNOWN - COMPOSITE_OPERATOR_OVER, // SVG_FECOMPOSITE_OPERATOR_OVER - COMPOSITE_OPERATOR_IN, // SVG_FECOMPOSITE_OPERATOR_IN - COMPOSITE_OPERATOR_OUT, // SVG_FECOMPOSITE_OPERATOR_OUT - COMPOSITE_OPERATOR_ATOP, // SVG_FECOMPOSITE_OPERATOR_ATOP - COMPOSITE_OPERATOR_XOR, // SVG_FECOMPOSITE_OPERATOR_XOR + static const uint8_t operators[] = { + COMPOSITE_OPERATOR_OVER, // SVGFECompositeOperator::Unknown + COMPOSITE_OPERATOR_OVER, // SVGFECompositeOperator::Over + COMPOSITE_OPERATOR_IN, // SVGFECompositeOperator::In + COMPOSITE_OPERATOR_OUT, // SVGFECompositeOperator::Out + COMPOSITE_OPERATOR_ATOP, // SVGFECompositeOperator::Atop + COMPOSITE_OPERATOR_XOR, // SVGFECompositeOperator::Xor COMPOSITE_OPERATOR_OVER, // Unused, arithmetic is handled above - COMPOSITE_OPERATOR_LIGHTER // SVG_FECOMPOSITE_OPERATOR_LIGHTER + COMPOSITE_OPERATOR_LIGHTER // SVGFECompositeOperator::Lighter }; - filter->SetAttribute(ATT_COMPOSITE_OPERATOR, (uint32_t)operators[op]); + static_assert(std::size(operators) == + ContiguousEnumSize::value); + filter->SetAttribute(ATT_COMPOSITE_OPERATOR, + (uint32_t)operators[static_cast(op)]); filter->SetInput(IN_COMPOSITE_IN_START, mSources[1]); filter->SetInput(IN_COMPOSITE_IN_START + 1, mSources[0]); } @@ -1416,7 +1431,7 @@ } nsIntRegion operator()(const ConvolveMatrixAttributes& aConvolveMatrix) { - if (aConvolveMatrix.mEdgeMode != EDGE_MODE_NONE) { + if (aConvolveMatrix.mEdgeMode != SVGEdgeMode::None) { return mDescription.PrimitiveSubregion(); } Size kernelUnitLength = aConvolveMatrix.mKernelUnitLength; @@ -1535,7 +1550,7 @@ static float ResultOfZeroUnderTransferFunction( const ComponentTransferAttributes& aFunctionAttributes, int32_t channel) { switch (aFunctionAttributes.mTypes[channel]) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { const nsTArray& tableValues = aFunctionAttributes.mValues[channel]; if (tableValues.Length() < 2) { return 0.0f; @@ -1543,7 +1558,7 @@ return tableValues[0]; } - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { const nsTArray& tableValues = aFunctionAttributes.mValues[channel]; if (tableValues.Length() < 1) { return 0.0f; @@ -1551,17 +1566,17 @@ return tableValues[0]; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { const nsTArray& values = aFunctionAttributes.mValues[channel]; return values[kComponentTransferInterceptIndex]; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { const nsTArray& values = aFunctionAttributes.mValues[channel]; return values[kComponentTransferOffsetIndex]; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: return 0.0f; } @@ -1587,7 +1602,7 @@ } nsIntRegion operator()(const ColorMatrixAttributes& aColorMatrix) { - if (aColorMatrix.mType == (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX) { + if (aColorMatrix.mType == SVGFEColorMatrixType::Matrix) { const nsTArray& values = aColorMatrix.mValues; if (values.Length() == 20 && values[19] > 0.0f) { return mDescription.PrimitiveSubregion(); @@ -1597,8 +1612,8 @@ } nsIntRegion operator()(const MorphologyAttributes& aMorphology) { - uint32_t op = aMorphology.mOperator; - if (op == SVG_OPERATOR_ERODE) { + SVGMorphologyOperator op = aMorphology.mOperator; + if (op == SVGMorphologyOperator::Erode) { return mInputExtents[0]; } Size radii = aMorphology.mRadii; @@ -1650,8 +1665,8 @@ } nsIntRegion operator()(const CompositeAttributes& aComposite) { - uint32_t op = aComposite.mOperator; - if (op == SVG_FECOMPOSITE_OPERATOR_ARITHMETIC) { + SVGFECompositeOperator op = aComposite.mOperator; + if (op == SVGFECompositeOperator::Arithmetic) { // The arithmetic composite primitive can draw outside the bounding // box of its source images. const nsTArray& coefficients = aComposite.mCoefficients; @@ -1674,7 +1689,7 @@ } return region; } - if (op == SVG_FECOMPOSITE_OPERATOR_IN) { + if (op == SVGFECompositeOperator::In) { return mInputExtents[0].Intersect(mInputExtents[1]); } return ResultChangeRegionForPrimitive(mDescription, mInputExtents); diff -Nru thunderbird-140.9.0esr/gfx/src/FilterSupport.h thunderbird-140.10.0esr/gfx/src/FilterSupport.h --- thunderbird-140.9.0esr/gfx/src/FilterSupport.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/src/FilterSupport.h 2026-04-21 14:52:53.000000000 +0000 @@ -7,6 +7,7 @@ #ifndef __FilterSupport_h #define __FilterSupport_h +#include "mozilla/EnumTypeTraits.h" #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Matrix.h" #include "mozilla/gfx/Point.h" @@ -32,75 +33,120 @@ DrawTarget* aDT, SourceSurface* aSurface, const IntPoint& aSurfacePosition); } // namespace FilterWrappers -// Morphology Operators -const unsigned short SVG_OPERATOR_UNKNOWN = 0; -const unsigned short SVG_OPERATOR_ERODE = 1; -const unsigned short SVG_OPERATOR_DILATE = 2; - -// ColorMatrix types -const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0; -const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1; -const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2; -const unsigned short SVG_FECOLORMATRIX_TYPE_HUE_ROTATE = 3; -const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA = 4; -// ColorMatrix types for CSS filters -const unsigned short SVG_FECOLORMATRIX_TYPE_SEPIA = 5; - -// ComponentTransfer types -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4; -const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5; -const unsigned short SVG_FECOMPONENTTRANSFER_SAME_AS_R = 6; - -// Blend Mode Values -const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0; -const unsigned short SVG_FEBLEND_MODE_NORMAL = 1; -const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2; -const unsigned short SVG_FEBLEND_MODE_SCREEN = 3; -const unsigned short SVG_FEBLEND_MODE_DARKEN = 4; -const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5; -const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6; -const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7; -const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8; -const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9; -const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10; -const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11; -const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12; -const unsigned short SVG_FEBLEND_MODE_HUE = 13; -const unsigned short SVG_FEBLEND_MODE_SATURATION = 14; -const unsigned short SVG_FEBLEND_MODE_COLOR = 15; -const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16; - -// Edge Mode Values -const unsigned short SVG_EDGEMODE_UNKNOWN = 0; -const unsigned short SVG_EDGEMODE_DUPLICATE = 1; -const unsigned short SVG_EDGEMODE_WRAP = 2; -const unsigned short SVG_EDGEMODE_NONE = 3; - -// Channel Selectors -const unsigned short SVG_CHANNEL_UNKNOWN = 0; -const unsigned short SVG_CHANNEL_R = 1; -const unsigned short SVG_CHANNEL_G = 2; -const unsigned short SVG_CHANNEL_B = 3; -const unsigned short SVG_CHANNEL_A = 4; - -// Turbulence Types -const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0; -const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1; -const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2; - -// Composite Operators -const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0; -const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1; -const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2; -const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3; -const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4; -const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5; -const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6; -const unsigned short SVG_FECOMPOSITE_OPERATOR_LIGHTER = 7; +enum class SVGMorphologyOperator : uint8_t { + Unknown = 0, + Erode = 1, + Dilate = 2, +}; + +enum class SVGFEColorMatrixType : uint8_t { + Unknown = 0, + Matrix = 1, + Saturate = 2, + HueRotate = 3, + LuminanceToAlpha = 4, + // ColorMatrix types for CSS filters + Sepia = 5, +}; + +enum class SVGFEComponentTransferType : uint8_t { + Unknown = 0, + Identity = 1, + Table = 2, + Discrete = 3, + Linear = 4, + Gamma = 5, + SameAsR = 6, +}; + +enum class SVGFEBlendMode : uint8_t { + Unknown = 0, + Normal = 1, + Multiply = 2, + Screen = 3, + Darken = 4, + Lighten = 5, + Overlay = 6, + ColorDodge = 7, + ColorBurn = 8, + HardLight = 9, + SoftLight = 10, + Difference = 11, + Exclusion = 12, + Hue = 13, + Saturation = 14, + Color = 15, + Luminosity = 16, +}; + +enum class SVGEdgeMode : uint8_t { + Unknown = 0, + Duplicate = 1, + Wrap = 2, + None = 3, +}; + +enum class SVGChannel : uint8_t { + Unknown = 0, + R = 1, + G = 2, + B = 3, + A = 4, +}; + +enum class SVGTurbulenceType : uint8_t { + Unknown = 0, + FractalNoise = 1, + Turbulence = 2, +}; + +enum class SVGFECompositeOperator : uint8_t { + Unknown = 0, + Over = 1, + In = 2, + Out = 3, + Atop = 4, + Xor = 5, + Arithmetic = 6, + Lighter = 7, +}; + +} // namespace gfx + +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGMorphologyOperator::Dilate; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEColorMatrixType::Sepia; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEComponentTransferType::SameAsR; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFEBlendMode::Luminosity; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGEdgeMode::None; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGChannel::A; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGTurbulenceType::Turbulence; +}; +template <> +struct MaxContiguousEnumValue { + static constexpr auto value = gfx::SVGFECompositeOperator::Lighter; +}; + +namespace gfx { struct FilterAttribute; @@ -114,7 +160,7 @@ }; struct BlendAttributes { - uint32_t mBlendMode; + SVGFEBlendMode mBlendMode; bool operator==(const BlendAttributes& aOther) const { return mBlendMode == aOther.mBlendMode; @@ -122,7 +168,7 @@ }; struct MorphologyAttributes { - uint32_t mOperator; + SVGMorphologyOperator mOperator; Size mRadii; bool operator==(const MorphologyAttributes& aOther) const { @@ -160,8 +206,8 @@ struct DisplacementMapAttributes { float mScale; - uint32_t mXChannel; - uint32_t mYChannel; + SVGChannel mXChannel; + SVGChannel mYChannel; bool operator==(const DisplacementMapAttributes& aOther) const { return mScale == aOther.mScale && mXChannel == aOther.mXChannel && @@ -175,7 +221,7 @@ float mSeed; uint32_t mOctaves; bool mStitchable; - uint32_t mType; + SVGTurbulenceType mType; bool operator==(const TurbulenceAttributes& aOther) const { return mOffset == aOther.mOffset && @@ -242,7 +288,7 @@ }; struct ColorMatrixAttributes { - uint32_t mType; + SVGFEColorMatrixType mType; ImplicitlyCopyableFloatArray mValues; bool operator==(const ColorMatrixAttributes& aOther) const { @@ -250,7 +296,7 @@ } }; -// If the types for G and B are SVG_FECOMPONENTTRANSFER_SAME_AS_R, +// If the types for G and B are SVGFEComponentTransferType::SameAsR, // use the R channel values - this lets us avoid copies. const uint32_t kChannelROrRGB = 0; const uint32_t kChannelG = 1; @@ -265,7 +311,7 @@ const uint32_t kComponentTransferOffsetIndex = 2; struct ComponentTransferAttributes { - uint8_t mTypes[4]; + SVGFEComponentTransferType mTypes[4]; ImplicitlyCopyableFloatArray mValues[4]; bool operator==(const ComponentTransferAttributes& aOther) const { @@ -282,7 +328,7 @@ float mDivisor; float mBias; IntPoint mTarget; - uint32_t mEdgeMode; + SVGEdgeMode mEdgeMode; Size mKernelUnitLength; bool mPreserveAlpha; @@ -297,7 +343,7 @@ }; struct CompositeAttributes { - uint32_t mOperator; + SVGFECompositeOperator mOperator; ImplicitlyCopyableFloatArray mCoefficients; bool operator==(const CompositeAttributes& aOther) const { diff -Nru thunderbird-140.9.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp thunderbird-140.10.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp --- thunderbird-140.9.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/tests/gtest/TestYUVtoRGB32.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -21,8 +21,12 @@ const Color YELLOW(255, 255, 0); const Color WHITE(255, 255, 255); const Color CHOCOLATE(210, 105, 30); -const std::array COLOR_LIST = {BLACK, BLUE, GREEN, CYAN, RED, - MAGENTA, YELLOW, WHITE, CHOCOLATE}; +const Color PERU(205, 133, 63); +const Color ROSYBROWN(188, 143, 143); +const Color STEELBLUE(70, 130, 180); +const std::array COLOR_LIST = { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, + YELLOW, WHITE, CHOCOLATE, PERU, ROSYBROWN, STEELBLUE}; Color RGB2YUV(const Color& aRGBColor) { const uint8_t& r = std::get<0>(aRGBColor); @@ -236,6 +240,26 @@ Color(236, 111, 20), // gfx::YUVColorSpace::BT2020 Color(229, 102, 20)}); + map.emplace(Hash(PERU), std::array{// gfx::YUVColorSpace::BT601 + Color(219, 137, 58), + // gfx::YUVColorSpace::BT709 + Color(228, 140, 58), + // gfx::YUVColorSpace::BT2020 + Color(223, 134, 59)}); + map.emplace(Hash(ROSYBROWN), + std::array{// gfx::YUVColorSpace::BT601 + Color(200, 147, 147), + // gfx::YUVColorSpace::BT709 + Color(204, 152, 147), + // gfx::YUVColorSpace::BT2020 + Color(201, 149, 147)}); + map.emplace(Hash(STEELBLUE), + std::array{// gfx::YUVColorSpace::BT601 + Color(65, 133, 189), + // gfx::YUVColorSpace::BT709 + Color(58, 129, 189), + // gfx::YUVColorSpace::BT2020 + Color(62, 135, 189)}); return map; } @@ -356,3 +380,131 @@ IsColorMatched(expectation, RGBX.get(), bufferSize); } } + +// Fills a 4×4 Y plane and chroma planes for a frame whose luma is divided +// into four 2×2 blocks. aColors[blockRow][blockCol] gives the color for each +// block. Chroma plane dimensions depend on aSubsampling: +// FULL (YV24): 4×4 chroma, each pixel maps 1:1 to a luma pixel. +// HALF_WIDTH (YV16): 2×4 chroma, half-width but full height. +// HALF_WIDTH_AND_HEIGHT (YV12): 2×2 chroma. +// Callers must provide at least 16 bytes for aUBuf/aVBuf to cover the FULL +// case; smaller subsamplings use only a prefix of that. +static void FillTwoByTwoFrame(const Color aColors[2][2], + gfx::ChromaSubsampling aSubsampling, + uint8_t* aYBuf, uint8_t* aUBuf, uint8_t* aVBuf) { + // Give each luma pixel a unique Y by adding a small per-pixel offset based + // on its position within its 2x2 chroma block: +0/+2/+4/+6 for + // (top-left/top-right/bottom-left/bottom-right). This makes luma sampling + // bugs detectable without meaningfully shifting the color. + for (int r = 0; r < 4; r++) { + for (int c = 0; c < 4; c++) { + uint8_t baseY = std::get<0>(RGB2YUV(aColors[r / 2][c / 2])); + aYBuf[r * 4 + c] = baseY + (r % 2) * 4 + (c % 2) * 2; + } + } + int chromaWidth = (aSubsampling == gfx::ChromaSubsampling::FULL) ? 4 : 2; + int chromaHeight = + (aSubsampling == gfx::ChromaSubsampling::HALF_WIDTH_AND_HEIGHT) ? 2 : 4; + for (int chromaRow = 0; chromaRow < chromaHeight; chromaRow++) { + int blockRow = chromaRow * 2 / chromaHeight; + for (int chromaCol = 0; chromaCol < chromaWidth; chromaCol++) { + int blockCol = chromaCol * 2 / chromaWidth; + aUBuf[chromaRow * chromaWidth + chromaCol] = + std::get<1>(RGB2YUV(aColors[blockRow][blockCol])); + aVBuf[chromaRow * chromaWidth + chromaCol] = + std::get<2>(RGB2YUV(aColors[blockRow][blockCol])); + } + } +} + +// Fills and converts a 4×4 test frame, writing the result into aOutput. +// aStride is in bytes. See FillTwoByTwoFrame for the aColors layout. +static void ConvertTestFrame(const Color aColors[2][2], + gfx::ChromaSubsampling aSubsampling, + const gfx::IntRect& aPictureRect, uint8_t* aOutput, + int32_t aStride) { + uint8_t yBuf[16], uBuf[16], vBuf[16]; + FillTwoByTwoFrame(aColors, aSubsampling, yBuf, uBuf, vBuf); + layers::PlanarYCbCrData data; + data.mYChannel = yBuf; + data.mYStride = 4; + data.mYSkip = 0; + data.mCbChannel = uBuf; + data.mCrChannel = vBuf; + data.mCbCrStride = (aSubsampling == gfx::ChromaSubsampling::FULL) ? 4 : 2; + data.mCbSkip = 0; + data.mCrSkip = 0; + data.mChromaSubsampling = aSubsampling; + data.mYUVColorSpace = gfx::YUVColorSpace::BT709; + data.mColorRange = gfx::ColorRange::LIMITED; + data.mPictureRect = aPictureRect; + ConvertYCbCrToRGB32(data, gfx::SurfaceFormat::R8G8B8X8, aOutput, aStride, + nullptr); +} + +// Tests for odd pic_x / pic_y offsets in YV12, YV16, and YV24. +// +// The 4x4 frame has four 2x2 chroma blocks with distinct mid-range colors. +// Within each block each luma pixel has a unique Y value (offset +0/+2/+4/+6), +// so both chroma and luma misalignment are detectable. The reference is a full +// even-aligned 4x4 conversion; each odd-crop output pixel is checked against +// its corresponding source position in that reference. +static const gfx::ChromaSubsampling kTestSubsamplings[] = { + gfx::ChromaSubsampling::HALF_WIDTH_AND_HEIGHT, + gfx::ChromaSubsampling::HALF_WIDTH, gfx::ChromaSubsampling::FULL}; + +static void RunOddPicTest(const Color aColors[2][2], + const gfx::IntRect& aRect) { + const int32_t stride = aRect.Width() * 4; + UniquePtr output = MakeUnique(aRect.Height() * stride); + auto exp = GetExpectedConvertedRGB(); + const size_t bt709 = static_cast(gfx::YUVColorSpace::BT709); + + for (gfx::ChromaSubsampling subsampling : kTestSubsamplings) { + // fullRef: even-aligned 4x4 reference (no odd-offset ambiguity). + uint8_t fullRef[4 * 4 * 4]; + ConvertTestFrame(aColors, subsampling, gfx::IntRect(0, 0, 4, 4), fullRef, + 4 * 4); + + // Sanity-check the reference: top-left of each 2x2 block (Y offset 0) + // must match GetExpectedConvertedRGB; the other three pixels in the block + // must be distinct but close (Y delta ≤6 → channel delta ~2-7). + for (int br = 0; br < 2; br++) { + for (int bc = 0; bc < 2; bc++) { + uint8_t* base = fullRef + (br * 2) * 4 * 4 + (bc * 2) * 4; + IsColorMatched(exp[Hash(aColors[br][bc])][bt709], base, 4); + for (int dr = 0; dr < 2; dr++) { + for (int dc = 0; dc < 2; dc++) { + if (dr == 0 && dc == 0) continue; + uint8_t* other = + fullRef + (br * 2 + dr) * 4 * 4 + (bc * 2 + dc) * 4; + for (int ch = 0; ch < 3; ch++) { + ASSERT_NE(base[ch], other[ch]); + ASSERT_NEAR(base[ch], other[ch], 10); + } + } + } + } + } + + // output: the odd-crop conversion under test. + ConvertTestFrame(aColors, subsampling, aRect, output.get(), stride); + + // Each output pixel must match its source position in the full reference. + for (int row = 0; row < aRect.Height(); row++) { + for (int col = 0; col < aRect.Width(); col++) { + uint8_t* ref = fullRef + (aRect.y + row) * 4 * 4 + (aRect.x + col) * 4; + Color expected(ref[0], ref[1], ref[2]); + IsColorMatched(expected, output.get() + row * stride + col * 4, 4); + } + } + } +} + +TEST(YCbCrUtils, ConvertYCbCrToRGB32OddPicOffset) +{ + const Color colors[2][2] = {{CHOCOLATE, PERU}, {ROSYBROWN, STEELBLUE}}; + RunOddPicTest(colors, gfx::IntRect(1, 1, 3, 3)); // both odd + RunOddPicTest(colors, gfx::IntRect(1, 0, 3, 4)); // odd pic_x only + RunOddPicTest(colors, gfx::IntRect(0, 1, 4, 3)); // odd pic_y only +} diff -Nru thunderbird-140.9.0esr/gfx/thebes/COLRFonts.cpp thunderbird-140.10.0esr/gfx/thebes/COLRFonts.cpp --- thunderbird-140.9.0esr/gfx/thebes/COLRFonts.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/COLRFonts.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -2312,7 +2312,7 @@ uint32_t deltaSetSize = (uint16_t(regionIndexCount) + uint16_t(wordDeltaCount)) << longWords; if (reinterpret_cast(deltaSets()) + - uint16_t(itemCount) * deltaSetSize > + uint64_t(uint16_t(itemCount)) * deltaSetSize > reinterpret_cast(aHeader) + aLength) { return false; } diff -Nru thunderbird-140.9.0esr/gfx/thebes/CoreTextFontList.h thunderbird-140.10.0esr/gfx/thebes/CoreTextFontList.h --- thunderbird-140.9.0esr/gfx/thebes/CoreTextFontList.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/CoreTextFontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -84,6 +84,8 @@ static void DestroyBlobFunc(void* aUserData); + FontTableCache* GetFontTableCache(bool aCreate) override { return nullptr; } + CGFontRef mFontRef MOZ_GUARDED_BY(mLock); // owning reference const double mSizeHint; diff -Nru thunderbird-140.9.0esr/gfx/thebes/SharedFontList.cpp thunderbird-140.10.0esr/gfx/thebes/SharedFontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/SharedFontList.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/SharedFontList.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -798,6 +798,14 @@ bool FontList::AppendShmBlock(uint32_t aSizeNeeded) { MOZ_ASSERT(XRE_IsParentProcess()); + + // TODO: currently most callers of AppendShmBlock() (via Alloc()) assume + // the allocation is infallible; hence the release-assert here is the safe + // way to handle overflow. Consider whether to make the allocation fallible, + // and instead handle null safely in the callers. + MOZ_RELEASE_ASSERT(mBlocks.Length() < (1u << Pointer::kIndexBits), + "FontList shm block limit exceeded"); + uint32_t size = std::max(aSizeNeeded, SHM_BLOCK_SIZE); auto handle = ipc::shared_memory::CreateFreezable(size); if (!handle) { diff -Nru thunderbird-140.9.0esr/gfx/thebes/SharedFontList.h thunderbird-140.10.0esr/gfx/thebes/SharedFontList.h --- thunderbird-140.9.0esr/gfx/thebes/SharedFontList.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/SharedFontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -42,7 +42,8 @@ Pointer(uint32_t aBlock, uint32_t aOffset) : mBlockAndOffset((aBlock << kBlockShift) | aOffset) { - MOZ_ASSERT(aBlock < (1u << kIndexBits) && aOffset < (1u << kBlockShift)); + MOZ_RELEASE_ASSERT(aBlock < (1u << kIndexBits) && + aOffset < (1u << kBlockShift)); } Pointer(const Pointer& aOther) { diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxDWriteFontList.cpp thunderbird-140.10.0esr/gfx/thebes/gfxDWriteFontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxDWriteFontList.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxDWriteFontList.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -384,7 +384,10 @@ return fe; } -gfxDWriteFontEntry::~gfxDWriteFontEntry() {} +gfxDWriteFontEntry::~gfxDWriteFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; +} static bool UsingArabicOrHebrewScriptSystemLocale() { LANGID langid = PRIMARYLANGID(::GetSystemDefaultLangID()); @@ -512,6 +515,18 @@ return nullptr; } +gfxFontEntry::FontTableCache* gfxDWriteFontEntry::GetFontTableCache( + bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + nsresult gfxDWriteFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { AUTO_PROFILER_LABEL("gfxDWriteFontEntry::ReadCMAP", GRAPHICS); @@ -1584,7 +1599,7 @@ if (FAILED(hr)) { glean::fontlist::dwritefont_init_problem.AccumulateSingleSample( uint32_t(errGDIInterop)); - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); return; } @@ -1593,7 +1608,7 @@ if (!mSystemFonts) { glean::fontlist::dwritefont_init_problem.AccumulateSingleSample( uint32_t(errSystemFontCollection)); - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); return; } #ifdef MOZ_BUNDLED_FONTS diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxDWriteFontList.h thunderbird-140.10.0esr/gfx/thebes/gfxDWriteFontList.h --- thunderbird-140.9.0esr/gfx/thebes/gfxDWriteFontList.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxDWriteFontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -217,6 +217,8 @@ static bool InitLogFont(IDWriteFont* aFont, LOGFONTW* aLogFont); + FontTableCache* GetFontTableCache(bool aCreate) override; + /** * A fontentry only needs to have either of these. If it has both only * the IDWriteFont will be used. @@ -236,6 +238,8 @@ DWRITE_FONT_FACE_TYPE mFaceType; + mozilla::Atomic mFontTableCache; + int8_t mIsCJK; bool mIsSystemFont; bool mForceGDIClassic; diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontBase.cpp thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontBase.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontBase.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontBase.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -747,7 +747,7 @@ * Get the cached glyph metrics for the glyph id if available. Otherwise, query * FreeType for the glyph extents and initialize the glyph metrics. */ -const gfxFT2FontBase::GlyphMetrics& gfxFT2FontBase::GetCachedGlyphMetrics( +gfxFT2FontBase::GlyphMetrics gfxFT2FontBase::GetCachedGlyphMetrics( uint16_t aGID, IntRect* aBounds) { { // Try to read cached metrics without exclusive locking. @@ -782,7 +782,7 @@ bool gfxFT2FontBase::GetGlyphBounds(uint16_t aGID, gfxRect* aBounds, bool aTight) { IntRect bounds; - const GlyphMetrics& metrics = GetCachedGlyphMetrics(aGID, &bounds); + const GlyphMetrics metrics = GetCachedGlyphMetrics(aGID, &bounds); if (!metrics.HasValidBounds()) { return false; } diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontBase.h thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontBase.h --- thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontBase.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontBase.h 2026-04-21 14:52:53.000000000 +0000 @@ -142,7 +142,7 @@ uint16_t mHeight; }; - const GlyphMetrics& GetCachedGlyphMetrics( + GlyphMetrics GetCachedGlyphMetrics( uint16_t aGID, mozilla::gfx::IntRect* aBounds = nullptr); mozilla::UniquePtr> mGlyphMetrics diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontList.cpp thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontList.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontList.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -165,6 +165,10 @@ */ FT2FontEntry::~FT2FontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; + auto* face = mHBFace.exchange(nullptr); + hb_face_destroy(face); if (mMMVar) { SharedFTFace* face = mFTFace; FT_Done_MM_Var(face->GetFace()->glyph->library, mMMVar); @@ -453,45 +457,52 @@ return rv; } -hb_face_t* FT2FontEntry::CreateHBFace() const { - hb_face_t* result = nullptr; +hb_face_t* FT2FontEntry::CreateHBFace() { + if (mHBFace) { + return hb_face_reference(mHBFace); + } + hb_face_t* face = nullptr; if (mFilename[0] == '/') { // An absolute path means a normal file in the filesystem, so we can use - // hb_blob_create_from_file to read it. - gfxFontUtils::AutoHBBlob fileBlob( - hb_blob_create_from_file(mFilename.get())); - if (hb_blob_get_length(fileBlob) > 0) { - result = hb_face_create(fileBlob, mFTFontIndex); + // hb_face_create_from_file_or_fail, and keep the face around. + face = hb_face_create_from_file_or_fail(mFilename.get(), mFTFontIndex); + if (face) { + if (!mHBFace.compareExchange(nullptr, face)) { + hb_face_destroy(face); + face = mHBFace; + } } - } else { - // A relative path means an omnijar resource, which we may need to - // decompress to a temporary buffer. - RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); - nsZipItem* item = reader->GetItem(mFilename); - MOZ_ASSERT(item, "failed to find zip entry"); - if (item) { - // TODO(jfkthame): - // Check whether the item is compressed; if not, we could just get a - // pointer without needing to allocate a buffer and copy the data. - // (Currently this configuration isn't used for Gecko on Android.) - uint32_t length = item->RealSize(); - uint8_t* buffer = static_cast(malloc(length)); - if (buffer) { - nsZipCursor cursor(item, reader, buffer, length); - cursor.Copy(&length); - MOZ_ASSERT(length == item->RealSize(), "error reading font"); - if (length == item->RealSize()) { - gfxFontUtils::AutoHBBlob blob( - hb_blob_create((const char*)buffer, length, - HB_MEMORY_MODE_READONLY, buffer, free)); - result = hb_face_create(blob, mFTFontIndex); - } + return hb_face_reference(face); + } + + // A relative path means an omnijar resource, which we may need to + // decompress to a temporary buffer. + RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); + nsZipItem* item = reader->GetItem(mFilename); + MOZ_ASSERT(item, "failed to find zip entry"); + if (item) { + // TODO(jfkthame): + // Check whether the item is compressed; if not, we could just get a + // pointer without needing to allocate a buffer and copy the data. + // (Currently this configuration isn't used for Gecko on Android.) + uint32_t length = item->RealSize(); + uint8_t* buffer = static_cast(malloc(length)); + if (buffer) { + nsZipCursor cursor(item, reader, buffer, length); + cursor.Copy(&length); + MOZ_ASSERT(length == item->RealSize(), "error reading font"); + if (length == item->RealSize()) { + gfxFontUtils::AutoHBBlob blob( + hb_blob_create((const char*)buffer, length, HB_MEMORY_MODE_READONLY, + buffer, free)); + // We don't retain this face; the caller will own the only reference. + return hb_face_create(blob, mFTFontIndex); } } } - return result; + return nullptr; } bool FT2FontEntry::HasFontTable(uint32_t aTableTag) { @@ -562,14 +573,13 @@ } } - // If the FT_Face hasn't been instantiated, try to read table directly - // via harfbuzz API to avoid expensive FT_Face creation. - if (!mFTFace && !mFilename.IsEmpty()) { - hb_face_t* face = CreateHBFace(); - if (face) { + // Try to read table directly via harfbuzz API, unless CreateHBFace will be + // expensive. + if (mHBFace || (!mFilename.IsEmpty() && mFilename[0] == '/')) { + if (hb_face_t* face = CreateHBFace()) { hb_blob_t* result = hb_face_reference_table(face, aTableTag); hb_face_destroy(face); - return result; + return result != hb_blob_get_empty() ? result : nullptr; } } @@ -578,6 +588,17 @@ return gfxFontEntry::GetFontTable(aTableTag); } +gfxFontEntry::FontTableCache* FT2FontEntry::GetFontTableCache(bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + bool FT2FontEntry::HasVariations() { switch (mHasVariations) { case HasVariationsState::No: diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontList.h thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontList.h --- thunderbird-140.9.0esr/gfx/thebes/gfxFT2FontList.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFT2FontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -86,9 +86,11 @@ // Get a harfbuzz face for this font, if possible. The caller is responsible // to destroy the face when no longer needed. + // Note that a face may be cached by the font entry, and a new reference + // returned to the caller. // This may be a bit expensive, so avoid calling multiple times if the same // face can be re-used for several purposes instead. - hb_face_t* CreateHBFace() const; + hb_face_t* CreateHBFace(); /** * Append this face's metadata to aFaceList for storage in the FontNameCache @@ -106,15 +108,22 @@ void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf, FontListSizes* aSizes) const override; + nsCString mFilename; + uint8_t mFTFontIndex; + + protected: + FontTableCache* GetFontTableCache(bool aCreate) override; + + mozilla::Atomic mFontTableCache; + + mozilla::Atomic mHBFace; + // Strong reference (addref'd), but held in an atomic ptr rather than a // normal RefPtr. mozilla::Atomic mFTFace; FT_MM_Var* mMMVar = nullptr; - nsCString mFilename; - uint8_t mFTFontIndex; - mozilla::ThreadSafeWeakPtr mUnscaledFont; nsTHashSet mAvailableTables; diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFcPlatformFontList.cpp thunderbird-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxFcPlatformFontList.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -7,7 +7,6 @@ #include "gfxFcPlatformFontList.h" #include "gfxFont.h" -#include "gfxFontConstants.h" #include "gfxFT2Utils.h" #include "gfxPlatform.h" #include "nsPresContext.h" @@ -18,25 +17,20 @@ #include "mozilla/Sprintf.h" #include "mozilla/StaticPrefs_gfx.h" #include "mozilla/glean/GfxMetrics.h" -#include "mozilla/TimeStamp.h" #include "nsGkAtoms.h" #include "nsIConsoleService.h" #include "nsIGfxInfo.h" #include "mozilla/Components.h" #include "nsString.h" #include "nsStringFwd.h" -#include "nsUnicodeProperties.h" #include "nsDirectoryServiceUtils.h" #include "nsDirectoryServiceDefs.h" -#include "nsAppDirectoryServiceDefs.h" #include "nsCharSeparatedTokenizer.h" #include "nsXULAppAPI.h" #include "SharedFontList-impl.h" #include "StandardFonts-linux.inc" #include "mozilla/intl/Locale.h" -#include "mozilla/gfx/HelpersCairo.h" - #include #include #include @@ -64,7 +58,6 @@ using namespace mozilla; using namespace mozilla::gfx; -using namespace mozilla::unicode; using namespace mozilla::intl; #ifndef FC_POSTSCRIPT_NAME @@ -401,13 +394,17 @@ } gfxFontconfigFontEntry::~gfxFontconfigFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; + auto* face = mHBFace.exchange(nullptr); + hb_face_destroy(face); if (mMMVar) { // Prior to freetype 2.9, there was no specific function to free the // FT_MM_Var record, and the docs just said to use free(). // InitializeVarFuncs must have been called in order for mMMVar to be // non-null here, so we don't need to do it again. if (sDoneVar) { - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); MOZ_ASSERT(ftFace, "How did mMMVar get set without a face?"); (*sDoneVar)(ftFace->GetFace()->glyph->library, mMMVar); } else { @@ -415,11 +412,75 @@ } } if (mFTFaceInitialized) { - auto face = mFTFace.exchange(nullptr); + auto* face = mFTFace.exchange(nullptr); NS_IF_RELEASE(face); } } +gfxFontconfigFontEntry::AutoHBFace gfxFontconfigFontEntry::GetHBFace() { + hb_face_t* face = mHBFace; + if (!face) { + FcChar8* filename; + FcPattern* pattern = GetPattern(); + bool useTableCache = false; + if (FcPatternGetString(pattern, FC_FILE, 0, &filename) == FcResultMatch) { + // Pattern has a filename: system font that we can load via + // hb_face_create_from_file_or_fail, allowing harfbuzz to manage table + // access internally. + int index; + if (FcPatternGetInteger(pattern, FC_INDEX, 0, &index) != FcResultMatch) { + index = 0; // default to 0 if not found in pattern + } + // Mask out possible variation-instance index stashed by fontconfig; we + // just want the face index within a collection file. + index &= 0xFFFF; + face = hb_face_create_from_file_or_fail((const char*)filename, index); + } else { + // If we have an FT_Font with webfont user data attached, we can use + // hb_face_create to wrap that. + if (mFTFaceInitialized) { + if (const FTUserFontData* ufd = GetUserFontData()) { + if (ufd->FontData()) { + hb_blob_t* blob = hb_blob_create( + (const char*)ufd->FontData(), ufd->FontDataLength(), + HB_MEMORY_MODE_READONLY, nullptr, nullptr); + // Currently the face index is always zero, as we don't support + // collections as webfonts. + face = hb_face_create(blob, 0); + // Drop our blob reference; the face will hold on to it. + hb_blob_destroy(blob); + } + } + } + } + if (!face) { + // Failed to create a face directly; fall back to gfxFontEntry::GetHBFace, + // which will use hb_face_create_for_tables and the font table cache. + NS_WARNING(nsPrintfCString("fallback to gfxFontEntry::GetHBFace for %s", + Name().get()) + .get()); + face = hb_face_reference(gfxFontEntry::GetHBFace()); + useTableCache = true; + } + AutoWriteLock lock(mLock); + if (mHBFace.compareExchange(nullptr, face)) { + if (useTableCache) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + } else { + // Lost a race to initialize mHBFace; discard our new one and use the + // winner of the race. + hb_face_destroy(face); + face = mHBFace; + } + } + // Return a new reference, owned by the AutoHBFace. + return AutoHBFace(hb_face_reference(face)); +} + nsresult gfxFontconfigFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { // attempt this once, if errors occur leave a blank cmap if (mCharacterMap) { @@ -528,7 +589,13 @@ } } - return gfxFontEntry::GetFontTable(aTableTag); + // Use the cache only if it has already been created. + if (mFontTableCache) { + return gfxFontEntry::GetFontTable(aTableTag); + } + + auto* table = hb_face_reference_table(GetHBFace(), aTableTag); + return table != hb_blob_get_empty() ? table : nullptr; } double gfxFontconfigFontEntry::GetAspect(uint8_t aSizeAdjustBasis) { @@ -937,7 +1004,7 @@ AutoWriteLock lock(mLock); // Here, we use the original mFTFace, not a potential clone with variation // settings applied. - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); unscaledFont = ftFace->GetData() ? new UnscaledFontFontconfig(ftFace) : new UnscaledFontFontconfig( std::move(file), index, ftFace); @@ -967,7 +1034,7 @@ } FTUserFontData* gfxFontconfigFontEntry::GetUserFontData() { - auto face = GetFTFace(); + auto* face = GetFTFace(); if (face && face->GetData()) { return static_cast(face->GetData()); } @@ -1005,7 +1072,7 @@ return true; } } else { - if (auto ftFace = GetFTFace()) { + if (auto* ftFace = GetFTFace()) { if (ftFace->GetFace()->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS) { mHasVariations = HasVariationsState::Yes; return true; @@ -1032,7 +1099,7 @@ if (!sGetVar) { return nullptr; } - auto ftFace = GetFTFace(); + auto* ftFace = GetFTFace(); if (!ftFace) { return nullptr; } @@ -1306,7 +1373,7 @@ if (!fe) { continue; } - auto fce = static_cast(fe.get()); + auto* fce = static_cast(fe.get()); aAddPatternFunc(fce->GetPattern(), mContainsAppFonts); } } else { @@ -1871,7 +1938,7 @@ return MakeUnique(); }) .get() - ->Add(fontlist::Face::InitData(initData), /* singleName = */ false); + ->Add(fontlist::Face::InitData(initData), /* aSingleName = */ false); n++; if (n == int(cIndex)) { diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFcPlatformFontList.h thunderbird-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.h --- thunderbird-140.9.0esr/gfx/thebes/gfxFcPlatformFontList.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFcPlatformFontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -9,11 +9,9 @@ #include "gfxFT2FontBase.h" #include "gfxPlatformFontList.h" #include "mozilla/FontPropertyTypes.h" -#include "mozilla/mozalloc.h" #include "mozilla/RefPtr.h" #include "mozilla/UniquePtr.h" #include "nsClassHashtable.h" -#include "nsTHashMap.h" #include #include "ft2build.h" @@ -89,6 +87,8 @@ gfxFontEntry* Clone() const override; + AutoHBFace GetHBFace() override; + FcPattern* GetPattern() { return mFontPattern; } nsresult ReadCMAP(FontInfoData* aFontInfoData = nullptr) override; @@ -107,6 +107,9 @@ bool HasFontTable(uint32_t aTableTag) override; nsresult CopyFontTable(uint32_t aTableTag, nsTArray&) override; hb_blob_t* GetFontTable(uint32_t aTableTag) override; + FontTableCache* GetFontTableCache(bool aCreate) override { + return mFontTableCache; + }; double GetAspect(uint8_t aSizeAdjustBasis); @@ -127,6 +130,14 @@ mozilla::Atomic mFTFace; mozilla::Atomic mFTFaceInitialized; + // HarfBuzz face, if the entry is backed by a disk file. Initialized on first + // use. + mozilla::Atomic mHBFace; + + // Font table cache, created only if we fail to create a hb_face_t that wraps + // the complete font data. + mozilla::Atomic mFontTableCache; + // Whether TestCharacterMap should check the actual cmap rather than asking // fontconfig about character coverage. // We do this for app-bundled (rather than system) fonts, as they may diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFont.cpp thunderbird-140.10.0esr/gfx/thebes/gfxFont.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxFont.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFont.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -49,6 +49,7 @@ #include "gfxSVGGlyphs.h" #include "gfx2DGlue.h" #include "TextDrawTarget.h" +#include "COLRFonts.h" #include "ThebesRLBox.h" @@ -1079,7 +1080,6 @@ gfxHarfBuzzShaper* gfxFont::GetHarfBuzzShaper() { if (!mHarfBuzzShaper) { auto* shaper = new gfxHarfBuzzShaper(this); - shaper->Initialize(); if (!mHarfBuzzShaper.compareExchange(nullptr, shaper)) { delete shaper; } @@ -2684,7 +2684,7 @@ // We need the hbShaper to get color glyph bounds, so check that it's // usable. hbShaper = GetHarfBuzzShaper(); - if (!hbShaper && !hbShaper->IsInitialized()) { + if (!hbShaper) { return false; } if (aTextDrawer) { diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFontEntry.cpp thunderbird-140.10.0esr/gfx/thebes/gfxFontEntry.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxFontEntry.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFontEntry.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -13,30 +13,21 @@ #include "gfxTextRun.h" #include "gfxPlatform.h" -#include "nsGkAtoms.h" #include "gfxTypes.h" #include "gfxContext.h" -#include "gfxFontConstants.h" #include "gfxGraphiteShaper.h" #include "gfxHarfBuzzShaper.h" #include "gfxUserFontSet.h" #include "gfxPlatformFontList.h" -#include "nsUnicodeProperties.h" -#include "nsMathUtils.h" -#include "nsBidiUtils.h" -#include "nsStyleConsts.h" -#include "mozilla/AppUnits.h" #include "mozilla/FloatingPoint.h" #include "mozilla/Likely.h" #include "mozilla/MemoryReporting.h" -#include "mozilla/Preferences.h" #include "mozilla/ProfilerLabels.h" #include "mozilla/ScopeExit.h" -#include "mozilla/Services.h" #include "mozilla/StaticPrefs_layout.h" #include "gfxSVGGlyphs.h" -#include "gfx2DGlue.h" +#include "COLRFonts.h" #include "harfbuzz/hb.h" #include "harfbuzz/hb-ot.h" @@ -50,10 +41,12 @@ using namespace mozilla::gfx; using namespace mozilla::unicode; -void gfxCharacterMap::NotifyMaybeReleased(gfxCharacterMap* aCmap) { +void gfxCharacterMap::NotifyMaybeReleased(gfxCharacterMap* aCmap, + uint32_t aHash) { // Tell gfxPlatformFontList that a charmap's refcount was decremented, - // so it should check whether the object is to be deleted. - gfxPlatformFontList::PlatformFontList()->MaybeRemoveCmap(aCmap); + // so it should check whether the object is to be deleted. aCmap may be + // dangling; aHash was captured while it was alive. + gfxPlatformFontList::PlatformFontList()->MaybeRemoveCmap(aCmap, aHash); } gfxFontEntry::gfxFontEntry(const nsACString& aName, bool aIsStandardFace) @@ -111,8 +104,6 @@ } } - mFontTableCache.reset(nullptr); - delete mSVGGlyphs.exchange(nullptr); delete[] mUVSData.exchange(nullptr); @@ -120,9 +111,8 @@ NS_IF_RELEASE(cmap); // By the time the entry is destroyed, all font instances that were - // using it should already have been deleted, and so the HB and/or Gr - // face objects should have been released. - MOZ_ASSERT(!mHBFace); + // using it should already have been deleted, and so any Graphite + // face object should have been released. MOZ_ASSERT(!mGrFaceInitialized); } @@ -143,9 +133,16 @@ } bool gfxFontEntry::TrySetShmemCharacterMap() { - MOZ_ASSERT(mShmemFace); - auto list = gfxPlatformFontList::PlatformFontList()->SharedFontList(); - auto* shmemCmap = mShmemFace->mCharacterMap.ToPtr(list); + auto* pfl = gfxPlatformFontList::PlatformFontList(); + // Hold the platform-fontlist lock so InitFontList() cannot reset + // mSharedFontList while we dereference it. + gfxPlatformFontList::AutoLock lock(pfl->mLock); + auto* face = mShmemFace; + if (!face) { + return false; + } + auto* list = pfl->SharedFontList(); + const auto* shmemCmap = face->mCharacterMap.ToPtr(list); mShmemCharacterMap.exchange(shmemCmap); return shmemCmap != nullptr; } @@ -387,7 +384,7 @@ auto* colr = GetFontTable(TRUETYPE_TAG('C', 'O', 'L', 'R')); auto* cpal = colr ? GetFontTable(TRUETYPE_TAG('C', 'P', 'A', 'L')) : nullptr; - if (colr && cpal && gfx::COLRFonts::ValidateColorGlyphs(colr, cpal)) { + if (colr && cpal && COLRFonts::ValidateColorGlyphs(colr, cpal)) { if (!mCOLR.compareExchange(nullptr, colr)) { hb_blob_destroy(colr); } @@ -403,178 +400,55 @@ return mCOLR && mCPAL; } -/** - * FontTableBlobData - * - * See FontTableHashEntry for the general strategy. - */ - -class gfxFontEntry::FontTableBlobData { - public: - explicit FontTableBlobData(nsTArray&& aBuffer) - : mTableData(std::move(aBuffer)), mFontEntry(nullptr), mHashKey(0) { - MOZ_COUNT_CTOR(FontTableBlobData); - } - - ~FontTableBlobData() { - MOZ_COUNT_DTOR(FontTableBlobData); - if (mFontEntry && mHashKey) { - AutoWriteLock lock(mFontEntry->mLock); - mFontEntry->mFontTableCache->RemoveEntry(mHashKey); - } - } - - // Useful for creating blobs - const char* GetTable() const { - return reinterpret_cast(mTableData.Elements()); - } - uint32_t GetTableLength() const { return mTableData.Length(); } - - // Tell this FontTableBlobData to remove the HashEntry when this is - // destroyed. - void ManageHashEntry(gfxFontEntry* aFontEntry, uint32_t aHashKey) { - mFontEntry = aFontEntry; - mHashKey = aHashKey; - } - - // Disconnect from the HashEntry (because the blob has already been - // removed from the hashtable). - void ForgetHashEntry() { - mFontEntry = nullptr; - mHashKey = 0; - } - - size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const { - return mTableData.ShallowSizeOfExcludingThis(aMallocSizeOf); - } - size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const { - return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); - } - - private: - // The font table data block - const nsTArray mTableData; - - // The blob destroy function needs to know the owning font entry - // so that it can take the font-entry's lock while modifying the - // hashtable; and the hashtable key, so that it can remove the entry. - gfxFontEntry* mFontEntry; - uint32_t mHashKey; - - // not implemented - FontTableBlobData(const FontTableBlobData&); -}; - -hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( - nsTArray&& aTable, gfxFontEntry* aFontEntry) { - Clear(); - // adopts elements of aTable - mSharedBlobData = new FontTableBlobData(std::move(aTable)); - - mBlob = hb_blob_create( - mSharedBlobData->GetTable(), mSharedBlobData->GetTableLength(), - HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); - if (mBlob == hb_blob_get_empty()) { - // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob will still be held in the hashtable with a strong - // reference. - mSharedBlobData = nullptr; - return hb_blob_reference(mBlob); - } - - // Tell the FontTableBlobData to remove this hash entry when destroyed. - // The hashtable does not keep a strong reference. - mSharedBlobData->ManageHashEntry(aFontEntry, GetKey()); - return mBlob; -} - -void gfxFontEntry::FontTableHashEntry::Clear() { - // If the FontTableBlobData is managing the hash entry, then the blob is - // not owned by this HashEntry; otherwise there is strong reference to the - // blob that must be removed. - if (mSharedBlobData) { - mSharedBlobData->ForgetHashEntry(); - mSharedBlobData = nullptr; - } else { - hb_blob_destroy(mBlob); +already_AddRefed gfxFontEntry::GetCMAPFromFontInfo( + FontInfoData* aFontInfoData, uint32_t& aUVSOffset) { + if (!aFontInfoData || !aFontInfoData->mLoadCmaps) { + return nullptr; } - mBlob = nullptr; -} - -// a hb_destroy_func for hb_blob_create - -/* static */ -void gfxFontEntry::FontTableHashEntry::DeleteFontTableBlobData( - void* aBlobData) { - delete static_cast(aBlobData); -} -hb_blob_t* gfxFontEntry::FontTableHashEntry::GetBlob() const { - return hb_blob_reference(mBlob); + return aFontInfoData->GetCMAP(mName, aUVSOffset); } -bool gfxFontEntry::GetExistingFontTable(uint32_t aTag, hb_blob_t** aBlob) { - AutoReadLock lock(mLock); - - if (MOZ_UNLIKELY(!mFontTableCache)) { - return false; - } - - if (const auto* entry = mFontTableCache->GetEntry(aTag)) { - *aBlob = entry->GetBlob(); - return true; +gfxFontEntry::FontTableBlob::FontTableBlob(nsTArray&& aData) + : mData(std::move(aData)) { + if (!mData.IsEmpty()) { + mBlob = hb_blob_create(reinterpret_cast(mData.Elements()), + mData.Length(), HB_MEMORY_MODE_READONLY, nullptr, + nullptr); } - - return false; } -hb_blob_t* gfxFontEntry::ShareFontTableAndGetBlob(uint32_t aTag, - nsTArray* aBuffer) { - AutoWriteLock lock(mLock); - - if (MOZ_UNLIKELY(!mFontTableCache)) { - mFontTableCache = MakeUnique(8); - } - - FontTableHashEntry* entry; - if (MOZ_UNLIKELY(entry = mFontTableCache->GetEntry(aTag))) { - // We must have been racing with another GetFontTable for the same table, - // and it won the race and filled in the entry before we took the lock. - // Ignore `aBuffer` and return a reference to the existing blob. - return entry->GetBlob(); - } - - // Infallible PutEntry call, so `entry` will be non-null. - entry = mFontTableCache->PutEntry(aTag); - - if (!aBuffer) { - // ensure the entry is null - entry->Clear(); - return nullptr; - } - - return entry->ShareTableAndGetBlob(std::move(*aBuffer), this); +size_t gfxFontEntry::FontTableBlob::SizeOfExcludingThis( + MallocSizeOf aMallocSizeOf) const { + return mData.ShallowSizeOfExcludingThis(aMallocSizeOf) + + ((mBlob && mBlob != hb_blob_get_empty()) ? aMallocSizeOf(mBlob) : 0); } -already_AddRefed gfxFontEntry::GetCMAPFromFontInfo( - FontInfoData* aFontInfoData, uint32_t& aUVSOffset) { - if (!aFontInfoData || !aFontInfoData->mLoadCmaps) { +hb_blob_t* gfxFontEntry::GetFontTable(uint32_t aTag) { + auto* cache = GetFontTableCache(true); + MOZ_ASSERT(cache, "missing or incomplete GetFontTable override?"); + if (!cache) { return nullptr; } - return aFontInfoData->GetCMAP(mName, aUVSOffset); -} - -hb_blob_t* gfxFontEntry::GetFontTable(uint32_t aTag) { - hb_blob_t* blob; - if (GetExistingFontTable(aTag, &blob)) { - return blob; + { + AutoReadLock lock(mLock); + if (auto lookup = cache->Lookup(aTag)) { + return lookup.Data().GetBlob(); + } } nsTArray buffer; bool haveTable = NS_SUCCEEDED(CopyFontTable(aTag, buffer)); - return ShareFontTableAndGetBlob(aTag, haveTable ? &buffer : nullptr); + AutoWriteLock lock(mLock); + return cache + ->LookupOrInsertWith(aTag, + [&] { + return haveTable ? FontTableBlob(std::move(buffer)) + : FontTableBlob(); + }) + .GetBlob(); } // callback for HarfBuzz to get a font table (in hb_blob_t form) @@ -1088,7 +962,7 @@ if (len < sizeof(TrakHeader)) { return false; } - auto trak = reinterpret_cast(data); + const auto* trak = reinterpret_cast(data); uint16_t horizOffset = trak->horizOffset; if (trak->version != 0x00010000 || uint16_t(trak->format) != 0 || horizOffset == 0 || uint16_t(trak->reserved) != 0) { @@ -1098,7 +972,8 @@ if (horizOffset > len - sizeof(TrackData)) { return false; } - auto trackData = reinterpret_cast(data + horizOffset); + const auto* trackData = + reinterpret_cast(data + horizOffset); uint16_t nTracks = trackData->nTracks; mNumTrakSizes = trackData->nSizes; if (nTracks == 0 || mNumTrakSizes < 2) { @@ -1110,7 +985,7 @@ len - (sizeof(TrackData) + nTracks * sizeof(TrackTableEntry))) { return false; } - auto trackTable = reinterpret_cast( + const auto* trackTable = reinterpret_cast( data + horizOffset + sizeof(TrackData)); // Look for 'normal' tracking, bail out if no such track is present. unsigned trackIndex; @@ -1398,18 +1273,6 @@ } } -size_t gfxFontEntry::FontTableHashEntry::SizeOfExcludingThis( - mozilla::MallocSizeOf aMallocSizeOf) const { - size_t n = 0; - if (mBlob) { - n += aMallocSizeOf(mBlob); - } - if (mSharedBlobData) { - n += mSharedBlobData->SizeOfIncludingThis(aMallocSizeOf); - } - return n; -} - void gfxFontEntry::AddSizeOfExcludingThis(MallocSizeOf aMallocSizeOf, FontListSizes* aSizes) const { aSizes->mFontListSize += mName.SizeOfExcludingThisIfUnshared(aMallocSizeOf); @@ -1419,11 +1282,19 @@ aSizes->mCharMapsSize += GetCharacterMap()->SizeOfIncludingThis(aMallocSizeOf); } + { AutoReadLock lock(mLock); - if (mFontTableCache) { + // Passing `false` to GetFontTableCache() here means it will not actually + // modify anything, just return the existing cache if any. + if (auto* cache = + const_cast(this)->GetFontTableCache(false)) { aSizes->mFontTableCacheSize += - mFontTableCache->SizeOfIncludingThis(aMallocSizeOf); + cache->ShallowSizeOfIncludingThis(aMallocSizeOf); + for (auto it = cache->ConstIter(); !it.Done(); it.Next()) { + aSizes->mFontTableCacheSize += + it.Data().SizeOfExcludingThis(aMallocSizeOf); + } } } @@ -1789,7 +1660,7 @@ gfxFontEntry* fe = nullptr; float distance = INFINITY; - for (auto e : entries) { + for (auto* e : entries) { if (e->SkipDuringSystemFallback()) { continue; } diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxFontEntry.h thunderbird-140.10.0esr/gfx/thebes/gfxFontEntry.h --- thunderbird-140.9.0esr/gfx/thebes/gfxFontEntry.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxFontEntry.h 2026-04-21 14:52:53.000000000 +0000 @@ -8,9 +8,7 @@ #include #include -#include #include -#include "COLRFonts.h" #include "ThebesRLBoxTypes.h" #include "gfxFontUtils.h" #include "gfxFontVariations.h" @@ -28,7 +26,6 @@ #include "mozilla/TypedEnumBits.h" #include "mozilla/UniquePtr.h" #include "mozilla/intl/UnicodeScriptCodes.h" -#include "nsTHashMap.h" #include "nsDebug.h" #include "nsHashKeys.h" #include "nsISupports.h" @@ -91,14 +88,15 @@ // new reference, or completes the release first!) void Release() { MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); - // We can't safely read this after we've decremented mRefCnt, so save it - // in a local variable here. Note that the value is never reset to false + // We can't safely read mShared and mHash after we've decremented mRefCnt, + // so save them in locals here. Note that mShared is never reset to false // once it has been set to true (when recording the cmap in the shared // table), so there's no risk of this resulting in a "false positive" when // tested later. A "false negative" is possible but harmless; it would // just mean we miss an opportunity to release a reference from the shared - // cmap table. + // cmap table. mHash is set once before sharing and never changes. bool isShared = mShared; + uint32_t hash = mHash; // Ensure we only access mRefCnt once, for consistency if the object is // being used by multiple threads. @@ -111,7 +109,13 @@ if (isShared) { MOZ_ASSERT(count > 0); if (count == 1) { - NotifyMaybeReleased(this); + // After --mRefCnt (above), `this` may be freed at any time (by another + // thread racing us into MaybeRemoveCmap and deleting first, or by the + // gfxPlatformFontList destructor's teardown path). We must not + // dereference `this` from here on. Pass the captured hash by value so + // MaybeRemoveCmap can perform the hashtable lookup without + // dereferencing the potentially-dangling pointer. + NotifyMaybeReleased(this, hash); } return; } @@ -157,7 +161,7 @@ void CalcHash() { mHash = GetChecksum(); } - static void NotifyMaybeReleased(gfxCharacterMap* aCmap); + static void NotifyMaybeReleased(gfxCharacterMap* aCmap, uint32_t aHash); // Only used when clearing the shared-cmap hashtable during shutdown. void ClearSharedFlag() { @@ -448,7 +452,7 @@ hb_face_t* mFace; }; - AutoHBFace GetHBFace() { + virtual AutoHBFace GetHBFace() { return AutoHBFace(hb_face_create_for_tables(HBGetTable, this, nullptr)); } @@ -750,13 +754,6 @@ // Usually, only one of these will actually be created for any given font // entry, depending on the font tables that are present. - // hb_face_t is refcounted internally, so each shaper that's using it will - // bump the ref count when it acquires the face, and "destroy" (release) it - // in its destructor. The font entry has only this non-owning reference to - // the face; when the face is deleted, it will tell the font entry to forget - // it, so that a new face will be created next time it is needed. - mozilla::Atomic mHBFace; - static hb_blob_t* HBGetTable(hb_face_t* face, uint32_t aTag, void* aUserData); // Callback that the hb_face will use to tell us when it is being deleted. @@ -811,96 +808,35 @@ int16_t mXMax = std::numeric_limits::max(); int16_t mYMax = std::numeric_limits::max(); - private: - /** - * Font table hashtable, to support GetFontTable for harfbuzz. - * - * The harfbuzz shaper (and potentially other clients) needs access to raw - * font table data. This needs to be cached so that it can be used - * repeatedly (each time we construct a text run; in some cases, for - * each character/glyph within the run) without re-fetching large tables - * every time. - * - * Because we may instantiate many gfxFonts for the same physical font - * file (at different sizes), we should ensure that they can share a - * single cached copy of the font tables. To do this, we implement table - * access and sharing on the fontEntry rather than the font itself. - * - * The default implementation uses GetFontTable() to read font table - * data into byte arrays, and wraps them in blobs which are registered in - * a hashtable. The hashtable can then return pre-existing blobs to - * harfbuzz. - * - * Harfbuzz will "destroy" the blobs when it is finished with them. When - * the last blob reference is removed, the FontTableBlobData user data - * will remove the blob from the hashtable if still registered. - */ - - class FontTableBlobData; - - /** - * FontTableHashEntry manages the entries of hb_blob_t's containing font - * table data. - * - * This is used to share font tables across fonts with the same - * font entry (but different sizes) for use by HarfBuzz. The hashtable - * does not own a strong reference to the blob, but keeps a weak pointer, - * managed by FontTableBlobData. Similarly FontTableBlobData keeps only a - * weak pointer to the hashtable, managed by FontTableHashEntry. - */ - - class FontTableHashEntry : public nsUint32HashKey { + protected: + // Font table cache, used only by backend implementations that are not able + // to provide a cheap GetFontTable() that wraps already-cached data. + class FontTableBlob { public: - // Declarations for nsTHashtable - - typedef nsUint32HashKey KeyClass; - typedef KeyClass::KeyType KeyType; - typedef KeyClass::KeyTypePointer KeyTypePointer; - - explicit FontTableHashEntry(KeyTypePointer aTag) - : KeyClass(aTag), mSharedBlobData(nullptr), mBlob(nullptr) {} - - // NOTE: This assumes the new entry belongs to the same hashtable as - // the old, because the mHashtable pointer in mSharedBlobData (if - // present) will not be updated. - FontTableHashEntry(FontTableHashEntry&& toMove) - : KeyClass(std::move(toMove)), - mSharedBlobData(std::move(toMove.mSharedBlobData)), - mBlob(std::move(toMove.mBlob)) { - toMove.mSharedBlobData = nullptr; - toMove.mBlob = nullptr; + FontTableBlob() = default; + explicit FontTableBlob(nsTArray&& aData); + FontTableBlob(const FontTableBlob& aOther) = delete; + FontTableBlob(FontTableBlob&& aOther) + : mData(std::move(aOther.mData)), mBlob(std::move(aOther.mBlob)) { + aOther.mBlob = nullptr; } - ~FontTableHashEntry() { Clear(); } - - // FontTable/Blob API - - // Transfer (not copy) elements of aTable to a new hb_blob_t and - // return ownership to the caller. A weak reference to the blob is - // recorded in the font entry's table cache so that others may use - // the same table. - hb_blob_t* ShareTableAndGetBlob(nsTArray&& aTable, - gfxFontEntry* aFontEntry); - - // Return a strong reference to the blob. - // Callers must hb_blob_destroy the returned blob. - hb_blob_t* GetBlob() const; - - void Clear(); + ~FontTableBlob() { hb_blob_destroy(mBlob); } + hb_blob_t* GetBlob() const { return hb_blob_reference(mBlob); } size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; - private: - static void DeleteFontTableBlobData(void* aBlobData); - // not implemented - FontTableHashEntry& operator=(FontTableHashEntry& toCopy); - - FontTableBlobData* mSharedBlobData; - hb_blob_t* mBlob; + protected: + nsTArray mData; + hb_blob_t* mBlob = nullptr; }; - using FontTableCache = nsTHashtable; - mozilla::UniquePtr mFontTableCache MOZ_GUARDED_BY(mLock); + using FontTableCache = nsTHashMap; + // Get the font table cache, if this backend uses it. Backends or individual + // font entries that don't want to use the cache just return nullptr. + // If aCreate is false, a new cache will not be created, but if one already + // exists it will be returned. + virtual FontTableCache* GetFontTableCache(bool aCreate) = 0; }; MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(gfxFontEntry::RangeFlags) diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxGDIFontList.cpp thunderbird-140.10.0esr/gfx/thebes/gfxGDIFontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxGDIFontList.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxGDIFontList.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -133,12 +133,29 @@ InitLogFont(aFaceName, aFontType); } +GDIFontEntry::~GDIFontEntry() { + auto* cache = mFontTableCache.exchange(nullptr); + delete cache; +} + gfxFontEntry* GDIFontEntry::Clone() const { MOZ_ASSERT(!IsUserFont(), "we can only clone installed fonts!"); return new GDIFontEntry(Name(), mFontType, SlantStyle(), Weight(), Stretch(), nullptr); } +gfxFontEntry::FontTableCache* GDIFontEntry::GetFontTableCache( + bool aCreate) { + // Create the cache if it does not yet exist. + if (!mFontTableCache && aCreate) { + auto* cache = new FontTableCache(); + if (!mFontTableCache.compareExchange(nullptr, cache)) { + delete cache; + } + } + return mFontTableCache; +} + nsresult GDIFontEntry::ReadCMAP(FontInfoData* aFontInfoData) { AUTO_PROFILER_LABEL("GDIFontEntry::ReadCMAP", OTHER); diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxGDIFontList.h thunderbird-140.10.0esr/gfx/thebes/gfxGDIFontList.h --- thunderbird-140.9.0esr/gfx/thebes/gfxGDIFontList.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxGDIFontList.h 2026-04-21 14:52:53.000000000 +0000 @@ -94,6 +94,8 @@ // This replaces FontEntry from gfxWindowsFonts.h/cpp. class GDIFontEntry final : public gfxFontEntry { public: + virtual ~GDIFontEntry(); + LPLOGFONTW GetLogFont() { return &mLogFont; } nsresult ReadCMAP(FontInfoData* aFontInfoData = nullptr) override; @@ -163,6 +165,8 @@ SlantStyleRange aStyle, WeightRange aWeight, StretchRange aStretch, gfxUserFontData* aUserFontData); + FontTableCache* GetFontTableCache(bool aCreate) override; + void InitLogFont(const nsACString& aName, gfxWindowsFontType aFontType); gfxFont* CreateFontInstance(const gfxFontStyle* aFontStyle) override; @@ -176,6 +180,8 @@ LOGFONTW mLogFont; mozilla::ThreadSafeWeakPtr mUnscaledFont; + + mozilla::Atomic mFontTableCache; }; // a single font family, referencing one or more faces diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp thunderbird-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -37,30 +37,10 @@ gfxHarfBuzzShaper::gfxHarfBuzzShaper(gfxFont* aFont) : gfxFontShaper(aFont), - mHBFont(nullptr), - mBuffer(nullptr), - mCallbackData(), - mKernTable(nullptr), - mHmtxTable(nullptr), - mVmtxTable(nullptr), - mVORGTable(nullptr), - mLocaTable(nullptr), - mGlyfTable(nullptr), - mCmapTable(nullptr), - mCmapFormat(-1), - mSubtableOffset(0), - mUVSTableOffset(0), - mNumLongHMetrics(0), - mNumLongVMetrics(0), - mDefaultVOrg(-1.0), mUseFontGetGlyph(aFont->ProvidesGetGlyph()), - mIsSymbolFont(false), - mUseFontGlyphWidths(aFont->ProvidesGlyphWidths()), - mInitialized(false), - mVerticalInitialized(false), - mUseVerticalPresentationForms(false), - mLoadedLocaGlyf(false), - mLocaLongOffsets(false) {} + mUseFontGlyphWidths(aFont->ProvidesGlyphWidths()) { + (void)NS_WARN_IF(!Initialize()); +} gfxHarfBuzzShaper::~gfxHarfBuzzShaper() { // hb_*_destroy functions are safe to call on nullptr @@ -79,15 +59,16 @@ hb_codepoint_t gfxHarfBuzzShaper::GetGlyphUncached( hb_codepoint_t unicode) const { + // Note that the fields used here are set during Initialize() and then never + // modified, so locking is not necessary. hb_codepoint_t gid = 0; if (mUseFontGetGlyph) { - MutexAutoUnlock unlock(mCacheLock); gid = mFont->GetGlyph(unicode, 0); } else { // we only instantiate a harfbuzz shaper if there's a cmap available - NS_ASSERTION(mCmapTable && (mCmapFormat > 0) && (mSubtableOffset > 0), - "cmap data not correctly set up, expect disaster"); + MOZ_ASSERT(mCmapTable && (mCmapFormat > 0) && (mSubtableOffset > 0), + "cmap data not correctly set up, expect disaster"); uint32_t length; const uint8_t* data = (const uint8_t*)hb_blob_get_data(mCmapTable, &length); @@ -147,30 +128,21 @@ hb_codepoint_t gfxHarfBuzzShaper::GetNominalGlyph( hb_codepoint_t unicode) const { - MutexAutoLock lock(mCacheLock); + RecursiveMutexAutoLock lock(mMutex); auto cached = mCmapCache->Lookup(unicode); if (cached) { return cached.Data().mGlyphId; } - // This call can temporarily unlock the cache if mUseFontGetGlyph is true. hb_codepoint_t gid = GetGlyphUncached(unicode); - - if (mUseFontGetGlyph) { - // GetGlyphUncached may have invalidated our earlier cache lookup! - mCmapCache->Put(unicode, CmapCacheData{unicode, gid}); - } else { - cached.Set(CmapCacheData{unicode, gid}); - } - + mCmapCache->Put(unicode, CmapCacheData{unicode, gid}); return gid; } unsigned int gfxHarfBuzzShaper::GetNominalGlyphs( unsigned int count, const hb_codepoint_t* first_unicode, unsigned int unicode_stride, hb_codepoint_t* first_glyph, - unsigned int glyph_stride) { - MutexAutoLock lock(mCacheLock); + unsigned int glyph_stride) const { unsigned int result = 0; while (result < count) { hb_codepoint_t usv = *first_unicode; @@ -302,17 +274,18 @@ return charPair ? charPair[1] : 0; } -static hb_bool_t HBGetNominalGlyph(hb_font_t* font, void* font_data, - hb_codepoint_t unicode, - hb_codepoint_t* glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +hb_bool_t gfxHarfBuzzShaper::HBGetNominalGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t* glyph, + void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + if (shaper->UseVerticalPresentationForms()) { hb_codepoint_t verticalForm = gfxHarfBuzzShaper::GetVerticalPresentationForm(unicode); if (verticalForm) { - *glyph = fcd->mShaper->GetNominalGlyph(verticalForm); + *glyph = shaper->GetNominalGlyph(verticalForm); if (*glyph != 0) { return true; } @@ -320,37 +293,39 @@ // fall back to the non-vertical form if we didn't find an alternate } - *glyph = fcd->mShaper->GetNominalGlyph(unicode); + *glyph = shaper->GetNominalGlyph(unicode); return *glyph != 0; } -static unsigned int HBGetNominalGlyphs( +/* static */ unsigned int gfxHarfBuzzShaper::HBGetNominalGlyphs( hb_font_t* font, void* font_data, unsigned int count, const hb_codepoint_t* first_unicode, unsigned int unicode_stride, hb_codepoint_t* first_glyph, unsigned int glyph_stride, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + if (shaper->UseVerticalPresentationForms()) { return 0; } - return fcd->mShaper->GetNominalGlyphs(count, first_unicode, unicode_stride, - first_glyph, glyph_stride); + // GetNominalGlyphs requires that the mMutex is held, which is guaranteed + // because we're inside a callback from hb_shape. + MOZ_PUSH_IGNORE_THREAD_SAFETY + return shaper->GetNominalGlyphs(count, first_unicode, unicode_stride, + first_glyph, glyph_stride); + MOZ_POP_THREAD_SAFETY } -static hb_bool_t HBGetVariationGlyph(hb_font_t* font, void* font_data, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t* glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetVariationGlyph( + hb_font_t* font, void* font_data, hb_codepoint_t unicode, + hb_codepoint_t variation_selector, hb_codepoint_t* glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); - if (fcd->mShaper->UseVerticalPresentationForms()) { + if (shaper->UseVerticalPresentationForms()) { hb_codepoint_t verticalForm = gfxHarfBuzzShaper::GetVerticalPresentationForm(unicode); if (verticalForm) { - *glyph = - fcd->mShaper->GetVariationGlyph(verticalForm, variation_selector); + *glyph = shaper->GetVariationGlyph(verticalForm, variation_selector); if (*glyph != 0) { return true; } @@ -358,7 +333,7 @@ // fall back to the non-vertical form if we didn't find an alternate } - *glyph = fcd->mShaper->GetVariationGlyph(unicode, variation_selector); + *glyph = shaper->GetVariationGlyph(unicode, variation_selector); return *glyph != 0; } @@ -405,13 +380,12 @@ hb_position_t gfxHarfBuzzShaper::GetGlyphHAdvance(hb_codepoint_t glyph) const { if (mUseFontGlyphWidths) { - MutexAutoLock lock(mCacheLock); + RecursiveMutexAutoLock lock(mMutex); if (auto cached = mWidthCache->Lookup(glyph)) { return cached.Data().mAdvance; } - mCacheLock.Unlock(); + hb_position_t advance = GetFont()->GetGlyphWidth(glyph); - mCacheLock.Lock(); mWidthCache->Put(glyph, WidthCacheData{glyph, advance}); return advance; } @@ -424,19 +398,14 @@ unsigned int glyph_stride, hb_position_t* first_advance, unsigned int advance_stride) const { + // This is called with the mMutex mutex already held. if (mUseFontGlyphWidths) { - // Take the cache lock here, hoping we'll be able to retrieve a bunch of - // widths from the cache for the cost of a single locking operation. - MutexAutoLock lock(mCacheLock); for (unsigned int i = 0; i < count; ++i) { hb_codepoint_t gid = *first_glyph; if (auto cached = mWidthCache->Lookup(gid)) { *first_advance = cached.Data().mAdvance; } else { - // Unlock to avoid deadlock if the font needs internal locking. - mCacheLock.Unlock(); hb_position_t advance = GetFont()->GetGlyphWidth(gid); - mCacheLock.Lock(); mWidthCache->Put(gid, WidthCacheData{gid, advance}); *first_advance = advance; } @@ -458,7 +427,9 @@ } hb_position_t gfxHarfBuzzShaper::GetGlyphVAdvance(hb_codepoint_t glyph) { - InitializeVertical(); + if (!mVerticalInitialized) { + InitializeVertical(); + } if (!mVmtxTable) { // Must be a "vertical" font that doesn't actually have vertical metrics. @@ -483,39 +454,41 @@ uint16_t(metrics->metrics[glyph].advanceWidth)); } -static hb_position_t HBGetGlyphHAdvance(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetGlyphHAdvance(glyph); -} - -static void HBGetGlyphHAdvances(hb_font_t* font, void* font_data, - unsigned int count, - const hb_codepoint_t* first_glyph, - unsigned int glyph_stride, - hb_position_t* first_advance, - unsigned int advance_stride, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - fcd->mShaper->GetGlyphHAdvances(count, first_glyph, glyph_stride, - first_advance, advance_stride); -} - -static hb_position_t HBGetGlyphVAdvance(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetGlyphHAdvance( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetGlyphHAdvance(glyph); +} + +/* static */ void gfxHarfBuzzShaper::HBGetGlyphHAdvances( + hb_font_t* font, void* font_data, unsigned int count, + const hb_codepoint_t* first_glyph, unsigned int glyph_stride, + hb_position_t* first_advance, unsigned int advance_stride, + void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + + // GetGlyphHAdvances requires that mMutex is held, which is guaranteed + // because we're inside a callback from hb_shape. + MOZ_PUSH_IGNORE_THREAD_SAFETY + shaper->GetGlyphHAdvances(count, first_glyph, glyph_stride, first_advance, + advance_stride); + MOZ_POP_THREAD_SAFETY +} + +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetGlyphVAdvance( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, void* user_data) { + gfxHarfBuzzShaper* shaper = static_cast(font_data); // Currently, we don't offer gfxFont subclasses a method to override this // and provide hinted platform-specific vertical advances (analogous to the // GetGlyphWidth method for horizontal advances). If that proves necessary, // we'll add a new gfxFont method and call it from here. - hb_position_t advance = fcd->mShaper->GetGlyphVAdvance(glyph); + hb_position_t advance = shaper->GetGlyphVAdvance(glyph); if (advance < 0) { // Not available (e.g. broken metrics in the font); use a fallback value. - advance = FloatToFixed(fcd->mShaper->GetFont() - ->GetMetrics(nsFontMetrics::eVertical) - .aveCharWidth); + advance = FloatToFixed( + shaper->GetFont()->GetMetrics(nsFontMetrics::eVertical).aveCharWidth); } // We negate the value from GetGlyphVAdvance here because harfbuzz shapes // with a coordinate system where positive is upwards, whereas the inline @@ -535,12 +508,12 @@ AutoSwap_PRInt16 vertOriginY; }; -static hb_bool_t HBGetGlyphVOrigin(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, hb_position_t* x, - hb_position_t* y, void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - fcd->mShaper->GetGlyphVOrigin(glyph, x, y); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetGlyphVOrigin( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + shaper->GetGlyphVOrigin(glyph, x, y); return true; } @@ -644,13 +617,12 @@ *aY = mDefaultVOrg; } -static hb_bool_t HBGetGlyphExtents(hb_font_t* font, void* font_data, - hb_codepoint_t glyph, - hb_glyph_extents_t* extents, - void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetGlyphExtents(glyph, extents); +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetGlyphExtents( + hb_font_t* font, void* font_data, hb_codepoint_t glyph, + hb_glyph_extents_t* extents, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetGlyphExtents(glyph, extents); } // Find the data for glyph ID |aGlyph| in the 'glyf' table, if present. @@ -687,15 +659,17 @@ uint32_t len; const char* data = hb_blob_get_data(mLocaTable, &len); if (mLocaLongOffsets) { - if ((aGlyph + 1) * sizeof(AutoSwap_PRUint32) > len) { + // We read offsets[aGlyph] and offsets[aGlyph + 1], so require aGlyph + 2 + // entries. + if ((aGlyph + 2) * sizeof(AutoSwap_PRUint32) > len) { return nullptr; } const AutoSwap_PRUint32* offsets = reinterpret_cast(data); offset = offsets[aGlyph]; - *aEmptyGlyf = (offset == uint16_t(offsets[aGlyph + 1])); + *aEmptyGlyf = (offset == uint32_t(offsets[aGlyph + 1])); } else { - if ((aGlyph + 1) * sizeof(AutoSwap_PRUint16) > len) { + if ((aGlyph + 2) * sizeof(AutoSwap_PRUint16) > len) { return nullptr; } const AutoSwap_PRUint16* offsets = @@ -745,10 +719,9 @@ return true; } -static hb_bool_t HBGetContourPoint(hb_font_t* font, void* font_data, - unsigned int point_index, - hb_codepoint_t glyph, hb_position_t* x, - hb_position_t* y, void* user_data) { +/* static */ hb_bool_t gfxHarfBuzzShaper::HBGetContourPoint( + hb_font_t* font, void* font_data, unsigned int point_index, + hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* user_data) { /* not yet implemented - no support for used of hinted contour points to fine-tune anchor positions in GPOS AnchorFormat2 */ return false; @@ -1123,13 +1096,12 @@ return 0; } -static hb_position_t HBGetHKerning(hb_font_t* font, void* font_data, - hb_codepoint_t first_glyph, - hb_codepoint_t second_glyph, - void* user_data) { - const gfxHarfBuzzShaper::FontCallbackData* fcd = - static_cast(font_data); - return fcd->mShaper->GetHKerning(first_glyph, second_glyph); +/* static */ hb_position_t gfxHarfBuzzShaper::HBGetHKerning( + hb_font_t* font, void* font_data, hb_codepoint_t first_glyph, + hb_codepoint_t second_glyph, void* user_data) { + const gfxHarfBuzzShaper* shaper = + static_cast(font_data); + return shaper->GetHKerning(first_glyph, second_glyph); } /* @@ -1216,11 +1188,9 @@ hb_ot_tag_to_script(HB_TAG('m', 'a', 't', 'h')); bool gfxHarfBuzzShaper::Initialize() { - if (mInitialized) { - return mHBFont != nullptr; - } - mInitialized = true; - mCallbackData.mShaper = this; + // We don't need to lock here, as we're just initializing the shaper and no + // other thread can yet be using it. + MOZ_PUSH_IGNORE_THREAD_SAFETY if (!sHBFontFuncs) { // static function callback pointers, initialized by the first @@ -1293,9 +1263,6 @@ mNumGlyphs = uint16_t(maxp->numGlyphs); } - // We don't need to take the cache lock here, as we're just initializing the - // shaper and no other thread can yet be using it. - MOZ_PUSH_IGNORE_THREAD_SAFETY mCmapCache = MakeUnique(); if (mUseFontGlyphWidths) { @@ -1307,7 +1274,6 @@ return false; } } - MOZ_POP_THREAD_SAFETY mBuffer = hb_buffer_create(); hb_buffer_set_unicode_funcs(mBuffer, sHBUnicodeFuncs); @@ -1318,14 +1284,16 @@ mFont->GetFontEntry()->HasFontTable(TRUETYPE_TAG('C', 'F', 'F', ' ')) ? sNominalGlyphFunc : sHBFontFuncs; - mHBFont = CreateHBFont(mFont, funcs, &mCallbackData); + mHBFont = CreateHBFont(mFont, funcs, this); + + MOZ_POP_THREAD_SAFETY return true; } hb_font_t* gfxHarfBuzzShaper::CreateHBFont(gfxFont* aFont, hb_font_funcs_t* aFontFuncs, - FontCallbackData* aCallbackData) { + void* aCallbackData) { auto face(aFont->GetFontEntry()->GetHBFace()); hb_font_t* result = hb_font_create(face); @@ -1395,9 +1363,8 @@ void gfxHarfBuzzShaper::InitializeVertical() { // We only do this once. If we don't have a mHmtxTable after that, // we'll be making up fallback metrics. - if (mVerticalInitialized) { - return; - } + RecursiveMutexAutoLock lock(mMutex); + mVerticalInitialized = true; if (!mHmtxTable) { @@ -1459,14 +1426,16 @@ nsAtom* aLanguage, bool aVertical, RoundingFlags aRounding, gfxShapedText* aShapedText) { - mUseVerticalPresentationForms = false; - - if (!Initialize()) { - return false; - } + // gfxFont (and hence this shaper) may be shared across threads via the + // global font cache; serialize ShapeText so that mBuffer and other mutable + // per-call state cannot be touched concurrently. + RecursiveMutexAutoLock lock(mMutex); + mUseVerticalPresentationForms = false; if (aVertical) { - InitializeVertical(); + if (!mVerticalInitialized) { + InitializeVertical(); + } if (!mFont->GetFontEntry()->SupportsOpenTypeFeature( aScript, HB_TAG('v', 'e', 'r', 't'))) { mUseVerticalPresentationForms = true; diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxHarfBuzzShaper.h thunderbird-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.h --- thunderbird-140.9.0esr/gfx/thebes/gfxHarfBuzzShaper.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxHarfBuzzShaper.h 2026-04-21 14:52:54.000000000 +0000 @@ -12,24 +12,53 @@ #include "nsUnicodeProperties.h" #include "mozilla/gfx/2D.h" #include "mozilla/MruCache.h" -#include "mozilla/Mutex.h" +#include "mozilla/RecursiveMutex.h" class gfxHarfBuzzShaper : public gfxFontShaper { + // private static methods for HarfBuzz callbacks: + static hb_bool_t HBGetNominalGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t* glyph, void* user_data); + static unsigned int HBGetNominalGlyphs( + hb_font_t* font, void* font_data, unsigned int count, + const hb_codepoint_t* first_unicode, unsigned int unicode_stride, + hb_codepoint_t* first_glyph, unsigned int glyph_stride, void* user_data); + static hb_bool_t HBGetVariationGlyph(hb_font_t* font, void* font_data, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t* glyph, void* user_data); + static hb_position_t HBGetGlyphHAdvance(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + void* user_data); + static void HBGetGlyphHAdvances(hb_font_t* font, void* font_data, + unsigned int count, + const hb_codepoint_t* first_glyph, + unsigned int glyph_stride, + hb_position_t* first_advance, + unsigned int advance_stride, void* user_data); + static hb_position_t HBGetGlyphVAdvance(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + void* user_data); + static hb_bool_t HBGetGlyphVOrigin(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data); + static hb_bool_t HBGetGlyphExtents(hb_font_t* font, void* font_data, + hb_codepoint_t glyph, + hb_glyph_extents_t* extents, + void* user_data); + static hb_bool_t HBGetContourPoint(hb_font_t* font, void* font_data, + unsigned int point_index, + hb_codepoint_t glyph, hb_position_t* x, + hb_position_t* y, void* user_data); + static hb_position_t HBGetHKerning(hb_font_t* font, void* font_data, + hb_codepoint_t first_glyph, + hb_codepoint_t second_glyph, + void* user_data); + public: explicit gfxHarfBuzzShaper(gfxFont* aFont); virtual ~gfxHarfBuzzShaper(); - /* - * For HarfBuzz font callback functions, font_data is a ptr to a - * FontCallbackData struct - */ - struct FontCallbackData { - gfxHarfBuzzShaper* mShaper; - }; - - // Initializes the shaper and returns whether this was successful. - bool Initialize(); - // Returns whether the shaper has been successfully initialized. bool IsInitialized() const { return mHBFont != nullptr; } @@ -38,41 +67,20 @@ nsAtom* aLanguage, bool aVertical, RoundingFlags aRounding, gfxShapedText* aShapedText) override; - // get a given font table in harfbuzz blob form - hb_blob_t* GetFontTable(hb_tag_t aTag) const; - // map unicode character to glyph ID hb_codepoint_t GetNominalGlyph(hb_codepoint_t unicode) const; - unsigned int GetNominalGlyphs(unsigned int count, - const hb_codepoint_t* first_unicode, - unsigned int unicode_stride, - hb_codepoint_t* first_glyph, - unsigned int glyph_stride); + hb_codepoint_t GetVariationGlyph(hb_codepoint_t unicode, hb_codepoint_t variation_selector) const; // get harfbuzz glyph advance, in font design units hb_position_t GetGlyphHAdvance(hb_codepoint_t glyph) const; - void GetGlyphHAdvances(unsigned int count, const hb_codepoint_t* first_glyph, - unsigned int glyph_stride, - hb_position_t* first_advance, - unsigned int advance_stride) const; // Get vertical glyph advance, or -1 if not available; caller should check // for a negative result and provide a fallback or fail, as appropriate. hb_position_t GetGlyphVAdvance(hb_codepoint_t glyph); - void GetGlyphVOrigin(hb_codepoint_t aGlyph, hb_position_t* aX, - hb_position_t* aY) const; - - hb_position_t GetHKerning(uint16_t aFirstGlyph, uint16_t aSecondGlyph) const; - - hb_bool_t GetGlyphExtents(hb_codepoint_t aGlyph, - hb_glyph_extents_t* aExtents) const; - - bool UseVerticalPresentationForms() const { - return mUseVerticalPresentationForms; - } + hb_font_t* GetHBFont() const { return mHBFont; } static hb_script_t GetHBScriptUsedForShaping(Script aScript) { // Decide what harfbuzz script code will be used for shaping @@ -95,23 +103,48 @@ // bounds, etc; if not, the built-in hb_ot font functions will be used. static hb_font_t* CreateHBFont(gfxFont* aFont, hb_font_funcs_t* aFontFuncs = nullptr, - FontCallbackData* aCallbackData = nullptr); - - hb_font_t* GetHBFont() const { return mHBFont; } - hb_face_t* GetHBFace() const { return hb_font_get_face(mHBFont); } + void* aCallbackData = nullptr); protected: - // This is called with the cache locked, but if mUseFontGetGlyph is true, it - // may unlock it temporarily. So in this case, it may invalidate an earlier - // cache entry reference. - hb_codepoint_t GetGlyphUncached(hb_codepoint_t unicode) const - MOZ_REQUIRES(mCacheLock); + // Initializes the shaper and returns whether this was successful. + bool Initialize(); + + // get a given font table in harfbuzz blob form + hb_blob_t* GetFontTable(hb_tag_t aTag) const; + + unsigned int GetNominalGlyphs(unsigned int count, + const hb_codepoint_t* first_unicode, + unsigned int unicode_stride, + hb_codepoint_t* first_glyph, + unsigned int glyph_stride) const + MOZ_REQUIRES(mMutex); + + void GetGlyphHAdvances(unsigned int count, const hb_codepoint_t* first_glyph, + unsigned int glyph_stride, + hb_position_t* first_advance, + unsigned int advance_stride) const + MOZ_REQUIRES(mMutex); + + void GetGlyphVOrigin(hb_codepoint_t aGlyph, hb_position_t* aX, + hb_position_t* aY) const; + + hb_position_t GetHKerning(uint16_t aFirstGlyph, uint16_t aSecondGlyph) const; + + hb_bool_t GetGlyphExtents(hb_codepoint_t aGlyph, + hb_glyph_extents_t* aExtents) const; + + bool UseVerticalPresentationForms() const { + return mUseVerticalPresentationForms; + } + + hb_codepoint_t GetGlyphUncached(hb_codepoint_t unicode) const; hb_position_t GetGlyphHAdvanceUncached(hb_codepoint_t gid) const; nsresult SetGlyphsFromRun(gfxShapedText* aShapedText, uint32_t aOffset, uint32_t aLength, const char16_t* aText, - bool aVertical, RoundingFlags aRounding); + bool aVertical, RoundingFlags aRounding) + MOZ_REQUIRES(mMutex); // retrieve glyph positions, applying advance adjustments and attachments // returns results in appUnits @@ -133,12 +166,20 @@ const Glyf* FindGlyf(hb_codepoint_t aGlyph, bool* aEmptyGlyf) const; // size-specific font object, owned by the gfxHarfBuzzShaper - hb_font_t* mHBFont; + hb_font_t* mHBFont = nullptr; - // harfbuzz buffer for the shaping process - hb_buffer_t* mBuffer; + // Held for the duration of ShapeText(): the shaper (and its hb_buffer_t) + // is shared across threads via the global gfxFontCache, so concurrent + // ShapeText() calls must be serialized to avoid racing on mBuffer and + // other mutable per-call state. + // GetNominalGlyph() and GetGlyphHAdvance() also need to lock the mutex + // because they may be called directly from thebes code, as well as via + // harfbuzz callbacks. + mutable mozilla::RecursiveMutex mMutex = + mozilla::RecursiveMutex("gfxHarfBuzzShaper::mMutex"); - mutable mozilla::Mutex mCacheLock = mozilla::Mutex("shaperCacheMutex"); + // harfbuzz buffer for the shaping process. + hb_buffer_t* mBuffer MOZ_GUARDED_BY(mMutex) = nullptr; struct CmapCacheData { uint32_t mCodepoint; @@ -153,7 +194,7 @@ } }; - mutable mozilla::UniquePtr mCmapCache MOZ_GUARDED_BY(mCacheLock); + mutable mozilla::UniquePtr mCmapCache MOZ_GUARDED_BY(mMutex); struct WidthCacheData { hb_codepoint_t mGlyphId; @@ -168,9 +209,7 @@ } }; - mutable mozilla::UniquePtr mWidthCache MOZ_GUARDED_BY(mCacheLock); - - FontCallbackData mCallbackData; + mutable mozilla::UniquePtr mWidthCache MOZ_GUARDED_BY(mMutex); // Following table references etc are declared "mutable" because the // harfbuzz callback functions take a const ptr to the shaper, but @@ -178,66 +217,68 @@ // in the font. // Old-style TrueType kern table, if we're not doing GPOS kerning - mutable hb_blob_t* mKernTable; + mutable hb_blob_t* mKernTable = nullptr; // Cached copy of the hmtx table. - mutable hb_blob_t* mHmtxTable; + mutable hb_blob_t* mHmtxTable = nullptr; // For vertical fonts, cached vmtx and VORG table, if present. - mutable hb_blob_t* mVmtxTable; - mutable hb_blob_t* mVORGTable; + mutable hb_blob_t* mVmtxTable = nullptr; + mutable hb_blob_t* mVORGTable = nullptr; // And for vertical TrueType (not CFF) fonts that have vmtx, // we also use loca and glyf to get glyph bounding boxes. - mutable hb_blob_t* mLocaTable; - mutable hb_blob_t* mGlyfTable; + mutable hb_blob_t* mLocaTable = nullptr; + mutable hb_blob_t* mGlyfTable = nullptr; // Cached pointer to cmap subtable to be used for char-to-glyph mapping. // This comes from GetFontTablePtr; if it is non-null, our destructor // must call ReleaseFontTablePtr to avoid permanently caching the table. - mutable hb_blob_t* mCmapTable; - mutable int32_t mCmapFormat; - mutable uint32_t mSubtableOffset; - mutable uint32_t mUVSTableOffset; + // These are set during Initialize(), before any use of the shaper. + hb_blob_t* mCmapTable = nullptr; + int32_t mCmapFormat = -1; + uint32_t mSubtableOffset = 0; + uint32_t mUVSTableOffset = 0; // Cached copy of numLongMetrics field from the hhea table, // for use when looking up glyph metrics; initialized to 0 by the // constructor so we can tell it hasn't been set yet. // This is a signed value so that we can use -1 to indicate // an error (if the hhea table was not available). - mutable int32_t mNumLongHMetrics; + mutable int32_t mNumLongHMetrics = 0; // Similarly for vhea if it's a vertical font. - mutable int32_t mNumLongVMetrics; + mutable int32_t mNumLongVMetrics = 0; // Default y-coordinate for glyph vertical origin, used if the font // does not actually have vertical-layout metrics. - mutable gfxFloat mDefaultVOrg; + mutable gfxFloat mDefaultVOrg = -1.0; // Number of glyphs in the font (set from 'maxp' during initialization). uint32_t mNumGlyphs = 0; // Whether the font implements GetGlyph, or we should read tables // directly - bool mUseFontGetGlyph; + bool mUseFontGetGlyph = false; // Whether the font is an MS Symbol-encoded font, in which case we will // try remapping U+0020..00FF to U+F020..F0FF for characters in the U+00xx // range that are otherwise unsupported. - bool mIsSymbolFont; + bool mIsSymbolFont = false; // Whether the font implements GetGlyphWidth, or we should read tables // directly to get ideal widths - bool mUseFontGlyphWidths; - - bool mInitialized; - bool mVerticalInitialized; + bool mUseFontGlyphWidths = false; // Whether to use vertical presentation forms for CJK characters // when available (only set if the 'vert' feature is not available). - bool mUseVerticalPresentationForms; + bool mUseVerticalPresentationForms = false; // these are set from the FindGlyf callback on first use of the glyf data - mutable bool mLoadedLocaGlyf; - mutable bool mLocaLongOffsets; + mutable bool mLoadedLocaGlyf = false; + mutable bool mLocaLongOffsets = false; + + // This is atomic so that we can check it without necessarily holding the + // lock. + std::atomic mVerticalInitialized = false; }; #endif /* GFX_HARFBUZZSHAPER_H */ diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxPlatformFontList.cpp thunderbird-140.10.0esr/gfx/thebes/gfxPlatformFontList.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxPlatformFontList.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxPlatformFontList.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -379,6 +379,8 @@ kFontSystemWhitelistPref); } NS_RELEASE(gFontListPrefObserver); + + delete mSharedFontList.exchange(nullptr); } FontVisibility gfxPlatformFontList::GetFontVisibility(nsCString& aFont, @@ -657,7 +659,9 @@ // From here, gfxPlatformFontList::IsInitialized will return true, // unless InitFontListForPlatform() fails and we reset it below. - mFontlistInitCount++; + if (MOZ_UNLIKELY(!++mFontlistInitCount)) { + ++mFontlistInitCount; // if the counter wrapped, bump it past zero + } InitializeCodepointsWithNoFonts(); @@ -676,19 +680,20 @@ } mFontEntries.Clear(); mShmemCharMaps.Clear(); - bool oldSharedList = mSharedFontList != nullptr; - mSharedFontList.reset(new fontlist::FontList(mFontlistInitCount)); + bool oldSharedList = SharedFontList() != nullptr; + delete mSharedFontList.exchange(new fontlist::FontList(mFontlistInitCount)); InitSharedFontListForPlatform(); - if (mSharedFontList && mSharedFontList->Initialized()) { + auto* newList = SharedFontList(); + if (newList && newList->Initialized()) { if (mLocalNameTable.Count()) { - SharedFontList()->SetLocalNames(mLocalNameTable); + newList->SetLocalNames(mLocalNameTable); mLocalNameTable.Clear(); } } else { // something went wrong, fall back to in-process list gfxCriticalNote << "Failed to initialize shared font list, " "falling back to in-process list."; - mSharedFontList.reset(nullptr); + delete mSharedFontList.exchange(nullptr); } if (oldSharedList && XRE_IsParentProcess()) { // notify all children of the change @@ -702,7 +707,10 @@ } } - if (!SharedFontList()) { + if (SharedFontList()) { + mFontListGeneration = SharedFontList()->GetGeneration(); + } else { + mFontListGeneration = 0; if (NS_FAILED(InitFontListForPlatform())) { mFontlistInitCount = 0; return false; @@ -789,7 +797,7 @@ } bool initialized = false; dom::ContentChild::GetSingleton()->SendInitOtherFamilyNames( - list->GetGeneration(), mDefer, &initialized); + pfl->GetGeneration(), mDefer, &initialized); pfl->mOtherFamilyNamesInitialized.compareExchange(false, initialized); return NS_OK; } @@ -810,8 +818,7 @@ if (NS_IsMainThread()) { bool initialized; dom::ContentChild::GetSingleton()->SendInitOtherFamilyNames( - SharedFontList()->GetGeneration(), aDeferOtherFamilyNamesLoading, - &initialized); + GetGeneration(), aDeferOtherFamilyNamesLoading, &initialized); mOtherFamilyNamesInitialized.compareExchange(false, initialized); } else { NS_DispatchToMainThread( @@ -1407,10 +1414,10 @@ return NS_OK; } if (XRE_IsParentProcess()) { - pfl->StartCmapLoading(list->GetGeneration(), mStartIndex); + pfl->StartCmapLoading(pfl->GetGeneration(), mStartIndex); } else { dom::ContentChild::GetSingleton()->SendStartCmapLoading( - list->GetGeneration(), mStartIndex); + pfl->GetGeneration(), mStartIndex); } return NS_OK; } @@ -1431,12 +1438,11 @@ // If we're already on the main thread, don't bother dispatching a runnable // here to kick off the loading process, just do it directly. if (NS_IsMainThread()) { - auto* list = SharedFontList(); if (XRE_IsParentProcess()) { - StartCmapLoading(list->GetGeneration(), aStartIndex); + StartCmapLoading(GetGeneration(), aStartIndex); } else { - dom::ContentChild::GetSingleton()->SendStartCmapLoading( - list->GetGeneration(), aStartIndex); + dom::ContentChild::GetSingleton()->SendStartCmapLoading(GetGeneration(), + aStartIndex); } } else { NS_DispatchToMainThread(new StartCmapLoadingRunnable(aStartIndex)); @@ -1491,7 +1497,7 @@ if (!list) { return NS_OK; } - if (mGeneration != list->GetGeneration()) { + if (mGeneration != pfl->GetGeneration()) { return NS_OK; } uint32_t numFamilies = list->NumFamilies(); @@ -1559,7 +1565,7 @@ void gfxPlatformFontList::StartCmapLoading(uint32_t aGeneration, uint32_t aStartIndex) { MOZ_RELEASE_ASSERT(XRE_IsParentProcess()); - if (aGeneration != SharedFontList()->GetGeneration()) { + if (aGeneration != GetGeneration()) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -1831,7 +1837,8 @@ mLoadCmaps(aLoadCmaps) {} NS_IMETHOD Run() override { - auto list = gfxPlatformFontList::PlatformFontList()->SharedFontList(); + auto* pfl = gfxPlatformFontList::PlatformFontList(); + auto* list = pfl->SharedFontList(); if (!list) { return NS_OK; } @@ -1840,8 +1847,12 @@ // was posted - just ignore it. return NS_OK; } - dom::ContentChild::GetSingleton()->SendInitializeFamily( - list->GetGeneration(), mIndex, mLoadCmaps); + auto& family = list->Families()[mIndex]; + if (mLoadCmaps ? family.IsFullyInitialized() : family.IsInitialized()) { + // Some other runnable initialized this or somesuch. + return NS_OK; + } + (void)pfl->InitializeFamily(&family, mLoadCmaps); return NS_OK; } @@ -1854,21 +1865,21 @@ bool aLoadCmaps) { MOZ_ASSERT(SharedFontList()); auto list = SharedFontList(); + auto* families = list->Families(); + if (!families) { + return false; + } + uint32_t index = aFamily - families; + if (index >= list->NumFamilies()) { + return false; + } + if (!NS_IsMainThread() && (!sInitFontListThread || !IsInitFontListThread())) { + NS_DispatchToMainThread(new InitializeFamilyRunnable(index, aLoadCmaps)); + return aFamily->IsInitialized(); + } if (!XRE_IsParentProcess()) { - auto* families = list->Families(); - if (!families) { - return false; - } - uint32_t index = aFamily - families; - if (index >= list->NumFamilies()) { - return false; - } - if (NS_IsMainThread()) { - dom::ContentChild::GetSingleton()->SendInitializeFamily( - list->GetGeneration(), index, aLoadCmaps); - } else { - NS_DispatchToMainThread(new InitializeFamilyRunnable(index, aLoadCmaps)); - } + dom::ContentChild::GetSingleton()->SendInitializeFamily( + GetGeneration(), index, aLoadCmaps); return aFamily->IsInitialized(); } @@ -1884,8 +1895,7 @@ // all the cmaps at once and reduce IPC traffic (and content-process file // access overhead, which is crippling for DirectWrite on Windows). if (aLoadCmaps) { - auto* faces = aFamily->Faces(list); - if (faces) { + if (auto* faces = aFamily->Faces(list)) { for (size_t i = 0; i < aFamily->NumFaces(); i++) { auto* face = faces[i].ToPtr(list); if (face && face->mCharacterMap.IsNull()) { @@ -2054,7 +2064,8 @@ aCmap->CalcHash(); aCmap->mShared = true; // Set the shared flag in preparation for adding // to the global table. - RefPtr cmap = mSharedCmaps.PutEntry(aCmap)->GetKey(); + CharMapLookup lookup{aCmap, aCmap->mHash, /* mCompareByPointer */ false}; + RefPtr cmap = mSharedCmaps.PutEntry(lookup)->GetCharMap(); // If we ended up finding a different, pre-existing entry, clear the // shared flag on this one so that it'll get deleted on Release(). @@ -2069,9 +2080,17 @@ // when a user of the charmap drops a reference and the refcount goes to 1; // in that case, it is possible our shared set is the only remaining user // of the object, and we should remove it. -// Note that aCharMap might have already been freed, so we must not try to -// dereference it until we have checked that it's still present in our table. -void gfxPlatformFontList::MaybeRemoveCmap(gfxCharacterMap* aCharMap) { +// +// CAUTION: aCharMap may already have been freed by the time we are called +// (another thread may have raced us here and deleted it first, or the +// destructor's teardown path may have run). We MUST NOT dereference aCharMap +// until we have established that it is still present in our table -- the +// table's strong reference then guarantees the object is alive. The hash +// lookup itself uses aHash (captured before the caller's --mRefCnt while the +// object was definitely alive) and pointer-identity comparison, so it never +// dereferences aCharMap. +void gfxPlatformFontList::MaybeRemoveCmap(gfxCharacterMap* aCharMap, + uint32_t aHash) { // Lock so that nobody else can get a reference via FindCharMap while we're // checking here. AutoLock lock(mLock); @@ -2081,14 +2100,18 @@ return; } - // aCharMap needs to match the entry and be the same ptr and still have a - // refcount of exactly 1 (i.e. we hold the only reference) before removing. - // If we're racing another thread, it might already have been removed, in - // which case GetEntry will not find it and we won't try to dereference the - // already-freed pointer. - CharMapHashKey* found = - mSharedCmaps.GetEntry(const_cast(aCharMap)); - if (found && found->GetKey() == aCharMap && aCharMap->RefCount() == 1) { + // Look up by captured hash + pointer identity; this does not dereference + // aCharMap. If a racing thread already removed and freed aCharMap, GetEntry + // simply won't find it (the freed slot can't reappear in the table at the + // same address while we hold mLock, since insertions also need mLock). + CharMapLookup lookup{aCharMap, aHash, /* mCompareByPointer */ true}; + CharMapHashKey* found = mSharedCmaps.GetEntry(lookup); + + // If found, the table holds a strong ref, so aCharMap is alive and we may + // dereference it. We must check that it still has a refcount of exactly 1 + // (the table's ref) before we remove; a FindCharMap may have raced us and + // AddRef'd it. + if (found && aCharMap->RefCount() == 1) { // Forget our reference to the object that's being deleted, without // calling Release() on it. Unused << found->mCharMap.forget(); @@ -3019,7 +3042,8 @@ aSizes->mFontListSize += mSharedCmaps.ShallowSizeOfExcludingThis(aMallocSizeOf); for (const auto& entry : mSharedCmaps) { - aSizes->mCharMapsSize += entry.GetKey()->SizeOfIncludingThis(aMallocSizeOf); + aSizes->mCharMapsSize += + entry.GetCharMap()->SizeOfIncludingThis(aMallocSizeOf); } aSizes->mFontListSize += @@ -3154,7 +3178,7 @@ if (!list) { return; } - if (!aGeneration || list->GetGeneration() == aGeneration) { + if (!aGeneration || GetGeneration() == aGeneration) { list->ShareShmBlockToProcess(aIndex, aPid, aOut); } else { *aOut = nullptr; @@ -3194,7 +3218,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3219,7 +3243,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3260,7 +3284,7 @@ if (!list) { return; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3290,7 +3314,7 @@ if (!list) { return false; } - if (list->GetGeneration() != aGeneration) { + if (GetGeneration() != aGeneration) { return false; } if (AppShutdown::IsInOrBeyond(ShutdownPhase::AppShutdownConfirmed)) { @@ -3299,10 +3323,6 @@ return InitOtherFamilyNames(aDefer); } -uint32_t gfxPlatformFontList::GetGeneration() const { - return SharedFontList() ? SharedFontList()->GetGeneration() : 0; -} - gfxPlatformFontList::FontPrefs::FontPrefs() { // This must be created on the main thread, so that we can safely use the // Preferences service. Once created, it can be read from any thread. diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxPlatformFontList.h thunderbird-140.10.0esr/gfx/thebes/gfxPlatformFontList.h --- thunderbird-140.9.0esr/gfx/thebes/gfxPlatformFontList.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxPlatformFontList.h 2026-04-21 14:52:54.000000000 +0000 @@ -36,13 +36,29 @@ } } // namespace mozilla +// Lookup key for the shared-cmap hashtable. The hash is carried separately +// from the gfxCharacterMap pointer so that MaybeRemoveCmap can look up an +// entry without dereferencing the (potentially already freed) pointer. +struct CharMapLookup { + // The cmap to look up. In pointer-compare mode this may be dangling and is + // used for pointer-equality only; in content-compare mode it must be alive. + gfxCharacterMap* mCharMap; + // The cmap's mHash, captured while the object was known to be alive. + uint32_t mHash; + // If true, KeyEquals compares by pointer identity (no deref of mCharMap). + // If false, KeyEquals compares by content (derefs mCharMap; must be alive). + bool mCompareByPointer; +}; + class CharMapHashKey : public PLDHashEntryHdr { public: - typedef gfxCharacterMap* KeyType; - typedef const gfxCharacterMap* KeyTypePointer; + typedef CharMapLookup KeyType; + typedef const CharMapLookup* KeyTypePointer; - explicit CharMapHashKey(const gfxCharacterMap* aCharMap) - : mCharMap(const_cast(aCharMap)) { + explicit CharMapHashKey(const CharMapLookup* aLookup) + : mCharMap(aLookup->mCharMap) { + // Only content-compare lookups (FindCharMap) insert; the cmap is alive. + MOZ_ASSERT(!aLookup->mCompareByPointer); MOZ_COUNT_CTOR(CharMapHashKey); } CharMapHashKey(const CharMapHashKey& toCopy) : mCharMap(toCopy.mCharMap) { @@ -50,23 +66,29 @@ } MOZ_COUNTED_DTOR(CharMapHashKey) - gfxCharacterMap* GetKey() const { return mCharMap.get(); } + gfxCharacterMap* GetCharMap() const { return mCharMap.get(); } - bool KeyEquals(const gfxCharacterMap* aCharMap) const { - MOZ_ASSERT(!aCharMap->mBuildOnTheFly && !mCharMap->mBuildOnTheFly, + bool KeyEquals(const CharMapLookup* aLookup) const { + if (aLookup->mCompareByPointer) { + // Pointer-identity compare for MaybeRemoveCmap. Does not dereference + // aLookup->mCharMap, which may be dangling. + return mCharMap.get() == aLookup->mCharMap; + } + // Content compare for FindCharMap. aLookup->mCharMap must be alive. + MOZ_ASSERT(!aLookup->mCharMap->mBuildOnTheFly && !mCharMap->mBuildOnTheFly, "custom cmap used in shared cmap hashtable"); - // cmaps built on the fly never match - if (aCharMap->mHash != mCharMap->mHash) { + if (aLookup->mHash != mCharMap->mHash) { return false; } - return mCharMap->Equals(aCharMap); + return mCharMap->Equals(aLookup->mCharMap); } - static const gfxCharacterMap* KeyToPointer(gfxCharacterMap* aCharMap) { - return aCharMap; + static const CharMapLookup* KeyToPointer(const CharMapLookup& aLookup) { + return &aLookup; } - static PLDHashNumber HashKey(const gfxCharacterMap* aCharMap) { - return aCharMap->mHash; + static PLDHashNumber HashKey(const CharMapLookup* aLookup) { + // Use the captured hash; never dereference aLookup->mCharMap. + return aLookup->mHash; } enum { ALLOW_MEMMOVE = true }; @@ -349,7 +371,7 @@ const gfxFontStyle* aStyle); mozilla::fontlist::FontList* SharedFontList() const { - return mSharedFontList.get(); + return mSharedFontList; } // Create a handle for a single shmem block (identified by index) ready to @@ -510,8 +532,9 @@ already_AddRefed FindCharMap(gfxCharacterMap* aCmap); // Remove the cmap from the shared cmap set if it holds the only remaining - // reference to the object. - void MaybeRemoveCmap(gfxCharacterMap* aCharMap); + // reference to the object. aCharMap may be dangling; aHash is its mHash + // captured while it was known alive. + void MaybeRemoveCmap(gfxCharacterMap* aCharMap, uint32_t aHash); // Keep track of userfont sets to notify when global fontlist changes occur. void AddUserFontSet(gfxUserFontSet* aUserFontSet) { @@ -639,7 +662,7 @@ // existing references to shared font family or face objects and character // maps will no longer be valid. // (The legacy (non-shared) list just returns 0 here.) - uint32_t GetGeneration() const; + uint32_t GetGeneration() const { return mFontListGeneration; } // Sometimes we need to know if we're on the InitFontList startup thread. static bool IsInitFontListThread() { @@ -1062,7 +1085,9 @@ nsTArray mEnabledFontsList; nsTHashSet mIconFontsSet; - mozilla::UniquePtr mSharedFontList; + // This is an owning reference; we are responsible to delete the FontList at + // appropriate times. + std::atomic mSharedFontList = nullptr; nsClassHashtable mAliasTable; nsTHashMap @@ -1078,6 +1103,9 @@ RefPtr mLoadCmapsRunnable; uint32_t mStartedLoadingCmapsFrom MOZ_GUARDED_BY(mLock) = 0xffffffffu; + // Cached value of mSharedFontList->GetGeneration(), updated by InitFontList. + std::atomic mFontListGeneration = 0; + bool mFontFamilyWhitelistActive = false; static PRThread* sInitFontListThread; diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxTextRun.cpp thunderbird-140.10.0esr/gfx/thebes/gfxTextRun.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxTextRun.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxTextRun.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -2026,17 +2026,8 @@ void gfxFontGroup::AddFamilyToFontList(fontlist::Family* aFamily, StyleGenericFontFamily aGeneric) { gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); - if (!aFamily->IsInitialized()) { - if (ServoStyleSet* set = gfxFontUtils::CurrentServoStyleSet()) { - // If we need to initialize a Family record, but we're on a style - // worker thread, we have to defer it. - set->AppendTask(PostTraversalTask::InitializeFamily(aFamily)); - set->AppendTask(PostTraversalTask::FontInfoUpdate(set)); - return; - } - if (!pfl->InitializeFamily(aFamily)) { - return; - } + if (!aFamily->IsInitialized() && !pfl->InitializeFamily(aFamily)) { + return; } AutoTArray faceList; aFamily->FindAllFacesForStyle(pfl->SharedFontList(), mStyle, faceList); diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxUserFontSet.cpp thunderbird-140.10.0esr/gfx/thebes/gfxUserFontSet.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxUserFontSet.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxUserFontSet.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -94,6 +94,10 @@ // traversal, since PostTraversalTask objects can hold raw pointers to // gfxUserFontEntry objects. MOZ_ASSERT(!gfxFontUtils::IsInServoTraversal()); + // Ensure the platform font entry is destroyed on the main thread, to avoid + // potential race updating the sUserFonts cache. + NS_ReleaseOnMainThread("gfxUserFontEntry::mPlatformFontEntry", + mPlatformFontEntry.forget()); } bool gfxUserFontEntry::Matches(const nsTArray& aFontFaceSrcList, @@ -541,7 +545,7 @@ // If we need to start a font load and we're on a style // worker thread, we have to defer it. SetLoadState(STATUS_LOAD_PENDING); - set->AppendTask(PostTraversalTask::LoadFontEntry(this)); + set->AppendTask(PostTraversalTask::LoadFontEntry(do_AddRef(this))); return; } @@ -1115,6 +1119,16 @@ // discard it as no longer valid. if (ufe->GetPlatformFontEntry() && ufe->GetPlatformFontEntry()->IsLocalUserFont()) { + // Clear shmem pointers on the local-user-font entry: it is not tracked + // in gfxPlatformFontList::mFontEntries, so InitFontList()'s cleanup loop + // misses it. + gfxFontEntry* pfe = ufe->GetPlatformFontEntry(); + { + AutoWriteLock lock(pfe->mLock); + pfe->mShmemCharacterMap = nullptr; + pfe->mShmemFace = nullptr; + pfe->mShmemFamily = nullptr; + } ufe->mPlatformFontEntry = nullptr; } // If the entry had a local source, we need to re-evaluate the source list @@ -1130,12 +1144,13 @@ for (auto& ufe : entriesToCancel) { if (auto* loader = ufe->GetLoader()) { // If there's a loader, we need to cancel it, because we'll trigger a - // fresh load if required when we re-resolve the font... + // fresh load if required when we re-resolve the font. Cancel() removes + // the loader from the set it was registered in (not necessarily |this| + // font set). loader->Cancel(); - RemoveLoader(loader); } else { - // ...otherwise, just reset our state so that we'll re-evaluate the - // source list from the beginning. + // Otherwise, just reset our state so that we'll re-evaluate the source + // list from the beginning. ufe->LoadCanceled(); } } @@ -1229,6 +1244,7 @@ } void gfxUserFontSet::UserFontCache::CacheFont(gfxFontEntry* aFontEntry) { + MOZ_ASSERT(NS_IsMainThread()); NS_ASSERTION(aFontEntry->mFamilyName.Length() != 0, "caching a font associated with no family yet"); @@ -1283,6 +1299,10 @@ } void gfxUserFontSet::UserFontCache::ForgetFont(gfxFontEntry* aFontEntry) { + // The only caller is ~gfxFontEntry; if this fires, there is a path to + // off-main-thread destruction of a font entry with mIsDataUserFont set + // that needs to be proxied to main thread (see ~gfxUserFontEntry). + MOZ_ASSERT(NS_IsMainThread()); if (!sUserFonts) { // if we've already deleted the cache (i.e. during shutdown), // just ignore this @@ -1306,6 +1326,7 @@ gfxFontEntry* gfxUserFontSet::UserFontCache::GetFont( const gfxFontFaceSrc& aSrc, const gfxUserFontEntry& aUserFontEntry) { + MOZ_ASSERT(NS_IsMainThread() || gfxFontUtils::CurrentServoStyleSet()); if (!sUserFonts || StaticPrefs::gfx_downloadable_fonts_disable_cache()) { return nullptr; } diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxUserFontSet.h thunderbird-140.10.0esr/gfx/thebes/gfxUserFontSet.h --- thunderbird-140.9.0esr/gfx/thebes/gfxUserFontSet.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxUserFontSet.h 2026-04-21 14:52:53.000000000 +0000 @@ -767,6 +767,8 @@ // user font entry. virtual void GetUserFontSets(nsTArray>& aResult); + FontTableCache* GetFontTableCache(bool aCreate) override { return nullptr; } + // general load state UserFontLoadState mUserFontLoadState; diff -Nru thunderbird-140.9.0esr/gfx/thebes/gfxUtils.cpp thunderbird-140.10.0esr/gfx/thebes/gfxUtils.cpp --- thunderbird-140.9.0esr/gfx/thebes/gfxUtils.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/thebes/gfxUtils.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -230,8 +230,7 @@ DataSourceSurface::MappedSurface destMap; if (!MapSrcAndCreateMappedDest(srcSurf, &destSurf, &srcMap, &destMap)) { MOZ_ASSERT(false, "MapSrcAndCreateMappedDest failed."); - RefPtr surface(srcSurf); - return surface.forget(); + return nullptr; } PremultiplyData(srcMap.mData, srcMap.mStride, srcSurf->GetFormat(), @@ -249,8 +248,7 @@ DataSourceSurface::MappedSurface destMap; if (!MapSrcAndCreateMappedDest(srcSurf, &destSurf, &srcMap, &destMap)) { MOZ_ASSERT(false, "MapSrcAndCreateMappedDest failed."); - RefPtr surface(srcSurf); - return surface.forget(); + return nullptr; } UnpremultiplyData(srcMap.mData, srcMap.mStride, srcSurf->GetFormat(), diff -Nru thunderbird-140.9.0esr/gfx/vr/VRManager.cpp thunderbird-140.10.0esr/gfx/vr/VRManager.cpp --- thunderbird-140.9.0esr/gfx/vr/VRManager.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/vr/VRManager.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -155,8 +155,8 @@ #if !defined(MOZ_WIDGET_ANDROID) // XRE_IsGPUProcess() is helping us to check some platforms like // Win 7 try which are not using GPU process but VR process is enabled. - mVRProcessEnabled = - StaticPrefs::dom_vr_process_enabled_AtStartup() && XRE_IsGPUProcess(); + mVRProcessEnabled = StaticPrefs::dom_vr_process_enabled_AtStartup() && + StaticPrefs::dom_vr_enabled() && XRE_IsGPUProcess(); VRServiceHost::Init(mVRProcessEnabled); mServiceHost = VRServiceHost::Get(); // We must shutdown before VRServiceHost, which is cleared diff -Nru thunderbird-140.9.0esr/gfx/vr/external_api/moz_external_vr.h thunderbird-140.10.0esr/gfx/vr/external_api/moz_external_vr.h --- thunderbird-140.9.0esr/gfx/vr/external_api/moz_external_vr.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/vr/external_api/moz_external_vr.h 2026-04-21 14:52:53.000000000 +0000 @@ -209,8 +209,9 @@ case gfx::VRControllerType::PicoGaze: case gfx::VRControllerType::PicoG2: case gfx::VRControllerType::PicoNeo2: - case gfx::VRControllerType::_end: return true; + case gfx::VRControllerType::_end: + break; } return false; } diff -Nru thunderbird-140.9.0esr/gfx/vr/ipc/VRChild.cpp thunderbird-140.10.0esr/gfx/vr/ipc/VRChild.cpp --- thunderbird-140.9.0esr/gfx/vr/ipc/VRChild.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/vr/ipc/VRChild.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -169,25 +169,27 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PVRChild::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - if (VRProcessManager* vpm = VRProcessManager::Get()) { - if (VRChild* child = vpm->GetVRChild()) { - if (child->mMemoryReportRequest) { - child->mMemoryReportRequest->Finish(aGeneration2); - child->mMemoryReportRequest = nullptr; + PVRChild::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + if (VRProcessManager* vpm = VRProcessManager::Get()) { + if (VRChild* child = vpm->GetVRChild()) { + if (child->mMemoryReportRequest) { + child->mMemoryReportRequest->Finish(aGeneration2); + child->mMemoryReportRequest = nullptr; + } + } } - } - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - if (VRProcessManager* vpm = VRProcessManager::Get()) { - if (VRChild* child = vpm->GetVRChild()) { - child->mMemoryReportRequest = nullptr; - } - } - }); + }, + [](mozilla::ipc::ResponseRejectReason) { + if (VRProcessManager* vpm = VRProcessManager::Get()) { + if (VRChild* child = vpm->GetVRChild()) { + child->mMemoryReportRequest = nullptr; + } + } + }); return true; } diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHost.cpp thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.cpp --- thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHost.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -91,6 +91,9 @@ RenderTextureHost::~RenderTextureHost() { MOZ_ASSERT(RenderThread::IsInRenderThread()); MOZ_COUNT_DTOR(RenderTextureHost); + if (mDestroyedCallback) { + mDestroyedCallback(); + } } wr::WrExternalImage RenderTextureHost::Lock(uint8_t aChannelIndex, diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHost.h thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.h --- thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHost.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHost.h 2026-04-21 14:52:54.000000000 +0000 @@ -97,6 +97,11 @@ virtual void UnlockSWGL() {} + virtual bool LockSWGLCompositeSurface(void* aContext, + wr::SWGLCompositeSurfaceInfo* aInfo) { + return false; + } + virtual RefPtr CreateTextureSource( layers::TextureSourceProvider* aProvider); @@ -177,6 +182,11 @@ virtual RefPtr GetTextureHostUsageInfo( const MutexAutoLock& aProofOfMapLock); + void SetDestroyedCallback(std::function&& aDestroyedCallback) { + MOZ_ASSERT(!mDestroyedCallback); + mDestroyedCallback = std::move(aDestroyedCallback); + } + protected: virtual ~RenderTextureHost(); @@ -184,6 +194,7 @@ // protected by RenderThread::mRenderTextureMapLock RefPtr mRenderTextureHostUsageInfo; + std::function mDestroyedCallback; friend class RenderTextureHostWrapper; }; diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h --- thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostSWGL.h 2026-04-21 14:52:53.000000000 +0000 @@ -49,7 +49,7 @@ // WrSWGLCompositeSurfaceInfo. This is paired with a call to UnlockSWGL when // composition is done. bool LockSWGLCompositeSurface(void* aContext, - wr::SWGLCompositeSurfaceInfo* aInfo); + wr::SWGLCompositeSurfaceInfo* aInfo) override; size_t BytesFromPlanes() { NS_ASSERTION(mPlanes.size(), "Can't compute bytes without any planes"); diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp --- thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -52,6 +52,30 @@ } } +wr::WrExternalImage RenderTextureHostWrapper::LockSWGL( + uint8_t aChannelIndex, void* aContext, RenderCompositor* aCompositor) { + if (!mTextureHost) { + return InvalidToWrExternalImage(); + } + + return mTextureHost->LockSWGL(aChannelIndex, aContext, aCompositor); +} + +void RenderTextureHostWrapper::UnlockSWGL() { + if (mTextureHost) { + mTextureHost->UnlockSWGL(); + } +} + +bool RenderTextureHostWrapper::LockSWGLCompositeSurface( + void* aContext, wr::SWGLCompositeSurfaceInfo* aInfo) { + if (!mTextureHost) { + return false; + } + + return mTextureHost->LockSWGLCompositeSurface(aContext, aInfo); +} + void RenderTextureHostWrapper::ClearCachedResources() { if (mTextureHost) { mTextureHost->ClearCachedResources(); diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h --- thunderbird-140.9.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/RenderTextureHostWrapper.h 2026-04-21 14:52:54.000000000 +0000 @@ -65,6 +65,13 @@ PlaneInfo& aPlaneInfo) override; void UnmapPlanes() override; + wr::WrExternalImage LockSWGL(uint8_t aChannelIndex, void* aContext, + RenderCompositor* aCompositor) override; + + void UnlockSWGL() override; + bool LockSWGLCompositeSurface(void* aContext, + wr::SWGLCompositeSurfaceInfo* aInfo) override; + // This is just a wrapper, so doesn't need to report the // size of the wrapped object (which reports itself). size_t Bytes() override { return 0; } diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/WebRenderAPI.cpp thunderbird-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.cpp --- thunderbird-140.9.0esr/gfx/webrender_bindings/WebRenderAPI.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -876,19 +876,16 @@ void WebRenderAPI::Capture() { // see CaptureBits // SCENE | FRAME | TILE_CACHE - uint8_t bits = 15; // TODO: get from JavaScript - const char* path = "wr-capture"; // TODO: get from JavaScript - wr_api_capture(mDocHandle, path, bits); + uint8_t bits = 15; // TODO: get from JavaScript + wr_api_capture(mDocHandle, bits); } -void WebRenderAPI::StartCaptureSequence(const nsACString& aPath, - uint32_t aFlags) { +void WebRenderAPI::StartCaptureSequence(uint32_t aFlags) { if (mCaptureSequence) { wr_api_stop_capture_sequence(mDocHandle); } - wr_api_start_capture_sequence(mDocHandle, PromiseFlatCString(aPath).get(), - aFlags); + wr_api_start_capture_sequence(mDocHandle, aFlags); mCaptureSequence = true; } diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/WebRenderAPI.h thunderbird-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.h --- thunderbird-140.9.0esr/gfx/webrender_bindings/WebRenderAPI.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/WebRenderAPI.h 2026-04-21 14:52:53.000000000 +0000 @@ -313,7 +313,7 @@ void Capture(); - void StartCaptureSequence(const nsACString& aPath, uint32_t aFlags); + void StartCaptureSequence(uint32_t aFlags); void StopCaptureSequence(); void BeginRecording(const TimeStamp& aRecordingStart, diff -Nru thunderbird-140.9.0esr/gfx/webrender_bindings/src/bindings.rs thunderbird-140.10.0esr/gfx/webrender_bindings/src/bindings.rs --- thunderbird-140.9.0esr/gfx/webrender_bindings/src/bindings.rs 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/webrender_bindings/src/bindings.rs 2026-04-21 14:52:53.000000000 +0000 @@ -2599,12 +2599,11 @@ txn.add_raw_font(key, bytes.flush_into_vec(), index); } -fn generate_capture_path(path: *const c_char) -> Option { +fn generate_capture_path() -> Option { use std::fs::{create_dir_all, File}; use std::io::Write; - let cstr = unsafe { CStr::from_ptr(path) }; - let local_dir = PathBuf::from(&*cstr.to_string_lossy()); + let local_dir = PathBuf::from("wr-capture"); // On Android we need to write into a particular folder on external // storage so that (a) it can be written without requiring permissions @@ -2653,16 +2652,16 @@ } #[no_mangle] -pub extern "C" fn wr_api_capture(dh: &mut DocumentHandle, path: *const c_char, bits_raw: u32) { - if let Some(path) = generate_capture_path(path) { +pub extern "C" fn wr_api_capture(dh: &mut DocumentHandle, bits_raw: u32) { + if let Some(path) = generate_capture_path() { let bits = CaptureBits::from_bits(bits_raw as _).unwrap(); dh.api.save_capture(path, bits); } } #[no_mangle] -pub extern "C" fn wr_api_start_capture_sequence(dh: &mut DocumentHandle, path: *const c_char, bits_raw: u32) { - if let Some(path) = generate_capture_path(path) { +pub extern "C" fn wr_api_start_capture_sequence(dh: &mut DocumentHandle, bits_raw: u32) { + if let Some(path) = generate_capture_path() { let bits = CaptureBits::from_bits(bits_raw as _).unwrap(); dh.api.start_capture_sequence(path, bits); } diff -Nru thunderbird-140.9.0esr/gfx/ycbcr/scale_yuv_argb.cpp thunderbird-140.10.0esr/gfx/ycbcr/scale_yuv_argb.cpp --- thunderbird-140.9.0esr/gfx/ycbcr/scale_yuv_argb.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ycbcr/scale_yuv_argb.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -11,6 +11,7 @@ #include "libyuv/scale.h" +#include #include #include @@ -937,7 +938,7 @@ YUVColorSpace yuv_color_space) { YUVBuferIter iter; - iter.src_width = src_width; + iter.src_width = std::min(src_width, dst_width); iter.src_height = src_height; iter.src_stride_y = src_stride_y; iter.src_stride_u = src_stride_u; diff -Nru thunderbird-140.9.0esr/gfx/ycbcr/yuv_convert.cpp thunderbird-140.10.0esr/gfx/ycbcr/yuv_convert.cpp --- thunderbird-140.9.0esr/gfx/ycbcr/yuv_convert.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/gfx/ycbcr/yuv_convert.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -177,6 +177,7 @@ } case YV16: { src_y = y_buf + y_pitch * pic_y + pic_x; + // Only used when pic_x is even; odd pic_x is handled below. src_u = u_buf + uv_pitch * pic_y + pic_x / 2; src_v = v_buf + uv_pitch * pic_y + pic_x / 2; @@ -185,8 +186,10 @@ } case YV12: { src_y = y_buf + y_pitch * pic_y + pic_x; - src_u = u_buf + (uv_pitch * pic_y + pic_x) / 2; - src_v = v_buf + (uv_pitch * pic_y + pic_x) / 2; + // Only used when pic_x and pic_y are both even; odd values are handled + // below. + src_u = u_buf + uv_pitch * (pic_y / 2) + pic_x / 2; + src_v = v_buf + uv_pitch * (pic_y / 2) + pic_x / 2; fConvertYUVToARGB = libyuv::I420ToARGBMatrix; break; @@ -210,6 +213,81 @@ const uint8_t* u_channel = swap_uv? src_v : src_u; const uint8_t* v_channel = swap_uv? src_u : src_v; + + // libyuv handles odd crop widths and heights correctly via its _Any_ row + // variants, but cannot handle an odd pic_x or pic_y for subsampled formats. + // For YV12/YV16 an odd pic_x means the Y plane starts at a position that + // doesn't align with a chroma column boundary; for YV12, odd pic_y has the + // same problem vertically. libyuv would then pair each Y sample with the + // wrong chroma, affecting every pixel in the image. + // + // Fix: split the output into up to 4 non-overlapping regions, each with + // even-aligned source coordinates. Integer division of an odd sx or sy by 2 + // floors to the correct chroma index (both luma positions in a 2x2 block + // share one chroma sample), so all regions are correct. + // + // With dx = pic_x & 1 and dy = pic_y & 1 (each 0 or 1): + // + // +------------+--------------------+ + // | dx x dy | (W-dx) x dy | <- only when dy > 0 + // +------------+--------------------+ + // | dx x (H-dy)| (W-dx) x (H-dy) | <- left col only when dx > 0 + // +------------+--------------------+ + + // dx/dy: 1 if pic_x/pic_y is odd and the format has chroma subsampling in + // that axis, 0 otherwise. + int dx = (yuv_type == YV12 || yuv_type == YV16) ? (pic_x & 1) : 0; + int dy = (yuv_type == YV12) ? (pic_y & 1) : 0; + if (dx | dy) { + // Converts source sub-region (sx, sy, w, h) to the area at dst in rgb_buf. + auto convert = [&](int sx, int sy, int w, int h, uint8_t* dst) -> nsresult { + if (w <= 0 || h <= 0) { + return NS_OK; + } + const uint8_t* py = y_buf + sy * y_pitch + sx; + const uint8_t* pu; + const uint8_t* pv; + if (yuv_type == YV12) { + pu = u_buf + (sy / 2) * uv_pitch + sx / 2; + pv = v_buf + (sy / 2) * uv_pitch + sx / 2; + } else { // YV16: full-height chroma planes, only horizontally subsampled. + pu = u_buf + sy * uv_pitch + sx / 2; + pv = v_buf + sy * uv_pitch + sx / 2; + } + const uint8_t* uc = swap_uv ? pv : pu; + const uint8_t* vc = swap_uv ? pu : pv; + return ToNSResult(fConvertYUVToARGB(py, y_pitch, uc, uv_pitch, vc, uv_pitch, + dst, rgb_pitch, yuv_constant, w, h)); + }; + if (dy) { + // First output row (source row pic_y is odd). + if (dx) { + // Corner pixel: source (pic_x, pic_y) → output top-left. + nsresult rv = convert(pic_x, pic_y, 1, 1, rgb_buf); + if (NS_FAILED(rv)) { + return rv; + } + } + // Remaining columns of first row; source x pic_x+dx is even. + nsresult rv = convert(pic_x + dx, pic_y, pic_width - dx, 1, rgb_buf + dx * 4); + if (NS_FAILED(rv)) { + return rv; + } + } + int sy = pic_y + dy; // even-aligned source y for remaining output rows + int h = pic_height - dy; + if (dx) { + // Left column of remaining rows; width=1 handles the odd source x. + nsresult rv = convert(pic_x, sy, 1, h, rgb_buf + dy * rgb_pitch); + if (NS_FAILED(rv)) { + return rv; + } + } + // Main body: source (pic_x+dx, sy), both even-aligned. + return convert(pic_x + dx, sy, pic_width - dx, h, + rgb_buf + dy * rgb_pitch + dx * 4); + } + return ToNSResult(fConvertYUVToARGB(src_y, y_pitch, u_channel, uv_pitch, v_channel, uv_pitch, rgb_buf, rgb_pitch, yuv_constant, pic_width, pic_height)); diff -Nru thunderbird-140.9.0esr/image/ImageWrapper.cpp thunderbird-140.10.0esr/image/ImageWrapper.cpp --- thunderbird-140.9.0esr/image/ImageWrapper.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/image/ImageWrapper.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -240,7 +240,8 @@ NS_IMETHODIMP_(void) ImageWrapper::RequestRefresh(const TimeStamp& aTime) { - return mInnerImage->RequestRefresh(aTime); + RefPtr inner = mInnerImage; + return inner->RequestRefresh(aTime); } NS_IMETHODIMP diff -Nru thunderbird-140.9.0esr/image/RasterImage.cpp thunderbird-140.10.0esr/image/RasterImage.cpp --- thunderbird-140.9.0esr/image/RasterImage.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/image/RasterImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -81,6 +81,8 @@ //****************************************************************************** RasterImage::~RasterImage() { + mIsBeingDestroyed = true; + // Make sure our SourceBuffer is marked as complete. This will ensure that any // outstanding decoders terminate. if (!mSourceBuffer->IsComplete()) { @@ -489,8 +491,12 @@ void RasterImage::OnSurfaceDiscarded(const SurfaceKey& aSurfaceKey) { MOZ_ASSERT(mProgressTracker); + if (mIsBeingDestroyed) { + return; + } + bool animatedFramesDiscarded = - mAnimationState && aSurfaceKey.Playback() == PlaybackType::eAnimated; + aSurfaceKey.Playback() == PlaybackType::eAnimated; nsCOMPtr eventTarget = do_GetMainThread(); diff -Nru thunderbird-140.9.0esr/image/RasterImage.h thunderbird-140.10.0esr/image/RasterImage.h --- thunderbird-140.9.0esr/image/RasterImage.h 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/image/RasterImage.h 2026-04-21 14:52:53.000000000 +0000 @@ -17,6 +17,7 @@ #ifndef mozilla_image_RasterImage_h #define mozilla_image_RasterImage_h +#include "mozilla/Atomics.h" #include "Image.h" #include "nsCOMPtr.h" #include "imgIContainer.h" @@ -382,6 +383,8 @@ // This is currently only used for statistics int32_t mDecodeCount; + Atomic mIsBeingDestroyed{false}; + #ifdef DEBUG uint32_t mFramesNotified; #endif diff -Nru thunderbird-140.9.0esr/image/VectorImage.cpp thunderbird-140.10.0esr/image/VectorImage.cpp --- thunderbird-140.9.0esr/image/VectorImage.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/image/VectorImage.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1603,6 +1603,10 @@ // invalid document. ReportDocumentUseCounters(); + // ProgressTracker::SyncNotifyProgress may release us, so ensure we + // stick around long enough to complete our work. + RefPtr kungFuDeathGrip(this); + if (mProgressTracker) { // Notify observers about the error and unblock page load. Progress progress = FLAG_HAS_ERROR; diff -Nru thunderbird-140.9.0esr/image/decoders/nsBMPDecoder.cpp thunderbird-140.10.0esr/image/decoders/nsBMPDecoder.cpp --- thunderbird-140.9.0esr/image/decoders/nsBMPDecoder.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/image/decoders/nsBMPDecoder.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -238,7 +238,8 @@ nsBMPDecoder::~nsBMPDecoder() {} // Obtains the size of the compressed image resource. -int32_t nsBMPDecoder::GetCompressedImageSize() const { +uint32_t nsBMPDecoder::GetCompressedImageSize() const { + // Keep this in sync with the overflow check in ReadInfoHeaderRest. // In the RGB case mImageSize might not be set, so compute it manually. MOZ_ASSERT(mPixelRowSize != 0); return mH.mCompression == Compression::RGB ? mPixelRowSize * AbsoluteHeight() @@ -637,6 +638,16 @@ mPixelRowSize += 4 - surplus; } + if (mIsWithinICO && mH.mCompression == Compression::RGB) { + // The ICO decoders calls GetCompressedImageSize so we need to make sure the + // computation it does cannot overflow. Keep this in sync with that + // function. + auto product = CheckedInt(mPixelRowSize) * AbsoluteHeight(); + if (!product.isValid()) { + return Transition::TerminateFailure(); + } + } + size_t bitFieldsLengthStillToRead = 0; if (mH.mCompression == Compression::BITFIELDS) { // Need to read bitfields. diff -Nru thunderbird-140.9.0esr/image/decoders/nsBMPDecoder.h thunderbird-140.10.0esr/image/decoders/nsBMPDecoder.h --- thunderbird-140.9.0esr/image/decoders/nsBMPDecoder.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/image/decoders/nsBMPDecoder.h 2026-04-21 14:52:54.000000000 +0000 @@ -159,7 +159,7 @@ size_t GetImageDataLength() const { return mImageDataLength; } /// Obtains the size of the compressed image resource. - int32_t GetCompressedImageSize() const; + uint32_t GetCompressedImageSize() const; /// Mark this BMP as being within an ICO file. Only used for testing purposes /// because the ICO-specific constructor does this marking automatically. @@ -205,7 +205,7 @@ nsBMPDecoder(RasterImage* aImage, State aState, size_t aLength, bool aForClipboard); - int32_t AbsoluteHeight() const { return abs(mH.mHeight); } + uint32_t AbsoluteHeight() const { return abs(mH.mHeight); } uint32_t* RowBuffer(); void ClearRowBufferRemainder(); diff -Nru thunderbird-140.9.0esr/image/decoders/nsICODecoder.cpp thunderbird-140.10.0esr/image/decoders/nsICODecoder.cpp --- thunderbird-140.9.0esr/image/decoders/nsICODecoder.cpp 2026-03-20 19:18:32.000000000 +0000 +++ thunderbird-140.10.0esr/image/decoders/nsICODecoder.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -136,7 +136,7 @@ // The first resource starts right after the directory, which starts right // after the ICO header. - return ICOHEADERSIZE + mNumIcons * ICODIRENTRYSIZE; + return ICOHEADERSIZE + static_cast(mNumIcons) * ICODIRENTRYSIZE; } LexerTransition nsICODecoder::ReadDirEntry(const char* aData) { @@ -221,7 +221,11 @@ // Move to the resource data to start metadata decoding. mDirEntry = &mUnsizedDirEntries[0]; - size_t offsetToResource = mDirEntry->mImageOffset - FirstResourceOffset(); + // We ignored any dir entries whose offset didn't make sense before this. + MOZ_ASSERT(static_cast(mDirEntry->mImageOffset) >= + FirstResourceOffset()); + size_t offsetToResource = + static_cast(mDirEntry->mImageOffset) - FirstResourceOffset(); return Transition::ToUnbuffered(ICOState::FOUND_RESOURCE, ICOState::SKIP_TO_RESOURCE, offsetToResource); } @@ -316,6 +320,9 @@ mDownscaler.emplace(OutputSize().ToUnknownSize()); } + // We ignored any dir entries whose offset didn't make sense before this. + MOZ_ASSERT(static_cast(mDirEntry->mImageOffset) >= + FirstResourceOffset()); size_t offsetToResource = mDirEntry->mImageOffset - FirstResourceOffset(); return Transition::ToUnbuffered(ICOState::FOUND_RESOURCE, ICOState::SKIP_TO_RESOURCE, offsetToResource); @@ -437,37 +444,67 @@ // Do we have an AND mask on this BMP? If so, we need to read it after we read // the BMP data itself. - uint32_t bmpDataLength = bmpDecoder->GetCompressedImageSize() + 4 * numColors; - bool hasANDMask = (BITMAPINFOSIZE + bmpDataLength) < mDirEntry->mBytesInRes; + auto bmpDataLength = + CheckedInt(bmpDecoder->GetCompressedImageSize()) + + 4 * numColors; + auto fullBmpLength = bmpDataLength + BITMAPINFOSIZE; + if (!bmpDataLength.isValid() || !fullBmpLength.isValid() || + fullBmpLength.value() > mDirEntry->mBytesInRes) { + // Claimed data length inside the bmp resource exceeds dir entry size. + return Transition::TerminateFailure(); + } + bool hasANDMask = fullBmpLength.value() < mDirEntry->mBytesInRes; ICOState afterBMPState = hasANDMask ? ICOState::PREPARE_FOR_MASK : ICOState::FINISHED_RESOURCE; // Read in the rest of the BMP unbuffered. return Transition::ToUnbuffered(afterBMPState, ICOState::READ_RESOURCE, - bmpDataLength); + bmpDataLength.value()); } LexerTransition nsICODecoder::PrepareForMask() { MOZ_ASSERT(mDirEntry); - MOZ_ASSERT(mContainedDecoder->GetDecodeDone()); // We have received all of the data required by the BMP decoder so flushing - // here guarantees the decode has finished. + // here guarantees the decode has finished, if we have a valid file. if (!FlushContainedDecoder()) { return Transition::TerminateFailure(); } - MOZ_ASSERT(mContainedDecoder->GetDecodeDone()); + if (!mContainedDecoder->GetDecodeDone()) { + return Transition::TerminateFailure(); + } RefPtr bmpDecoder = static_cast(mContainedDecoder.get()); + if (!bmpDecoder->GetImageData() || bmpDecoder->GetImageDataLength() == 0) { + return Transition::TerminateFailure(); + } + if (mDownscaler) { + if (mDownscaler->TargetSize().width < 0 || + mDownscaler->TargetSize().height < 0 || + bmpDecoder->GetImageDataLength() != + static_cast(mDownscaler->TargetSize().width * + mDownscaler->TargetSize().height * 4)) { + return Transition::TerminateFailure(); + } + } else { + if (mDirEntry->mSize.width < 0 || mDirEntry->mSize.height < 0 || + bmpDecoder->GetImageDataLength() != + static_cast(mDirEntry->mSize.width * + mDirEntry->mSize.height * 4)) { + return Transition::TerminateFailure(); + } + } + uint16_t numColors = GetNumColors(); MOZ_ASSERT(numColors != uint16_t(-1)); // Determine the length of the AND mask. uint32_t bmpLengthWithHeader = BITMAPINFOSIZE + bmpDecoder->GetCompressedImageSize() + 4 * numColors; + // We can't get here unless this is true. MOZ_ASSERT(bmpLengthWithHeader < mDirEntry->mBytesInRes); uint32_t maskLength = mDirEntry->mBytesInRes - bmpLengthWithHeader; @@ -491,9 +528,6 @@ // produced, so we need to downscale the mask into a temporary buffer and then // combine the mask's alpha values with the color values from the image. if (mDownscaler) { - MOZ_ASSERT(bmpDecoder->GetImageDataLength() == - mDownscaler->TargetSize().width * - mDownscaler->TargetSize().height * sizeof(uint32_t)); mMaskBuffer = MakeUniqueFallible(bmpDecoder->GetImageDataLength()); if (NS_WARN_IF(!mMaskBuffer)) { @@ -616,7 +650,11 @@ return Transition::TerminateFailure(); } - MOZ_ASSERT(mContainedDecoder->GetDecodeDone()); + if (!mContainedDecoder->GetDecodeDone()) { + // We've sent as much data as the dir entry says for this resource, if it's + // not done by now then something is corrupt. + return Transition::TerminateFailure(); + } // If it is a metadata decode, all we were trying to get was the size // information missing from the dir entry. diff -Nru thunderbird-140.9.0esr/image/decoders/nsPNGDecoder.cpp thunderbird-140.10.0esr/image/decoders/nsPNGDecoder.cpp --- thunderbird-140.9.0esr/image/decoders/nsPNGDecoder.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/image/decoders/nsPNGDecoder.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -448,9 +448,6 @@ mInProfile = qcms_profile_create_cicp( primaries, ChooseTransferCharacteristics(tc)); if (mInProfile) { - if (!(color_type & PNG_COLOR_MASK_COLOR)) { - png_set_gray_to_rgb(png_ptr); - } return qcms_profile_get_rendering_intent(mInProfile); } } @@ -477,9 +474,7 @@ mismatch = true; } } else { - if (profileSpace == icSigRgbData) { - png_set_gray_to_rgb(png_ptr); - } else if (profileSpace != icSigGrayData) { + if (profileSpace != icSigRgbData && profileSpace != icSigGrayData) { mismatch = true; } } @@ -498,7 +493,6 @@ *sRGBTag = true; int fileIntent; - png_set_gray_to_rgb(png_ptr); png_get_sRGB(png_ptr, info_ptr, &fileIntent); uint32_t map[] = {QCMS_INTENT_PERCEPTUAL, QCMS_INTENT_RELATIVE_COLORIMETRIC, QCMS_INTENT_SATURATION, @@ -523,10 +517,6 @@ mInProfile = qcms_profile_create_rgb_with_gamma(whitePoint, primaries, 1.0 / gammaOfFile); - - if (mInProfile) { - png_set_gray_to_rgb(png_ptr); - } } return QCMS_INTENT_PERCEPTUAL; // Our default @@ -593,9 +583,9 @@ // We only need to extract the color profile for non-metadata decodes. It is // fairly expensive to read the profile and create the transform so we should // avoid it if not necessary. - uint32_t intent = -1; - bool sRGBTag = false; if (!decoder->IsMetadataDecode()) { + uint32_t intent = -1; + bool sRGBTag = false; if (decoder->mCMSMode != CMSMode::Off) { intent = gfxPlatform::GetRenderingIntent(); uint32_t pIntent = @@ -604,15 +594,74 @@ if (intent == uint32_t(-1)) { intent = pIntent; } + + // png_get_channels won't return accurate info for determining the alpha + // status until after we call png_read_update_info below so we use this + // method of determining if we will have alpha so that we can select the + // correct qcms input type here. + const bool willHaveAlpha = + (color_type & PNG_COLOR_MASK_ALPHA) || num_trans != 0; + + // Determine the qcms transform here, before png_read_update_info commits + // libpng to a specific output format. For gray images the presence or + // absence of a qcms transform determines if we want libpng to output + // gray data (we call qcms to transform it to rgb before passing it to + // the surface pipe), or rgb data (no qcms transform so we need rgb data + // to pass directly into the surface pipe). + if (decoder->mInProfile && decoder->GetCMSOutputProfile()) { + uint32_t profileSpace = + qcms_profile_get_color_space(decoder->mInProfile); + decoder->mUsePipeTransform = profileSpace != icSigGrayData; + + qcms_data_type inType, outType; + if (decoder->mUsePipeTransform) { + // libpng outputs data in RGBA order and we want our final output to + // be BGRA order. SurfacePipe takes care of this for us but + // unfortunately the swizzle to change the order can happen before or + // after color management depending on if we have alpha. If we have + // alpha then the order will be color management then swizzle. If we + // do not have alpha then the order will be swizzle then color + // management. See CreateSurfacePipe + // https://searchfox.org/mozilla-central/rev/7d6651d29c5c1620bc059f879a3e9bbfb53f271f/image/SurfacePipeFactory.h#133-145 + if (willHaveAlpha) { + inType = QCMS_DATA_RGBA_8; + outType = QCMS_DATA_RGBA_8; + } else { + inType = gfxPlatform::GetCMSOSRGBAType(); + outType = inType; + } + } else { + // qcms operates on the data before we hand it to SurfacePipe. + inType = willHaveAlpha ? QCMS_DATA_GRAYA_8 : QCMS_DATA_GRAY_8; + outType = gfxPlatform::GetCMSOSRGBAType(); + } + decoder->mTransform = qcms_transform_create( + decoder->mInProfile, inType, decoder->GetCMSOutputProfile(), + outType, (qcms_intent)intent); + } else if ((sRGBTag && decoder->mCMSMode == CMSMode::TaggedOnly) || + decoder->mCMSMode == CMSMode::All) { + // See comment above about SurfacePipe, color management and ordering. + decoder->mUsePipeTransform = true; + if (willHaveAlpha) { + decoder->mTransform = + decoder->GetCMSsRGBTransform(SurfaceFormat::R8G8B8A8); + } else { + decoder->mTransform = + decoder->GetCMSsRGBTransform(SurfaceFormat::OS_RGBA); + } + } } - const bool hasColorInfo = decoder->mInProfile || sRGBTag; - if (!hasColorInfo || !decoder->GetCMSOutputProfile()) { + + // Expand gray to RGB unless we will pass the data to qcms to handle it via + // a non-pipe transform. + if (!decoder->mTransform || decoder->mUsePipeTransform) { png_set_gray_to_rgb(png_ptr); + } - // only do gamma correction if CMS isn't entirely disabled - if (decoder->mCMSMode != CMSMode::Off) { - PNGDoGammaCorrection(png_ptr, info_ptr); - } + // Only apply libpng gamma correction when there is no qcms transform to + // handle it, and CMS is not entirely disabled. + if (!decoder->mTransform && decoder->mCMSMode != CMSMode::Off) { + PNGDoGammaCorrection(png_ptr, info_ptr); } } @@ -651,7 +700,6 @@ } #endif - auto transparency = decoder->GetTransparencyType(frameRect); if (decoder->IsMetadataDecode()) { // If we are animated then the first frame rect is either: // 1) the whole image if the IDAT chunk is part of the animation @@ -660,61 +708,14 @@ // PostHasTransparency in the metadata decode if we need to. So it's // okay to pass IntRect(0, 0, width, height) here for animated images; // they will call with the proper first frame rect in the full decode. - decoder->PostHasTransparencyIfNeeded(transparency); + decoder->PostHasTransparencyIfNeeded( + decoder->GetTransparencyType(frameRect)); // We have the metadata we're looking for, so stop here, before we allocate // buffers below. return decoder->DoTerminate(png_ptr, TerminalState::SUCCESS); } - if (decoder->mInProfile && decoder->GetCMSOutputProfile()) { - qcms_data_type inType; - qcms_data_type outType; - - uint32_t profileSpace = qcms_profile_get_color_space(decoder->mInProfile); - decoder->mUsePipeTransform = profileSpace != icSigGrayData; - if (decoder->mUsePipeTransform) { - // libpng outputs data in RGBA order and we want our final output to be - // BGRA order. SurfacePipe takes care of this for us but unfortunately the - // swizzle to change the order can happen before or after color management - // depending on if we have alpha. If we have alpha then the order will be - // color management then swizzle. If we do not have alpha then the order - // will be swizzle then color management. See CreateSurfacePipe - // https://searchfox.org/mozilla-central/rev/7d6651d29c5c1620bc059f879a3e9bbfb53f271f/image/SurfacePipeFactory.h#133-145 - if (transparency == TransparencyType::eAlpha) { - inType = QCMS_DATA_RGBA_8; - outType = QCMS_DATA_RGBA_8; - } else { - inType = gfxPlatform::GetCMSOSRGBAType(); - outType = inType; - } - } else { - // qcms operates on the data before we hand it to SurfacePipe. - if (color_type & PNG_COLOR_MASK_ALPHA) { - inType = QCMS_DATA_GRAYA_8; - outType = gfxPlatform::GetCMSOSRGBAType(); - } else { - inType = QCMS_DATA_GRAY_8; - outType = gfxPlatform::GetCMSOSRGBAType(); - } - } - - decoder->mTransform = qcms_transform_create(decoder->mInProfile, inType, - decoder->GetCMSOutputProfile(), - outType, (qcms_intent)intent); - } else if ((sRGBTag && decoder->mCMSMode == CMSMode::TaggedOnly) || - decoder->mCMSMode == CMSMode::All) { - // See comment above about SurfacePipe, color management and ordering. - decoder->mUsePipeTransform = true; - if (transparency == TransparencyType::eAlpha) { - decoder->mTransform = - decoder->GetCMSsRGBTransform(SurfaceFormat::R8G8B8A8); - } else { - decoder->mTransform = - decoder->GetCMSsRGBTransform(SurfaceFormat::OS_RGBA); - } - } - #ifdef PNG_APNG_SUPPORTED if (isAnimated) { png_set_progressive_frame_fn(png_ptr, nsPNGDecoder::frame_info_callback, diff -Nru thunderbird-140.9.0esr/ipc/glue/BackgroundParentImpl.cpp thunderbird-140.10.0esr/ipc/glue/BackgroundParentImpl.cpp --- thunderbird-140.9.0esr/ipc/glue/BackgroundParentImpl.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/ipc/glue/BackgroundParentImpl.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -537,6 +537,12 @@ PSharedWorkerParent* aActor, const mozilla::dom::RemoteWorkerData& aData, const uint64_t& aWindowID, const mozilla::dom::MessagePortIdentifier& aPortIdentifier) { + + if (MOZ_UNLIKELY(aData.serviceWorkerData().type() != + OptionalServiceWorkerData::Tvoid_t)) { + return IPC_FAIL(this, "Invalid worker type for PSharedWorkerParent"); + } + mozilla::dom::SharedWorkerParent* actor = static_cast(aActor); actor->Initialize(aData, aWindowID, aPortIdentifier); @@ -677,6 +683,10 @@ AssertIsInMainProcess(); AssertIsOnBackgroundThread(); + if (!StaticPrefs::dom_udpsocket_enabled() && aFilter.IsEmpty()) { + return IPC_FAIL(this, "udp socket not enabled"); + } + if (aOptionalPrincipal.isSome()) { // Support for checking principals (for non-mtransport use) will be handled // in bug 1167039 diff -Nru thunderbird-140.9.0esr/ipc/glue/UtilityProcessParent.cpp thunderbird-140.10.0esr/ipc/glue/UtilityProcessParent.cpp --- thunderbird-140.9.0esr/ipc/glue/UtilityProcessParent.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/ipc/glue/UtilityProcessParent.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -37,17 +37,20 @@ const bool& aMinimizeMemoryUsage, const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PUtilityProcessParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [self = RefPtr{this}](const uint32_t& aGeneration2) { - if (self->mMemoryReportRequest) { - self->mMemoryReportRequest->Finish(aGeneration2); - self->mMemoryReportRequest = nullptr; - } - }, - [self = RefPtr{this}](mozilla::ipc::ResponseRejectReason) { - self->mMemoryReportRequest = nullptr; - }); + RefPtr self(this); + PUtilityProcessParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [self](uint32_t aGeneration2) { + if (self->mMemoryReportRequest) { + self->mMemoryReportRequest->Finish(aGeneration2); + self->mMemoryReportRequest = nullptr; + } + }, + [self](mozilla::ipc::ResponseRejectReason) { + self->mMemoryReportRequest = nullptr; + }); return true; } diff -Nru thunderbird-140.9.0esr/js/loader/ModuleLoaderBase.cpp thunderbird-140.10.0esr/js/loader/ModuleLoaderBase.cpp --- thunderbird-140.9.0esr/js/loader/ModuleLoaderBase.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/loader/ModuleLoaderBase.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -169,8 +169,14 @@ bool ModuleLoaderBase::ImportMetaResolve(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); - RootedValue modulePrivate( - cx, js::GetFunctionNativeReserved(&args.callee(), ModulePrivateSlot)); + RootedValue moduleValue( + cx, js::GetFunctionNativeReserved( + &args.callee(), + static_cast(ModuleRecordSlot))); + MOZ_ASSERT(!moduleValue.isUndefined()); + RootedObject moduleRecord(cx, &moduleValue.toObject()); + RootedValue modulePrivate(cx, GetModulePrivate(moduleRecord)); + MOZ_ASSERT(!modulePrivate.isUndefined()); // https://html.spec.whatwg.org/#hostgetimportmetaproperties // Step 4.1. Set specifier to ? ToString(specifier). @@ -280,10 +286,15 @@ } // Store the 'active script' of the meta object into the function slot. - // https://html.spec.whatwg.org/#active-script + // See https://html.spec.whatwg.org/#active-script + // + // Note: Hold a reference to the module record which in turn keeps the + // ModuleScript alive when import.resolve is called. RootedObject resolveFuncObj(aCx, JS_GetFunctionObject(resolveFunc)); - js::SetFunctionNativeReserved(resolveFuncObj, ModulePrivateSlot, - aReferencingPrivate); + RootedObject moduleRecord(aCx, script->ModuleRecord()); + js::SetFunctionNativeReserved( + resolveFuncObj, static_cast(ModuleRecordSlot), + JS::ObjectValue(*moduleRecord)); return true; } diff -Nru thunderbird-140.9.0esr/js/loader/ModuleLoaderBase.h thunderbird-140.10.0esr/js/loader/ModuleLoaderBase.h --- thunderbird-140.9.0esr/js/loader/ModuleLoaderBase.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/js/loader/ModuleLoaderBase.h 2026-04-21 14:52:54.000000000 +0000 @@ -557,7 +557,7 @@ bool IsFetchingAndHasWaitingRequest(ModuleLoadRequest* aRequest); // The slot stored in ImportMetaResolve function. - enum { ModulePrivateSlot = 0, SlotCount }; + enum { ModuleRecordSlot = 0, SlotCount }; // The number of args in ImportMetaResolve. static const uint32_t ImportMetaResolveNumArgs = 1; diff -Nru thunderbird-140.9.0esr/js/public/Object.h thunderbird-140.10.0esr/js/public/Object.h --- thunderbird-140.9.0esr/js/public/Object.h 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/js/public/Object.h 2026-04-21 14:52:54.000000000 +0000 @@ -129,6 +129,12 @@ SetReservedSlot(obj, 0, PrivateValue(nsISupportsValue)); } +/** + * Returns true if the native object has own named properties, i.e. user-added + * properties (expandos). Must not be called on proxy objects. + */ +extern JS_PUBLIC_API bool NativeObjectHasOwnProperties(const JSObject* obj); + } // namespace JS // JSObject* is an aligned pointer, but this information isn't available in the diff -Nru thunderbird-140.9.0esr/js/src/builtin/temporal/Instant.cpp thunderbird-140.10.0esr/js/src/builtin/temporal/Instant.cpp --- thunderbird-140.9.0esr/js/src/builtin/temporal/Instant.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/builtin/temporal/Instant.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -235,10 +235,10 @@ if (!result) { return nullptr; } - if (y) { + if (length > 1) { result->setDigit(1, y); } - if (x) { + if (length > 0) { result->setDigit(0, x); } return result; diff -Nru thunderbird-140.9.0esr/js/src/debugger/Debugger.cpp thunderbird-140.10.0esr/js/src/debugger/Debugger.cpp --- thunderbird-140.9.0esr/js/src/debugger/Debugger.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/debugger/Debugger.cpp 2026-04-21 14:52:53.000000000 +0000 @@ -1152,6 +1152,9 @@ if (success && completion.get().suspending()) { Debugger::suspendGeneratorDebuggerFrames(cx, frame); } else { + if (frame.isWasmDebugFrame()) { + DebugEnvironments::onPopWasm(cx, frame); + } Debugger::terminateDebuggerFrames(cx, frame); } }); diff -Nru thunderbird-140.9.0esr/js/src/gc/GC.cpp thunderbird-140.10.0esr/js/src/gc/GC.cpp --- thunderbird-140.9.0esr/js/src/gc/GC.cpp 2026-03-20 19:18:33.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/gc/GC.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -2194,8 +2194,11 @@ break; } - // Check whether something used the chunk while lock was released. - if (!CanDecommitWholeChunk(chunk)) { + // Check whether something used the chunk while the lock was released. The + // chunk may have been taken from the empty chunks pool (e.g. adopted as + // the current chunk, or repurposed as a nursery/buffer chunk), so we must + // verify it is still a member of the pool before removing it. + if (!emptyChunks(lock).contains(chunk) || !CanDecommitWholeChunk(chunk)) { continue; } diff -Nru thunderbird-140.9.0esr/js/src/gc/GCRuntime.h thunderbird-140.10.0esr/js/src/gc/GCRuntime.h --- thunderbird-140.9.0esr/js/src/gc/GCRuntime.h 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/gc/GCRuntime.h 2026-04-21 14:52:54.000000000 +0000 @@ -108,13 +108,15 @@ void sort(); + // Linear time, use with caution. + bool contains(ArenaChunk* chunk) const; + private: ArenaChunk* mergeSort(ArenaChunk* list, size_t count); bool isSorted() const; #ifdef DEBUG public: - bool contains(ArenaChunk* chunk) const; bool verify() const; void verifyChunks() const; #endif diff -Nru thunderbird-140.9.0esr/js/src/gc/Heap.cpp thunderbird-140.10.0esr/js/src/gc/Heap.cpp --- thunderbird-140.9.0esr/js/src/gc/Heap.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/gc/Heap.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -696,10 +696,11 @@ return true; } -#ifdef DEBUG - bool ChunkPool::contains(ArenaChunk* chunk) const { +#ifdef DEBUG verify(); +#endif + for (ArenaChunk* cursor = head_; cursor; cursor = cursor->info.next) { if (cursor == chunk) { return true; @@ -708,6 +709,8 @@ return false; } +#ifdef DEBUG + bool ChunkPool::verify() const { MOZ_ASSERT(bool(head_) == bool(count_)); uint32_t count = 0; diff -Nru thunderbird-140.9.0esr/js/src/jit/MIR-wasm.cpp thunderbird-140.10.0esr/js/src/jit/MIR-wasm.cpp --- thunderbird-140.9.0esr/js/src/jit/MIR-wasm.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jit/MIR-wasm.cpp 2026-04-21 14:52:55.000000000 +0000 @@ -311,6 +311,16 @@ return load->accessType() == accessType() && congruentIfOperandsEqual(load); } +bool MWasmI31RefGet::congruentTo(const MDefinition* ins) const { + if (!ins->isWasmI31RefGet()) { + return false; + } + // Make sure that we have a signed/signed or unsigned/unsigned pair to be + // considered congruent. + return congruentIfOperandsEqual(ins) && + ins->toWasmI31RefGet()->wideningOp() == wideningOp(); +} + MDefinition::AliasType MWasmLoadInstanceDataField::mightAlias( const MDefinition* def) const { if (def->isWasmStoreInstanceDataField()) { diff -Nru thunderbird-140.9.0esr/js/src/jit/MIR.cpp thunderbird-140.10.0esr/js/src/jit/MIR.cpp --- thunderbird-140.9.0esr/js/src/jit/MIR.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jit/MIR.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -6549,6 +6549,34 @@ return MConstant::NewIntPtr(alloc, intptr_t(ival)); } +AliasSet MLoadScriptedProxyHandler::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNativeObject::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNotProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardIsNotDOMProxy::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MGuardHasProxyHandler::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + +AliasSet MIsConstructor::getAliasSet() const { + return AliasSet::Load(AliasSet::ObjectFields); +} + MDefinition* MIsObject::foldsTo(TempAllocator& alloc) { MDefinition* input = object(); if (!input->isBox()) { diff -Nru thunderbird-140.9.0esr/js/src/jit/MIR.h thunderbird-140.10.0esr/js/src/jit/MIR.h --- thunderbird-140.9.0esr/js/src/jit/MIR.h 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jit/MIR.h 2026-04-21 14:52:54.000000000 +0000 @@ -9051,7 +9051,9 @@ } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } }; class MHasClass : public MUnaryInstruction, public SingleObjectPolicy::Data { @@ -9072,7 +9074,9 @@ const JSClass* getClass() const { return class_; } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } bool congruentTo(const MDefinition* ins) const override { if (!ins->isHasClass()) { return false; @@ -9112,7 +9116,9 @@ } MDefinition* foldsTo(TempAllocator& alloc) override; - AliasSet getAliasSet() const override { return AliasSet::None(); } + AliasSet getAliasSet() const override { + return AliasSet::Load(AliasSet::ObjectFields); + } bool congruentTo(const MDefinition* ins) const override { if (!ins->isGuardToClass()) { return false; diff -Nru thunderbird-140.9.0esr/js/src/jit/MIROps.yaml thunderbird-140.10.0esr/js/src/jit/MIROps.yaml --- thunderbird-140.9.0esr/js/src/jit/MIROps.yaml 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jit/MIROps.yaml 2026-04-21 14:52:54.000000000 +0000 @@ -668,7 +668,7 @@ result_type: Object guard: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom generate_lir: true #ifdef JS_PUNBOX64 @@ -825,7 +825,7 @@ wideningOp: wasm::FieldWideningOp type_policy: none result_type: Int32 - congruent_to: if_operands_equal + congruent_to: custom alias_set: none generate_lir: true @@ -2161,7 +2161,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardGlobalGeneration arguments: @@ -2180,7 +2180,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardIsNotDOMProxy operands: @@ -2189,7 +2189,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom - name: GuardIsNotProxy operands: @@ -2199,7 +2199,7 @@ movable: true congruent_to: if_operands_equal folds_to: custom - alias_set: none + alias_set: custom - name: ProxyGet operands: @@ -2401,7 +2401,7 @@ guard: true movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom # Loads a specific JSObject* that was originally nursery-allocated. # See also WarpObjectField. @@ -2965,7 +2965,7 @@ result_type: Boolean movable: true congruent_to: if_operands_equal - alias_set: none + alias_set: custom generate_lir: true - name: IsCrossRealmArrayConstructor diff -Nru thunderbird-140.9.0esr/js/src/jit/ScalarReplacement.cpp thunderbird-140.10.0esr/js/src/jit/ScalarReplacement.cpp --- thunderbird-140.9.0esr/js/src/jit/ScalarReplacement.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jit/ScalarReplacement.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -3044,11 +3044,7 @@ bool mergeIntoSuccessorState(MBasicBlock* curr, MBasicBlock* succ, BlockState** pSuccState); -#ifdef DEBUG void assertSuccess(); -#else - void assertSuccess() {} -#endif bool oom() const { return oom_; } @@ -3065,15 +3061,13 @@ state_ = state; } -#ifdef DEBUG void WasmStructMemoryView::assertSuccess() { // Make sure that the undefined value used as a placeholder is not used. - MOZ_ASSERT(!undefinedVal_->hasUses()); + MOZ_RELEASE_ASSERT(!undefinedVal_->hasUses()); // Make sure that the MWasmNewStruct instruction is not used anymore. - MOZ_ASSERT(!struct_->hasUses()); + MOZ_RELEASE_ASSERT(!struct_->hasUses()); } -#endif MBasicBlock* WasmStructMemoryView::startingBlock() { return startBlock_; } @@ -3323,7 +3317,7 @@ } case MDefinition::Opcode::WasmStoreFieldRef: { // Escaped if it's stored into another struct. - if (def->toWasmStoreFieldRef()->value() == newStruct) { + if (def->toWasmStoreFieldRef()->value() == ins) { JitSpewDef(JitSpew_Escape, "is escaped by\n", def); return true; } diff -Nru thunderbird-140.9.0esr/js/src/jsfriendapi.cpp thunderbird-140.10.0esr/js/src/jsfriendapi.cpp --- thunderbird-140.9.0esr/js/src/jsfriendapi.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/jsfriendapi.cpp 2026-04-21 14:52:55.000000000 +0000 @@ -479,6 +479,10 @@ } } +bool JS::NativeObjectHasOwnProperties(const JSObject* obj) { + return !obj->as().empty(); +} + void js::SetPreserveWrapperCallbacks( JSContext* cx, PreserveWrapperCallback preserveWrapper, HasReleasedWrapperCallback hasReleasedWrapper) { diff -Nru thunderbird-140.9.0esr/js/src/proxy/Proxy.cpp thunderbird-140.10.0esr/js/src/proxy/Proxy.cpp --- thunderbird-140.9.0esr/js/src/proxy/Proxy.cpp 2026-03-20 19:18:34.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/proxy/Proxy.cpp 2026-04-21 14:52:54.000000000 +0000 @@ -425,7 +425,9 @@ if (!ToPropertyKey(cx, idVal, &id)) { return false; } - + if (MOZ_UNLIKELY(!proxy->is())) { + return HasProperty(cx, proxy, id, result); + } return Proxy::has(cx, proxy, id, result); } @@ -466,7 +468,9 @@ if (!ToPropertyKey(cx, idVal, &id)) { return false; } - + if (MOZ_UNLIKELY(!proxy->is())) { + return HasOwnProperty(cx, proxy, id, result); + } return Proxy::hasOwn(cx, proxy, id, result); } @@ -548,6 +552,9 @@ } RootedValue receiver(cx, ObjectValue(*proxy)); + if (MOZ_UNLIKELY(!proxy->is())) { + return GetProperty(cx, proxy, receiver, id, vp); + } return Proxy::getInternal(cx, proxy, receiver, id, vp); } @@ -621,7 +628,11 @@ ObjectOpResult result; RootedValue receiver(cx, ObjectValue(*proxy)); - if (!Proxy::setInternal(cx, proxy, id, val, receiver, result)) { + if (MOZ_UNLIKELY(!proxy->is())) { + if (!SetProperty(cx, proxy, id, val, receiver, result)) { + return false; + } + } else if (!Proxy::setInternal(cx, proxy, id, val, receiver, result)) { return false; } return result.checkStrictModeError(cx, proxy, id, strict); diff -Nru thunderbird-140.9.0esr/js/src/vm/ArgumentsObject.cpp thunderbird-140.10.0esr/js/src/vm/ArgumentsObject.cpp --- thunderbird-140.9.0esr/js/src/vm/ArgumentsObject.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/ArgumentsObject.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -864,6 +864,12 @@ } } + // Ensure the arguments object has RareArgumentsData so that step 8 is + // infallible. + if (isMapped && !argsobj->getOrCreateRareData(cx)) { + return false; + } + // Step 6. NativeDefineProperty will lookup [[Value]] for us. if (defineMapped) { if (!DefineMappedIndex(cx, argsobj, id, &newArgDesc, result)) { @@ -884,17 +890,15 @@ if (isMapped) { unsigned arg = unsigned(id.toInt()); if (desc.isAccessorDescriptor()) { - if (!argsobj->markElementDeleted(cx, arg)) { - return false; - } + bool ok = argsobj->markElementDeleted(cx, arg); + MOZ_RELEASE_ASSERT(ok, "shouldn't fail after getOrCreateRareData"); } else { if (desc.hasValue()) { argsobj->setElement(arg, desc.value()); } if (desc.hasWritable() && !desc.writable()) { - if (!argsobj->markElementDeleted(cx, arg)) { - return false; - } + bool ok = argsobj->markElementDeleted(cx, arg); + MOZ_RELEASE_ASSERT(ok, "shouldn't fail after getOrCreateRareData"); } } } @@ -940,7 +944,7 @@ if (id.isInt()) { unsigned arg = unsigned(id.toInt()); - if (arg < argsobj->initialLength()) { + if (argsobj->isElement(arg)) { argsobj->setElement(arg, v); return result.succeed(); } diff -Nru thunderbird-140.9.0esr/js/src/vm/AsyncFunction.cpp thunderbird-140.10.0esr/js/src/vm/AsyncFunction.cpp --- thunderbird-140.9.0esr/js/src/vm/AsyncFunction.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/AsyncFunction.cpp 2026-04-21 14:52:56.000000000 +0000 @@ -316,9 +316,8 @@ cx, &func.getExtendedSlot(FunctionExtended::MODULE_SLOT) .toObject() .as()); - AsyncModuleExecutionRejected(cx, module, args.get(0)); args.rval().setUndefined(); - return true; + return AsyncModuleExecutionRejected(cx, module, args.get(0)); } AsyncFunctionGeneratorObject* AsyncFunctionGeneratorObject::create( diff -Nru thunderbird-140.9.0esr/js/src/vm/CharacterEncoding.cpp thunderbird-140.10.0esr/js/src/vm/CharacterEncoding.cpp --- thunderbird-140.9.0esr/js/src/vm/CharacterEncoding.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/CharacterEncoding.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -536,21 +536,14 @@ template bool UTF8EqualsChars(const JS::UTF8Chars& utfChars, const CharT* chars) { + static_assert(std::is_same_v || + std::is_same_v); + size_t ind = 0; bool isEqual = true; auto checkEqual = [&isEqual, &ind, chars](char16_t c) -> LoopDisposition { -#ifdef DEBUG - JS::SmallestEncoding encoding = JS::SmallestEncoding::ASCII; - UpdateSmallestEncodingForChar(c, &encoding); - if (std::is_same_v) { - MOZ_ASSERT(encoding <= JS::SmallestEncoding::Latin1); - } else if (!std::is_same_v) { - MOZ_CRASH("Invalid character type in UTF8EqualsChars"); - } -#endif - - if (CharT(c) != chars[ind]) { + if (c != char16_t(chars[ind])) { isEqual = false; return LoopDisposition::Break; } @@ -559,7 +552,7 @@ return LoopDisposition::Continue; }; - // To get here, you must have checked your work. + // The caller must have already validated UTF-8 well-formedness. InflateUTF8ToUTF16(/* cx = */ nullptr, utfChars, checkEqual); diff -Nru thunderbird-140.9.0esr/js/src/vm/EnvironmentObject.cpp thunderbird-140.10.0esr/js/src/vm/EnvironmentObject.cpp --- thunderbird-140.9.0esr/js/src/vm/EnvironmentObject.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/EnvironmentObject.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -3081,6 +3081,30 @@ onPopGeneric(cx, ei); } +void DebugEnvironments::onPopWasm(JSContext* cx, AbstractFramePtr frame) { + MOZ_ASSERT(frame.isWasmDebugFrame()); + + DebugEnvironments* envs = cx->realm()->debugEnvs(); + if (!envs) { + return; + } + + Rooted instance(cx, frame.wasmInstance()->object()); + uint32_t funcIndex = frame.asWasmDebugFrame()->funcIndex(); + Rooted wasmFunctionScope( + cx, instance->getExistingFunctionScope(funcIndex)); + if (!wasmFunctionScope) { + return; + } + + MissingEnvironmentKey key(frame, wasmFunctionScope); + if (MissingEnvironmentMap::Ptr p = envs->missingEnvs.lookup(key)) { + EnvironmentObject& env = p->value()->environment(); + envs->liveEnvs.remove(&env); + envs->missingEnvs.remove(p); + } +} + void DebugEnvironments::onRealmUnsetIsDebuggee(Realm* realm) { if (DebugEnvironments* envs = realm->debugEnvs()) { envs->proxiedEnvs.clear(); diff -Nru thunderbird-140.9.0esr/js/src/vm/EnvironmentObject.h thunderbird-140.10.0esr/js/src/vm/EnvironmentObject.h --- thunderbird-140.9.0esr/js/src/vm/EnvironmentObject.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/EnvironmentObject.h 2026-04-21 14:52:57.000000000 +0000 @@ -1518,6 +1518,7 @@ const jsbytecode* pc); static void onPopWith(AbstractFramePtr frame); static void onPopModule(JSContext* cx, const EnvironmentIter& ei); + static void onPopWasm(JSContext* cx, AbstractFramePtr frame); static void onRealmUnsetIsDebuggee(Realm* realm); }; diff -Nru thunderbird-140.9.0esr/js/src/vm/MatchPairs.h thunderbird-140.10.0esr/js/src/vm/MatchPairs.h --- thunderbird-140.9.0esr/js/src/vm/MatchPairs.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/MatchPairs.h 2026-04-21 14:52:57.000000000 +0000 @@ -72,7 +72,10 @@ friend class RegExpShared; friend class RegExpStatics; - void forgetArray() { pairs_ = nullptr; } + void forgetArray() { + pairs_ = nullptr; + pairCount_ = 0; + } public: void checkAgainst(size_t inputLength) { diff -Nru thunderbird-140.9.0esr/js/src/vm/Modules.cpp thunderbird-140.10.0esr/js/src/vm/Modules.cpp --- thunderbird-140.9.0esr/js/src/vm/Modules.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/Modules.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -1973,7 +1973,9 @@ std::ignore = cx->getPendingException(&exception); } cx->clearPendingException(); - AsyncModuleExecutionRejected(cx, module, exception); + if (!AsyncModuleExecutionRejected(cx, module, exception)) { + MOZ_ASSERT(cx->isThrowingOverRecursed()); + } } // https://tc39.es/ecma262/#sec-async-module-execution-fulfilled @@ -2112,25 +2114,30 @@ // https://tc39.es/ecma262/#sec-async-module-execution-rejected // ES2023 16.2.1.5.2.5 AsyncModuleExecutionRejected -void js::AsyncModuleExecutionRejected(JSContext* cx, +bool js::AsyncModuleExecutionRejected(JSContext* cx, Handle module, HandleValue error) { + AutoCheckRecursionLimit recursion(cx); + if (!recursion.check(cx)) { + return false; + } + // Step 1. If module.[[Status]] is evaluated, then: if (module->status() == ModuleStatus::Evaluated) { // Step 1.a. Assert: module.[[EvaluationError]] is not empty MOZ_ASSERT(module->hadEvaluationError()); // Step 1.b. Return unused. - return; + return true; } // Step 2. Assert: module.[[Status]] is evaluating-async. MOZ_ASSERT(module->status() == ModuleStatus::EvaluatingAsync); - // Step 3. Assert: module.[[AsyncEvaluation]] is true. + // Step 3. Assert: module.[[AsyncEvaluationOrder]] is an integer. MOZ_ASSERT(module->isAsyncEvaluating()); - // Step 4. 4. Assert: module.[[EvaluationError]] is empty. + // Step 4. Assert: module.[[EvaluationError]] is empty. MOZ_ASSERT(!module->hadEvaluationError()); ModuleObject::onTopLevelEvaluationFinished(module); @@ -2141,25 +2148,15 @@ // Step 6. Set module.[[Status]] to evaluated. MOZ_ASSERT(module->status() == ModuleStatus::Evaluated); + // Step 7. Set module.[[AsyncEvaluationOrder]] to done. module->clearAsyncEvaluatingPostOrder(); - // Step 7. For each Cyclic Module Record m of module.[[AsyncParentModules]], - // do: - Rooted parents(cx, module->asyncParentModules()); - Rooted parent(cx); - for (uint32_t i = 0; i < parents->length(); i++) { - parent = &parents->get(i).toObject().as(); - - // Step 7.a. Perform AsyncModuleExecutionRejected(m, error). - AsyncModuleExecutionRejected(cx, parent, error); - } - - // Step 8. If module.[[TopLevelCapability]] is not empty, then: + // Step 9. If module.[[TopLevelCapability]] is not empty, then: if (module->hasTopLevelCapability()) { - // Step 8.a. Assert: module.[[CycleRoot]] is module. + // Step 9.a. Assert: module.[[CycleRoot]] is module. MOZ_ASSERT(module->getCycleRoot() == module); - // Step 8.b. Perform ! Call(module.[[TopLevelCapability]].[[Reject]], + // Step 9.b. Perform ! Call(module.[[TopLevelCapability]].[[Reject]], // undefined, error). if (!ModuleObject::topLevelCapabilityReject(cx, module, error)) { // If Reject fails, there's nothing more we can do here. @@ -2167,5 +2164,19 @@ } } - // Step 9. Return unused. + // Step 10. For each Cyclic Module Record m of module.[[AsyncParentModules]], + // do: + Rooted parents(cx, module->asyncParentModules()); + Rooted parent(cx); + for (uint32_t i = 0; i < parents->length(); i++) { + parent = &parents->get(i).toObject().as(); + + // Step 10.a. Perform AsyncModuleExecutionRejected(m, error). + if (!AsyncModuleExecutionRejected(cx, parent, error)) { + return false; + } + } + + // Step 11. Return unused. + return true; } diff -Nru thunderbird-140.9.0esr/js/src/vm/Modules.h thunderbird-140.10.0esr/js/src/vm/Modules.h --- thunderbird-140.9.0esr/js/src/vm/Modules.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/Modules.h 2026-04-21 14:52:57.000000000 +0000 @@ -49,7 +49,9 @@ void AsyncModuleExecutionFulfilled(JSContext* cx, Handle module); -void AsyncModuleExecutionRejected(JSContext* cx, Handle module, +// This function recusively calls AsyncModuleExecutionRejected on async parent +// modules. It returns false if the stack recusion limit is exceeded. +bool AsyncModuleExecutionRejected(JSContext* cx, Handle module, HandleValue error); } // namespace js diff -Nru thunderbird-140.9.0esr/js/src/vm/RegExpStatics.h thunderbird-140.10.0esr/js/src/vm/RegExpStatics.h --- thunderbird-140.9.0esr/js/src/vm/RegExpStatics.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/RegExpStatics.h 2026-04-21 14:52:57.000000000 +0000 @@ -248,6 +248,7 @@ if (!matches.initArrayFrom(newPairs)) { ReportOutOfMemory(cx); + clear(); return false; } diff -Nru thunderbird-140.9.0esr/js/src/vm/StructuredClone.cpp thunderbird-140.10.0esr/js/src/vm/StructuredClone.cpp --- thunderbird-140.9.0esr/js/src/vm/StructuredClone.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/vm/StructuredClone.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -1582,6 +1582,7 @@ Rooted memoryObj(context(), &obj->unwrapAs()); + JSAutoRealm ar(context(), memoryObj); Rooted sab( context(), &memoryObj->buffer().as()); @@ -2989,6 +2990,12 @@ if (!startRead(&isHuge)) { return false; } + if (!isHuge.isBoolean()) { + JS_ReportErrorNumberASCII(context(), GetErrorMessage, nullptr, + JSMSG_SC_BAD_SERIALIZED_DATA, + "isHuge must be a boolean"); + return false; + } // Read the SharedArrayBuffer object. RootedValue payload(cx); @@ -3807,7 +3814,13 @@ if (!startRead(&val)) { return nullptr; } - bool hasCause = ToBoolean(val); + if (!val.isBoolean()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_SC_BAD_SERIALIZED_DATA, + "hasCause must be a boolean"); + return nullptr; + } + bool hasCause = val.toBoolean(); Rooted> cause(cx, mozilla::Nothing()); if (hasCause) { cause = mozilla::Some(BooleanValue(true)); @@ -3873,6 +3886,12 @@ } if (errorObj->type() == JSEXN_AGGREGATEERR) { + if (!errors.isObject() || !errors.toObject().is()) { + JS_ReportErrorNumberASCII( + cx, GetErrorMessage, nullptr, JSMSG_SC_BAD_SERIALIZED_DATA, + "AggregateError 'errors' field must be an Array"); + return false; + } if (!DefineDataProperty(context(), errorObj, cx->names().errors, errors, 0)) { return false; diff -Nru thunderbird-140.9.0esr/js/src/wasm/WasmInstance.cpp thunderbird-140.10.0esr/js/src/wasm/WasmInstance.cpp --- thunderbird-140.9.0esr/js/src/wasm/WasmInstance.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/wasm/WasmInstance.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -393,18 +393,18 @@ PtrT byteOffset, ValT value, int64_t timeout_ns) { JSContext* cx = instance->cx(); - if (!instance->memory(memoryIndex)->isShared()) { - ReportTrapError(cx, JSMSG_WASM_NONSHARED_WAIT); + if (byteOffset & (sizeof(ValT) - 1)) { + ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); return -1; } - if (byteOffset & (sizeof(ValT) - 1)) { - ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); + if (!instance->memory(memoryIndex)->isShared()) { + ReportTrapError(cx, JSMSG_WASM_NONSHARED_WAIT); return -1; } - if (byteOffset + sizeof(ValT) > - instance->memory(memoryIndex)->volatileMemoryLength()) { + size_t memSizeBytes = instance->memory(memoryIndex)->volatileMemoryLength(); + if (memSizeBytes < sizeof(ValT) || byteOffset > memSizeBytes - sizeof(ValT)) { ReportTrapError(cx, JSMSG_WASM_OUT_OF_BOUNDS); return -1; } @@ -468,16 +468,14 @@ uint32_t memoryIndex) { JSContext* cx = instance->cx(); - // The alignment guard is not in the wasm spec as of 2017-11-02, but is - // considered likely to appear, as 4-byte alignment is required for WAKE by - // the spec's validation algorithm. - if (byteOffset & 3) { ReportTrapError(cx, JSMSG_WASM_UNALIGNED_ACCESS); return -1; } - if (byteOffset >= instance->memory(memoryIndex)->volatileMemoryLength()) { + size_t memSizeBytes = instance->memory(memoryIndex)->volatileMemoryLength(); + if (memSizeBytes < sizeof(int32_t) || + byteOffset > memSizeBytes - sizeof(int32_t)) { ReportTrapError(cx, JSMSG_WASM_OUT_OF_BOUNDS); return -1; } diff -Nru thunderbird-140.9.0esr/js/src/wasm/WasmJS.cpp thunderbird-140.10.0esr/js/src/wasm/WasmJS.cpp --- thunderbird-140.9.0esr/js/src/wasm/WasmJS.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/wasm/WasmJS.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -2009,6 +2009,15 @@ return getReservedSlot(EXPORTS_OBJ_SLOT).toObject(); } +WasmFunctionScope* WasmInstanceObject::getExistingFunctionScope( + uint32_t funcIndex) const { + if (auto p = scopes().asWasmFunctionScopeMap().lookup(funcIndex)) { + return p->value(); + } + + return nullptr; +} + WasmInstanceObject::UnspecifiedScopeMap& WasmInstanceObject::scopes() const { return *(UnspecifiedScopeMap*)(getReservedSlot(SCOPES_SLOT).toPrivate()); } diff -Nru thunderbird-140.9.0esr/js/src/wasm/WasmJS.h thunderbird-140.10.0esr/js/src/wasm/WasmJS.h --- thunderbird-140.9.0esr/js/src/wasm/WasmJS.h 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/src/wasm/WasmJS.h 2026-04-21 14:52:57.000000000 +0000 @@ -223,6 +223,7 @@ wasm::Instance& instance() const; JSObject& exportsObj() const; + WasmFunctionScope* getExistingFunctionScope(uint32_t funcIndex) const; [[nodiscard]] static bool getExportedFunction( JSContext* cx, Handle instanceObj, diff -Nru thunderbird-140.9.0esr/js/xpconnect/src/ExportHelpers.cpp thunderbird-140.10.0esr/js/xpconnect/src/ExportHelpers.cpp --- thunderbird-140.9.0esr/js/xpconnect/src/ExportHelpers.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/xpconnect/src/ExportHelpers.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -402,7 +402,7 @@ FunctionForwarderOptions& options, MutableHandleValue vp) { RootedId id(cx, idArg); - if (id.isVoid()) { + if (!id.isString()) { id = GetJSIDByIndex(cx, XPCJSContext::IDX_EMPTYSTRING); } @@ -501,7 +501,7 @@ } } if (!funName) { - funName = JS_AtomizeAndPinString(cx, ""); + funName = JS_GetEmptyString(cx); } JS_MarkCrossZoneIdValue(cx, StringValue(funName)); @@ -511,7 +511,11 @@ } else { JS_MarkCrossZoneId(cx, id); } - MOZ_ASSERT(id.isString()); + + if (!id.isString()) { + JS_ReportErrorASCII(cx, "defineAs must be a string"); + return false; + } // The function forwarder will live in the target compartment. Since // this function will be referenced from its private slot, to avoid a diff -Nru thunderbird-140.9.0esr/js/xpconnect/src/XPCJSRuntime.cpp thunderbird-140.10.0esr/js/xpconnect/src/XPCJSRuntime.cpp --- thunderbird-140.9.0esr/js/xpconnect/src/XPCJSRuntime.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/js/xpconnect/src/XPCJSRuntime.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -956,6 +956,8 @@ self->mWrappedJSMap->UpdateWeakPointersAfterGC(trc); self->mUAWidgetScopeMap.traceWeak(trc); + + BrowsingContext::SweepWindowProxies(trc); } /* static */ diff -Nru thunderbird-140.9.0esr/layout/base/PresShell.cpp thunderbird-140.10.0esr/layout/base/PresShell.cpp --- thunderbird-140.9.0esr/layout/base/PresShell.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/base/PresShell.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -5167,6 +5167,9 @@ // XXX deal with frame being null due to display:contents for (; frame; frame = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(frame)) { + if (frame->HasAnyStateBits(NS_FRAME_IS_NONDISPLAY)) { + continue; + } info->mBuilder.SetVisibleRect(frame->InkOverflowRect()); info->mBuilder.SetDirtyRect(frame->InkOverflowRect()); frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList); @@ -7864,17 +7867,13 @@ switch (aGUIEvent->mMessage) { case eMouseDown: - case eMouseUp: { - RefPtr presContext = mPresShell->GetPresContext(); - if (NS_WARN_IF(!presContext)) { + case eMouseUp: // XXX How about eContextMenu? + { + if (NS_WARN_IF(!mPresShell->GetPresContext())) { return false; } - uint64_t framesConstructedCount = presContext->FramesConstructedCount(); - uint64_t framesReflowedCount = presContext->FramesReflowedCount(); - MOZ_KnownLive(mPresShell)->FlushPendingNotifications(FlushType::Layout); - return framesConstructedCount != presContext->FramesConstructedCount() || - framesReflowedCount != presContext->FramesReflowedCount(); + return true; } default: return false; @@ -7944,18 +7943,19 @@ // If target is in a child document, we've not flushed its layout yet. PresShell* childPresShell = targetFrame->PresShell(); EventHandler childEventHandler(*childPresShell); - bool layoutChanged = + const AutoWeakFrame targetFrameWeak(targetFrame); + const DebugOnly flushedPendingNotifications = childEventHandler.MaybeFlushPendingNotifications(aGUIEvent); if (!aWeakRootFrameToHandleEvent.IsAlive()) { // Stop handling the event if the root frame to handle event is destroyed // by the reflow. (but why?) return nullptr; } - if (!layoutChanged) { - // If the layout in the child PresShell hasn't been changed, we don't - // need to recompute the target. + if (targetFrameWeak.IsAlive()) { + // If the target frame is alive, we don't need to recompute the target. return targetFrame; } + MOZ_ASSERT(flushedPendingNotifications); // Finally, we need to recompute the target with the latest layout. targetFrame = diff -Nru thunderbird-140.9.0esr/layout/base/PresShell.h thunderbird-140.10.0esr/layout/base/PresShell.h --- thunderbird-140.9.0esr/layout/base/PresShell.h 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/base/PresShell.h 2026-04-21 14:52:57.000000000 +0000 @@ -2331,11 +2331,10 @@ * * @param aGUIEvent The handling event. * @return true if this actually flushes pending - * layout and that has caused changing the * layout. */ - MOZ_CAN_RUN_SCRIPT - bool MaybeFlushPendingNotifications(WidgetGUIEvent* aGUIEvent); + MOZ_CAN_RUN_SCRIPT bool MaybeFlushPendingNotifications( + WidgetGUIEvent* aGUIEvent); /** * GetFrameToHandleNonTouchEvent() returns a frame to handle the event. diff -Nru thunderbird-140.9.0esr/layout/base/tests/mochitest.toml thunderbird-140.10.0esr/layout/base/tests/mochitest.toml --- thunderbird-140.9.0esr/layout/base/tests/mochitest.toml 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/base/tests/mochitest.toml 2026-04-21 14:52:57.000000000 +0000 @@ -273,8 +273,6 @@ "file_getBoxQuads_convertPointRectQuad_frame2.html", ] -["test_getClientRects_emptytext.html"] - ["test_interactive_widget.html"] run-if = ["os == 'android'"] diff -Nru thunderbird-140.9.0esr/layout/base/tests/test_getClientRects_emptytext.html thunderbird-140.10.0esr/layout/base/tests/test_getClientRects_emptytext.html --- thunderbird-140.9.0esr/layout/base/tests/test_getClientRects_emptytext.html 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/base/tests/test_getClientRects_emptytext.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - -

- -
- - - diff -Nru thunderbird-140.9.0esr/layout/forms/nsRangeFrame.cpp thunderbird-140.10.0esr/layout/forms/nsRangeFrame.cpp --- thunderbird-140.9.0esr/layout/forms/nsRangeFrame.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/forms/nsRangeFrame.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -429,13 +429,9 @@ } auto min = input.GetMinimum(); auto max = input.GetMaximum(); - auto* options = list->Options(); - nsAutoString label; - for (uint32_t i = 0; i < options->Length(); ++i) { - auto* item = options->Item(i); - auto* option = HTMLOptionElement::FromNode(item); - MOZ_ASSERT(option); - if (option->Disabled()) { + for (nsINode* n = list->GetFirstChild(); n; n = n->GetNextNode(list)) { + auto* option = HTMLOptionElement::FromNode(n); + if (!option || option->Disabled()) { continue; } nsAutoString str; diff -Nru thunderbird-140.9.0esr/layout/forms/nsTextControlFrame.cpp thunderbird-140.10.0esr/layout/forms/nsTextControlFrame.cpp --- thunderbird-140.9.0esr/layout/forms/nsTextControlFrame.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/forms/nsTextControlFrame.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -754,7 +754,7 @@ return; } - mozilla::PresShell* presShell = PresShell(); + RefPtr presShell = PresShell(); RefPtr caret = presShell->GetCaret(); if (!caret) { return; @@ -776,6 +776,9 @@ if (!docSel->IsCollapsed()) { docSel->RemoveAllRanges(IgnoreErrors()); } + if (presShell->IsDestroying()) { + return; + } // If the focus moved to a text control during text selection by pointer // device, stop extending the selection. diff -Nru thunderbird-140.9.0esr/layout/generic/ScrollContainerFrame.cpp thunderbird-140.10.0esr/layout/generic/ScrollContainerFrame.cpp --- thunderbird-140.9.0esr/layout/generic/ScrollContainerFrame.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/generic/ScrollContainerFrame.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -2457,9 +2457,12 @@ if (aParams.IsInstant()) { // Asynchronous scrolling is not allowed, so we'll kill any existing // async-scrolling process and do an instant scroll. + AutoWeakFrame weakFrame(this); CompleteAsyncScroll(GetScrollPosition(), range, std::move(snapTargetIds), aParams.mOrigin); - mApzSmoothScrollDestination = Nothing(); + if (weakFrame.IsAlive()) { + mApzSmoothScrollDestination = Nothing(); + } return; } diff -Nru thunderbird-140.9.0esr/layout/generic/ScrollbarActivity.cpp thunderbird-140.10.0esr/layout/generic/ScrollbarActivity.cpp --- thunderbird-140.9.0esr/layout/generic/ScrollbarActivity.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/generic/ScrollbarActivity.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -37,6 +37,7 @@ } void ScrollbarActivity::ActivityOccurred() { + nsAutoScriptBlocker scriptBlocker; ActivityStarted(); ActivityStopped(); } diff -Nru thunderbird-140.9.0esr/layout/generic/nsFrameSelection.cpp thunderbird-140.10.0esr/layout/generic/nsFrameSelection.cpp --- thunderbird-140.9.0esr/layout/generic/nsFrameSelection.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/generic/nsFrameSelection.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -1487,7 +1487,7 @@ } case FocusMode::kExtendSelection: { // Now update the range list: - nsINode* inclusiveTableCellAncestor = + nsCOMPtr inclusiveTableCellAncestor = GetClosestInclusiveTableCellAncestor(&aNewFocus); if (mTableSelection.mClosestInclusiveTableCellAncestor && inclusiveTableCellAncestor && @@ -1641,8 +1641,7 @@ } } -void nsFrameSelection::RepaintHighlightSelection( - nsAtom* aHighlightName) { +void nsFrameSelection::RepaintHighlightSelection(nsAtom* aHighlightName) { if (auto iter = std::find_if(mHighlightSelections.begin(), mHighlightSelections.end(), [&aHighlightName](auto const& aElm) { @@ -1817,76 +1816,84 @@ SelectionIntoView aSelectionIntoView) { MOZ_ASSERT(aFrame); - // expected behavior for PageMove is to scroll AND move the caret - // and remain relative position of the caret in view. see Bug 4302. - - // Get the scroll container frame. If aFrame is not scrollable, this is - // nullptr. - ScrollContainerFrame* scrollContainerFrame = aFrame->GetScrollTargetFrame(); - // Get the scrolled frame. If aFrame is not scrollable, this is aFrame - // itself. - nsIFrame* scrolledFrame = - scrollContainerFrame ? scrollContainerFrame->GetScrolledFrame() : aFrame; - if (!scrolledFrame) { + if (MOZ_UNLIKELY(!IsAvailable())) { return NS_OK; } + // expected behavior for PageMove is to scroll AND move the caret + // and remain relative position of the caret in view. see Bug 4302. + // find out where the caret is. // we should know mDesiredCaretPos.mValue value of nsFrameSelection, but I - // havent seen that behavior in other windows applications yet. - RefPtr selection = &NormalSelection(); - if (!selection) { - return NS_OK; - } + // haven't seen that behavior in other windows applications yet. + MOZ_DIAGNOSTIC_ASSERT(GetSelection(mozilla::SelectionType::eNormal)); + const OwningNonNull selection = NormalSelection(); - nsRect caretPos; - nsIFrame* caretFrame = nsCaret::GetGeometry(selection, &caretPos); - if (!caretFrame) { - return NS_OK; - } + // Get the scroll container frame. If aFrame is not scrollable, this is + // nullptr. + ScrollContainerFrame* scrollContainerFrame = aFrame->GetScrollTargetFrame(); + const AutoWeakFrame scrollContainerFrameWeak(scrollContainerFrame); - // If the scrolled frame is outside of current selection limiter, - // we need to scroll the frame but keep moving selection in the limiter. - nsIFrame* frameToClick = scrolledFrame; - if (!NodeIsInLimiters(scrolledFrame->GetContent())) { - frameToClick = GetFrameToPageSelect(); - if (NS_WARN_IF(!frameToClick)) { - return NS_OK; + bool scrolledFrameIsInLimiter = true; + const auto offsets = [&]() + MOZ_NEVER_INLINE_DEBUG -> nsIFrame::ContentOffsets { + // Get the scrolled frame. If aFrame is not scrollable, this is aFrame + // itself. + nsIFrame* scrolledFrame = scrollContainerFrame + ? scrollContainerFrame->GetScrolledFrame() + : aFrame; + if (MOZ_UNLIKELY(!scrolledFrame)) { + return {}; + } + + nsRect caretPos; + nsIFrame* caretFrame = nsCaret::GetGeometry(selection, &caretPos); + if (MOZ_UNLIKELY(!caretFrame)) { + return {}; + } + + // If the scrolled frame is outside of current selection limiter, + // we need to scroll the frame but keep moving selection in the limiter. + nsIFrame* frameToClick = scrolledFrame; + if (!NodeIsInLimiters(scrolledFrame->GetContent())) { + frameToClick = GetFrameToPageSelect(); + scrolledFrameIsInLimiter = scrolledFrame == frameToClick; + if (NS_WARN_IF(!frameToClick)) { + return {}; + } } - } - if (scrollContainerFrame) { - // If there is a scrollable frame, adjust pseudo-click position with page - // scroll amount. - // XXX This may scroll more than one page if ScrollSelectionIntoView is - // called later because caret may not fully visible. E.g., if - // clicking line will be visible only half height with scrolling - // the frame, ScrollSelectionIntoView additionally scrolls to show - // the caret entirely. - if (aForward) { - caretPos.y += scrollContainerFrame->GetPageScrollAmount().height; - } else { - caretPos.y -= scrollContainerFrame->GetPageScrollAmount().height; - } - } else { - // Otherwise, adjust pseudo-click position with the frame size. - if (aForward) { - caretPos.y += frameToClick->GetSize().height; + if (scrollContainerFrame) { + // If there is a scrollable frame, adjust pseudo-click position with page + // scroll amount. + // XXX This may scroll more than one page if ScrollSelectionIntoView is + // called later because caret may not fully visible. E.g., if + // clicking line will be visible only half height with scrolling + // the frame, ScrollSelectionIntoView additionally scrolls to show + // the caret entirely. + if (aForward) { + caretPos.y += scrollContainerFrame->GetPageScrollAmount().height; + } else { + caretPos.y -= scrollContainerFrame->GetPageScrollAmount().height; + } } else { - caretPos.y -= frameToClick->GetSize().height; + // Otherwise, adjust pseudo-click position with the frame size. + if (aForward) { + caretPos.y += frameToClick->GetSize().height; + } else { + caretPos.y -= frameToClick->GetSize().height; + } } - } - - caretPos += caretFrame->GetOffsetTo(frameToClick); - // get a content at desired location - nsPoint desiredPoint; - desiredPoint.x = caretPos.x; - desiredPoint.y = caretPos.y + caretPos.height / 2; - nsIFrame::ContentOffsets offsets = - frameToClick->GetContentOffsetsFromPoint(desiredPoint); + caretPos += caretFrame->GetOffsetTo(frameToClick); - if (!offsets.content) { + // get a content at desired location + nsPoint desiredPoint; + desiredPoint.x = caretPos.x; + desiredPoint.y = caretPos.y + caretPos.height / 2; + return frameToClick->GetContentOffsetsFromPoint(desiredPoint); + }(); + if (MOZ_UNLIKELY(!offsets.content)) { // XXX Do we need to handle ScrollSelectionIntoView in this case? return NS_OK; } @@ -1896,7 +1903,7 @@ { // We don't want any script to run until we check whether selection is // modified by HandleClick. - SelectionBatcher ensureNoSelectionChangeNotifications(selection, + SelectionBatcher ensureNoSelectionChangeNotifications(selection.ref(), __FUNCTION__); RangeBoundary oldAnchor = selection->AnchorRef(); @@ -1916,7 +1923,7 @@ aSelectionIntoView == SelectionIntoView::IfChanged && !selectionChanged); // Then, scroll the given frame one page. - if (scrollContainerFrame) { + if (scrollContainerFrameWeak.IsAlive()) { // If we'll call ScrollSelectionIntoView later and selection wasn't // changed and we scroll outside of selection limiter, we shouldn't use // smooth scroll here because ScrollContainerFrame uses normal runnable, @@ -1925,9 +1932,10 @@ // case, ScrollSelectionIntoView would scroll to show caret instead of // page scroll of an element outside selection limiter. ScrollMode scrollMode = doScrollSelectionIntoView && !selectionChanged && - scrolledFrame != frameToClick + !scrolledFrameIsInLimiter ? ScrollMode::Instant : ScrollMode::Smooth; + MOZ_ASSERT(scrollContainerFrameWeak.GetFrame() == scrollContainerFrame); scrollContainerFrame->ScrollBy(nsIntPoint(0, aForward ? 1 : -1), ScrollUnit::PAGES, scrollMode); } diff -Nru thunderbird-140.9.0esr/layout/generic/nsFrameSelection.h thunderbird-140.10.0esr/layout/generic/nsFrameSelection.h --- thunderbird-140.9.0esr/layout/generic/nsFrameSelection.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/generic/nsFrameSelection.h 2026-04-21 14:52:58.000000000 +0000 @@ -279,6 +279,13 @@ CaretAssociationHint aHint); public: + [[nodiscard]] bool IsAvailable() const { + // mDomSelections is initialized at construction and cleared if the cycle + // collector unlink them so that if the first selection is available, the + // others should be fine. + return !!mDomSelections[0]; + } + /** * Sets the type of the selection based on whether a selection is created * by doubleclick, long tapping a word or tripleclick. diff -Nru thunderbird-140.9.0esr/layout/generic/nsIFrame.cpp thunderbird-140.10.0esr/layout/generic/nsIFrame.cpp --- thunderbird-140.9.0esr/layout/generic/nsIFrame.cpp 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/generic/nsIFrame.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -1324,12 +1324,7 @@ } if (handleStickyChange && !HasAnyStateBits(NS_FRAME_IS_NONDISPLAY) && - !GetPrevInFlow()) { - // Note that we only add first continuations, but we really only - // want to add first continuation-or-ib-split-siblings. But since we don't - // yet know if we're a later part of a block-in-inline split, we'll just - // add later members of a block-in-inline split here, and then - // StickyScrollContainer will remove them later. + nsLayoutUtils::IsFirstContinuationOrIBSplitSibling(this)) { if (auto* ssc = StickyScrollContainer::GetStickyScrollContainerForFrame(this)) { if (disp->mPosition == StylePositionProperty::Sticky) { @@ -3179,7 +3174,8 @@ return; } - if (HasAnyStateBits(NS_FRAME_TOO_DEEP_IN_FRAME_TREE)) { + if (HasAnyStateBits(NS_FRAME_TOO_DEEP_IN_FRAME_TREE | + NS_FRAME_IS_NONDISPLAY)) { return; } diff -Nru thunderbird-140.9.0esr/layout/printing/ipc/RemotePrintJobParent.cpp thunderbird-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.cpp --- thunderbird-140.9.0esr/layout/printing/ipc/RemotePrintJobParent.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -26,15 +26,18 @@ namespace mozilla::layout { RemotePrintJobParent::RemotePrintJobParent(nsIPrintSettings* aPrintSettings) - : mPrintSettings(aPrintSettings), - mIsDoingPrinting(false), - mStatus(NS_ERROR_UNEXPECTED) { + : mPrintSettings(aPrintSettings), mStatus(NS_ERROR_UNEXPECTED) { MOZ_COUNT_CTOR(RemotePrintJobParent); } mozilla::ipc::IPCResult RemotePrintJobParent::RecvInitializePrint( const nsAString& aDocumentTitle, const int32_t& aStartPage, const int32_t& aEndPage) { + if (mInitializeReceived) { + MOZ_ASSERT_UNREACHABLE("Unexpected redundant call to RecvInitializePrint"); + return IPC_FAIL(this, "Unexpected redundant call to RecvInitializePrint"); + } + mInitializeReceived = true; PROFILER_MARKER_TEXT("RemotePrintJobParent", LAYOUT_Printing, {}, "RemotePrintJobParent::RecvInitializePrint"_ns); diff -Nru thunderbird-140.9.0esr/layout/printing/ipc/RemotePrintJobParent.h thunderbird-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.h --- thunderbird-140.9.0esr/layout/printing/ipc/RemotePrintJobParent.h 2026-03-20 19:18:36.000000000 +0000 +++ thunderbird-140.10.0esr/layout/printing/ipc/RemotePrintJobParent.h 2026-04-21 14:52:57.000000000 +0000 @@ -92,8 +92,10 @@ UniquePtr mPrintTranslator; nsCOMArray mPrintProgressListeners; PRFileDescStream mCurrentPageStream; - bool mIsDoingPrinting; nsresult mStatus; + bool mIsDoingPrinting = false; + bool mInitializeReceived = + false; // True after RecvInitializePrint is called. }; } // namespace layout diff -Nru thunderbird-140.9.0esr/layout/style/FontFace.cpp thunderbird-140.10.0esr/layout/style/FontFace.cpp --- thunderbird-140.9.0esr/layout/style/FontFace.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFace.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -254,6 +254,7 @@ } mImpl->Load(aRv); + mImpl->UpdateOwnerKeepAlive(); return mLoaded; } @@ -265,40 +266,27 @@ return nullptr; } + if (mImpl) { + mImpl->UpdateOwnerKeepAlive(); + } + return mLoaded; } void FontFace::MaybeResolve() { gfxFontUtils::AssertSafeThreadOrServoFontMetricsLocked(); + MOZ_ASSERT(!NS_IsMainThread() || nsContentUtils::IsSafeToRunScript()); + MOZ_ASSERT(!gfxFontUtils::CurrentServoStyleSet()); - if (!mLoaded) { - return; - } - - if (ServoStyleSet* ss = gfxFontUtils::CurrentServoStyleSet()) { - // See comments in Gecko_GetFontMetrics. - ss->AppendTask(PostTraversalTask::ResolveFontFaceLoadedPromise(this)); - return; + if (RefPtr loaded = mLoaded) { + loaded->MaybeResolve(this); } - - if (NS_IsMainThread() && !nsContentUtils::IsSafeToRunScript()) { - nsContentUtils::AddScriptRunner(NewRunnableMethod( - "FontFace::MaybeResolve", this, &FontFace::MaybeResolve)); - return; - } - - mLoaded->MaybeResolve(this); } void FontFace::MaybeReject(nsresult aResult) { gfxFontUtils::AssertSafeThreadOrServoFontMetricsLocked(); - - if (ServoStyleSet* ss = gfxFontUtils::CurrentServoStyleSet()) { - // See comments in Gecko_GetFontMetrics. - ss->AppendTask( - PostTraversalTask::RejectFontFaceLoadedPromise(this, aResult)); - return; - } + MOZ_ASSERT(!NS_IsMainThread() || nsContentUtils::IsSafeToRunScript()); + MOZ_ASSERT(!gfxFontUtils::CurrentServoStyleSet()); if (mLoaded) { mLoaded->MaybeReject(aResult); diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceImpl.cpp thunderbird-140.10.0esr/layout/style/FontFaceImpl.cpp --- thunderbird-140.9.0esr/layout/style/FontFaceImpl.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceImpl.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -385,35 +385,45 @@ } void FontFaceImpl::UpdateOwnerPromise() { - if (!mFontFaceSet->IsOnOwningThread()) { - mFontFaceSet->DispatchToOwningThread( - "FontFaceImpl::UpdateOwnerPromise", - [self = RefPtr{this}] { self->UpdateOwnerPromise(); }); + mFontFaceSet->DispatchToOwningThread( + "FontFaceImpl::UpdateOwnerPromise", + [self = RefPtr{this}] { self->UpdateOwnerPromiseSync(); }); +} + +void FontFaceImpl::UpdateOwnerKeepAlive() { + AssertIsOnOwningThread(); + if (!mOwner) { + MOZ_DIAGNOSTIC_ASSERT(!mKeepingOwnerAlive); return; } + const bool shouldKeepOwnerAlive = + mStatus == FontFaceLoadStatus::Loading && !!mOwner->GetParentObject(); + if (shouldKeepOwnerAlive == mKeepingOwnerAlive) { + return; + } + mKeepingOwnerAlive = shouldKeepOwnerAlive; + if (shouldKeepOwnerAlive) { + mOwner->AddRef(); + } else { + mOwner->Release(); + } +} +void FontFaceImpl::UpdateOwnerPromiseSync() { if (NS_WARN_IF(!mOwner)) { MOZ_DIAGNOSTIC_ASSERT(!mKeepingOwnerAlive); return; } + RefPtr owner = mOwner; + UpdateOwnerKeepAlive(); if (mStatus == FontFaceLoadStatus::Loaded) { - mOwner->MaybeResolve(); + owner->MaybeResolve(); } else if (mStatus == FontFaceLoadStatus::Error) { if (mSourceType == eSourceType_Buffer) { - mOwner->MaybeReject(NS_ERROR_DOM_SYNTAX_ERR); - } else { - mOwner->MaybeReject(NS_ERROR_DOM_NETWORK_ERR); - } - } - - const bool shouldKeepOwnerAlive = mStatus == FontFaceLoadStatus::Loading; - if (shouldKeepOwnerAlive != mKeepingOwnerAlive) { - mKeepingOwnerAlive = shouldKeepOwnerAlive; - if (shouldKeepOwnerAlive) { - mOwner->AddRef(); + owner->MaybeReject(NS_ERROR_DOM_SYNTAX_ERR); } else { - mOwner->Release(); + owner->MaybeReject(NS_ERROR_DOM_NETWORK_ERR); } } } diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceImpl.h thunderbird-140.10.0esr/layout/style/FontFaceImpl.h --- thunderbird-140.9.0esr/layout/style/FontFaceImpl.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceImpl.h 2026-04-21 14:52:58.000000000 +0000 @@ -202,6 +202,8 @@ void InitializeSourceURL(const nsACString& aURL); void InitializeSourceBuffer(uint8_t* aBuffer, uint32_t aLength); + void UpdateOwnerKeepAlive(); + /** * Sets all of the descriptor values in mDescriptors using values passed * to the JS constructor. @@ -221,6 +223,7 @@ // Helper function for Load. void DoLoad(); void UpdateOwnerPromise(); + void UpdateOwnerPromiseSync(); // Helper function for the descriptor setter methods. // Returns true if the descriptor was modified, false if descriptor is diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceSet.cpp thunderbird-140.10.0esr/layout/style/FontFaceSet.cpp --- thunderbird-140.9.0esr/layout/style/FontFaceSet.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceSet.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -394,18 +394,18 @@ // refcounting. (Also, the Promise object creation must be done on // the main thread.) set->AppendTask( - PostTraversalTask::DispatchLoadingEventAndReplaceReadyPromise(this)); + PostTraversalTask::DispatchLoadingEventAndReplaceReadyPromise( + do_AddRef(mImpl))); return; } (new AsyncEventDispatcher(this, u"loading"_ns, CanBubble::eNo)) ->PostDOMEvent(); - if (mReady && mReady->State() != Promise::PromiseState::Pending) { - if (GetParentObject()) { - ErrorResult rv; - mReady = Promise::Create(GetParentObject(), rv); - } + if (mReady && mReady->State() != Promise::PromiseState::Pending && + GetParentObject()) { + IgnoredErrorResult rv; + mReady = Promise::Create(GetParentObject(), rv); } // We may previously have been in a state where all fonts had finished diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceSetDocumentImpl.cpp thunderbird-140.10.0esr/layout/style/FontFaceSetDocumentImpl.cpp --- thunderbird-140.9.0esr/layout/style/FontFaceSetDocumentImpl.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceSetDocumentImpl.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -469,8 +469,8 @@ RefPtr f = record.mFontFace; if (gfxUserFontEntry* userFontEntry = f->GetUserFontEntry()) { if (nsFontFaceLoader* loader = userFontEntry->GetLoader()) { + // Cancel() removes the loader from its registering set's mLoaders. loader->Cancel(); - RemoveLoader(loader); } } diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceSetImpl.cpp thunderbird-140.10.0esr/layout/style/FontFaceSetImpl.cpp --- thunderbird-140.9.0esr/layout/style/FontFaceSetImpl.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceSetImpl.cpp 2026-04-21 14:52:57.000000000 +0000 @@ -93,10 +93,12 @@ return; } if (NS_IsMainThread()) { - for (const auto& key : mLoaders.Keys()) { + // Move mLoaders to a local, because Cancel() calls RemoveLoader() which + // would otherwise mutate the table during the iteration. + auto loaders = std::move(mLoaders); + for (const auto& key : loaders.Keys()) { key->Cancel(); } - mLoaders.Clear(); return; } @@ -764,21 +766,6 @@ } void FontFaceSetImpl::DispatchCheckLoadingFinishedAfterDelay() { - gfxFontUtils::AssertSafeThreadOrServoFontMetricsLocked(); - - if (ServoStyleSet* set = gfxFontUtils::CurrentServoStyleSet()) { - // See comments in Gecko_GetFontMetrics. - // - // We can't just dispatch the runnable below if we're not on the main - // thread, since it needs to take a strong reference to the FontFaceSet, - // and being a DOM object, FontFaceSet doesn't support thread-safe - // refcounting. - set->AppendTask( - PostTraversalTask::DispatchFontFaceSetCheckLoadingFinishedAfterDelay( - this)); - return; - } - DispatchToOwningThread( "FontFaceSetImpl::DispatchCheckLoadingFinishedAfterDelay", [self = RefPtr{this}]() { self->CheckLoadingFinishedAfterDelay(); }); @@ -815,7 +802,7 @@ [self = RefPtr{this}]() { self->OnLoadingStarted(); }); } -void FontFaceSetImpl::OnLoadingStarted() { +void FontFaceSetImpl::DispatchLoadingEventAndReplaceReadyPromise() { RecursiveMutexAutoLock lock(mMutex); if (mOwner) { mOwner->DispatchLoadingEventAndReplaceReadyPromise(); diff -Nru thunderbird-140.9.0esr/layout/style/FontFaceSetImpl.h thunderbird-140.10.0esr/layout/style/FontFaceSetImpl.h --- thunderbird-140.9.0esr/layout/style/FontFaceSetImpl.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/FontFaceSetImpl.h 2026-04-21 14:52:58.000000000 +0000 @@ -171,6 +171,7 @@ ErrorResult& aRv); virtual void DispatchCheckLoadingFinishedAfterDelay(); + void DispatchLoadingEventAndReplaceReadyPromise(); protected: ~FontFaceSetImpl() override; @@ -200,7 +201,9 @@ */ void CheckLoadingFinishedAfterDelay(); - void OnLoadingStarted(); + void OnLoadingStarted() { + DispatchLoadingEventAndReplaceReadyPromise(); + } void OnLoadingFinished(); // Note: if you add new cycle collected objects to FontFaceRecord, diff -Nru thunderbird-140.9.0esr/layout/style/PostTraversalTask.cpp thunderbird-140.10.0esr/layout/style/PostTraversalTask.cpp --- thunderbird-140.9.0esr/layout/style/PostTraversalTask.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/PostTraversalTask.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -18,40 +18,29 @@ using namespace dom; -void PostTraversalTask::Run() { +PostTraversalTask::~PostTraversalTask() { + if (!mTarget) { + return; + } switch (mType) { - case Type::ResolveFontFaceLoadedPromise: - static_cast(mTarget)->MaybeResolve(); + case Type::DispatchLoadingEventAndReplaceReadyPromise: + static_cast(mTarget)->Release(); break; - - case Type::RejectFontFaceLoadedPromise: - static_cast(mTarget)->MaybeReject(mResult); + case Type::LoadFontEntry: + static_cast(mTarget)->Release(); break; + } +} +void PostTraversalTask::Run() { + switch (mType) { case Type::DispatchLoadingEventAndReplaceReadyPromise: - static_cast(mTarget) + static_cast(mTarget) ->DispatchLoadingEventAndReplaceReadyPromise(); break; - - case Type::DispatchFontFaceSetCheckLoadingFinishedAfterDelay: - static_cast(mTarget) - ->DispatchCheckLoadingFinishedAfterDelay(); - break; - case Type::LoadFontEntry: static_cast(mTarget)->ContinueLoad(); break; - - case Type::InitializeFamily: - Unused << gfxPlatformFontList::PlatformFontList()->InitializeFamily( - static_cast(mTarget)); - break; - - case Type::FontInfoUpdate: - if (auto* pc = static_cast(mTarget)->GetPresContext()) { - pc->ForceReflowForFontInfoUpdateFromStyle(); - } - break; } } diff -Nru thunderbird-140.9.0esr/layout/style/PostTraversalTask.h thunderbird-140.10.0esr/layout/style/PostTraversalTask.h --- thunderbird-140.9.0esr/layout/style/PostTraversalTask.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/PostTraversalTask.h 2026-04-21 14:52:58.000000000 +0000 @@ -7,14 +7,13 @@ #ifndef mozilla_PostTraversalTask_h #define mozilla_PostTraversalTask_h -#include "nscore.h" +#include "mozilla/AlreadyAddRefed.h" /* a task to be performed immediately after a Servo traversal */ namespace mozilla { class ServoStyleSet; namespace dom { -class FontFace; class FontFaceSet; class FontFaceSetImpl; } // namespace dom @@ -36,91 +35,46 @@ */ class PostTraversalTask { public: - static PostTraversalTask ResolveFontFaceLoadedPromise( - dom::FontFace* aFontFace) { - auto task = PostTraversalTask(Type::ResolveFontFaceLoadedPromise); - task.mTarget = aFontFace; - return task; - } - - static PostTraversalTask RejectFontFaceLoadedPromise(dom::FontFace* aFontFace, - nsresult aResult) { - auto task = PostTraversalTask(Type::ResolveFontFaceLoadedPromise); - task.mTarget = aFontFace; - task.mResult = aResult; - return task; - } - static PostTraversalTask DispatchLoadingEventAndReplaceReadyPromise( - dom::FontFaceSet* aFontFaceSet) { - auto task = - PostTraversalTask(Type::DispatchLoadingEventAndReplaceReadyPromise); - task.mTarget = aFontFaceSet; + already_AddRefed aFontFaceSetImpl) { + PostTraversalTask task(Type::DispatchLoadingEventAndReplaceReadyPromise); + task.mTarget = aFontFaceSetImpl.take(); return task; } - static PostTraversalTask DispatchFontFaceSetCheckLoadingFinishedAfterDelay( - dom::FontFaceSetImpl* aFontFaceSet) { - auto task = PostTraversalTask( - Type::DispatchFontFaceSetCheckLoadingFinishedAfterDelay); - task.mTarget = aFontFaceSet; + static PostTraversalTask LoadFontEntry( + already_AddRefed aFontEntry) { + PostTraversalTask task(Type::LoadFontEntry); + task.mTarget = aFontEntry.take(); return task; } - static PostTraversalTask LoadFontEntry(gfxUserFontEntry* aFontEntry) { - auto task = PostTraversalTask(Type::LoadFontEntry); - task.mTarget = aFontEntry; - return task; - } - - static PostTraversalTask InitializeFamily(fontlist::Family* aFamily) { - auto task = PostTraversalTask(Type::InitializeFamily); - task.mTarget = aFamily; - return task; - } + void Run(); - static PostTraversalTask FontInfoUpdate(ServoStyleSet* aSet) { - auto task = PostTraversalTask(Type::FontInfoUpdate); - task.mTarget = aSet; - return task; - } + PostTraversalTask(const PostTraversalTask&) = delete; + PostTraversalTask(PostTraversalTask&& aOther) + : PostTraversalTask(aOther.mType) { + mTarget = aOther.mTarget; + aOther.mTarget = nullptr; + }; - void Run(); + ~PostTraversalTask(); private: - // For any new raw pointer type that we need to store in a PostTraversalTask, - // please add an assertion that class' destructor that we are not in a Servo - // traversal, to protect against the possibility of having dangling pointers. enum class Type { - // mTarget (FontFace*) - ResolveFontFaceLoadedPromise, - - // mTarget (FontFace*) - // mResult - RejectFontFaceLoadedPromise, - - // mTarget (FontFaceSet*) - DispatchLoadingEventAndReplaceReadyPromise, - // mTarget (FontFaceSetImpl*) - DispatchFontFaceSetCheckLoadingFinishedAfterDelay, + DispatchLoadingEventAndReplaceReadyPromise, // mTarget (gfxUserFontEntry*) LoadFontEntry, - - // mTarget (fontlist::Family*) - InitializeFamily, - - // mTarget (ServoStyleSet*) - FontInfoUpdate, }; explicit PostTraversalTask(Type aType) - : mType(aType), mTarget(nullptr), mResult(NS_OK) {} + : mType(aType), mTarget(nullptr) {} - Type mType; - void* mTarget; - nsresult mResult; + const Type mType; + // Note that this is a strong reference of the relevant target + void* mTarget = nullptr; }; } // namespace mozilla diff -Nru thunderbird-140.9.0esr/layout/style/ServoStyleSet.cpp thunderbird-140.10.0esr/layout/style/ServoStyleSet.cpp --- thunderbird-140.9.0esr/layout/style/ServoStyleSet.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/ServoStyleSet.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -7,6 +7,7 @@ #include "mozilla/ServoStyleSet.h" #include "mozilla/ServoStyleSetInlines.h" +#include "COLRFonts.h" #include "mozilla/DocumentStyleRootIterator.h" #include "mozilla/AttributeStyles.h" #include "mozilla/EffectCompositor.h" diff -Nru thunderbird-140.9.0esr/layout/style/ServoStyleSet.h thunderbird-140.10.0esr/layout/style/ServoStyleSet.h --- thunderbird-140.9.0esr/layout/style/ServoStyleSet.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/ServoStyleSet.h 2026-04-21 14:52:58.000000000 +0000 @@ -425,7 +425,7 @@ // synchronization measures. AssertIsMainThreadOrServoFontMetricsLocked(); - mPostTraversalTasks.AppendElement(aTask); + mPostTraversalTasks.AppendElement(std::move(aTask)); } // Returns true if a restyle of the document is needed due to cloning diff -Nru thunderbird-140.9.0esr/layout/style/nsFontFaceLoader.cpp thunderbird-140.10.0esr/layout/style/nsFontFaceLoader.cpp --- thunderbird-140.9.0esr/layout/style/nsFontFaceLoader.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/style/nsFontFaceLoader.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -350,6 +350,9 @@ if (doc) { doc->UnblockOnload(false); } + // Remove ourselves from the set that registered us, so it never holds a + // dangling raw pointer to us after we're freed. + mFontFaceSet->RemoveLoader(this); mFontFaceSet = nullptr; if (mLoadTimer) { mLoadTimer->Cancel(); diff -Nru thunderbird-140.9.0esr/layout/svg/CSSFilterInstance.cpp thunderbird-140.10.0esr/layout/svg/CSSFilterInstance.cpp --- thunderbird-140.9.0esr/layout/svg/CSSFilterInstance.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/svg/CSSFilterInstance.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -127,15 +127,15 @@ ComponentTransferAttributes atts; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Linear; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; std::array slopeIntercept; slopeIntercept[kComponentTransferSlopeIndex] = value; slopeIntercept[kComponentTransferInterceptIndex] = intercept; atts.mValues[kChannelROrRGB].AppendElements(Span(slopeIntercept)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -148,15 +148,15 @@ ComponentTransferAttributes atts; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Linear; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; std::array slopeIntercept; slopeIntercept[kComponentTransferSlopeIndex] = value; slopeIntercept[kComponentTransferInterceptIndex] = intercept; atts.mValues[kChannelROrRGB].AppendElements(Span(slopeIntercept)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -189,7 +189,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SATURATE; + atts.mType = SVGFEColorMatrixType::Saturate; // Set color matrix value. atts.mValues.AppendElement(1 - ClampFactor(mFilter.AsGrayscale())); @@ -202,7 +202,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_HUE_ROTATE; + atts.mType = SVGFEColorMatrixType::HueRotate; // Set color matrix value. atts.mValues.AppendElement(mFilter.AsHueRotate().ToDegrees()); @@ -220,12 +220,12 @@ std::array invertTableValues = {value, 1 - value}; // Set transfer functions for RGB. - atts.mTypes[kChannelROrRGB] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_TABLE; - atts.mTypes[kChannelG] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; - atts.mTypes[kChannelB] = (uint8_t)SVG_FECOMPONENTTRANSFER_SAME_AS_R; + atts.mTypes[kChannelROrRGB] = SVGFEComponentTransferType::Table; + atts.mTypes[kChannelG] = SVGFEComponentTransferType::SameAsR; + atts.mTypes[kChannelB] = SVGFEComponentTransferType::SameAsR; atts.mValues[kChannelROrRGB].AppendElements(Span(invertTableValues)); - atts.mTypes[kChannelA] = (uint8_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + atts.mTypes[kChannelA] = SVGFEComponentTransferType::Identity; aDescr.Attributes() = AsVariant(std::move(atts)); return NS_OK; @@ -245,7 +245,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SATURATE; + atts.mType = SVGFEColorMatrixType::Saturate; // Set color matrix value. atts.mValues.AppendElement(mFilter.AsSaturate()); @@ -258,7 +258,7 @@ FilterPrimitiveDescription& aDescr) { ColorMatrixAttributes atts; // Set color matrix type. - atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_SEPIA; + atts.mType = SVGFEColorMatrixType::Sepia; // Set color matrix value. atts.mValues.AppendElement(ClampFactor(mFilter.AsSepia())); diff -Nru thunderbird-140.9.0esr/layout/svg/FilterInstance.cpp thunderbird-140.10.0esr/layout/svg/FilterInstance.cpp --- thunderbird-140.9.0esr/layout/svg/FilterInstance.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/svg/FilterInstance.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -114,18 +114,19 @@ } } -static mozilla::wr::ComponentTransferFuncType FuncTypeToWr(uint8_t aFuncType) { - MOZ_ASSERT(aFuncType != SVG_FECOMPONENTTRANSFER_SAME_AS_R); +static mozilla::wr::ComponentTransferFuncType FuncTypeToWr( + SVGFEComponentTransferType aFuncType) { + MOZ_ASSERT(aFuncType != SVGFEComponentTransferType::SameAsR); switch (aFuncType) { - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: + case SVGFEComponentTransferType::Table: return mozilla::wr::ComponentTransferFuncType::Table; - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: + case SVGFEComponentTransferType::Discrete: return mozilla::wr::ComponentTransferFuncType::Discrete; - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: + case SVGFEComponentTransferType::Linear: return mozilla::wr::ComponentTransferFuncType::Linear; - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: + case SVGFEComponentTransferType::Gamma: return mozilla::wr::ComponentTransferFuncType::Gamma; - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: + case SVGFEComponentTransferType::Identity: default: return mozilla::wr::ComponentTransferFuncType::Identity; } @@ -333,14 +334,14 @@ filterData.R_values_count = attributes.mValues[0].Length(); size_t indexToUse = - attributes.mTypes[1] == SVG_FECOMPONENTTRANSFER_SAME_AS_R ? 0 : 1; + attributes.mTypes[1] == SVGFEComponentTransferType::SameAsR ? 0 : 1; filterData.funcG_type = FuncTypeToWr(attributes.mTypes[indexToUse]); size_t G_startindex = values->Length(); values->AppendElements(attributes.mValues[indexToUse]); filterData.G_values_count = attributes.mValues[indexToUse].Length(); indexToUse = - attributes.mTypes[2] == SVG_FECOMPONENTTRANSFER_SAME_AS_R ? 0 : 2; + attributes.mTypes[2] == SVGFEComponentTransferType::SameAsR ? 0 : 2; filterData.funcB_type = FuncTypeToWr(attributes.mTypes[indexToUse]); size_t B_startindex = values->Length(); values->AppendElements(attributes.mValues[indexToUse]); @@ -487,66 +488,66 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mBlendMode) { - case SVG_FEBLEND_MODE_COLOR: + case SVGFEBlendMode::Color: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColor(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_COLOR_BURN: + case SVGFEBlendMode::ColorBurn: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColorBurn(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_COLOR_DODGE: + case SVGFEBlendMode::ColorDodge: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendColorDodge(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_DARKEN: + case SVGFEBlendMode::Darken: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendDarken(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_DIFFERENCE: + case SVGFEBlendMode::Difference: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendDifference(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_EXCLUSION: + case SVGFEBlendMode::Exclusion: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendExclusion(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_HARD_LIGHT: + case SVGFEBlendMode::HardLight: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendHardLight(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_HUE: + case SVGFEBlendMode::Hue: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEBlendHue(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_LIGHTEN: + case SVGFEBlendMode::Lighten: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendLighten(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_LUMINOSITY: + case SVGFEBlendMode::Luminosity: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendLuminosity(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_MULTIPLY: + case SVGFEBlendMode::Multiply: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendMultiply(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_NORMAL: + case SVGFEBlendMode::Normal: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendNormal(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_OVERLAY: + case SVGFEBlendMode::Overlay: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendOverlay(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SATURATION: + case SVGFEBlendMode::Saturation: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendSaturation(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SCREEN: + case SVGFEBlendMode::Screen: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendScreen(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FEBLEND_MODE_SOFT_LIGHT: + case SVGFEBlendMode::SoftLight: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEBlendSoftLight(aGraphNode)); return WrFiltersStatus::SVGFE; @@ -566,33 +567,33 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mOperator) { - case SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: + case SVGFECompositeOperator::Arithmetic: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFECompositeArithmetic( aGraphNode, aAttributes.mCoefficients[0], aAttributes.mCoefficients[1], aAttributes.mCoefficients[2], aAttributes.mCoefficients[3])); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_ATOP: + case SVGFECompositeOperator::Atop: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeATop(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_IN: + case SVGFECompositeOperator::In: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeIn(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_LIGHTER: + case SVGFECompositeOperator::Lighter: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeLighter(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_OUT: + case SVGFECompositeOperator::Out: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeOut(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_OVER: + case SVGFECompositeOperator::Over: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeOver(aGraphNode)); return WrFiltersStatus::SVGFE; - case SVG_FECOMPOSITE_OPERATOR_XOR: + case SVGFECompositeOperator::Xor: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFECompositeXOR(aGraphNode)); return WrFiltersStatus::SVGFE; @@ -653,19 +654,19 @@ // The only type that doesn't use interpolation is discrete. wr::WrFilterData filterData{}; filterData.funcR_type = - aAttributes.mTypes[0] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[0] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcG_type = - aAttributes.mTypes[1] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[1] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcB_type = - aAttributes.mTypes[2] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[2] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; filterData.funcA_type = - aAttributes.mTypes[3] != SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE + aAttributes.mTypes[3] != SVGFEComponentTransferType::Discrete ? mozilla::wr::ComponentTransferFuncType::Table : mozilla::wr::ComponentTransferFuncType::Discrete; @@ -691,15 +692,15 @@ auto f = aAttributes.mTypes[c]; // Check if there's no data (we have crashtests for this). if (aAttributes.mValues[c].Length() < 1 && - f != SVG_FECOMPONENTTRANSFER_SAME_AS_R) { - f = SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + f != SVGFEComponentTransferType::SameAsR) { + f = SVGFEComponentTransferType::Identity; } - // Check for misuse of SVG_FECOMPONENTTRANSFER_SAME_AS_R. - if (c == 0 && f == SVG_FECOMPONENTTRANSFER_SAME_AS_R) { - f = SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + // Check for misuse of SVGFEComponentTransferType::SameAsR. + if (c == 0 && f == SVGFEComponentTransferType::SameAsR) { + f = SVGFEComponentTransferType::Identity; } switch (f) { - case SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: { + case SVGFEComponentTransferType::Discrete: { size_t length = (size_t)aAttributes.mValues[c].Length(); size_t length1 = length - 1; float step = (float)length / (float)stops; @@ -716,7 +717,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: { + case SVGFEComponentTransferType::Gamma: { float step = 1.0f / (float)(stops - 1); float amplitude = aAttributes.mValues[c][0]; float exponent = aAttributes.mValues[c][1]; @@ -728,7 +729,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: { + case SVGFEComponentTransferType::Identity: { float step = 1.0f / (float)(stops - 1); for (size_t i = 0; i < stops; i++) { float v = (float)i * step; @@ -737,7 +738,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: { + case SVGFEComponentTransferType::Linear: { float step = aAttributes.mValues[c][0] / (float)(stops - 1); float intercept = aAttributes.mValues[c][1]; for (size_t i = 0; i < stops; i++) { @@ -747,7 +748,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_TYPE_TABLE: { + case SVGFEComponentTransferType::Table: { size_t length1 = (size_t)aAttributes.mValues[c].Length() - 1; float step = (float)length1 / (float)(stops - 1); for (size_t i = 0; i < stops; i++) { @@ -763,7 +764,7 @@ } break; } - case SVG_FECOMPONENTTRANSFER_SAME_AS_R: { + case SVGFEComponentTransferType::SameAsR: { // We already checked c > 0 above. for (size_t i = 0; i < stops; i++) { values[i * 4 + c] = values[i * 4]; @@ -824,8 +825,8 @@ } } switch (aAttributes.mEdgeMode) { - case SVG_EDGEMODE_UNKNOWN: - case SVG_EDGEMODE_DUPLICATE: + case SVGEdgeMode::Unknown: + case SVGEdgeMode::Duplicate: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeDuplicate( aGraphNode, aAttributes.mKernelSize.Width(), @@ -836,7 +837,7 @@ aAttributes.mKernelUnitLength.Height(), aAttributes.mPreserveAlpha)); return WrFiltersStatus::SVGFE; - case SVG_EDGEMODE_NONE: + case SVGEdgeMode::None: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeNone( aGraphNode, aAttributes.mKernelSize.Width(), @@ -847,7 +848,7 @@ aAttributes.mKernelUnitLength.Height(), aAttributes.mPreserveAlpha)); return WrFiltersStatus::SVGFE; - case SVG_EDGEMODE_WRAP: + case SVGEdgeMode::Wrap: aWrFilters.filters.AppendElement( wr::FilterOp::SVGFEConvolveMatrixEdgeModeWrap( aGraphNode, aAttributes.mKernelSize.Width(), @@ -924,8 +925,9 @@ return WrFiltersStatus::BLOB_FALLBACK; } aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEDisplacementMap( - aGraphNode, aAttributes.mScale, aAttributes.mXChannel, - aAttributes.mYChannel)); + aGraphNode, aAttributes.mScale, + static_cast(aAttributes.mXChannel), + static_cast(aAttributes.mYChannel))); return WrFiltersStatus::SVGFE; } @@ -1065,11 +1067,11 @@ return WrFiltersStatus::BLOB_FALLBACK; } switch (aAttributes.mOperator) { - case SVG_OPERATOR_DILATE: + case SVGMorphologyOperator::Dilate: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEMorphologyDilate( aGraphNode, aAttributes.mRadii.width, aAttributes.mRadii.height)); return WrFiltersStatus::SVGFE; - case SVG_OPERATOR_ERODE: + case SVGMorphologyOperator::Erode: aWrFilters.filters.AppendElement(wr::FilterOp::SVGFEMorphologyErode( aGraphNode, aAttributes.mRadii.width, aAttributes.mRadii.height)); return WrFiltersStatus::SVGFE; @@ -1177,7 +1179,7 @@ seed = m1; } switch (aAttributes.mType) { - case SVG_TURBULENCE_TYPE_FRACTALNOISE: + case SVGTurbulenceType::FractalNoise: if (aAttributes.mStitchable) { aWrFilters.filters.AppendElement( wr::FilterOp::SVGFETurbulenceWithFractalNoiseWithStitching( @@ -1190,7 +1192,7 @@ aAttributes.mBaseFrequency.height, aAttributes.mOctaves, seed)); } return WrFiltersStatus::SVGFE; - case SVG_TURBULENCE_TYPE_TURBULENCE: + case SVGTurbulenceType::Turbulence: if (aAttributes.mStitchable) { aWrFilters.filters.AppendElement( wr::FilterOp::SVGFETurbulenceWithTurbulenceNoiseWithStitching( diff -Nru thunderbird-140.9.0esr/layout/svg/SVGObserverUtils.cpp thunderbird-140.10.0esr/layout/svg/SVGObserverUtils.cpp --- thunderbird-140.9.0esr/layout/svg/SVGObserverUtils.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/layout/svg/SVGObserverUtils.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -1738,8 +1738,10 @@ // anonymous block frame, then we look up to its parent (the SVGTextFrame). nsIFrame* paintedFrame = aPaintedFrame; if (paintedFrame->IsInSVGTextSubtree()) { - paintedFrame = paintedFrame->GetParent(); - nsIFrame* grandparent = paintedFrame->GetParent(); + // Continuations can come and go during reflow, and we don't need to + // observe the referenced element more than once for a given node. + paintedFrame = paintedFrame->GetParent()->FirstContinuation(); + nsIFrame* grandparent = paintedFrame->GetParent()->FirstContinuation(); if (grandparent && grandparent->IsSVGTextFrame()) { paintedFrame = grandparent; } diff -Nru thunderbird-140.9.0esr/layout/tables/celldata.h thunderbird-140.10.0esr/layout/tables/celldata.h --- thunderbird-140.9.0esr/layout/tables/celldata.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/layout/tables/celldata.h 2026-04-21 14:52:58.000000000 +0000 @@ -10,6 +10,7 @@ #include "nsCoord.h" #include "mozilla/gfx/Types.h" #include "mozilla/WritingModes.h" +#include #include class nsTableCellFrame; @@ -292,6 +293,10 @@ } inline void CellData::SetRowSpanOffset(uint32_t aSpan) { + MOZ_ASSERT(aSpan > 0, "a zero-sized span is nonsensical"); + MOZ_ASSERT(aSpan <= MAX_ROWSPAN, "span shouldn't exceed what we can handle"); + aSpan = std::min(aSpan, static_cast(MAX_ROWSPAN)); + mBits &= ~ROW_SPAN_OFFSET; mBits |= (aSpan << ROW_SPAN_SHIFT); mBits |= SPAN; @@ -310,6 +315,10 @@ } inline void CellData::SetColSpanOffset(uint32_t aSpan) { + MOZ_ASSERT(aSpan > 0, "a zero-sized span is nonsensical"); + MOZ_ASSERT(aSpan <= MAX_COLSPAN, "span shouldn't exceed what we can handle"); + aSpan = std::min(aSpan, static_cast(MAX_COLSPAN)); + mBits &= ~COL_SPAN_OFFSET; mBits |= (aSpan << COL_SPAN_SHIFT); diff -Nru thunderbird-140.9.0esr/layout/tables/nsCellMap.cpp thunderbird-140.10.0esr/layout/tables/nsCellMap.cpp --- thunderbird-140.9.0esr/layout/tables/nsCellMap.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/layout/tables/nsCellMap.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -1845,7 +1845,9 @@ break; } } - return colSpan; + + // Enforce that the effective colSpan is between 1 and MAX_COLSPAN: + return std::clamp(colSpan, 1, MAX_COLSPAN); } int32_t nsCellMap::GetRowSpanForNewCell(nsTableCellFrame* aCellFrameToAdd, @@ -1856,7 +1858,7 @@ if (0 == rowSpan) { // Use a min value of 2 for a zero rowspan to make computations easier // elsewhere. Zero rowspans are only content dependent! - rowSpan = std::max(2, mContentRowCount - aRowIndex); + rowSpan = std::clamp(mContentRowCount - aRowIndex, 2, MAX_ROWSPAN); aIsZeroRowSpan = true; } return rowSpan; @@ -1910,7 +1912,9 @@ break; } } - return rowSpan; + + // Enforce that the effective rowSpan is between 1 and MAX_ROWSPAN: + return std::clamp(rowSpan, 1, MAX_ROWSPAN); } void nsCellMap::ShrinkWithoutCell(nsTableCellMap& aMap, diff -Nru thunderbird-140.9.0esr/media/ffvpx/README_MOZILLA thunderbird-140.10.0esr/media/ffvpx/README_MOZILLA --- thunderbird-140.9.0esr/media/ffvpx/README_MOZILLA 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/ffvpx/README_MOZILLA 2026-04-21 14:52:58.000000000 +0000 @@ -128,6 +128,10 @@ issue being that it's included instead of the system header, causing all sorts of issues. +Additionally, `jni.h` and `jni.c` in ffmpeg sources need to be renamed to +`fffjni.h` and `fffjni.c`, and `#include` to those files need to be updated. +This is because there are header collisions with the JDK. + `moz.build` files might need to be modified as well, in light of compilation and link errors. @@ -141,3 +145,4 @@ stdio.h function, that causes bug 1879740 issue on Windows. - opusenc-dtx.patch to allow enabling DTX in the opus encoder. - libaomenc-svc.patch to allow configuring SVC in the libaom encoder. +- vp9-get-format-rollback.patch to fix a VP9 decoder error handling issue. diff -Nru thunderbird-140.9.0esr/media/ffvpx/libavcodec/vp9.c thunderbird-140.10.0esr/media/ffvpx/libavcodec/vp9.c --- thunderbird-140.9.0esr/media/ffvpx/libavcodec/vp9.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/ffvpx/libavcodec/vp9.c 2026-04-21 14:52:58.000000000 +0000 @@ -235,8 +235,10 @@ *fmtp = AV_PIX_FMT_NONE; ret = ff_get_format(avctx, pix_fmts); - if (ret < 0) + if (ret < 0) { + ff_set_dimensions(avctx, s->w, s->h); return ret; + } avctx->pix_fmt = ret; s->gf_fmt = s->pix_fmt; diff -Nru thunderbird-140.9.0esr/media/ffvpx/vp9-get-format-rollback.patch thunderbird-140.10.0esr/media/ffvpx/vp9-get-format-rollback.patch --- thunderbird-140.9.0esr/media/ffvpx/vp9-get-format-rollback.patch 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/media/ffvpx/vp9-get-format-rollback.patch 2026-04-21 14:52:58.000000000 +0000 @@ -0,0 +1,16 @@ +diff --git a/media/ffvpx/libavcodec/vp9.c b/media/ffvpx/libavcodec/vp9.c +--- a/media/ffvpx/libavcodec/vp9.c ++++ b/media/ffvpx/libavcodec/vp9.c +@@ -235,8 +235,11 @@ static int update_size(AVCodecContext *avctx, int w, int h) + *fmtp++ = s->pix_fmt; + *fmtp = AV_PIX_FMT_NONE; + + ret = ff_get_format(avctx, pix_fmts); +- if (ret < 0) ++ if (ret < 0) { ++ ff_set_dimensions(avctx, s->w, s->h); + return ret; ++ } + + avctx->pix_fmt = ret; + s->gf_fmt = s->pix_fmt; diff -Nru thunderbird-140.9.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp thunderbird-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp --- thunderbird-140.9.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -131,7 +131,8 @@ CK_LOGD("VideoDecoder::OutputFrame Decoder output ret=0x%x", hr); - mOutputQueue.push(output); + mOutputQueue.push({output, mDecoder->GetPictureRegion(), + mDecoder->GetStride(), mDecoder->GetFrameHeight()}); CK_LOGD("VideoDecoder::OutputFrame: Queue size: %u", mOutputQueue.size()); } @@ -148,20 +149,19 @@ return cdm::Status::kDecodeError; } - CComPtr result = mOutputQueue.front(); + OutputData result = std::move(mOutputQueue.front()); mOutputQueue.pop(); // The Chromium CDM API doesn't have support for negative strides, though // they are theoretically possible in real world data. - if (mDecoder->GetStride() <= 0) { + if (result.mStride <= 0) { CK_LOGD("VideoDecoder::OutputFrame Failed! (negative stride)"); return cdm::Status::kDecodeError; } - const IntRect& picture = mDecoder->GetPictureRegion(); - hr = SampleToVideoFrame(result, picture.width, picture.height, - mDecoder->GetStride(), mDecoder->GetFrameHeight(), - aVideoFrame); + const IntRect& picture = result.mPictureRegion; + hr = SampleToVideoFrame(result.mSample, picture.width, picture.height, + result.mStride, result.mFrameHeight, aVideoFrame); if (FAILED(hr)) { CK_LOGD("VideoDecoder::OutputFrame Failed!"); return cdm::Status::kDecodeError; diff -Nru thunderbird-140.9.0esr/media/gmp-clearkey/0.1/VideoDecoder.h thunderbird-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.h --- thunderbird-140.9.0esr/media/gmp-clearkey/0.1/VideoDecoder.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/gmp-clearkey/0.1/VideoDecoder.h 2026-04-21 14:52:58.000000000 +0000 @@ -64,7 +64,13 @@ cdm::Host_11* mHost; wmf::AutoPtr mDecoder; - std::queue> mOutputQueue; + struct OutputData { + wmf::CComPtr mSample; + wmf::IntRect mPictureRegion; + int32_t mStride; + int32_t mFrameHeight; + }; + std::queue mOutputQueue; bool mHasShutdown; }; diff -Nru thunderbird-140.9.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp thunderbird-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp --- thunderbird-140.9.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.cpp 2026-04-21 14:52:58.000000000 +0000 @@ -22,13 +22,6 @@ namespace wmf { -WMFH264Decoder::WMFH264Decoder() : mDecoder(nullptr) { - memset(&mInputStreamInfo, 0, sizeof(MFT_INPUT_STREAM_INFO)); - memset(&mOutputStreamInfo, 0, sizeof(MFT_OUTPUT_STREAM_INFO)); -} - -WMFH264Decoder::~WMFH264Decoder() {} - HRESULT WMFH264Decoder::Init(int32_t aCoreCount) { HRESULT hr; @@ -103,14 +96,6 @@ return S_OK; } -int32_t WMFH264Decoder::GetFrameHeight() const { return mVideoHeight; } - -const IntRect& WMFH264Decoder::GetPictureRegion() const { - return mPictureRegion; -} - -int32_t WMFH264Decoder::GetStride() const { return mStride; } - HRESULT WMFH264Decoder::SetDecoderInputType() { HRESULT hr; @@ -263,7 +248,10 @@ hr = SetDecoderOutputType(); ENSURE(SUCCEEDED(hr), hr); - return GetOutputSample(aOutSample); + hr = mDecoder->GetOutputStreamInfo(0, &mOutputStreamInfo); + ENSURE(SUCCEEDED(hr), hr); + + return MF_E_TRANSFORM_STREAM_CHANGE; } else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { return MF_E_TRANSFORM_NEED_MORE_INPUT; } @@ -300,15 +288,21 @@ WMFH264Decoder::Output(IMFSample** aOutput) { HRESULT hr; CComPtr outputSample; - hr = GetOutputSample(&outputSample); + do { + hr = GetOutputSample(&outputSample); + } while (hr == MF_E_TRANSFORM_STREAM_CHANGE); + if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { return MF_E_TRANSFORM_NEED_MORE_INPUT; } - // Treat other errors as fatal. - ENSURE(SUCCEEDED(hr) && outputSample, hr); - *aOutput = outputSample.Detach(); + ENSURE(SUCCEEDED(hr), hr); + if (!outputSample) { + LOG("GetOutputSample returned success without sample\n"); + return E_UNEXPECTED; + } + *aOutput = outputSample.Detach(); return S_OK; } diff -Nru thunderbird-140.9.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h thunderbird-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h --- thunderbird-140.9.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/gmp-clearkey/0.1/WMFH264Decoder.h 2026-04-21 14:52:58.000000000 +0000 @@ -23,8 +23,8 @@ class WMFH264Decoder { public: - WMFH264Decoder(); - ~WMFH264Decoder(); + WMFH264Decoder() = default; + ~WMFH264Decoder() = default; HRESULT Init(int32_t aCoreCount); @@ -35,9 +35,9 @@ HRESULT Reset(); - int32_t GetFrameHeight() const; - const IntRect& GetPictureRegion() const; - int32_t GetStride() const; + int32_t GetFrameHeight() const { return mVideoHeight; } + const IntRect& GetPictureRegion() const { return mPictureRegion; } + int32_t GetStride() const { return mStride; } HRESULT Drain(); @@ -54,15 +54,15 @@ HRESULT GetOutputSample(IMFSample** aOutSample); HRESULT ConfigureVideoFrameGeometry(IMFMediaType* aMediaType); - MFT_INPUT_STREAM_INFO mInputStreamInfo; - MFT_OUTPUT_STREAM_INFO mOutputStreamInfo; + MFT_INPUT_STREAM_INFO mInputStreamInfo{}; + MFT_OUTPUT_STREAM_INFO mOutputStreamInfo{}; CComPtr mDecoder; - int32_t mVideoWidth; - int32_t mVideoHeight; + int32_t mVideoWidth = 0; + int32_t mVideoHeight = 0; IntRect mPictureRegion; - int32_t mStride; + int32_t mStride = 0; }; } // namespace wmf diff -Nru thunderbird-140.9.0esr/media/libpng/ANNOUNCE thunderbird-140.10.0esr/media/libpng/ANNOUNCE --- thunderbird-140.9.0esr/media/libpng/ANNOUNCE 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/ANNOUNCE 2026-04-21 14:52:58.000000000 +0000 @@ -1,5 +1,5 @@ -libpng 1.6.55 - February 9, 2026 -================================ +libpng 1.6.57 - April 8, 2026 +============================= This is a public release of libpng, intended for use in production code. @@ -9,10 +9,10 @@ Source files: - * libpng-1.6.55.tar.xz (LZMA-compressed, recommended) - * libpng-1.6.55.tar.gz (deflate-compressed) - * lpng1655.7z (LZMA-compressed) - * lpng1655.zip (deflate-compressed) + * libpng-1.6.57.tar.xz (LZMA-compressed, recommended) + * libpng-1.6.57.tar.gz (deflate-compressed) + * lpng1657.7z (LZMA-compressed) + * lpng1657.zip (deflate-compressed) Other information: @@ -22,14 +22,19 @@ * TRADEMARK.md -Changes from version 1.6.54 to version 1.6.55 +Changes from version 1.6.56 to version 1.6.57 --------------------------------------------- - * Fixed CVE-2026-25646 (high severity): - Heap buffer overflow in `png_set_quantize`. - (Reported and fixed by Joshua Inscoe.) - * Resolved an oss-fuzz build issue involving nalloc. - (Contributed by Philippe Antoine.) + * Fixed CVE-2026-34757 (medium severity): + Use-after-free in `png_set_PLTE`, `png_set_tRNS` and `png_set_hIST` + leading to corrupted chunk data and potential heap information disclosure. + Also hardened the append-style setters (`png_set_text`, `png_set_sPLT`, + `png_set_unknown_chunks`) against a theoretical variant of the same + aliasing pattern. + (Reported by Iv4n .) + * Fixed integer overflow in rowbytes computation in read transforms. + (Contributed by Mohammad Seet.) + Send comments/corrections/commendations to png-mng-implement at lists.sf.net. Subscription is required; visit diff -Nru thunderbird-140.9.0esr/media/libpng/AUTHORS thunderbird-140.10.0esr/media/libpng/AUTHORS --- thunderbird-140.9.0esr/media/libpng/AUTHORS 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/AUTHORS 2026-04-21 14:52:58.000000000 +0000 @@ -15,6 +15,7 @@ * Glenn Randers-Pehrson * Greg Roelofs * Guy Eric Schalnat + * Halil Oktay * James Yu * John Bowler * Joshua Inscoe @@ -26,6 +27,7 @@ * Mans Rullgard * Matt Sarett * Mike Klein + * Mohammad Seet * Pascal Massimino * Paul Schmidt * Petr Simecek @@ -34,12 +36,14 @@ * Sam Bushell * Samuel Williams * Simon-Pierre Cadieux + * Taegu Ha (하태구) * Tim Wegner * Tobias Stoeckmann * Tom Lane * Tom Tanner * Vadim Barkov * Willem van Schaik + * Yuelin Wang (王跃林) * Zhijie Liang * Apple Inc. - Zixu Wang (王子旭) diff -Nru thunderbird-140.9.0esr/media/libpng/CHANGES thunderbird-140.10.0esr/media/libpng/CHANGES --- thunderbird-140.9.0esr/media/libpng/CHANGES 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/CHANGES 2026-04-21 14:52:58.000000000 +0000 @@ -6337,6 +6337,48 @@ Resolved an oss-fuzz build issue involving nalloc. (Contributed by Philippe Antoine.) +Version 1.6.56 [March 25, 2026] + Fixed CVE-2026-33416 (high severity): + Use-after-free via pointer aliasing in `png_set_tRNS` and `png_set_PLTE`. + (Reported by Halil Oktay and Ryo Shimada; + fixed by Halil Oktay and Cosmin Truta.) + Fixed CVE-2026-33636 (high severity): + Out-of-bounds read/write in the palette expansion on ARM Neon. + (Reported by Taegu Ha; fixed by Taegu Ha and Cosmin Truta.) + Fixed uninitialized reads beyond `num_trans` in `trans_alpha` buffers. + (Contributed by Halil Oktay.) + Fixed stale `info_ptr->palette` after in-place gamma and background + transforms. + Fixed wrong channel indices in `png_image_read_and_map` RGB_ALPHA path. + (Contributed by Yuelin Wang.) + Fixed wrong background color in colormap read. + (Contributed by Yuelin Wang.) + Fixed dead loop in sPLT write. + (Contributed by Yuelin Wang.) + Added missing null pointer checks in four public API functions. + (Contributed by Yuelin Wang.) + Validated shift bit depths in `png_set_shift` to prevent infinite loop. + (Contributed by Yuelin Wang.) + Avoided undefined behavior in library and tests. + Deprecated the hardly-ever-tested POINTER_INDEXING config option. + Added negative-stride test coverage for the simplified API. + Fixed memory leaks and API misuse in oss-fuzz. + (Contributed by Owen Sanzas.) + Implemented various fixes and improvements in oss-fuzz. + (Contributed by Bob Friesenhahn and Philippe Antoine.) + Performed various refactorings and cleanups. + +Version 1.6.57 [April 8, 2026] + Fixed CVE-2026-34757 (medium severity): + Use-after-free in `png_set_PLTE`, `png_set_tRNS` and `png_set_hIST` + leading to corrupted chunk data and potential heap information disclosure. + Also hardened the append-style setters (`png_set_text`, `png_set_sPLT`, + `png_set_unknown_chunks`) against a theoretical variant of the same + aliasing pattern. + (Reported by Iv4n .) + Fixed integer overflow in rowbytes computation in read transforms. + (Contributed by Mohammad Seet.) + Send comments/corrections/commendations to png-mng-implement at lists.sf.net. Subscription is required; visit diff -Nru thunderbird-140.9.0esr/media/libpng/README thunderbird-140.10.0esr/media/libpng/README --- thunderbird-140.9.0esr/media/libpng/README 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/README 2026-04-21 14:52:58.000000000 +0000 @@ -1,4 +1,4 @@ -README for libpng version 1.6.55 +README for libpng version 1.6.57 ================================ See the note about version numbers near the top of `png.h`. diff -Nru thunderbird-140.9.0esr/media/libpng/arm/palette_neon_intrinsics.c thunderbird-140.10.0esr/media/libpng/arm/palette_neon_intrinsics.c --- thunderbird-140.9.0esr/media/libpng/arm/palette_neon_intrinsics.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/arm/palette_neon_intrinsics.c 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* palette_neon_intrinsics.c - NEON optimised palette expansion functions * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 2017-2018 Arm Holdings. All rights reserved. * Written by Richard Townsend , February 2017. * @@ -48,12 +48,12 @@ w.val[0] = v.val[0]; w.val[1] = v.val[1]; w.val[2] = v.val[2]; - vst4q_u8(riffled_palette + (i << 2), w); + vst4q_u8(riffled_palette + i * 4, w); } /* Fix up the missing transparency values. */ for (i = 0; i < num_trans; i++) - riffled_palette[(i << 2) + 3] = trans_alpha[i]; + riffled_palette[i * 4 + 3] = trans_alpha[i]; } /* Expands a palettized row into RGBA8. */ @@ -77,27 +77,26 @@ * The NEON part writes forward from a given position, so we have * to seek this back by 4 pixels x 4 bytes. */ - *ddp = *ddp - ((pixels_per_chunk * sizeof(png_uint_32)) - 1); + *ddp = *ddp - (pixels_per_chunk * 4 - 1); - for (i = 0; i < row_width; i += pixels_per_chunk) + for (i = 0; i + pixels_per_chunk <= row_width; i += pixels_per_chunk) { uint32x4_t cur; - png_bytep sp = *ssp - i, dp = *ddp - (i << 2); + png_bytep sp = *ssp - i, dp = *ddp - i * 4; cur = vld1q_dup_u32 (riffled_palette + *(sp - 3)); cur = vld1q_lane_u32(riffled_palette + *(sp - 2), cur, 1); cur = vld1q_lane_u32(riffled_palette + *(sp - 1), cur, 2); cur = vld1q_lane_u32(riffled_palette + *(sp - 0), cur, 3); vst1q_u32((void *)dp, cur); } - if (i != row_width) - { - /* Remove the amount that wasn't processed. */ - i -= pixels_per_chunk; - } - /* Decrement output pointers. */ + /* Undo the pre-adjustment of *ddp before the pointer handoff, + * so the scalar fallback in pngrtran.c receives a dp that points + * to the correct position. + */ + *ddp = *ddp + (pixels_per_chunk * 4 - 1); *ssp = *ssp - i; - *ddp = *ddp - (i << 2); + *ddp = *ddp - i * 4; return i; } @@ -118,32 +117,30 @@ return 0; /* Seeking this back by 8 pixels x 3 bytes. */ - *ddp = *ddp - ((pixels_per_chunk * sizeof(png_color)) - 1); + *ddp = *ddp - (pixels_per_chunk * 3 - 1); - for (i = 0; i < row_width; i += pixels_per_chunk) + for (i = 0; i + pixels_per_chunk <= row_width; i += pixels_per_chunk) { uint8x8x3_t cur; - png_bytep sp = *ssp - i, dp = *ddp - ((i << 1) + i); - cur = vld3_dup_u8(palette + sizeof(png_color) * (*(sp - 7))); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 6)), cur, 1); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 5)), cur, 2); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 4)), cur, 3); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 3)), cur, 4); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 2)), cur, 5); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 1)), cur, 6); - cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 0)), cur, 7); + png_bytep sp = *ssp - i, dp = *ddp - i * 3; + cur = vld3_dup_u8(palette + *(sp - 7) * 3); + cur = vld3_lane_u8(palette + *(sp - 6) * 3, cur, 1); + cur = vld3_lane_u8(palette + *(sp - 5) * 3, cur, 2); + cur = vld3_lane_u8(palette + *(sp - 4) * 3, cur, 3); + cur = vld3_lane_u8(palette + *(sp - 3) * 3, cur, 4); + cur = vld3_lane_u8(palette + *(sp - 2) * 3, cur, 5); + cur = vld3_lane_u8(palette + *(sp - 1) * 3, cur, 6); + cur = vld3_lane_u8(palette + *(sp - 0) * 3, cur, 7); vst3_u8((void *)dp, cur); } - if (i != row_width) - { - /* Remove the amount that wasn't processed. */ - i -= pixels_per_chunk; - } - - /* Decrement output pointers. */ + /* Undo the pre-adjustment of *ddp before the pointer handoff, + * so the scalar fallback in pngrtran.c receives a dp that points + * to the correct position. + */ + *ddp = *ddp + (pixels_per_chunk * 3 - 1); *ssp = *ssp - i; - *ddp = *ddp - ((i << 1) + i); + *ddp = *ddp - i * 3; return i; } diff -Nru thunderbird-140.9.0esr/media/libpng/libpng-manual.txt thunderbird-140.10.0esr/media/libpng/libpng-manual.txt --- thunderbird-140.9.0esr/media/libpng/libpng-manual.txt 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/libpng-manual.txt 2026-04-21 14:52:58.000000000 +0000 @@ -9,7 +9,7 @@ Based on: - libpng version 1.6.36, December 2018, through 1.6.55 - February 2026 + libpng version 1.6.36, December 2018, through 1.6.57 - April 2026 Updated and distributed by Cosmin Truta Copyright (c) 2018-2026 Cosmin Truta @@ -2318,7 +2318,7 @@ png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number); Respectively these tell you the width and height of the sub-image -corresponding to the numbered pass. 'pass' is in in the range 0 to 6 - +corresponding to the numbered pass. 'pass' is in the range 0 to 6 - this can be confusing because the specification refers to the same passes as 1 to 7! Be careful, you must check both the width and height before calling png_read_rows() and not call it for that pass if either is zero. @@ -2457,7 +2457,7 @@ This function may be safely called when the relevant storage has already been freed, or has not yet been allocated, or was allocated -by the user and not by libpng, and will in those cases do nothing. +by the user and not by libpng, and will in those cases do nothing. The "seq" parameter is ignored if only one item of the selected data type, such as PLTE, is allowed. If "seq" is not -1, and multiple items are allowed for the data type identified in the mask, such as text or @@ -3292,7 +3292,7 @@ don't have to wait for the disclaimer to go over the modem before they start seeing the image. Finally, keywords should be full words, not abbreviations. Keywords and text are in the ISO 8859-1 -(Latin-1) character set (a superset of regular ASCII) and can not +(Latin-1) character set (a superset of regular ASCII) and cannot contain NUL characters, and should not contain control or other unprintable characters. To make the comments widely readable, stick with basic ASCII, and avoid machine specific character set extensions @@ -3694,7 +3694,7 @@ This function may be safely called when the relevant storage has already been freed, or has not yet been allocated, or was allocated -by the user and not by libpng, and will in those cases do nothing. +by the user and not by libpng, and will in those cases do nothing. The "seq" parameter is ignored if only one item of the selected data type, such as PLTE, is allowed. If "seq" is not -1, and multiple items are allowed for the data type identified in the mask, such as text or diff -Nru thunderbird-140.9.0esr/media/libpng/moz.yaml thunderbird-140.10.0esr/media/libpng/moz.yaml --- thunderbird-140.9.0esr/media/libpng/moz.yaml 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/moz.yaml 2026-04-21 14:52:58.000000000 +0000 @@ -11,8 +11,9 @@ url: "http://www.libpng.org/pub/png/libpng.html" license: libpng - release: v1.6.55 (2026-02-09T22:02:20+02:00). - revision: v1.6.55 + release: v1.6.57 (2026-04-08T23:49:24+03:00). + + revision: "v1.6.57" license-file: LICENSE diff -Nru thunderbird-140.9.0esr/media/libpng/png.c thunderbird-140.10.0esr/media/libpng/png.c --- thunderbird-140.9.0esr/media/libpng/png.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/png.c 2026-04-21 14:52:58.000000000 +0000 @@ -13,7 +13,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_55 Your_png_h_is_not_version_1_6_55; +typedef png_libpng_version_1_6_57 Your_png_h_is_not_version_1_6_57; /* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the * corresponding macro definitions. This causes a compile time failure if @@ -820,7 +820,7 @@ return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.55" PNG_STRING_NEWLINE \ + "libpng version 1.6.57" PNG_STRING_NEWLINE \ "Copyright (c) 2018-2026 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ @@ -1170,7 +1170,7 @@ return 1; /* The reference white is simply the sum of the end-point (X,Y,Z) vectors so - * the fillowing calculates (X+Y+Z) of the reference white (media white, + * the following calculates (X+Y+Z) of the reference white (media white, * encoding white) itself: */ d = dblue; @@ -1215,9 +1215,9 @@ * (-0.0770) because the PNG spec itself requires the xy values to be * unsigned. whitey is also required to be 5 or more to avoid overflow. * - * Instead the upper limits have been relaxed to accomodate ACES AP1 where + * Instead the upper limits have been relaxed to accommodate ACES AP1 where * redz ends up as -600 (-0.006). ProPhotoRGB was already "in range." - * The new limit accomodates the AP0 and AP1 ranges for z but not AP0 redy. + * The new limit accommodates the AP0 and AP1 ranges for z but not AP0 redy. */ const png_fixed_point fpLimit = PNG_FP_1+(PNG_FP_1/10); if (xy->redx < 0 || xy->redx > fpLimit) return 1; @@ -1328,7 +1328,7 @@ * red-scale + green-scale + blue-scale = 1/white-y = white-scale * * So now we have a Cramer's rule solution where the determinants are just - * 3x3 - far more tractible. Unfortunately 3x3 determinants still involve + * 3x3 - far more tractable. Unfortunately 3x3 determinants still involve * multiplication of three coefficients so we can't guarantee to avoid * overflow in the libpng fixed point representation. Using Cramer's rule in * floating point is probably a good choice here, but it's not an option for @@ -1697,7 +1697,7 @@ * into R, G and B channels. * * Previously it was suggested that an RGB profile on grayscale data could be - * handled. However it it is clear that using an RGB profile in this context + * handled. However it is clear that using an RGB profile in this context * must be an error - there is no specification of what it means. Thus it is * almost certainly more correct to ignore the profile. */ @@ -2915,7 +2915,7 @@ * * 2.2/(2+51/256) == 1.00035524 * - * I.e. vanishly small (<4E-4) but still detectable in 16-bit linear (+/- + * I.e. vanishingly small (<4E-4) but still detectable in 16-bit linear (+/- * 23). Note that the Adobe choice seems to be something intended to give an * exact number with 8 binary fractional digits - it is the closest to 2.2 * that is possible a base 2 .8p representation. diff -Nru thunderbird-140.9.0esr/media/libpng/png.h thunderbird-140.10.0esr/media/libpng/png.h --- thunderbird-140.9.0esr/media/libpng/png.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/png.h 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.55 + * libpng version 1.6.57 * * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson @@ -14,7 +14,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.55, February 2026: + * libpng versions 1.6.36, December 2018, through 1.6.57, April 2026: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -238,7 +238,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.55 16 10655 16.so.16.55[.0] + * 1.6.57 16 10657 16.so.16.57[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -274,7 +274,7 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.55" +#define PNG_LIBPNG_VER_STRING "1.6.57" #define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n" /* The versions of shared library builds should stay in sync, going forward */ @@ -285,7 +285,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 55 +#define PNG_LIBPNG_VER_RELEASE 57 /* This should be zero for a public release, or non-zero for a * development version. @@ -316,7 +316,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10655 /* 1.6.55 */ +#define PNG_LIBPNG_VER 10657 /* 1.6.57 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -441,7 +441,7 @@ /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char *png_libpng_version_1_6_55; +typedef char *png_libpng_version_1_6_57; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -2360,7 +2360,7 @@ #endif /* Note while png_set_text() will accept a structure whose text, - * language, and translated keywords are NULL pointers, the structure + * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. diff -Nru thunderbird-140.9.0esr/media/libpng/pngconf.h thunderbird-140.10.0esr/media/libpng/pngconf.h --- thunderbird-140.9.0esr/media/libpng/pngconf.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngconf.h 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.55 + * libpng version 1.6.57 * * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson diff -Nru thunderbird-140.9.0esr/media/libpng/pngpriv.h thunderbird-140.10.0esr/media/libpng/pngpriv.h --- thunderbird-140.9.0esr/media/libpng/pngpriv.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngpriv.h 2026-04-21 14:52:58.000000000 +0000 @@ -971,7 +971,7 @@ * * At present these index values are not exported (not part of the public API) * so can be changed at will. For convenience the names are in lexical sort - * order but with the critical chunks at the start in the order of occurence in + * order but with the critical chunks at the start in the order of occurrence in * a PNG. * * PNG_INFO_ values do not exist for every one of these chunk handles; for @@ -2143,7 +2143,7 @@ * not valid it will be the index of a character in the supposed number. * * The format of a number is defined in the PNG extensions specification - * and this API is strictly conformant to that spec, not anyone elses! + * and this API is strictly conformant to that spec, not anyone else's! * * The format as a regular expression is: * diff -Nru thunderbird-140.9.0esr/media/libpng/pngread.c thunderbird-140.10.0esr/media/libpng/pngread.c --- thunderbird-140.9.0esr/media/libpng/pngread.c 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngread.c 2026-04-21 14:52:58.000000000 +0000 @@ -771,7 +771,7 @@ png_read_finish_IDAT(png_ptr); #ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Report invalid palette index; added at libng-1.5.10 */ + /* Report invalid palette index; added at libpng-1.5.10 */ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_palette_max >= png_ptr->num_palette) png_benign_error(png_ptr, "Read palette index exceeding num_palette"); @@ -859,21 +859,19 @@ png_ptr->quantize_index = NULL; #endif - if ((png_ptr->free_me & PNG_FREE_PLTE) != 0) - { - png_zfree(png_ptr, png_ptr->palette); - png_ptr->palette = NULL; - } - png_ptr->free_me &= ~PNG_FREE_PLTE; + /* png_ptr->palette is always independently allocated (not aliased + * with info_ptr->palette), so free it unconditionally. + */ + png_free(png_ptr, png_ptr->palette); + png_ptr->palette = NULL; #if defined(PNG_tRNS_SUPPORTED) || \ defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if ((png_ptr->free_me & PNG_FREE_TRNS) != 0) - { - png_free(png_ptr, png_ptr->trans_alpha); - png_ptr->trans_alpha = NULL; - } - png_ptr->free_me &= ~PNG_FREE_TRNS; + /* png_ptr->trans_alpha is always independently allocated (not aliased + * with info_ptr->trans_alpha), so free it unconditionally. + */ + png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->trans_alpha = NULL; #endif inflateEnd(&png_ptr->zstream); @@ -1336,7 +1334,7 @@ * png_struct::chromaticities always exists since the simplified API * requires rgb-to-gray. The mDCV, cICP and cHRM chunks may all set it to * a non-sRGB value, so it needs to be checked but **only** if one of - * those chunks occured in the file. + * those chunks occurred in the file. */ /* Highest priority: check to be safe. */ if (png_has_chunk(png_ptr, cICP) || png_has_chunk(png_ptr, mDCV)) @@ -2676,7 +2674,7 @@ { r = back_r; g = back_g; - b = back_g; + b = back_b; } /* Compare the newly-created color-map entry with the one the @@ -2954,9 +2952,9 @@ { png_bytep inrow = png_voidcast(png_bytep, display->local_row); png_bytep outrow = first_row + y * row_step; - png_const_bytep end_row = outrow + width; + png_const_bytep row_end = outrow + width; - /* Read read the libpng data into the temporary buffer. */ + /* Read the libpng data into the temporary buffer. */ png_read_row(png_ptr, inrow, NULL); /* Now process the row according to the processing option, note @@ -2967,7 +2965,7 @@ switch (proc) { case PNG_CMAP_GA: - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { /* The data is always in the PNG order */ unsigned int gray = *inrow++; @@ -2996,7 +2994,7 @@ break; case PNG_CMAP_TRANS: - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { png_byte gray = *inrow++; png_byte alpha = *inrow++; @@ -3013,7 +3011,7 @@ break; case PNG_CMAP_RGB: - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]); inrow += 3; @@ -3021,7 +3019,7 @@ break; case PNG_CMAP_RGB_ALPHA: - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { unsigned int alpha = inrow[3]; @@ -3058,10 +3056,10 @@ */ if (inrow[0] & 0x80) back_i += 9; /* red */ if (inrow[0] & 0x40) back_i += 9; - if (inrow[0] & 0x80) back_i += 3; /* green */ - if (inrow[0] & 0x40) back_i += 3; - if (inrow[0] & 0x80) back_i += 1; /* blue */ - if (inrow[0] & 0x40) back_i += 1; + if (inrow[1] & 0x80) back_i += 3; /* green */ + if (inrow[1] & 0x40) back_i += 3; + if (inrow[2] & 0x80) back_i += 1; /* blue */ + if (inrow[2] & 0x40) back_i += 1; *outrow = (png_byte)back_i; } @@ -3328,18 +3326,18 @@ { png_bytep inrow = png_voidcast(png_bytep, display->local_row); png_bytep outrow; - png_const_bytep end_row; + png_const_bytep row_end; /* Read the row, which is packed: */ png_read_row(png_ptr, inrow, NULL); outrow = png_voidcast(png_bytep, display->first_row); outrow += y * row_step; - end_row = outrow + width * channels; + row_end = outrow + width * channels; /* Now do the composition on each pixel in this row. */ outrow += startx; - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { png_byte alpha = inrow[channels]; @@ -3512,14 +3510,14 @@ png_bytep inrow = png_voidcast(png_bytep, display->local_row); png_bytep outrow = first_row + y * row_step; - png_const_bytep end_row = outrow + width; + png_const_bytep row_end = outrow + width; /* Read the row, which is packed: */ png_read_row(png_ptr, inrow, NULL); /* Now do the composition on each pixel in this row. */ outrow += startx; - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { png_byte alpha = inrow[1]; @@ -3557,14 +3555,14 @@ png_bytep inrow = png_voidcast(png_bytep, display->local_row); png_bytep outrow = first_row + y * row_step; - png_const_bytep end_row = outrow + width; + png_const_bytep row_end = outrow + width; /* Read the row, which is packed: */ png_read_row(png_ptr, inrow, NULL); /* Now do the composition on each pixel in this row. */ outrow += startx; - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { png_byte alpha = inrow[1]; @@ -3647,7 +3645,7 @@ { png_const_uint_16p inrow; png_uint_16p outrow = first_row + y * row_step; - png_uint_16p end_row = outrow + width * outchannels; + png_uint_16p row_end = outrow + width * outchannels; /* Read the row, which is packed: */ png_read_row(png_ptr, png_voidcast(png_bytep, @@ -3657,7 +3655,7 @@ /* Now do the pre-multiplication on each pixel in this row. */ outrow += startx; - for (; outrow < end_row; outrow += stepx) + for (; outrow < row_end; outrow += stepx) { png_uint_32 component = inrow[0]; png_uint_16 alpha = inrow[1]; @@ -4193,7 +4191,7 @@ row_stride = (png_int_32)/*SAFE*/png_row_stride; if (row_stride < 0) - check = (png_uint_32)(-row_stride); + check = -(png_uint_32)row_stride; else check = (png_uint_32)row_stride; diff -Nru thunderbird-140.9.0esr/media/libpng/pngrtran.c thunderbird-140.10.0esr/media/libpng/pngrtran.c --- thunderbird-140.9.0esr/media/libpng/pngrtran.c 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngrtran.c 2026-04-21 14:52:58.000000000 +0000 @@ -230,7 +230,7 @@ * * Terminology (assuming power law, "gamma", encodings): * "screen" gamma: a power law imposed by the output device when digital - * samples are converted to visible light output. The EOTF - volage to + * samples are converted to visible light output. The EOTF - voltage to * luminance on output. * * "file" gamma: a power law used to encode luminance levels from the input @@ -495,6 +495,9 @@ if (png_rtran_ok(png_ptr, 0) == 0) return; + if (palette == NULL) + return; + png_ptr->transformations |= PNG_QUANTIZE; if (full_quantize == 0) @@ -811,7 +814,13 @@ } if (png_ptr->palette == NULL) { - png_ptr->palette = palette; + /* Allocate an owned copy rather than aliasing the caller's pointer, + * so that png_read_destroy can free png_ptr->palette unconditionally. + */ + png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr, + PNG_MAX_PALETTE_LENGTH * (sizeof (png_color)))); + memcpy(png_ptr->palette, palette, (unsigned int)num_palette * + (sizeof (png_color))); } png_ptr->num_palette = (png_uint_16)num_palette; @@ -1364,7 +1373,7 @@ if (file_gamma != 0) return file_gamma; - /* If png_reciprocal oveflows it returns 0 which indicates to the caller that + /* If png_reciprocal overflows, it returns 0, indicating to the caller that * there is no usable file gamma. (The checks added to png_set_gamma and * png_set_alpha_mode should prevent a screen_gamma which would overflow.) */ @@ -2061,6 +2070,21 @@ { png_debug(1, "in png_read_transform_info"); + if (png_ptr->transformations != 0) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + info_ptr->palette != NULL && png_ptr->palette != NULL) + { + /* Sync info_ptr->palette with png_ptr->palette. + * The function png_init_read_transformations may have modified + * png_ptr->palette in place (e.g. for gamma correction or for + * background compositing). + */ + memcpy(info_ptr->palette, png_ptr->palette, + PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))); + } + } + #ifdef PNG_READ_EXPAND_SUPPORTED if ((png_ptr->transformations & PNG_EXPAND) != 0) { @@ -2355,7 +2379,7 @@ } row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_width * row_info->channels; + row_info->rowbytes = (size_t)row_width * row_info->channels; } } #endif @@ -2557,7 +2581,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; + row_info->rowbytes = (size_t)row_info->width * row_info->channels; } } #endif @@ -2585,7 +2609,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; + row_info->rowbytes = (size_t)row_info->width * row_info->channels; } } #endif @@ -2821,7 +2845,7 @@ *(--dp) = lo_filler; row_info->channels = 2; row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; + row_info->rowbytes = (size_t)row_width * 2; } else @@ -2836,7 +2860,7 @@ } row_info->channels = 2; row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; + row_info->rowbytes = (size_t)row_width * 2; } } @@ -2859,7 +2883,7 @@ *(--dp) = hi_filler; row_info->channels = 2; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } else @@ -2876,7 +2900,7 @@ } row_info->channels = 2; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } } #endif @@ -2900,7 +2924,7 @@ *(--dp) = lo_filler; row_info->channels = 4; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } else @@ -2917,7 +2941,7 @@ } row_info->channels = 4; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; } } @@ -2944,7 +2968,7 @@ *(--dp) = hi_filler; row_info->channels = 4; row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; + row_info->rowbytes = (size_t)row_width * 8; } else @@ -2966,7 +2990,7 @@ row_info->channels = 4; row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; + row_info->rowbytes = (size_t)row_width * 8; } } #endif @@ -4460,7 +4484,7 @@ } row_info->bit_depth = 8; row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; + row_info->rowbytes = (size_t)row_width * 4; row_info->color_type = 6; row_info->channels = 4; } @@ -4468,7 +4492,7 @@ else { sp = row + (size_t)row_width - 1; - dp = row + (size_t)(row_width * 3) - 1; + dp = row + (size_t)row_width * 3 - 1; i = 0; #ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE i = png_do_expand_palette_rgb8_neon(png_ptr, row_info, row, @@ -4487,7 +4511,7 @@ row_info->bit_depth = 8; row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; + row_info->rowbytes = (size_t)row_width * 3; row_info->color_type = 2; row_info->channels = 3; } diff -Nru thunderbird-140.9.0esr/media/libpng/pngrutil.c thunderbird-140.10.0esr/media/libpng/pngrutil.c --- thunderbird-140.9.0esr/media/libpng/pngrutil.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngrutil.c 2026-04-21 14:52:57.000000000 +0000 @@ -436,7 +436,7 @@ * be gained by using this when it is known *if* the zlib stream itself does * not record the number; however, this is an illusion: the original writer * of the PNG may have selected a lower window size, and we really must - * follow that because, for systems with with limited capabilities, we + * follow that because, for systems with limited capabilities, we * would otherwise reject the application's attempts to use a smaller window * size (zlib doesn't have an interface to say "this or lower"!). * @@ -1011,7 +1011,7 @@ * in the case of an 8-bit display with a decoder which controls the palette. * * The alternative here is to ignore the error and store the palette anyway; - * destroying the tRNS will definately cause problems. + * destroying the tRNS will definitely cause problems. * * NOTE: the case of PNG_COLOR_TYPE_PALETTE need not be considered because * the png_handle_ routines for the three 'after PLTE' chunks tRNS, bKGD and @@ -1058,19 +1058,6 @@ /* A valid PLTE chunk has been read */ png_ptr->mode |= PNG_HAVE_PLTE; - /* TODO: png_set_PLTE has the side effect of setting png_ptr->palette to - * its own copy of the palette. This has the side effect that when - * png_start_row is called (this happens after any call to - * png_read_update_info) the info_ptr palette gets changed. This is - * extremely unexpected and confusing. - * - * REVIEW: there have been consistent bugs in the past about gamma and - * similar transforms to colour mapped images being useless because the - * modified palette cannot be accessed because of the above. - * - * CONSIDER: Fix this by not sharing the palette in this way. But does - * this completely fix the problem? - */ png_set_PLTE(png_ptr, info_ptr, palette, num); return handled_ok; } @@ -1272,7 +1259,7 @@ /* png_set_cHRM may complain about some of the values but this doesn't matter * because it was a cHRM and it did have vaguely (if, perhaps, ridiculous) - * values. Ridiculousity will be checked if the values are used later. + * values. Ridiculosity will be checked if the values are used later. */ png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy, xy.greenx, xy.greeny, xy.bluex, xy.bluey); @@ -1569,7 +1556,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) /* Note: this does not properly handle chunks that are > 64K under DOS */ { - png_bytep entry_start, buffer; + png_bytep buffer; + png_bytep entry_start; png_sPLT_t new_palette; png_sPLT_entryp pp; png_uint_32 data_length; @@ -1776,10 +1764,6 @@ return handled_error; } - /* TODO: this is a horrible side effect in the palette case because the - * png_struct ends up with a pointer to the tRNS buffer owned by the - * png_info. Fix this. - */ png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, &(png_ptr->trans_color)); return handled_ok; @@ -2038,7 +2022,7 @@ return handled_error; /* PNGv3: the code used to check the byte order mark at the start for MM or - * II, however PNGv3 states that the the first 4 bytes should be checked. + * II, however PNGv3 states that the first 4 bytes should be checked. * The caller ensures that there are four bytes available. */ { @@ -2160,9 +2144,13 @@ static png_handle_result_code /* PRIVATE */ png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) { + png_bytep buffer; + png_bytep buf; + png_bytep endptr; png_int_32 X0, X1; - png_byte type, nparams; - png_bytep buffer, buf, units, endptr; + png_byte type; + png_byte nparams; + png_byte *units; png_charpp params; int i; @@ -3190,7 +3178,7 @@ png_uint_32 max_length :12; /* Length min, max in bytes */ png_uint_32 min_length :8; /* Length errors on critical chunks have special handling to preserve the - * existing behaviour in libpng 1.6. Anciallary chunks are checked below + * existing behaviour in libpng 1.6. Ancillary chunks are checked below * and produce a 'benign' error. */ png_uint_32 pos_before :4; /* PNG_HAVE_ values chunk must precede */ @@ -3198,7 +3186,7 @@ /* NOTE: PLTE, tRNS and bKGD require special handling which depends on * the colour type of the base image. */ - png_uint_32 multiple :1; /* Multiple occurences permitted */ + png_uint_32 multiple :1; /* Multiple occurrences permitted */ /* This is enabled for PLTE because PLTE may, in practice, be optional */ } read_chunks[PNG_INDEX_unknown] = @@ -3232,7 +3220,7 @@ # define CDIHDR 13U, 13U, hIHDR, 0, 0 # define CDPLTE NoCheck, 0U, 0, hIHDR, 1 /* PLTE errors are only critical for colour-map images, consequently the - * hander does all the checks. + * handler does all the checks. */ # define CDIDAT NoCheck, 0U, aIDAT, hIHDR, 1 # define CDIEND NoCheck, 0U, 0, aIDAT, 0 diff -Nru thunderbird-140.9.0esr/media/libpng/pngset.c thunderbird-140.10.0esr/media/libpng/pngset.c --- thunderbird-140.9.0esr/media/libpng/pngset.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngset.c 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* pngset.c - storage of image information into info struct * - * Copyright (c) 2018-2025 Cosmin Truta + * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -333,7 +333,8 @@ png_debug1(1, "in %s storage function", "eXIf"); if (png_ptr == NULL || info_ptr == NULL || - (png_ptr->mode & PNG_WROTE_eXIf) != 0) + (png_ptr->mode & PNG_WROTE_eXIf) != 0 || + exif == NULL) return; new_exif = png_voidcast(png_bytep, png_malloc_warn(png_ptr, num_exif)); @@ -384,11 +385,12 @@ png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr, png_const_uint_16p hist) { + png_uint_16 safe_hist[PNG_MAX_PALETTE_LENGTH]; int i; png_debug1(1, "in %s storage function", "hIST"); - if (png_ptr == NULL || info_ptr == NULL) + if (png_ptr == NULL || info_ptr == NULL || hist == NULL) return; if (info_ptr->num_palette == 0 || info_ptr->num_palette @@ -400,6 +402,13 @@ return; } + /* Snapshot the caller's hist before freeing, in case it points to + * info_ptr->hist (getter-to-setter aliasing). + */ + memcpy(safe_hist, hist, (unsigned int)info_ptr->num_palette * + (sizeof (png_uint_16))); + hist = safe_hist; + png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in @@ -746,7 +755,7 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_const_colorp palette, int num_palette) { - + png_color safe_palette[PNG_MAX_PALETTE_LENGTH]; png_uint_32 max_palette_length; png_debug1(1, "in %s storage function", "PLTE"); @@ -780,28 +789,47 @@ png_error(png_ptr, "Invalid palette"); } - /* It may not actually be necessary to set png_ptr->palette here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - * - * 1.6.0: the above statement appears to be incorrect; something has to set - * the palette inside png_struct on read. + /* Snapshot the caller's palette before freeing, in case it points to + * info_ptr->palette (getter-to-setter aliasing). */ + if (num_palette > 0) + memcpy(safe_palette, palette, (unsigned int)num_palette * + (sizeof (png_color))); + + palette = safe_palette; + png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead * of num_palette entries, in case of an invalid PNG file or incorrect * call to png_set_PLTE() with too-large sample values. + * + * Allocate independent buffers for info_ptr and png_ptr so that the + * lifetime of png_ptr->palette is decoupled from the lifetime of + * info_ptr->palette. Previously, these two pointers were aliased, + * which caused a use-after-free vulnerability if png_free_data freed + * info_ptr->palette while png_ptr->palette was still in use by the + * row transform functions (e.g. png_do_expand_palette). + * + * Both buffers are allocated with png_calloc to zero-fill, because + * the ARM NEON palette riffle reads all 256 entries unconditionally, + * regardless of num_palette. */ + png_free(png_ptr, png_ptr->palette); png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr, PNG_MAX_PALETTE_LENGTH * (sizeof (png_color)))); + info_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr, + PNG_MAX_PALETTE_LENGTH * (sizeof (png_color)))); + png_ptr->num_palette = info_ptr->num_palette = (png_uint_16)num_palette; if (num_palette > 0) + { + memcpy(info_ptr->palette, palette, (unsigned int)num_palette * + (sizeof (png_color))); memcpy(png_ptr->palette, palette, (unsigned int)num_palette * (sizeof (png_color))); + } - info_ptr->palette = png_ptr->palette; - info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; info_ptr->free_me |= PNG_FREE_PLTE; info_ptr->valid |= PNG_INFO_PLTE; } @@ -931,6 +959,7 @@ png_const_textp text_ptr, int num_text) { int i; + png_textp old_text = NULL; png_debug1(1, "in text storage function, chunk typeid = 0x%lx", png_ptr == NULL ? 0xabadca11UL : (unsigned long)png_ptr->chunk_name); @@ -978,7 +1007,10 @@ return 1; } - png_free(png_ptr, info_ptr->text); + /* Defer freeing the old array until after the copy loop below, + * in case text_ptr aliases info_ptr->text (getter-to-setter). + */ + old_text = info_ptr->text; info_ptr->text = new_text; info_ptr->free_me |= PNG_FREE_TEXT; @@ -1063,6 +1095,7 @@ { png_chunk_report(png_ptr, "text chunk: out of memory", PNG_CHUNK_WRITE_ERROR); + png_free(png_ptr, old_text); return 1; } @@ -1116,6 +1149,8 @@ png_debug1(3, "transferred text chunk %d", info_ptr->num_text); } + png_free(png_ptr, old_text); + return 0; } #endif @@ -1159,28 +1194,50 @@ if (trans_alpha != NULL) { - /* It may not actually be necessary to set png_ptr->trans_alpha here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - * - * 1.6.0: The above statement is incorrect; png_handle_tRNS effectively - * relies on png_set_tRNS storing the information in png_struct - * (otherwise it won't be there for the code in pngrtran.c). + /* Snapshot the caller's trans_alpha before freeing, in case it + * points to info_ptr->trans_alpha (getter-to-setter aliasing). */ + png_byte safe_trans[PNG_MAX_PALETTE_LENGTH]; + + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) + memcpy(safe_trans, trans_alpha, (size_t)num_trans); + + trans_alpha = safe_trans; png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) { - /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ + /* Allocate info_ptr's copy of the transparency data. + * Initialize all entries to fully opaque (0xff), then overwrite + * the first num_trans entries with the actual values. + */ info_ptr->trans_alpha = png_voidcast(png_bytep, png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); + memset(info_ptr->trans_alpha, 0xff, PNG_MAX_PALETTE_LENGTH); memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans); - info_ptr->free_me |= PNG_FREE_TRNS; info_ptr->valid |= PNG_INFO_tRNS; + + /* Allocate an independent copy for png_struct, so that the + * lifetime of png_ptr->trans_alpha is decoupled from the + * lifetime of info_ptr->trans_alpha. Previously these two + * pointers were aliased, which caused a use-after-free if + * png_free_data freed info_ptr->trans_alpha while + * png_ptr->trans_alpha was still in use by the row transform + * functions (e.g. png_do_expand_palette). + */ + png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->trans_alpha = png_voidcast(png_bytep, + png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); + memset(png_ptr->trans_alpha, 0xff, PNG_MAX_PALETTE_LENGTH); + memcpy(png_ptr->trans_alpha, trans_alpha, (size_t)num_trans); + } + else + { + png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->trans_alpha = NULL; } - png_ptr->trans_alpha = info_ptr->trans_alpha; } if (trans_color != NULL) @@ -1231,6 +1288,7 @@ */ { png_sPLT_tp np; + png_sPLT_tp old_spalettes; png_debug1(1, "in %s storage function", "sPLT"); @@ -1251,7 +1309,10 @@ return; } - png_free(png_ptr, info_ptr->splt_palettes); + /* Defer freeing the old array until after the copy loop below, + * in case entries aliases info_ptr->splt_palettes (getter-to-setter). + */ + old_spalettes = info_ptr->splt_palettes; info_ptr->splt_palettes = np; info_ptr->free_me |= PNG_FREE_SPLT; @@ -1315,6 +1376,8 @@ } while (--nentries); + png_free(png_ptr, old_spalettes); + if (nentries > 0) png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR); } @@ -1503,6 +1566,7 @@ png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) { png_unknown_chunkp np; + png_unknown_chunkp old_unknowns; if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 || unknowns == NULL) @@ -1549,7 +1613,10 @@ return; } - png_free(png_ptr, info_ptr->unknown_chunks); + /* Defer freeing the old array until after the copy loop below, + * in case unknowns aliases info_ptr->unknown_chunks (getter-to-setter). + */ + old_unknowns = info_ptr->unknown_chunks; info_ptr->unknown_chunks = np; /* safe because it is initialized */ info_ptr->free_me |= PNG_FREE_UNKN; @@ -1595,6 +1662,8 @@ ++np; ++(info_ptr->unknown_chunks_num); } + + png_free(png_ptr, old_unknowns); } void PNGAPI @@ -2018,7 +2087,7 @@ #endif /* BENIGN_ERRORS */ #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Whether to report invalid palette index; added at libng-1.5.10. + /* Whether to report invalid palette index; added at libpng-1.5.10. * It is possible for an indexed (color-type==3) PNG file to contain * pixels with invalid (out-of-range) indexes if the PLTE chunk has * fewer entries than the image's bit-depth would allow. We recover diff -Nru thunderbird-140.9.0esr/media/libpng/pngstruct.h thunderbird-140.10.0esr/media/libpng/pngstruct.h --- thunderbird-140.9.0esr/media/libpng/pngstruct.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngstruct.h 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* pngstruct.h - internal structures for libpng * - * Copyright (c) 2018-2025 Cosmin Truta + * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -106,7 +106,7 @@ * TODO: C23: convert these macros to C23 inlines (which are static). */ #define png_chunk_flag_from_index(i) (0x80000000U >> (31 - (i))) - /* The flag coresponding to the given png_index enum value. This is defined + /* The flag corresponding to the given png_index enum value. This is defined * for png_unknown as well (until it reaches the value 32) but this should * not be relied on. */ @@ -115,7 +115,7 @@ (((png_ptr)->chunks & png_chunk_flag_from_index(i)) != 0) /* The chunk has been recorded in png_struct */ -#define png_file_add_chunk(pnt_ptr, i)\ +#define png_file_add_chunk(png_ptr, i)\ ((void)((png_ptr)->chunks |= png_chunk_flag_from_index(i))) /* Record the chunk in the png_struct */ diff -Nru thunderbird-140.9.0esr/media/libpng/pngtrans.c thunderbird-140.10.0esr/media/libpng/pngtrans.c --- thunderbird-140.9.0esr/media/libpng/pngtrans.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngtrans.c 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Copyright (c) 2018-2024 Cosmin Truta + * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -84,9 +84,38 @@ { png_debug(1, "in png_set_shift"); - if (png_ptr == NULL) + if (png_ptr == NULL || true_bits == NULL) return; + /* Check the shift values before passing them on to png_do_shift. */ + { + png_byte bit_depth = png_ptr->bit_depth; + int invalid = 0; + + if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0) + { + if (true_bits->red == 0 || true_bits->red > bit_depth || + true_bits->green == 0 || true_bits->green > bit_depth || + true_bits->blue == 0 || true_bits->blue > bit_depth) + invalid = 1; + } + else + { + if (true_bits->gray == 0 || true_bits->gray > bit_depth) + invalid = 1; + } + + if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 && + (true_bits->alpha == 0 || true_bits->alpha > bit_depth)) + invalid = 1; + + if (invalid) + { + png_app_error(png_ptr, "png_set_shift: invalid shift values"); + return; + } + } + png_ptr->transformations |= PNG_SHIFT; png_ptr->shift = *true_bits; } @@ -457,10 +486,9 @@ if (row_info->bit_depth < 8) { + png_const_bytep table; png_bytep rp; - png_const_bytep end, table; - - end = row + row_info->rowbytes; + png_bytep row_end = row + row_info->rowbytes; if (row_info->bit_depth == 1) table = onebppswaptable; @@ -474,7 +502,7 @@ else return; - for (rp = row; rp < end; rp++) + for (rp = row; rp < row_end; rp++) *rp = table[*rp]; } } diff -Nru thunderbird-140.9.0esr/media/libpng/pngwrite.c thunderbird-140.10.0esr/media/libpng/pngwrite.c --- thunderbird-140.9.0esr/media/libpng/pngwrite.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngwrite.c 2026-04-21 14:52:58.000000000 +0000 @@ -163,7 +163,7 @@ * them. * * PNG v3: Chunks mDCV and cLLI provide ancillary information for the - * interpretation of the colourspace chunkgs but do not require support for + * interpretation of the colourspace chunks but do not require support for * those chunks so are outside the "COLORSPACE" check but before the write of * the colourspace chunks themselves. */ @@ -1019,6 +1019,16 @@ png_ptr->chunk_list = NULL; #endif +#if defined(PNG_tRNS_SUPPORTED) + /* Free the independent copy of trans_alpha owned by png_struct. */ + png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->trans_alpha = NULL; +#endif + + /* Free the independent copy of the palette owned by png_struct. */ + png_free(png_ptr, png_ptr->palette); + png_ptr->palette = NULL; + /* The error handling and memory handling information is left intact at this * point: the jmp_buf may still have to be freed. See png_destroy_png_struct * for how this happens. @@ -2029,7 +2039,7 @@ display->row_stride = (png_int_32)/*SAFE*/png_row_stride; if (display->row_stride < 0) - check = (png_uint_32)(-display->row_stride); + check = -(png_uint_32)display->row_stride; else check = (png_uint_32)display->row_stride; @@ -2228,7 +2238,7 @@ static void (PNGCBAPI -image_memory_write)(png_structp png_ptr, png_bytep/*const*/ data, size_t size) +image_memory_write)(png_structp png_ptr, png_bytep data, size_t size) { png_image_write_control *display = png_voidcast(png_image_write_control*, png_ptr->io_ptr/*backdoor: png_get_io_ptr(png_ptr)*/); diff -Nru thunderbird-140.9.0esr/media/libpng/pngwutil.c thunderbird-140.10.0esr/media/libpng/pngwutil.c --- thunderbird-140.9.0esr/media/libpng/pngwutil.c 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/media/libpng/pngwutil.c 2026-04-21 14:52:58.000000000 +0000 @@ -1,6 +1,6 @@ /* pngwutil.c - utilities to write a PNG file * - * Copyright (c) 2018-2025 Cosmin Truta + * Copyright (c) 2018-2026 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -909,7 +909,6 @@ png_debug1(3, "num_palette = %d", png_ptr->num_palette); png_write_chunk_header(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3)); -#ifdef PNG_POINTER_INDEXING_SUPPORTED for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) { @@ -919,21 +918,6 @@ png_write_chunk_data(png_ptr, buf, 3); } -#else - /* This is a little slower but some buggy compilers need to do this - * instead - */ - pal_ptr=palette; - - for (i = 0; i < num_pal; i++) - { - buf[0] = pal_ptr[i].red; - buf[1] = pal_ptr[i].green; - buf[2] = pal_ptr[i].blue; - png_write_chunk_data(png_ptr, buf, 3); - } - -#endif png_write_chunk_end(png_ptr); png_ptr->mode |= PNG_HAVE_PLTE; } @@ -1232,9 +1216,6 @@ size_t entry_size = (spalette->depth == 8 ? 6 : 10); size_t palette_size = entry_size * (size_t)spalette->nentries; png_sPLT_entryp ep; -#ifndef PNG_POINTER_INDEXING_SUPPORTED - int i; -#endif png_debug(1, "in png_write_sPLT"); @@ -1252,7 +1233,6 @@ png_write_chunk_data(png_ptr, &spalette->depth, 1); /* Loop through each palette entry, writing appropriately */ -#ifdef PNG_POINTER_INDEXING_SUPPORTED for (ep = spalette->entries; epentries + spalette->nentries; ep++) { if (spalette->depth == 8) @@ -1275,31 +1255,6 @@ png_write_chunk_data(png_ptr, entrybuf, entry_size); } -#else - ep=spalette->entries; - for (i = 0; i>spalette->nentries; i++) - { - if (spalette->depth == 8) - { - entrybuf[0] = (png_byte)ep[i].red; - entrybuf[1] = (png_byte)ep[i].green; - entrybuf[2] = (png_byte)ep[i].blue; - entrybuf[3] = (png_byte)ep[i].alpha; - png_save_uint_16(entrybuf + 4, ep[i].frequency); - } - - else - { - png_save_uint_16(entrybuf + 0, ep[i].red); - png_save_uint_16(entrybuf + 2, ep[i].green); - png_save_uint_16(entrybuf + 4, ep[i].blue); - png_save_uint_16(entrybuf + 6, ep[i].alpha); - png_save_uint_16(entrybuf + 8, ep[i].frequency); - } - - png_write_chunk_data(png_ptr, entrybuf, entry_size); - } -#endif png_write_chunk_end(png_ptr); } @@ -1769,7 +1724,7 @@ } new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE; - ++key_len; /* for the keywod separator */ + ++key_len; /* for the keyword separator */ /* We leave it to the application to meet PNG-1.0 requirements on the * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of diff -Nru thunderbird-140.9.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c thunderbird-140.10.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c --- thunderbird-140.9.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libvpx/libvpx/vp8/common/alloccommon.c 2026-04-21 14:52:58.000000000 +0000 @@ -34,7 +34,7 @@ oci->pp_limits_buffer = NULL; vpx_free(oci->postproc_state.generated_noise); - oci->postproc_state.generated_noise = NULL; + memset(&oci->postproc_state, 0, sizeof(oci->postproc_state)); #endif vpx_free(oci->above_context); @@ -42,10 +42,14 @@ #if CONFIG_ERROR_CONCEALMENT vpx_free(oci->prev_mip); oci->prev_mip = NULL; + oci->prev_mi = NULL; #endif oci->above_context = NULL; oci->mip = NULL; + oci->mi = NULL; + oci->show_frame_mi = NULL; + oci->frame_to_show = NULL; } int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) { diff -Nru thunderbird-140.9.0esr/media/libvpx/moz.yaml thunderbird-140.10.0esr/media/libvpx/moz.yaml --- thunderbird-140.9.0esr/media/libvpx/moz.yaml 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/media/libvpx/moz.yaml 2026-04-21 14:52:58.000000000 +0000 @@ -56,6 +56,7 @@ - arm_cpu_runtime_detection_code_on_openbsd.patch - input_frame_validation.patch - input_frame_validation_vp9.patch + - reset_post_proc_state.patch update-actions: - action: move-file diff -Nru thunderbird-140.9.0esr/media/libvpx/reset_post_proc_state.patch thunderbird-140.10.0esr/media/libvpx/reset_post_proc_state.patch --- thunderbird-140.9.0esr/media/libvpx/reset_post_proc_state.patch 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/media/libvpx/reset_post_proc_state.patch 2026-04-21 14:52:58.000000000 +0000 @@ -0,0 +1,32 @@ +# HG changeset patch +# User Jan-Ivar Bruaroey + +Bug 2029423 - Reset post_proc state. + +diff --git a/vp8/common/alloccommon.c b/vp8/common/alloccommon.c +--- a/vp8/common/alloccommon.c ++++ b/vp8/common/alloccommon.c +@@ -34,7 +34,7 @@ void vp8_de_alloc_frame_buffers(VP8_COMM + oci->pp_limits_buffer = NULL; + + vpx_free(oci->postproc_state.generated_noise); +- oci->postproc_state.generated_noise = NULL; ++ memset(&oci->postproc_state, 0, sizeof(oci->postproc_state)); + #endif + + vpx_free(oci->above_context); +@@ -42,10 +42,14 @@ void vp8_de_alloc_frame_buffers(VP8_COMM + #if CONFIG_ERROR_CONCEALMENT + vpx_free(oci->prev_mip); + oci->prev_mip = NULL; ++ oci->prev_mi = NULL; + #endif + + oci->above_context = NULL; + oci->mip = NULL; ++ oci->mi = NULL; ++ oci->show_frame_mi = NULL; ++ oci->frame_to_show = NULL; + } + + int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) { diff -Nru thunderbird-140.9.0esr/mfbt/CheckedInt.h thunderbird-140.10.0esr/mfbt/CheckedInt.h --- thunderbird-140.9.0esr/mfbt/CheckedInt.h 2026-03-20 19:18:37.000000000 +0000 +++ thunderbird-140.10.0esr/mfbt/CheckedInt.h 2026-04-21 14:52:58.000000000 +0000 @@ -557,7 +557,7 @@ /** @returns the actual value */ constexpr T value() const { - MOZ_DIAGNOSTIC_ASSERT( + MOZ_RELEASE_ASSERT( mIsValid, "Invalid checked integer (division by zero or integer overflow)"); return mValue; diff -Nru thunderbird-140.9.0esr/modules/brotli/common/constants.c thunderbird-140.10.0esr/modules/brotli/common/constants.c --- thunderbird-140.9.0esr/modules/brotli/common/constants.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/constants.c 2026-04-21 14:52:59.000000000 +0000 @@ -6,10 +6,10 @@ #include "constants.h" -const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { - {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, - {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, - {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, - {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, - {8433, 13}, {16625, 24}}; +const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { + {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, + {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, + {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, + {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, + {8433, 13}, {16625, 24}}; diff -Nru thunderbird-140.9.0esr/modules/brotli/common/constants.h thunderbird-140.10.0esr/modules/brotli/common/constants.h --- thunderbird-140.9.0esr/modules/brotli/common/constants.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/constants.h 2026-04-21 14:52:59.000000000 +0000 @@ -12,9 +12,6 @@ #ifndef BROTLI_COMMON_CONSTANTS_H_ #define BROTLI_COMMON_CONSTANTS_H_ -#include -#include - #include "platform.h" /* Specification: 7.3. Encoding of the context map */ @@ -195,7 +192,7 @@ } BrotliPrefixCodeRange; /* "Soft-private", it is exported, but not "advertised" as API. */ -BROTLI_COMMON_API extern const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; +BROTLI_COMMON_API extern const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; #endif /* BROTLI_COMMON_CONSTANTS_H_ */ diff -Nru thunderbird-140.9.0esr/modules/brotli/common/context.c thunderbird-140.10.0esr/modules/brotli/common/context.c --- thunderbird-140.9.0esr/modules/brotli/common/context.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/context.c 2026-04-21 14:52:59.000000000 +0000 @@ -1,9 +1,9 @@ #include "context.h" -#include +#include "platform.h" /* Common context lookup table for all context modes. */ -const uint8_t _kBrotliContextLookupTable[2048] = { +const BROTLI_MODEL("small") uint8_t _kBrotliContextLookupTable[2048] = { /* CONTEXT_LSB6, last byte. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, diff -Nru thunderbird-140.9.0esr/modules/brotli/common/context.h thunderbird-140.10.0esr/modules/brotli/common/context.h --- thunderbird-140.9.0esr/modules/brotli/common/context.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/context.h 2026-04-21 14:52:59.000000000 +0000 @@ -88,8 +88,7 @@ #ifndef BROTLI_COMMON_CONTEXT_H_ #define BROTLI_COMMON_CONTEXT_H_ -#include -#include +#include "platform.h" typedef enum ContextType { CONTEXT_LSB6 = 0, diff -Nru thunderbird-140.9.0esr/modules/brotli/common/dictionary.c thunderbird-140.10.0esr/modules/brotli/common/dictionary.c --- thunderbird-140.9.0esr/modules/brotli/common/dictionary.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/dictionary.c 2026-04-21 14:52:58.000000000 +0000 @@ -12,5863 +12,11 @@ #endif #if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const uint8_t kBrotliDictionaryData[] = -/* GENERATED CODE START */ -{ -116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, -111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 -,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 -,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, -118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, -110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, -114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, -103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, -104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, -117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, -101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 -,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 -,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 -,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, -101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, -115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, -97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, -105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, -111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, -105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 -,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, -108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, -101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, -108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, -102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, -111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, -111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, -115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, -37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 -,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 -,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, -115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, -101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, -107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, -110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 -,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, -117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 -,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, -114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 -,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 -,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, -116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 -,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, -117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 -,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 -,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 -,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, -112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, -117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, -110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, -115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 -,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 -,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, -120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 -,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, -116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 -,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, -102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, -116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, -111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, -110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, -119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, -46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 -,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, -99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, -101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, -121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, -116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, -101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 -,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, -115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 -,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, -105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, -108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, -108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, -102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, -100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, -104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, -99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, -102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, -101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, -108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, -35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 -,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 -,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 -,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, -97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, -108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, -109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, -111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, -116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, -97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 -,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, -103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 -,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, -108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, -101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, -103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 -,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, -116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, -109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 -,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, -97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, -122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, -99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, -98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, -116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, -115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, -108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, -60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, -114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, -102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, -47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, -115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 -,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, -111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, -56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, -110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 -,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, -100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, -107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, -112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, -115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, -101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, -100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, -72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, -120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 -,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 -,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, -101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 -,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, -119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, -119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, -117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, -111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, -97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, -110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, -10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 -,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 -,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, -116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 -,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, -60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, -45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, -97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 -,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, -47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, -115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, -117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, -49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 -,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, -57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 -,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, -50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 -,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, -57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 -,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, -56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 -,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, -57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 -,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, -49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 -,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, -115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 -,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, -105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 -,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 -,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, -111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, -111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, -116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 -,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, -100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 -,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 -,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 -,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 -,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 -,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 -,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 -,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 -,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 -,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 -,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 -,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 -,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 -,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 -,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 -,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 -,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 -,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 -,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, -101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, -98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, -114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, -97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, -114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, -101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, -101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, -117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, -108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 -,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, -101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, -103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 -,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, -111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, -114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, -114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, -101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 -,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, -108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, -115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, -100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, -115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, -100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, -111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, -108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, -115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, -109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, -116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, -114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, -116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 -,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, -105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, -111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 -,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, -114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, -114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 -,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, -115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, -97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 -,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, -101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 -,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 -,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 -,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 -,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, -117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, -114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, -108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, -99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 -,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, -116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, -116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, -114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 -,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, -112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, -103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, -97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, -110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 -,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, -114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, -101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, -118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 -,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, -105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, -116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, -113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 -,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 -,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, -116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, -114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, -83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 -,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 -,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, -105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, -97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, -105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, -110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, -105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 -,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, -115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 -,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, -105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, -108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 -,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, -105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, -97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, -109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, -101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, -109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, -110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, -105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, -109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, -48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, -115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 -,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, -100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, -116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, -108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, -102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 -,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, -121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 -,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 -,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 -,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, -117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, -110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, -118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, -120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, -34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, -111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, -107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, -100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 -,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 -,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 -,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 -,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, -111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 -,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, -102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, -101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, -101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 -,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 -,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 -,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, -102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, -115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, -60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 -,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 -,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, -119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, -103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, -117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 -,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 -,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 -,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 -,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, -100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, -101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 -,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, -110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 -,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, -100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, -111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, -101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 -,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, -35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, -112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, -108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, -104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, -114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, -97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, -109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 -,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, -114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, -115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, -111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, -105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 -,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, -118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, -103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 -,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, -101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, -35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, -101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, -116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, -111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, -108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, -60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, -34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 -,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, -97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, -34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, -97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, -104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, -121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, -115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, -102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 -,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, -110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 -,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, -115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, -112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, -104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 -,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, -101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, -195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, -110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, -116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, -111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, -101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, -118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, -101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, -195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 -,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, -115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 -,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, -116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, -105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, -114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, -101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, -114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, -111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 -,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 -,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 -,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, -117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, -99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 -,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, -97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, -114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 -,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, -101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, -97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, -106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 -,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, -103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, -115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 -,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, -195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, -102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, -97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, -116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, -112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, -114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, -115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, -117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, -105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, -97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 -,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, -108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 -,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, -108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, -97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, -97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 -,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, -114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 -,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, -111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, -99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, -116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, -101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, -101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, -116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, -118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 -,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, -117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 -,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, -116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, -114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 -,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, -111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 -,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, -97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, -108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, -104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 -,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, -101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, -101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 -,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, -110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, -111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, -112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 -,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, -102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, -105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, -104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, -104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 -,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 -,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, -108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, -115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, -117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, -101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, -114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, -101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 -,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, -103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, -99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, -116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, -101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, -118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, -114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 -,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, -105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, -101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, -118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, -118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, -121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, -111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, -101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, -111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, -116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, -101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, -110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 -,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, -101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 -,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, -115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, -115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 -,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, -114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, -114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, -105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, -118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, -114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, -110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, -101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, -110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 -,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, -110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, -116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, -115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, -109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, -103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, -104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, -121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, -123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, -101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, -114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, -110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, -66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 -,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, -108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 -,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 -,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, -101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 -,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, -101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, -105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, -101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, -110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 -,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 -,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 -,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, -110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, -101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 -,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, -101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, -111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, -60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, -114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, -100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, -114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, -110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 -,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, -95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 -,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 -,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 -,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, -112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, -107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, -110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, -110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, -114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, -34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 -,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 -,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 -,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, -116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, -105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, -34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 -,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, -101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, -105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, -101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, -114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 -,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, -121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, -114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, -111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, -114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, -117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, -116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 -,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 -,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, -70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, -32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 -,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, -97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, -102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 -,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, -114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, -101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, -103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, -116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 -,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, -115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 -,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, -104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, -115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, -121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, -111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, -112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, -105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, -112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, -109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, -97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 -,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, -104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, -109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, -114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, -115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, -108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, -101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 -,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, -34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 -,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, -101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, -110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, -61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, -112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, -111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, -32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, -106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, -114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, -101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, -120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 -,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, -105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, -103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, -10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, -121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, -136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, -191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, -228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, -155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, -184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, -228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, -187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, -175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, -230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, -175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, -144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, -231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, -145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, -148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, -229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, -131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, -155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, -230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, -143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, -155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, -233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, -150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, -188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, -230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, -161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, -180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, -229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, -149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, -164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, -232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, -133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, -156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, -231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, -183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, -155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, -228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, -154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, -144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, -231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, -174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, -131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, -231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, -144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, -181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, -230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, -189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, -159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, -232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, -183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, -187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, -228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, -186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, -136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, -229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, -139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, -142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, -229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, -140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, -191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, -232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, -186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, -168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, -229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, -142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, -187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, -230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, -186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, -166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, -229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, -162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, -190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, -231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, -144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, -133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, -232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, -179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, -187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, -229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, -128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, -157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, -230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, -165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, -175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, -229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, -143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, -138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, -232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, -183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, -143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, -231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, -142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, -168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, -230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, -148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, -138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, -233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, -145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, -130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, -229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, -162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, -186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, -229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, -187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, -184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, -232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, -131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, -137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, -231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, -139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, -157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, -229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, -186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, -155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, -230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, -154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, -156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, -232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, -183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, -174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, -229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, -129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, -174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, -230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, -186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, -131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, -229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, -154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, -142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, -229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, -142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, -174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, -228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, -176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, -173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, -231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, -136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, -155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, -232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, -161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, -186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, -231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, -140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, -179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, -228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, -151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, -138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, -229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, -141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, -184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, -230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, -189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, -156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, -233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, -137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, -156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, -228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, -169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, -133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, -231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, -154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, -173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, -228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, -138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, -128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, -229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, -182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, -130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, -231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, -174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, -167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, -229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, -179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, -142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, -230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, -179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, -164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, -230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, -133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, -141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, -231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, -156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, -187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, -230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, -155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, -186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, -230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, -147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, -189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, -229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, -133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, -185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, -230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, -165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, -135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, -229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, -135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, -155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, -233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, -191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, -187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, -228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, -161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, -187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, -230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, -182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, -191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, -232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, -152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, -137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, -229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, -150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, -175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, -229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, -166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, -153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, -232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, -147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, -189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, -230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, -140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, -161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, -229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, -129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, -156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, -230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, -150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, -171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, -229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, -165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, -156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, -232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, -147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, -130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, -229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, -183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, -138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, -232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, -161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, -167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, -232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, -151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, -143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, -228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, -159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, -187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, -231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, -159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, -143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, -229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, -170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, -136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, -230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, -182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, -136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, -233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, -155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, -156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, -230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, -160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, -133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, -231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, -167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, -133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, -229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, -136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, -190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, -228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, -144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, -134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, -232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, -185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, -189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, -232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, -145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, -189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, -231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, -154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, -149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, -233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, -142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, -173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, -230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, -176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, -136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, -229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, -141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, -139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, -229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, -175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, -131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, -232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, -139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, -187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, -229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, -138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, -188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, -230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, -187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, -144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, -105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, -116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, -116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, -114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, -112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, -100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 -,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, -103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, -111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, -117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, -105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 -,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 -,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, -118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, -114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, -110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, -101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, -109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 -,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 -,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, -109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 -,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, -109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, -111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, -105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 -,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, -113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, -105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, -116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 -,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, -112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, -118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, -101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, -115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 -,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, -98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 -,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, -110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, -115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, -105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, -111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, -118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, -101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, -161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, -179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 -,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, -195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 -,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 -,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, -190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, -178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, -176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, -186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, -146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, -190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, -130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, -188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, -176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, -190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, -161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, -176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, -186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, -141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, -128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, -143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, -146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, -190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, -128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, -141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, -190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, -190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, -164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, -224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, -135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, -164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, -224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, -185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, -97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, -224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, -190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, -164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, -224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, -128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, -164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, -224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, -139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, -164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, -224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, -178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, -164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, -176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, -137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, -131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, -177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, -133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, -132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, -173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, -175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, -167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, -185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, -134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, -132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, -138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, -176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, -131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, -181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, -138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, -167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, -167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, -138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, -174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, -167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, -181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, -134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, -173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, -168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, -179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, -178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, -135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, -132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, -138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, -131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, -168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, -138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, -133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, -130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, -114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, -101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, -115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, -102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, -97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, -114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, -115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 -,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, -119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 -,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, -101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 -,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, -105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, -105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, -108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, -100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, -111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 -,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 -,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, -117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 -,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, -115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 -,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, -109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, -101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 -,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, -110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 -,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, -116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, -106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, -105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, -108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, -101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, -101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, -97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 -,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, -117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 -,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, -119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, -108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, -114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, -105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, -116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 -,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, -116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, -115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, -115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, -114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, -108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, -111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 -,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, -101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, -110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, -112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, -99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 -,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, -100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, -110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, -101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, -80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, -99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, -99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, -105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, -112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, -101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 -,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 -,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, -105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, -101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, -100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, -101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, -108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 -,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 -,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, -105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 -,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, -45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, -100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 -,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, -71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, -105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, -100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, -98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, -109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, -111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, -101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, -103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, -108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 -,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, -101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, -100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, -116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 -,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 -,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 -,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, -97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 -,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 -,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, -117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, -116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 -,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 -,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 -,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, -97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, -110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, -111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, -100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, -114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, -115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, -108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, -116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, -32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, -100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, -101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, -104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, -101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, -100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, -110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, -97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, -117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 -,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 -,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 -,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, -118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 -,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, -121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, -117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, -41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, -110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, -97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 -,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 -,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, -105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 -,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, -101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, -100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 -,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, -97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 -,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, -104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 -,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, -117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, -104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 -,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, -58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, -95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, -99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, -112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 -,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, -114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 -,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, -112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, -115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, -116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 -,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, -101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, -112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, -101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, -101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, -118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, -116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 -,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, -118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, -104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, -114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 -,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, -115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, -111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, -116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, -101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, -105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, -108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, -114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 -,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, -10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, -111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, -103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 -,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, -108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, -104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 -,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, -97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, -104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, -101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, -115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, -117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, -114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, -104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 -,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, -109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 -,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, -108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, -100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, -105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, -100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, -112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 -,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, -105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, -110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, -32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 -,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, -110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 -,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, -97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 -,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 -,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, -116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 -,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, -101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, -116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, -115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, -105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, -119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, -105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, -107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, -98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, -32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, -99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 -,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, -105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, -99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 -,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 -,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, -100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, -116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, -117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 -,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, -114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 -,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, -114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, -105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 -,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 -,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, -101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, -101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 -,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 -,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, -62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, -103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, -116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, -100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, -103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 -,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, -97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, -108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, -117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 -,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, -114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, -113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, -114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, -97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, -100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, -104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, -103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 -,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, -118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, -104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, -115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, -32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, -108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 -,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, -101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, -112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 -,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, -109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, -109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 -,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, -99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, -116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 -,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, -117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, -116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 -,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, -32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, -105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, -104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, -105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, -118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, -100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, -97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 -,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 -,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, -115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 -,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 -,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, -116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, -108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 -,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, -114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, -104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 -,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 -,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, -101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, -116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, -110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, -105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, -108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, -114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, -108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, -78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, -116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, -116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, -119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, -119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, -10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, -101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, -116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, -104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 -,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, -105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, -101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, -115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 -,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 -,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, -115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 -,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, -111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, -101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, -108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, -101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 -,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, -116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 -,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, -102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 -,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 -,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, -108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, -105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, -101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, -114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, -100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 -,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, -101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, -104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 -,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, -103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, -32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, -66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, -116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, -100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, -105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, -101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, -111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, -97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, -101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, -117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, -111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, -97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, -102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, -117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, -116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 -,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 -,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, -105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, -115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 -,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, -121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, -110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, -115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, -62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, -101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 -,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 -,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 -,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, -104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, -111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, -97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 -,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, -108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, -97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 -,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, -105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, -101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, -108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, -115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, -32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, -98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 -,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, -114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 -,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 -,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, -101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, -101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, -100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 -,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, -100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, -108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 -,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, -101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, -101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, -108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, -99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 -,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, -103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, -116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 -,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 -,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 -,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, -97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 -,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, -111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, -115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 -,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 -,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, -117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, -115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, -111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, -101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, -104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 -,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 -,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, -195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 -,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, -101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 -,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, -97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, -100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, -101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 -,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 -,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, -116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 -,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, -105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, -72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 -,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, -112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, -32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, -97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, -105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, -116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, -99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, -46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, -116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 -,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, -114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 -,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, -114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, -110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, -116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, -121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, -44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 -,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, -32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 -,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, -116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 -,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, -105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, -32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 -,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, -115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, -116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, -105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, -105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 -,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, -59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, -111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 -,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 -,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, -108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, -116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, -111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, -108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, -103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, -110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, -110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 -,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 -,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, -114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, -101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, -101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, -121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, -115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, -100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 -,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, -119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, -104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 -,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 -,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, -97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 -,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, -110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, -110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, -115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, -97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, -109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 -,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, -97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, -116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, -110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, -108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, -101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, -97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, -110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, -97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, -100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, -119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, -108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, -109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 -,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, -114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, -115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, -105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, -78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, -60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, -97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 -,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, -46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, -115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, -114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, -101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 -,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, -111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, -105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, -116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 -,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, -105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, -117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, -97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, -116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 -,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, -32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, -115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 -,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, -61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, -110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, -108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, -32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 -,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, -117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 -,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, -110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, -101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, -116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, -101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, -103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, -110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, -114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, -115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 -,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, -97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 -,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 -,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 -,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, -65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, -112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, -117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, -111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, -110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 -,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, -116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 -,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 -,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, -118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, -109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, -110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, -111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, -104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, -111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, -105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, -101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, -101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, -118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, -97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, -116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 -,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 -,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, -101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, -119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, -119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, -111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, -59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 -,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 -,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, -101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, -111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, -109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, -114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, -46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, -102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, -101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 -,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, -97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, -103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, -118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 -,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, -114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, -32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, -110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, -32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, -101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, -116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, -60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 -,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, -97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, -111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, -105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, -34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, -111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, -101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 -,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 -,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, -121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, -108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 -,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, -99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, -101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, -105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, -32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 -,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, -105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, -33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, -121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 -,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 -,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, -116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, -101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 -,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, -114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, -32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, -32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, -112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 -,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, -114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, -115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, -97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 -,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 -,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, -110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 -,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, -114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, -121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, -100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, -101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, -73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 -,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, -103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, -115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 -,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, -61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, -117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, -97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, -103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 -,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, -107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, -97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, -98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, -109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 -,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 -,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, -97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, -111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, -114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 -,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, -103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, -101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, -103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, -111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, -195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, -111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 -,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, -111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, -101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, -115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, -99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, -105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, -105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, -105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 -,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 -,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, -101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 -,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, -103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 -,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, -98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, -101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, -108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, -109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, -111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, -110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 -,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, -97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, -114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, -115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, -101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, -105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, -115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, -100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, -111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, -114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, -118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, -110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, -108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, -107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, -97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, -115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, -101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 -,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, -105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, -97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, -115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 -,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, -100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, -117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, -97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, -101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 -,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, -121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, -97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, -108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, -100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, -117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 -,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, -111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, -100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 -,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 -,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, -101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, -108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 -,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, -101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, -98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, -32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, -116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 -,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 -,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, -115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, -101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, -34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, -108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, -47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, -104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, -99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 -,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, -99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, -99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, -99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, -103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 -,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, -117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, -83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, -105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, -108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, -114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 -,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, -118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, -105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 -,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 -,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, -108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, -110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, -117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 -,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, -117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 -,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, -105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, -109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, -115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, -111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 -,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, -114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, -97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, -68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 -,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 -,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, -97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, -117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, -101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, -111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, -114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, -115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, -117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 -,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 -,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, -114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, -111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 -,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 -,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, -60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 -,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, -117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, -34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 -,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, -115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, -101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, -103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, -114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, -112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 -,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 -,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, -99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, -60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, -105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 -,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, -112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 -,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 -,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, -99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, -47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, -101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, -97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, -116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, -114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, -101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, -110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, -111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, -97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, -99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, -116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, -97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, -121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, -105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 -,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, -107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 -,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 -,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, -101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, -105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, -97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, -116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 -,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, -114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 -,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 -,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, -114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, -108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, -110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 -,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, -105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, -101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, -100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, -108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, -105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 -,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, -110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, -101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, -115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 -,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, -97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, -110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, -108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, -114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 -,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 -,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, -105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, -101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, -119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 -,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, -117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, -68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 -,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, -104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, -112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, -107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 -,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 -,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, -99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 -,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 -,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, -97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, -110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, -61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, -109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, -103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 -,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, -112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, -109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 -,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, -101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 -,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, -108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, -118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 -,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, -99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 -,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, -32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, -108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 -,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, -61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, -107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, -97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, -104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, -101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, -101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, -115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, -111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 -,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 -,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, -32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, -104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 -,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, -60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, -110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, -111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 -,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, -115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 -,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, -109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, -111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 -,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, -109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, -110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, -104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, -104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, -99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, -111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, -62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 -,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, -79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, -114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, -114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 -,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 -,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 -,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 -,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, -99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, -98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, -41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 -,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, -109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, -103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, -111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, -119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, -105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, -112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, -97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, -110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, -112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, -114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, -32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, -34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, -128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, -105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, -107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, -110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 -,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, -114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, -115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 -,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, -111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, -116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, -195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, -114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, -101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 -,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 -,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, -110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, -169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, -114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 -,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 -,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 -,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, -103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, -108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, -108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, -109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, -116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, -101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 -,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, -101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 -,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, -195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 -,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, -109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, -97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, -116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 -,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, -99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 -,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 -,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, -114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, -111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, -116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, -111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, -112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, -195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, -114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, -111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 -,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 -,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, -105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, -173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, -100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, -115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, -114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, -105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 -,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, -114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 -,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, -101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, -115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, -103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, -110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, -177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, -116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, -115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, -114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 -,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, -180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, -177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, -190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, -188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, -190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, -179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, -190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, -190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, -180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, -189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, -190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, -178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, -136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, -180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, -128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, -133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, -130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, -188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, -190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, -141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, -188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, -178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, -180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, -189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, -188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, -190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, -176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, -178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, -189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, -180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, -189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, -128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, -132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, -174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, -138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, -167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, -173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, -138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, -135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, -163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, -173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, -167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, -167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, -167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, -177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, -180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, -138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, -180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, -133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, -133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, -133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, -181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, -177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, -133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, -136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, -168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, -167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, -163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, -138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, -133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, -177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, -134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, -136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, -167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, -132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, -0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, -5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, -23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, -255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, -3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, -0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, -101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, -99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, -104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, -105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, -103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 -,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 -,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, -117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, -116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, -110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 -,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, -110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 -,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, -101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, -116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, -101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 -,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 -,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, -109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 -,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, -104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, -108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 -,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, -105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, -102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 -,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, -109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 -,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, -105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 -,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, -101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, -110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, -110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, -111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, -114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 -,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, -116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, -101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 -,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, -100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, -101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 -,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, -34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 -,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, -119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 -,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, -99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, -105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, -115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, -114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, -115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, -102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 -,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, -107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, -99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, -97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 -,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, -116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, -111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 -,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, -104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, -108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, -108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 -,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, -101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, -102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, -110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, -71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, -112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, -99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, -62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, -111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, -100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, -103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, -101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, -112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, -105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, -110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, -116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, -115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, -116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, -112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, -114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 -,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, -32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, -117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, -110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 -,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 -,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, -108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, -100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 -,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, -108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, -101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, -117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, -104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, -121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, -114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, -116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, -116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, -109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, -110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, -105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, -116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, -111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, -111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 -,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 -,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, -109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, -108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 -,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, -117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, -75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 -,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, -102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, -111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, -59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, -118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, -105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 -,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, -34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, -115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, -115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 -,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 -,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 -,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, -101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, -98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, -101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, -115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 -,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, -100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, -111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, -116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, -114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, -112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, -99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, -115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, -100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, -116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, -101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, -116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 -,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, -109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 -,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 -,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 -,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 -,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 -,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, -32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, -115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, -116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, -114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, -97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, -102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, -111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 -,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, -116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, -116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, -101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, -102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, -32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, -114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, -119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 -,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, -115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, -114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, -101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 -,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, -101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, -101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, -115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 -,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, -101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, -121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 -,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 -,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, -112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 -,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, -111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 -,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 -,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 -,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, -102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 -,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, -101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, -120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, -115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, -97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, -114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 -,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, -117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, -115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, -112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, -101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 -,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 -,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, -102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, -111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 -,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 -,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, -114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, -105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, -105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, -105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 -,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, -114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, -116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 -,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 -,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, -116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, -118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, -114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, -101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 -,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, -108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, -116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, -116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, -114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, -105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, -110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, -97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 -,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, -62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, -115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, -110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, -97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, -105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, -115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, -115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, -101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, -101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 -,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, -97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, -111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 -,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, -110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, -97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, -100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, -116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 -,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, -116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 -,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, -101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, -104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, -101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, -101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, -112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 -,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 -,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, -110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, -115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, -110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, -102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 -,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 -,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 -,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, -110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, -110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 -,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 -,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, -119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, -107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, -97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, -119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, -101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 -,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, -111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, -114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, -105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, -110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, -115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, -108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, -110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 -,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, -116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 -,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 -,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, -101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 -,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 -,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, -101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 -,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, -101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, -115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, -116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, -32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, -97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, -105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, -116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, -109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, -114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, -99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 -,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 -,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 -,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, -32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, -110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, -110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, -100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, -116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 -,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, -116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, -100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, -110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, -112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, -115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, -61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 -,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, -34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 -,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, -111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, -110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 -,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 -,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, -114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, -115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, -103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, -115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 -,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, -105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, -97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 -,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, -110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, -103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 -,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, -99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 -,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 -,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 -,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, -116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 -,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, -105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 -,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 -,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, -59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 -,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, -104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, -59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 -,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, -110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, -104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, -98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, -101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, -118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, -116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, -184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, -231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, -186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, -174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, -229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, -167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, -142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, -228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, -129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, -186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, -232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, -173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, -173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, -229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, -115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, -114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, -99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, -97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 -,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, -110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 -,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, -114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, -111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, -105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, -101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 -,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 -,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, -110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 -,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 -,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 -,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 -,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, -109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, -116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, -115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, -111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 -,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, -110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, -109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 -,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, -97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, -101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 -,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, -99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, -97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, -116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 -,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 -,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 -,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 -,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 -,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 -,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 -,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 -,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 -,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, -164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, -224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, -164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, -165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, -224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, -178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, -164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, -224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, -190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, -164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, -224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, -133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, -164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, -224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, -135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, -164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, -224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, -173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, -164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, -224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, -174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, -164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, -224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, -176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, -164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, -224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, -128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, -164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, -224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, -178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, -165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, -224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, -156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, -164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, -224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, -130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, -164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, -224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, -182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, -164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, -224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, -101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, -10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 -,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, -112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, -107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, -101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 -,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 -,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, -103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, -99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, -118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 -,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 -,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, -111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, -105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, -97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, -111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, -116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, -97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 -,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, -114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, -111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 -,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, -116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, -105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 -,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, -110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, -111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 -,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 -,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, -101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 -,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 -,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, -105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, -108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, -110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 -,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, -111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, -110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, -44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 -,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, -111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 -,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, -115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, -101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, -104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 -,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, -99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 -,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, -101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, -118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, -115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, -111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, -100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, -112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, -112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, -99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 -,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, -114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, -111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, -110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, -101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 -,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, -108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, -112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, -110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, -115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, -111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, -112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 -,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 -,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, -116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, -32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, -108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, -100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, -60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 -,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, -103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, -101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, -103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 -,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, -101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, -103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 -,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, -47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, -117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, -114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 -,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, -117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, -100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, -32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, -105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, -120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, -114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, -101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 -,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, -116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, -58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, -111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, -111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, -108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, -109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, -110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, -110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, -111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, -105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, -100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 -,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, -108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, -105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, -115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, -116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, -110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, -112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 -,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 -,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, -117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, -102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, -116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 -,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, -114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, -10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 -,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, -111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 -,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, -47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 -,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, -32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, -111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 -,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 -,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, -111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, -32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, -32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, -111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, -110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, -32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 -,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, -115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, -110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, -115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, -111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, -111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, -108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 -,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, -118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, -110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 -,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 -,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, -114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, -108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, -97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, -34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 -,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, -111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, -99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 -,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, -74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, -116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, -110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, -105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 -,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, -102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 -,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 -,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, -105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, -111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 -,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, -115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, -117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, -114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, -47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, -116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 -,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, -110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, -59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, -105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 -,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, -110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, -97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, -105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, -112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 -,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 -,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, -100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 -,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, -105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 -,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 -,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, -116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 -,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, -100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, -116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, -100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 -,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, -116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, -111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, -119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, -101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, -101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, -105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 -,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, -99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, -114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, -101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 -,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 -,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, -97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, -115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, -108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 -,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, -117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, -116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, -115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, -119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, -110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, -62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 -,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 -,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 -,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 -,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 -,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, -114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, -115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 -,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, -101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 -,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, -101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, -13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, -105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 -,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, -103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, -105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 -,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, -111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 -,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, -100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, -100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, -108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, -105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, -114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, -115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, -105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, -114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, -105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 -,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 -,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 -,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, -101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, -101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 -,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, -110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, -115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, -105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, -116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 -,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 -,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, -110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, -105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 -,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 -,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, -116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, -104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, -112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 -,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, -108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, -102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, -99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, -105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 -,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, -101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 -,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 -,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 -,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, -101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, -101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, -110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 -,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, -101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 -,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, -107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, -108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, -112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, -98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, -100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, -105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, -105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, -32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, -104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, -39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 -,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 -,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 -,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, -102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, -114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, -110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, -97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, -119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 -,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 -,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, -102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 -,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, -110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, -100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, -114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, -101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 -,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, -32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, -117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 -,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, -44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, -105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, -116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 -,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, -108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, -110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, -59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 -,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, -104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, -100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, -32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 -,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, -101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 -,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, -105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 -,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, -101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 -,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, -97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, -106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, -112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 -,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, -101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, -114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, -108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 -,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, -34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, -101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, -116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, -109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, -119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 -,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 -,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 -,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 -,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, -100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, -101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, -114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, -111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, -101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, -111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, -103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 -,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, -105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, -101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, -111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, -66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, -32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 -,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, -103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 -,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 -,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, -111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, -97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 -,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, -116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, -61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 -,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 -,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, -101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 -,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, -116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, -103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 -,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 -,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, -111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, -115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, -100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, -117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, -115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, -115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 -,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 -,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, -115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, -116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, -105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, -105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, -97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, -173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, -101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, -118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, -101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, -108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, -117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, -114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, -179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 -,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 -,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, -117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, -101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, -116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, -209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, -209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, -209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, -209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, -208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, -208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, -208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, -208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, -209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, -208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, -208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, -208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, -208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, -208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, -209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, -208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, -209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, -208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, -208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, -209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, -209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, -208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, -208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, -208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, -208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, -208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, -208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, -208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, -209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, -209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, -208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, -208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, -208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, -208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, -208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, -208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, -208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, -208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, -209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, -209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, -209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, -208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, -208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, -208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, -208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, -209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, -208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, -209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, -208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, -208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, -208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, -217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, -216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, -216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, -217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, -216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, -216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, -216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, -216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, -217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, -216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, -217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, -216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, -216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, -216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, -216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, -217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, -216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, -217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, -217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, -217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, -216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, -217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, -216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, -217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, -217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, -216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, -216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, -217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, -216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, -217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, -216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, -217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, -216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, -217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, -216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, -217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, -216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, -217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, -217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 -,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, -34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, -111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 -,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, -105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, -109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 -,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, -105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 -,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, -101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, -108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, -99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, -101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 -,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, -105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, -105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, -99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, -116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 -,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, -114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, -108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 -,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, -111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, -110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 -,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, -111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 -,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 -,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, -100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, -105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, -101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 -,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 -,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, -101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 -,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 -,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, -112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 -,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, -99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, -101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, -114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, -105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, -115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, -112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 -,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, -104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, -104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, -110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 -,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 -,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 -,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, -41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 -,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 -,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, -111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, -105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 -,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, -101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 -,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, -118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 -,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, -117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 -,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, -109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, -105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, -111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, -105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, -114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, -117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 -,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, -105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, -116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, -114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, -116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, -114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, -32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, -101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, -111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, -61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, -111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 -,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, -115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, -115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, -110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, -114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, -116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 -,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, -109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, -121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, -37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 -,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 -,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, -32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, -101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, -61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 -,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, -116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 -,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, -101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 -,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 -,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, -101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, -110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, -110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, -115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, -120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 -,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, -100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 -,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, -34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, -98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 -,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 -,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, -116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, -117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, -116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, -101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, -111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, -100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 -,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 -,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, -32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, -116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, -108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, -115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 -,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, -116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, -102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, -104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, -105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, -105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, -101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, -60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, -32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, -102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, -114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, -110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 -,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 -,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, -105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 -,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, -104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, -115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, -111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 -,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, -105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 -,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 -,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, -108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 -,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, -84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 -,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 -,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, -110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, -112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 -,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, -101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, -115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, -104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, -32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, -114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, -99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, -97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 -,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 -,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, -112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, -104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, -102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, -116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 -,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, -105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 -,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, -116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, -117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, -114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 -,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, -105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 -,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, -34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, -60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, -32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, -116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 -,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 -,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, -104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, -115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 -,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, -114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, -112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, -112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, -114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, -68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, -110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, -104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 -,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 -,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 -,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, -105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, -101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, -101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, -114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, -99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 -,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 -,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, -112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 -,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, -111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, -72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, -114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, -114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, -116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, -105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, -108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, -83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 -,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, -104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, -104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, -101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, -101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, -97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, -99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 -,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, -100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, -32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 -,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, -116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, -112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 -,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, -101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, -114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, -112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 -,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 -,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, -47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, -116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, -101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, -110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, -114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, -101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 -,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, -97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, -115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 -,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, -105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, -105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 -,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, -105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, -105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, -99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, -116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, -111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, -112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, -110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, -110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, -109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, -116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, -111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 -,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 -,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, -109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, -105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, -116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, -111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 -,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, -111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, -116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 -,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, -101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, -118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, -115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, -109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 -,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 -,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, -111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, -99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 -,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, -110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, -105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, -105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, -97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, -104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, -108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, -115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, -32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 -,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, -101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, -111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, -111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 -,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, -110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, -104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, -37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 -,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, -101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 -,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, -110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, -110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, -99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, -117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, -101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, -34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, -97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, -105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, -116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, -44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, -105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, -99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 -,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 -,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, -32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, -101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 -,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, -32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, -101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 -,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, -116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, -108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, -104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, -97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 -,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 -,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, -102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, -116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, -101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, -34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, -111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, -32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, -116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 -,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, -115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 -,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, -115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, -32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 -,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, -101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, -116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, -102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, -111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, -32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, -116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, -103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, -115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 -,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, -111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, -105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, -114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, -101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, -115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, -101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, -32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, -109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, -118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, -105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, -118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, -104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, -112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, -105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, -119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, -102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 -,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, -110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, -116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, -101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, -116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, -101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 -,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, -109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, -101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, -99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 -,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, -121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, -105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 -,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, -110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 -,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, -101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, -32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 -,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, -111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, -122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 -,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, -32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 -,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, -108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, -102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 -,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 -,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, -110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, -32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 -,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, -101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, -111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, -102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 -,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, -112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, -101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, -111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, -69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 -,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, -44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, -101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, -111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, -111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, -108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 -,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 -,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, -116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, -105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, -121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, -101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 -,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 -,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, -115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 -,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, -32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, -111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, -104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, -101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, -116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 -,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 -,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, -110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, -110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, -32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, -115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, -119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, -34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, -97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, -116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, -101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, -108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, -116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 -,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, -101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 -,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, -101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, -116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 -,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, -115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, -116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, -32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, -114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, -32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, -111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 -,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 -,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, -117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, -110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, -116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, -100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, -104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, -114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, -32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 -,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 -,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 -,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, -105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 -,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, -112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, -101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, -100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, -111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, -101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, -111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, -115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, -46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, -109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, -110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, -32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, -32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, -109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, -111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, -109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, -102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 -,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, -111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 -,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, -111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, -32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, -32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 -,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, -102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 -,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, -101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, -111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, -104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 -,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, -97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, -97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 -,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, -112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 -,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, -108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, -32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, -105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, -108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 -,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 -,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, -117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, -104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, -99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, -102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, -110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 -,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, -60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 -,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 -,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, -32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 -,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, -111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, -101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 -,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, -179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, -195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, -97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, -105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, -101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, -116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 -,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, -110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 -,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 -,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, -101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, -116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 -,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, -114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 -,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, -114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, -108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 -,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, -115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 -,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 -,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, -109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 -,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, -99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, -97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 -,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, -104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, -108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, -115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 -,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, -110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, -105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, -46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, -116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, -116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, -97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, -105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 -,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, -110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, -115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, -105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 -,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, -100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 -,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, -100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, -102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, -108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, -112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, -108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, -105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, -117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, -108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 -,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, -112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, -97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, -59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, -58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 -,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, -110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, -102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, -111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 -,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, -110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, -114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, -110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, -101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, -116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 -,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, -99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, -105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, -105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, -108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, -97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, -62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, -108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, -101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, -97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, -111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 -,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, -116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 -,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, -117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, -109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, -111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, -115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, -103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, -114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, -103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, -111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, -105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, -99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, -108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, -110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, -105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, -110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, -105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, -117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, -97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, -10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, -121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, -111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, -101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, -115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, -115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 -,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, -101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, -112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, -105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, -103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, -113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, -100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, -103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 -,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, -97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, -99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 -,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, -48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, -111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, -100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, -105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, -103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 -,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, -97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, -97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, -102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 -,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 -,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 -,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, -97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, -100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, -116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, -103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 -,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, -115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, -115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, -114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, -114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, -102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, -115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 -,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, -101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, -121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, -97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, -104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, -114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 -,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, -105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, -115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 -,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, -101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, -115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, -105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 -,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 -,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, -102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, -105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 -,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 -,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, -111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 -,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, -116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 -,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, -97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 -,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, -114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 -,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, -110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, -97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, -98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, -115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, -103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, -32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, -109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, -110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, -110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, -32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, -112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, -99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 -,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, -32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 -,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, -109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, -100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, -109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, -98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, -116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, -108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, -117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, -34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, -105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, -111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, -97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 -,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, -116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, -115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, -119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 -,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, -102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 -,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, -115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, -100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, -105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 -,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, -10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 -,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, -32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, -110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, -101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, -100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, -103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 -,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, -116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, -110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, -117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, -105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, -98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, -111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, -101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, -101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, -97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, -111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 -,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, -101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, -111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, -121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, -99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, -32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, -121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, -116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, -103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 -,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 -,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 -,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 -,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, -115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, -101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, -119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, -110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 -,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, -101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, -101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, -114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, -108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, -111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 -,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, -105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, -98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, -103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, -118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 -,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 -,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, -112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 -,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 -,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, -101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, -110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, -101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, -34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, -105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, -62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, -114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 -,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 -,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, -108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 -,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 -,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, -115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, -112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 -,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 -,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 -,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, -97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, -110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 -,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, -116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, -111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, -102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 -,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 -,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 -,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, -32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 -,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, -101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 -,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 -,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, -101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, -116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 -,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, -111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, -114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, -111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, -101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, -109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, -101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, -101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 -,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 -,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, -117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 -,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, -104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, -97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, -115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 -,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, -114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, -10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, -105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, -115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, -32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, -101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, -110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 -,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, -104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, -110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, -108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, -110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, -111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, -102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, -97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, -102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, -101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, -114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, -32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, -108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, -119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, -34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 -,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 -,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, -109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, -116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, -105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 -,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, -111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, -108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, -108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, -105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, -101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, -101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, -108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, -105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 -,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, -101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, -116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, -112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, -97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, -105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, -62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, -100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, -102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, -32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 -,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, -114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, -114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, -101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 -,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, -100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 -,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 -,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, -101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, -105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, -115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, -104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, -103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, -104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, -114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, -110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, -101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 -,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, -97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, -122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 -,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, -115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, -101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, -115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, -110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, -32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 -,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 -,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, -116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 -,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, -32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 -,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, -111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, -109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 -,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 -,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 -,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, -208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, -208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, -217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, -173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, -189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, -228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, -180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, -189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, -105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 -,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 -,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, -111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, -114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, -105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 -,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 -,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 -,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, -111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, -105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, -112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, -101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 -,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, -99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, -105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, -110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, -116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, -116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, -98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, -190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, -190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, -128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, -181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, -135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, -129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, -143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, -179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, -190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, -133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, -189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, -131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, -176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, -181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, -190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, -184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, -176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, -176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, -143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, -190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, -130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, -185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, -190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, -129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, -185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, -191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, -176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, -187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, -176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, -181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, -129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, -181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, -190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, -133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, -190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, -190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, -185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, -129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, -184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, -184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, -190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, -190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, -140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, -187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, -176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, -181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, -135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, -176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, -189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, -129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, -184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, -143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, -176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, -189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, -181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, -189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, -181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, -176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, -143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, -131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, -130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, -164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, -224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, -175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, -164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, -224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, -190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, -164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, -224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, -135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, -164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, -224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, -135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, -164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, -224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, -159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, -164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, -224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, -135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, -164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, -224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, -135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, -164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, -224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, -176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, -164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, -224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, -163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, -164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, -224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, -166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, -164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, -224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, -190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, -164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, -224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, -135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, -164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, -224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, -181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, -164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, -224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, -130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, -164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, -224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, -166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, -164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, -224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, -184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, -164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, -224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, -135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, -164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, -224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, -135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, -164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, -224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, -185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, -164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, -224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, -190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, -164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, -224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, -135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, -164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, -224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, -190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, -164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, -224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, -190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, -164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, -224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, -165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, -164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, -224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, -190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, -165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, -224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, -135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, -164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, -224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, -130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, -164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, -224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, -181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, -164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, -224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, -172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, -164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, -224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, -135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, -164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, -224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, -178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, -164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, -224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, -185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, -183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, -136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, -169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, -167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, -132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, -168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, -167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, -132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, -185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, -177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, -132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, -169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, -177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, -173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, -138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, -177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, -132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, -177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, -179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, -172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, -134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, -183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, -132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, -135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, -167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, -132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, -175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, -167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, -138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, -171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, -175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, -132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, -185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, -133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, -180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, -179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, -134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, -132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, -179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, -133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, -132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, -110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, -99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, -110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, -104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, -110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, -105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 -,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, -122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 -,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, -101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, -105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, -118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, -111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, -111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 -,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, -110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 -,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, -108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 -,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, -105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, -112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 -,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 -,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, -97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, -97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, -101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, -101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, -114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, -119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, -105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, -34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, -117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 -,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, -105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 -,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, -116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, -110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, -108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, -108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, -108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, -110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, -110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, -116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, -103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, -111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, -111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, -102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 -,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, -32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, -71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, -105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, -101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 -,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, -100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, -116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, -116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, -105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, -108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, -47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 -,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, -103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, -110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, -111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, -121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, -60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, -32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 -,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, -116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, -109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, -114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, -110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 -,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 -,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, -110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, -110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, -114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 -,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, -111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 -,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, -114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 -,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, -98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, -115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, -104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, -110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, -62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 -,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, -116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 -,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, -108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, -102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, -99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, -118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, -32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, -109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, -105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, -116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 -,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, -114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, -105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, -114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, -69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, -112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 -,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 -,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, -104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, -111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 -,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, -111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, -111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, -110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, -97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, -116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, -115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, -111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, -111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, -104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, -101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, -109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 -,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 -,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, -113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 -,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, -115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 -,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 -,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 -,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, -32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, -116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, -100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 -,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 -,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 -,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, -116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 -,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, -110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, -105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 -,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, -101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, -114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, -102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, -109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, -110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, -116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, -105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 -,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, -32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, -109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 -,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, -104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, -101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, -116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, -116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, -115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, -32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 -,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 -,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 -,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, -100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, -117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, -32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 -,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, -100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, -105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 -,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 -,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 -,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, -116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, -111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, -39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 -,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, -97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 -,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, -102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, -116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 -,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, -104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, -120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, -78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, -111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, -101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, -45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, -117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 -,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, -101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, -114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 -,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, -32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, -108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, -110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, -100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 -,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, -111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, -101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, -116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, -97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, -114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 -,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, -97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, -110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 -,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, -110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, -114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, -111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, -116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 -,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, -100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, -105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, -110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, -32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 -,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, -98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, -101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, -117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, -115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, -108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 -,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, -110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, -116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, -111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 -,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, -116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 -,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 -,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, -32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 -,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 -,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, -117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 -,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, -97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, -115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, -102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, -97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, -108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, -32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 -,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, -32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 -,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, -115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, -101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 -,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, -105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, -108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, -110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 -,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, -97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, -105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, -104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 -,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 -,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, -121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 -,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, -115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, -97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 -,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 -,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, -116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, -97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, -114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 -,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, -115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, -111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 -,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, -108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 -,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 -,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 -,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, -117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, -67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, -100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 -,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, -117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, -114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, -116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, -117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 -,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, -116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, -101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, -99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 -,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 -,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, -102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, -108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, -32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, -117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, -111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, -101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 -,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, -101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 -,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 -,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, -116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 -,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 -,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 -,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 -,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 -,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, -32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, -115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, -116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 -,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, -115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, -108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, -99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, -101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 -,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 -,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, -121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 -,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, -105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, -105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, -116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, -34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 -,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, -115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, -111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, -32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, -115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 -,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, -116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 -,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 -,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, -116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 -,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 -,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, -46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, -116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 -,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, -111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, -98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 -,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, -102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 -,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, -110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, -116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, -109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, -111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, -110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, -111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 -,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, -100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, -116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, -111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, -111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 -,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 -,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, -101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, -101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 -,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, -114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 -,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, -97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 -,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, -91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, -32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, -99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, -101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 -,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 -,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, -110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, -104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, -32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, -99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 -,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 -,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, -110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, -100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, -101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, -101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, -101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, -108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 -,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, -109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 -,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, -119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, -119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, -60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, -97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, -34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, -32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, -101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 -,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, -111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, -105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, -108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, -114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 -,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, -115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, -32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, -100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, -111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, -97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, -97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, -121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, -32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 -,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 -,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, -115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 -,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, -100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 -,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, -62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, -115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 -,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 -,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 -,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, -112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, -32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 -,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 -,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 -,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, -116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, -115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, -101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, -104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, -114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, -58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, -101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, -110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, -32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, -111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, -100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 -,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, -101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 -,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, -116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, -116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, -101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 -,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, -100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, -105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 -,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, -108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, -32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 -,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 -,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, -32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, -101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, -110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, -101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, -114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, -111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, -61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, -101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, -34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 -,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, -116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, -101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 -,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, -119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 -,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, -118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 -,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, -116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 -,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, -99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, -61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, -100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, -101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 -,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 -,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, -101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, -102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 -,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, -120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, -110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, -101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 -,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, -110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, -110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, -101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, -105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, -117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 -,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 -,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, -111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 -,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 -,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, -32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, -32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, -100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, -105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, -98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 -,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, -115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, -98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 -,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, -119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 -,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 -,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 -,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, -105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 -,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 -,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, -114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, -114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, -111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, -101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, -101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, -32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, -102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, -32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, -101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, -114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, -97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 -,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, -115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 -,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 -,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 -,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 -,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 -,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, -116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 -,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, -121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, -101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, -101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, -100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, -116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, -107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 -,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, -105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, -115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, -116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, -60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, -116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, -108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 -,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 -,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, -34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, -116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, -101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 -,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, -110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, -101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, -105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 -,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, -100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 -,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, -104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, -110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, -105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 -,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 -,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, -117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 -,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, -105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 -,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, -32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, -101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, -102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, -111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, -97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, -116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, -104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, -100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 -,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 -,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 -,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, -114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, -116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, -47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, -114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 -,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, -104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, -97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 -,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, -116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, -101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, -116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 -,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, -101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, -110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 -,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, -101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, -101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, -111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, -105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, -110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, -116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, -110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, -113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, -101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 -,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, -32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, -60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, -101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 -,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, -116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, -115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 -,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 -,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 -,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, -186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, -176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, -185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, -129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, -130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, -177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, -181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, -129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, -135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, -184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, -191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, -190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, -190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, -129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, -129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, -129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, -181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, -130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, -188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, -186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, -190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, -129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, -176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, -190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, -130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, -190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, -181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, -170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, -167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, -177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, -185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, -167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, -167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, -132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, -182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, -167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, -179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, -133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, -129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, -138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, -132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, -168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, -167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, -167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, -169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, -174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, -133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, -132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, -132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, -167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, -175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, -177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, -167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, -116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, -115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, -110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, -45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 -,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, -99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, -102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, -108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, -32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 -,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, -100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, -103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, -118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 -,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, -32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, -32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 -,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, -98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 -,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 -,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, -32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, -32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, -58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, -105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 -,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, -105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, -116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, -115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 -,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, -97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 -,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, -115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, -60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, -44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, -108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, -32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, -108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 -,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, -62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 -,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, -97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 -,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 -,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, -111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 -,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 -,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, -99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 -,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 -,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 -,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, -116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, -116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, -116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, -119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, -104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, -116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, -97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, -102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, -104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, -117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, -104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, -117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, -105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 -,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, -100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, -111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, -111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 -,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, -101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, -61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, -101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, -99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 -,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, -110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 -,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, -104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 -,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, -100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, -101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, -111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, -100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, -112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, -116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, -115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, -111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 -,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, -117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, -111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, -116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, -105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, -101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, -114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 -,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, -80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, -110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 -,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, -97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 -,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, -105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 -,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, -116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, -116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, -111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, -61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, -121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, -112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, -13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 -,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 -,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, -112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, -110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 -,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, -32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, -100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, -101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, -100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, -151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, -164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, -224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, -181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, -164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, -224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, -130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, -165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, -224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, -128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, -164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, -224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, -151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, -164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, -224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, -135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, -165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, -224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, -171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, -164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, -224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, -176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, -165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, -224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, -154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, -164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, -224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, -135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, -164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, -224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, -136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, -164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, -224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, -164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, -165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, -224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, -128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, -164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, -224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, -135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, -164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, -224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, -184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, -164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, -224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, -184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, -164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, -224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, -128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, -164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, -224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, -190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, -165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, -224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, -164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, -165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, -224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, -130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, -164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, -224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, -175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, -164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, -224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, -135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, -164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 -,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 -,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, -101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, -112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 -,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 -,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, -34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, -108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, -105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, -32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, -110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, -111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, -100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 -,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 -,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, -116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, -101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, -118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 -,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, -101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 -,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, -110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, -116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 -,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, -118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 -,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, -110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, -104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 -,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, -114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, -111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 -,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 -,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, -100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, -105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, -41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, -101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, -109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 -,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, -115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, -121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, -114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, -109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, -111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, -111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, -101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, -114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, -119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, -116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, -97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, -49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 -,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, -48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, -111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, -121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 -,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 -,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, -114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, -10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 -,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, -32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, -47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 -,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, -116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, -97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, -105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, -208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, -209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, -208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, -208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, -208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, -208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, -208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, -209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, -209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, -208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, -208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, -209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, -208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, -208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, -208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, -208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, -217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, -216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, -217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, -217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, -217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, -216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, -217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, -216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, -217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, -216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, -216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, -216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, -98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, -61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, -116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, -46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, -62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 -,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, -34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, -60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, -104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, -111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, -97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, -34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, -111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, -117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, -116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, -99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, -32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, -62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, -101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, -111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 -,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, -103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 -,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, -99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, -32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, -97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, -112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 -,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, -32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, -111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 -,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, -102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, -104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 -,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, -116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 -,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, -109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, -101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, -101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, -105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, -114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, -32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, -114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 -,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 -,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 -,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, -108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 -,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, -110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, -108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, -115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, -111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, -114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, -100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, -112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, -104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 -,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 -,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 -,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, -97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, -101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, -108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, -116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 -,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, -118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, -111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, -104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, -100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, -116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, -105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 -,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, -105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, -108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, -120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 -,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, -116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, -99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, -100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 -,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, -110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 -,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 -,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, -97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, -108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, -103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, -116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, -101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 -,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 -,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, -116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 -,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, -32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, -101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, -97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, -110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 -,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 -,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, -108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, -117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 -,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, -116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, -115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, -99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, -111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, -109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 -,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, -112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, -107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, -106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, -118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, -108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, -99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, -62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, -101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, -119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, -101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 -,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, -105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 -,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, -104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, -116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 -,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 -,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 -,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 -,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, -101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 -,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 -,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, -101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, -104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, -115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 -,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, -114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 -,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, -108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 -,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 -,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, -104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, -99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 -,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, -32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 -,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 -,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 -,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, -111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, -32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, -46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 -,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, -110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, -116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, -104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, -101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, -111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, -114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, -47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, -116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, -46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, -101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 -,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, -32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, -105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 -,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 -,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 -,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, -112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, -32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 -,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 -,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 -,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 -,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, -115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, -101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, -110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 -,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, -102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, -116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, -108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, -105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 -,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 -,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, -105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, -117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, -101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 -,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, -105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, -99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, -110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 -,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 -,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, -111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, -100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 -,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 -,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, -110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, -104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, -101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, -101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, -114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 -,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 -,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, -119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 -,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 -,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, -97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, -111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, -101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, -97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 -,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, -100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, -100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, -112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 -,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 -,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, -101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, -111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, -116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, -111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, -62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 -,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, -103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, -110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, -121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, -10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, -101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, -111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, -101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 -,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 -,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 -,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 -,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 -,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 -,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 -,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 -,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 -,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 -,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 -,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 -,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 -,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 -,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 -,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 -,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 -,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 -,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 -,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 -,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 -,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 -,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 -,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 -,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 -,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 -,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 -,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 -,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 -,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 -,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 -,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 -,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 -,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 -,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 -,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 -,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 -,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 -,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 -,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 -,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 -,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 -,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 -,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 -,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 -,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 -,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 -,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 -,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 -,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 -,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 -,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 -,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 -,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 -,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 -,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 -,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 -,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 -,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 -,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 -,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 -,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 -,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 -,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 -,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 -,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 -,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 -,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 -,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 -,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 -,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 -,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 -,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 -,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 -,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 -,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 -,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 -,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 -,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 -,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 -,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 -,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 -,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 -,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 -,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 -,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 -,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 -,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 -,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 -,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 -,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, -61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 -,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, -34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 -,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, -116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, -116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 -,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 -,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, -62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, -116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 -,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, -47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, -101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, -58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, -99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, -116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 -,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, -114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, -114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, -115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, -13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 -,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, -101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, -45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, -101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, -105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, -121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, -101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, -61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, -108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 -,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 -,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, -101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, -105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, -100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, -98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, -102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 -,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, -32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, -115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, -121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 -,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, -110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, -101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, -97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, -101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, -110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, -109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, -112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 -,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 -,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 -,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 -,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 -,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, -100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 -,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, -117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, -32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 -,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 -,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, -109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 -,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, -99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, -114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, -101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, -99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, -114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, -110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, -101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, -47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, -120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, -97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, -97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, -103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, -100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, -32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, -102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 -,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, -60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, -114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, -98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 -,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 -,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, -110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, -32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, -101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, -101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, -116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, -32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, -32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, -101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, -116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, -32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, -101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 -,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, -104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, -116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, -45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 -,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 -,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 -,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 -,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 -,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, -32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, -97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, -116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 -,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, -37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 -,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, -47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, -101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, -121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, -116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, -97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, -105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, -112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 -,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, -111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, -114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, -61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 -,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, -100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 -,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, -115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 -,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, -114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, -32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, -101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, -32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 -,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, -114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 -,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, -108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, -34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, -115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 -,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, -32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 -,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, -61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, -108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, -104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 -,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, -32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, -99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, -111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, -102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, -61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, -60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 -,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, -32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, -101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, -102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, -110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, -60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, -116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, -101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 -,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 -,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, -110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, -99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, -104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, -109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, -105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, -105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 -,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, -103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 -,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 -,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, -111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, -101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, -32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 -,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, -105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, -99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, -116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, -60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, -97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, -32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, -101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, -103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, -101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, -111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, -32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 -,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, -115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 -,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, -40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, -97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, -105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, -61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 -,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, -101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 -,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, -116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, -114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, -101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 -,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, -103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 -,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, -105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 -,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, -104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 -,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, -112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, -163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, -131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, -160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, -188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, -131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, -189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, -186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, -130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, -180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, -167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, -167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, -167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, -116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, -84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, -112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 -,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, -32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, -115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, -112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, -116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, -109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 -,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, -105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, -120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, -104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 -,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, -101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, -112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, -41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 -,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, -60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, -120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, -101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 -,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 -,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, -62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, -111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, -112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, -60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, -101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, -62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 -,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, -97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 -,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 -,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 -,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, -141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, -164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, -224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, -168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, -164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, -224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, -141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, -164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, -224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, -154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, -164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, -224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, -190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, -164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, -224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, -149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, -164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, -224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, -130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, -164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, -224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, -190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, -164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, -224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, -188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, -164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, -224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, -105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, -109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, -116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 -,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 -,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 -,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 -,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 -,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 -,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, -101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 -,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, -34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, -47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 -,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, -101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, -100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 -,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, -68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, -61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, -112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 -,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, -97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, -101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, -112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 -,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 -,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, -99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 -,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, -32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, -67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 -,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, -110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 -,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, -116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, -121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, -60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, -118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, -34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, -116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, -110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 -,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, -32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, -101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 -,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, -110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, -32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, -100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, -116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, -32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, -183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, -182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, -183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, -184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, -183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, -177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, -33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 -,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 -,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, -114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, -58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, -119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, -84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 -,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, -47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, -39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, -105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, -101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, -106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, -100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, -101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 -,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 -,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, -34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, -101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, -117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 -,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, -111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 -,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, -105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, -97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, -34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 -,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, -32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, -116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, -34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, -116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, -121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 -,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, -99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, -116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, -32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, -101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 -,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, -46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, -60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 -,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, -115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, -120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, -116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, -115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, -101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 -,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, -39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 -,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 -,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 -,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 -,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 -,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 -,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 -,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 -,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 -,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 -,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 -,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 -,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 -,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 -,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 -,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 -,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 -,224,164,191,224,164,175,224,164,164,224,164,190 -} -/* GENERATED CODE END */ -; -#endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */ - -#if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const BrotliDictionary kBrotliDictionary = { +/* Embed kBrotliDictionaryData */ +#include "dictionary_inc.h" +static const BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #else -static BrotliDictionary kBrotliDictionary = { +static BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #endif /* size_bits_by_length */ { diff -Nru thunderbird-140.9.0esr/modules/brotli/common/dictionary.h thunderbird-140.10.0esr/modules/brotli/common/dictionary.h --- thunderbird-140.9.0esr/modules/brotli/common/dictionary.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/dictionary.h 2026-04-21 14:52:58.000000000 +0000 @@ -9,8 +9,7 @@ #ifndef BROTLI_COMMON_DICTIONARY_H_ #define BROTLI_COMMON_DICTIONARY_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff -Nru thunderbird-140.9.0esr/modules/brotli/common/dictionary_inc.h thunderbird-140.10.0esr/modules/brotli/common/dictionary_inc.h --- thunderbird-140.9.0esr/modules/brotli/common/dictionary_inc.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/dictionary_inc.h 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,5847 @@ +static const BROTLI_MODEL("small") uint8_t kBrotliDictionaryData[] = { +116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, +111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 +,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 +,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, +118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, +110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, +114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, +103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, +104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, +117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, +101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 +,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 +,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 +,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, +101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, +115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, +97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, +105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, +111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, +105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 +,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, +108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, +101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, +108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, +102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, +111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, +111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, +115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, +37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 +,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 +,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, +115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, +101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, +107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, +110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 +,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, +117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 +,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, +114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 +,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 +,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, +116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 +,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, +117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 +,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 +,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 +,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, +112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, +117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, +110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, +115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 +,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 +,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, +120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 +,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, +116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 +,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, +102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, +116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, +111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, +110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, +119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, +46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 +,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, +99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, +101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, +121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, +116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, +101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 +,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, +115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 +,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, +105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, +108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, +108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, +102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, +100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, +104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, +99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, +102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, +101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, +108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, +35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 +,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 +,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 +,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, +97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, +108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, +109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, +111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, +116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, +97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 +,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, +103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 +,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, +108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, +101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, +103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 +,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, +116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, +109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 +,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, +97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, +122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, +99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, +98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, +116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, +115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, +108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, +60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, +114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, +102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, +47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, +115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 +,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, +111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, +56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, +110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 +,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, +100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, +107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, +112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, +115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, +101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, +100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, +72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, +120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 +,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 +,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, +101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 +,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, +119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, +119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, +117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, +111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, +97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, +110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, +10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 +,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 +,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, +116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 +,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, +60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, +45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, +97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 +,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, +47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, +115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, +117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, +49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 +,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, +57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 +,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, +50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 +,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, +57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 +,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, +56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 +,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, +57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 +,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, +49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 +,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, +115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 +,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, +105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 +,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 +,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, +111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, +111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, +116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 +,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, +100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 +,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 +,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 +,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 +,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 +,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 +,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 +,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 +,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 +,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 +,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 +,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 +,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 +,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 +,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 +,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 +,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 +,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 +,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, +101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, +98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, +114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, +97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, +114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, +101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, +101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, +117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, +108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 +,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, +101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, +103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 +,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, +111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, +114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, +114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, +101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 +,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, +108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, +115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, +100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, +115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, +100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, +111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, +108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, +115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, +109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, +116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, +114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, +116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 +,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, +105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, +111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 +,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, +114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, +114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 +,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, +115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, +97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 +,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, +101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 +,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 +,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 +,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 +,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, +117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, +114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, +108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, +99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 +,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, +116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, +116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, +114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 +,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, +112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, +103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, +97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, +110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 +,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, +114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, +101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, +118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 +,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, +105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, +116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, +113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 +,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 +,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, +116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, +114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, +83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 +,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 +,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, +105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, +97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, +105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, +110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, +105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 +,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, +115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 +,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, +105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, +108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 +,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, +105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, +97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, +109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, +101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, +109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, +110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, +105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, +109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, +48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, +115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 +,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, +100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, +116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, +108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, +102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 +,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, +121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 +,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 +,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 +,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, +117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, +110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, +118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, +120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, +34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, +111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, +107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, +100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 +,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 +,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 +,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 +,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, +111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 +,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, +102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, +101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, +101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 +,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 +,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 +,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, +102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, +115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, +60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 +,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 +,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, +119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, +103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, +117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 +,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 +,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 +,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 +,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, +100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, +101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 +,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, +110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 +,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, +100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, +111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, +101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 +,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, +35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, +112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, +108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, +104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, +114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, +97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, +109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 +,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, +114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, +115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, +111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, +105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 +,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, +118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, +103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 +,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, +101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, +35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, +101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, +116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, +111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, +108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, +60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, +34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 +,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, +97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, +34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, +97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, +104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, +121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, +115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, +102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 +,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, +110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 +,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, +115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, +112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, +104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 +,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, +101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, +195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, +110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, +116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, +111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, +101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, +118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, +101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, +195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 +,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, +115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 +,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, +116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, +105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, +114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, +101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, +114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, +111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 +,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 +,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 +,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, +117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, +99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 +,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, +97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, +114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 +,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, +101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, +97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, +106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 +,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, +103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, +115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 +,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, +195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, +102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, +97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, +116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, +112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, +114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, +115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, +117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, +105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, +97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 +,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, +108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 +,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, +108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, +97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, +97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 +,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, +114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 +,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, +111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, +99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, +116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, +101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, +101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, +116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, +118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 +,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, +117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 +,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, +116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, +114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 +,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, +111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 +,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, +97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, +108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, +104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 +,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, +101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, +101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 +,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, +110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, +111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, +112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 +,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, +102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, +105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, +104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, +104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 +,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 +,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, +108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, +115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, +117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, +101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, +114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, +101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 +,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, +103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, +99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, +116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, +101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, +118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, +114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 +,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, +105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, +101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, +118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, +118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, +121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, +111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, +101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, +111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, +116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, +101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, +110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 +,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, +101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 +,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, +115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, +115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 +,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, +114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, +114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, +105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, +118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, +114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, +110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, +101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, +110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 +,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, +110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, +116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, +115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, +109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, +103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, +104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, +121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, +123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, +101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, +114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, +110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, +66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 +,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, +108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 +,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 +,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, +101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 +,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, +101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, +105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, +101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, +110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 +,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 +,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 +,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, +110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, +101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 +,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, +101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, +111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, +60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, +114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, +100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, +114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, +110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 +,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, +95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 +,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 +,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 +,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, +112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, +107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, +110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, +110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, +114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, +34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 +,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 +,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 +,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, +116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, +105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, +34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 +,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, +101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, +105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, +101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, +114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 +,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, +121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, +114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, +111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, +114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, +117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, +116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 +,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 +,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, +70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, +32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 +,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, +97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, +102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 +,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, +114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, +101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, +103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, +116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 +,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, +115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 +,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, +104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, +115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, +121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, +111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, +112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, +105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, +112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, +109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, +97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 +,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, +104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, +109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, +114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, +115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, +108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, +101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 +,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, +34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 +,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, +101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, +110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, +61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, +112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, +111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, +32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, +106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, +114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, +101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, +120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 +,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, +105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, +103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, +10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, +121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, +136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, +191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, +228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, +155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, +184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, +228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, +187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, +175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, +230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, +175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, +144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, +231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, +145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, +148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, +229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, +131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, +155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, +230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, +143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, +155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, +233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, +150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, +188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, +230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, +161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, +180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, +229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, +149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, +164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, +232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, +133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, +156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, +231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, +183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, +155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, +228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, +154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, +144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, +231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, +174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, +131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, +231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, +144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, +181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, +230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, +189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, +159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, +232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, +183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, +187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, +228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, +186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, +136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, +229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, +139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, +142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, +229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, +140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, +191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, +232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, +186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, +168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, +229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, +142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, +187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, +230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, +186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, +166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, +229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, +162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, +190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, +231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, +144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, +133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, +232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, +179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, +187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, +229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, +128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, +157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, +230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, +165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, +175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, +229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, +143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, +138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, +232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, +183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, +143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, +231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, +142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, +168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, +230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, +148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, +138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, +233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, +145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, +130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, +229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, +162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, +186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, +229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, +187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, +184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, +232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, +131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, +137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, +231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, +139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, +157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, +229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, +186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, +155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, +230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, +154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, +156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, +232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, +183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, +174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, +229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, +129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, +174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, +230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, +186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, +131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, +229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, +154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, +142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, +229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, +142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, +174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, +228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, +176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, +173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, +231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, +136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, +155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, +232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, +161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, +186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, +231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, +140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, +179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, +228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, +151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, +138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, +229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, +141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, +184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, +230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, +189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, +156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, +233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, +137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, +156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, +228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, +169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, +133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, +231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, +154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, +173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, +228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, +138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, +128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, +229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, +182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, +130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, +231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, +174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, +167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, +229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, +179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, +142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, +230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, +179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, +164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, +230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, +133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, +141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, +231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, +156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, +187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, +230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, +155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, +186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, +230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, +147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, +189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, +229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, +133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, +185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, +230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, +165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, +135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, +229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, +135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, +155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, +233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, +191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, +187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, +228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, +161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, +187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, +230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, +182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, +191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, +232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, +152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, +137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, +229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, +150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, +175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, +229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, +166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, +153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, +232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, +147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, +189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, +230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, +140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, +161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, +229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, +129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, +156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, +230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, +150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, +171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, +229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, +165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, +156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, +232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, +147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, +130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, +229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, +183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, +138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, +232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, +161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, +167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, +232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, +151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, +143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, +228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, +159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, +187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, +231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, +159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, +143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, +229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, +170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, +136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, +230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, +182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, +136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, +233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, +155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, +156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, +230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, +160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, +133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, +231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, +167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, +133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, +229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, +136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, +190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, +228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, +144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, +134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, +232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, +185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, +189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, +232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, +145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, +189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, +231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, +154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, +149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, +233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, +142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, +173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, +230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, +176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, +136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, +229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, +141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, +139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, +229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, +175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, +131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, +232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, +139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, +187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, +229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, +138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, +188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, +230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, +187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, +144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, +105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, +116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, +116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, +114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, +112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, +100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 +,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, +103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, +111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, +117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, +105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 +,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 +,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, +118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, +114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, +110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, +101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, +109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 +,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 +,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, +109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 +,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, +109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, +111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, +105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 +,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, +113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, +105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, +116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 +,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, +112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, +118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, +101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, +115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 +,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, +98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 +,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, +110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, +115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, +105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, +111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, +118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, +101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, +161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, +179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 +,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, +195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 +,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 +,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, +190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, +178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, +176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, +186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, +146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, +190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, +130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, +188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, +176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, +190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, +161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, +176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, +186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, +141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, +128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, +143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, +146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, +190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, +128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, +141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, +190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, +190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, +164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, +224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, +135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, +164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, +224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, +185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, +97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, +224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, +190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, +164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, +224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, +128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, +164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, +224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, +139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, +164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, +224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, +178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, +164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, +176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, +137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, +131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, +177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, +133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, +132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, +173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, +175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, +167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, +185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, +134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, +132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, +138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, +176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, +131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, +181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, +138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, +167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, +167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, +138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, +174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, +167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, +181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, +134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, +173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, +168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, +179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, +178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, +135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, +132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, +138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, +131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, +168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, +138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, +133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, +130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, +114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, +101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, +115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, +102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, +97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, +114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, +115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 +,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, +119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 +,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, +101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 +,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, +105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, +105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, +108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, +100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, +111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 +,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 +,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, +117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 +,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, +115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 +,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, +109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, +101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 +,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, +110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 +,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, +116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, +106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, +105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, +108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, +101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, +101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, +97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 +,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, +117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 +,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, +119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, +108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, +114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, +105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, +116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 +,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, +116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, +115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, +115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, +114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, +108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, +111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 +,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, +101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, +110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, +112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, +99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 +,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, +100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, +110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, +101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, +80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, +99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, +99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, +105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, +112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, +101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 +,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 +,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, +105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, +101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, +100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, +101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, +108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 +,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 +,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, +105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 +,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, +45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, +100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 +,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, +71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, +105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, +100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, +98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, +109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, +111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, +101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, +103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, +108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 +,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, +101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, +100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, +116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 +,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 +,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 +,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, +97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 +,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 +,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, +117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, +116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 +,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 +,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 +,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, +97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, +110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, +111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, +100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, +114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, +115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, +108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, +116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, +32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, +100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, +101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, +104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, +101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, +100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, +110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, +97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, +117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 +,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 +,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 +,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, +118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 +,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, +121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, +117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, +41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, +110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, +97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 +,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 +,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, +105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 +,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, +101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, +100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 +,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, +97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 +,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, +104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 +,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, +117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, +104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 +,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, +58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, +95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, +99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, +112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 +,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, +114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 +,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, +112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, +115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, +116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 +,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, +101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, +112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, +101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, +101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, +118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, +116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 +,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, +118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, +104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, +114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 +,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, +115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, +111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, +116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, +101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, +105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, +108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, +114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 +,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, +10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, +111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, +103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 +,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, +108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, +104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 +,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, +97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, +104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, +101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, +115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, +117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, +114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, +104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 +,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, +109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 +,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, +108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, +100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, +105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, +100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, +112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 +,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, +105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, +110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, +32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 +,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, +110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 +,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, +97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 +,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 +,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, +116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 +,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, +101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, +116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, +115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, +105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, +119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, +105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, +107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, +98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, +32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, +99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 +,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, +105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, +99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 +,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 +,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, +100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, +116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, +117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 +,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, +114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 +,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, +114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, +105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 +,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 +,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, +101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, +101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 +,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 +,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, +62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, +103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, +116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, +100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, +103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 +,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, +97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, +108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, +117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 +,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, +114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, +113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, +114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, +97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, +100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, +104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, +103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 +,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, +118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, +104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, +115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, +32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, +108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 +,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, +101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, +112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 +,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, +109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, +109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 +,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, +99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, +116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 +,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, +117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, +116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 +,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, +32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, +105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, +104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, +105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, +118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, +100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, +97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 +,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 +,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, +115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 +,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 +,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, +116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, +108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 +,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, +114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, +104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 +,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 +,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, +101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, +116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, +110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, +105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, +108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, +114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, +108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, +78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, +116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, +116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, +119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, +119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, +10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, +101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, +116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, +104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 +,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, +105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, +101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, +115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 +,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 +,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, +115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 +,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, +111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, +101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, +108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, +101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 +,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, +116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 +,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, +102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 +,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 +,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, +108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, +105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, +101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, +114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, +100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 +,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, +101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, +104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 +,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, +103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, +32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, +66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, +116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, +100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, +105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, +101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, +111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, +97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, +101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, +117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, +111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, +97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, +102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, +117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, +116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 +,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 +,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, +105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, +115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 +,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, +121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, +110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, +115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, +62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, +101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 +,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 +,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 +,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, +104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, +111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, +97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 +,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, +108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, +97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 +,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, +105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, +101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, +108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, +115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, +32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, +98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 +,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, +114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 +,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 +,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, +101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, +101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, +100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 +,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, +100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, +108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 +,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, +101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, +101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, +108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, +99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 +,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, +103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, +116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 +,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 +,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 +,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, +97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 +,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, +111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, +115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 +,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 +,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, +117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, +115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, +111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, +101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, +104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 +,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 +,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, +195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 +,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, +101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 +,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, +97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, +100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, +101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 +,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 +,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, +116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 +,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, +105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, +72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 +,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, +112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, +32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, +97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, +105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, +116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, +99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, +46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, +116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 +,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, +114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 +,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, +114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, +110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, +116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, +121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, +44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 +,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, +32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 +,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, +116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 +,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, +105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, +32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 +,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, +115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, +116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, +105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, +105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 +,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, +59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, +111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 +,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 +,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, +108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, +116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, +111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, +108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, +103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, +110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, +110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 +,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 +,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, +114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, +101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, +101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, +121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, +115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, +100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 +,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, +119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, +104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 +,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 +,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, +97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 +,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, +110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, +110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, +115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, +97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, +109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 +,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, +97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, +116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, +110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, +108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, +101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, +97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, +110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, +97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, +100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, +119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, +108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, +109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 +,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, +114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, +115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, +105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, +78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, +60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, +97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 +,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, +46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, +115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, +114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, +101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 +,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, +111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, +105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, +116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 +,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, +105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, +117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, +97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, +116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 +,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, +32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, +115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 +,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, +61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, +110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, +108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, +32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 +,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, +117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 +,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, +110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, +101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, +116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, +101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, +103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, +110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, +114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, +115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 +,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, +97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 +,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 +,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 +,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, +65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, +112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, +117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, +111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, +110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 +,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, +116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 +,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 +,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, +118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, +109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, +110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, +111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, +104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, +111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, +105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, +101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, +101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, +118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, +97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, +116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 +,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 +,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, +101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, +119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, +119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, +111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, +59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 +,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 +,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, +101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, +111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, +109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, +114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, +46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, +102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, +101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 +,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, +97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, +103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, +118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 +,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, +114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, +32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, +110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, +32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, +101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, +116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, +60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 +,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, +97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, +111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, +105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, +34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, +111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, +101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 +,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 +,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, +121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, +108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 +,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, +99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, +101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, +105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, +32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 +,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, +105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, +33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, +121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 +,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 +,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, +116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, +101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 +,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, +114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, +32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, +32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, +112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 +,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, +114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, +115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, +97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 +,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 +,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, +110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 +,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, +114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, +121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, +100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, +101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, +73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 +,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, +103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, +115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 +,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, +61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, +117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, +97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, +103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 +,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, +107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, +97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, +98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, +109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 +,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 +,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, +97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, +111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, +114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 +,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, +103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, +101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, +103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, +111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, +195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, +111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 +,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, +111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, +101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, +115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, +99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, +105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, +105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, +105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 +,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 +,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, +101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 +,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, +103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 +,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, +98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, +101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, +108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, +109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, +111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, +110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 +,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, +97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, +114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, +115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, +101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, +105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, +115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, +100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, +111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, +114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, +118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, +110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, +108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, +107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, +97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, +115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, +101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 +,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, +105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, +97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, +115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 +,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, +100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, +117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, +97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, +101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 +,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, +121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, +97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, +108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, +100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, +117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 +,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, +111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, +100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 +,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 +,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, +101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, +108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 +,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, +101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, +98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, +32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, +116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 +,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 +,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, +115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, +101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, +34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, +108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, +47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, +104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, +99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 +,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, +99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, +99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, +99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, +103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 +,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, +117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, +83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, +105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, +108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, +114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 +,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, +118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, +105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 +,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 +,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, +108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, +110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, +117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 +,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, +117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 +,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, +105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, +109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, +115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, +111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 +,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, +114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, +97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, +68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 +,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 +,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, +97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, +117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, +101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, +111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, +114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, +115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, +117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 +,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 +,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, +114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, +111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 +,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 +,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, +60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 +,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, +117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, +34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 +,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, +115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, +101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, +103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, +114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, +112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 +,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 +,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, +99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, +60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, +105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 +,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, +112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 +,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 +,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, +99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, +47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, +101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, +97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, +116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, +114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, +101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, +110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, +111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, +97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, +99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, +116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, +97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, +121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, +105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 +,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, +107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 +,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 +,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, +101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, +105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, +97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, +116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 +,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, +114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 +,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 +,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, +114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, +108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, +110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 +,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, +105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, +101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, +100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, +108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, +105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 +,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, +110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, +101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, +115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 +,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, +97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, +110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, +108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, +114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 +,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 +,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, +105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, +101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, +119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 +,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, +117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, +68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 +,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, +104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, +112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, +107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 +,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 +,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, +99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 +,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 +,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, +97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, +110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, +61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, +109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, +103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 +,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, +112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, +109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 +,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, +101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 +,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, +108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, +118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 +,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, +99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 +,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, +32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, +108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 +,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, +61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, +107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, +97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, +104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, +101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, +101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, +115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, +111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 +,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 +,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, +32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, +104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 +,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, +60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, +110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, +111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 +,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, +115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 +,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, +109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, +111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 +,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, +109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, +110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, +104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, +104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, +99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, +111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, +62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 +,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, +79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, +114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, +114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 +,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 +,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 +,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 +,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, +99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, +98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, +41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 +,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, +109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, +103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, +111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, +119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, +105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, +112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, +97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, +110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, +112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, +114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, +32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, +34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, +128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, +105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, +107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, +110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 +,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, +114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, +115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 +,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, +111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, +116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, +195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, +114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, +101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 +,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 +,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, +110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, +169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, +114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 +,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 +,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 +,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, +103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, +108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, +108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, +109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, +116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, +101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 +,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, +101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 +,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, +195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 +,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, +109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, +97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, +116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 +,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, +99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 +,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 +,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, +114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, +111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, +116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, +111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, +112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, +195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, +114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, +111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 +,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 +,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, +105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, +173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, +100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, +115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, +114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, +105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 +,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, +114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 +,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, +101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, +115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, +103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, +110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, +177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, +116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, +115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, +114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 +,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, +180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, +177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, +190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, +188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, +190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, +179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, +190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, +190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, +180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, +189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, +190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, +178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, +136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, +180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, +128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, +133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, +130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, +188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, +190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, +141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, +188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, +178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, +180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, +189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, +188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, +190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, +176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, +178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, +189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, +180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, +189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, +128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, +132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, +174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, +138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, +167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, +173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, +138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, +135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, +163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, +173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, +167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, +167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, +167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, +177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, +180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, +138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, +180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, +133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, +133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, +133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, +181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, +177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, +133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, +136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, +168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, +167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, +163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, +138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, +133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, +177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, +134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, +136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, +167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, +132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, +0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, +5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, +23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, +255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, +3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, +0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, +101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, +99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, +104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, +105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, +103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 +,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 +,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, +117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, +116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, +110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 +,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, +110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 +,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, +101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, +116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, +101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 +,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 +,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, +109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 +,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, +104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, +108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 +,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, +105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, +102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 +,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, +109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 +,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, +105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 +,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, +101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, +110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, +110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, +111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, +114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 +,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, +116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, +101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 +,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, +100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, +101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 +,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, +34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 +,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, +119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 +,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, +99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, +105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, +115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, +114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, +115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, +102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 +,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, +107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, +99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, +97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 +,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, +116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, +111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 +,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, +104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, +108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, +108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 +,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, +101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, +102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, +110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, +71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, +112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, +99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, +62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, +111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, +100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, +103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, +101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, +112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, +105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, +110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, +116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, +115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, +116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, +112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, +114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 +,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, +32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, +117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, +110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 +,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 +,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, +108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, +100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 +,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, +108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, +101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, +117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, +104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, +121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, +114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, +116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, +116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, +109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, +110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, +105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, +116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, +111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, +111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 +,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 +,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, +109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, +108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 +,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, +117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, +75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 +,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, +102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, +111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, +59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, +118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, +105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 +,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, +34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, +115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, +115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 +,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 +,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 +,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, +101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, +98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, +101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, +115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 +,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, +100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, +111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, +116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, +114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, +112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, +99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, +115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, +100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, +116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, +101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, +116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 +,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, +109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 +,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 +,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 +,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 +,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 +,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, +32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, +115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, +116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, +114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, +97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, +102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, +111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 +,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, +116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, +116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, +101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, +102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, +32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, +114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, +119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 +,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, +115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, +114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, +101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 +,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, +101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, +101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, +115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 +,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, +101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, +121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 +,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 +,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, +112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 +,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, +111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 +,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 +,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 +,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, +102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 +,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, +101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, +120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, +115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, +97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, +114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 +,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, +117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, +115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, +112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, +101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 +,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 +,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, +102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, +111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 +,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 +,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, +114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, +105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, +105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, +105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 +,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, +114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, +116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 +,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 +,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, +116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, +118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, +114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, +101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 +,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, +108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, +116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, +116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, +114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, +105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, +110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, +97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 +,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, +62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, +115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, +110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, +97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, +105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, +115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, +115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, +101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, +101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 +,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, +97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, +111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 +,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, +110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, +97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, +100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, +116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 +,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, +116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 +,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, +101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, +104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, +101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, +101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, +112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 +,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 +,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, +110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, +115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, +110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, +102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 +,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 +,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 +,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, +110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, +110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 +,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 +,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, +119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, +107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, +97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, +119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, +101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 +,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, +111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, +114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, +105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, +110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, +115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, +108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, +110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 +,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, +116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 +,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 +,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, +101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 +,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 +,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, +101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 +,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, +101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, +115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, +116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, +32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, +97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, +105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, +116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, +109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, +114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, +99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 +,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 +,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 +,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, +32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, +110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, +110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, +100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, +116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 +,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, +116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, +100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, +110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, +112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, +115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, +61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 +,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, +34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 +,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, +111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, +110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 +,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 +,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, +114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, +115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, +103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, +115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 +,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, +105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, +97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 +,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, +110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, +103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 +,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, +99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 +,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 +,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 +,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, +116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 +,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, +105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 +,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 +,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, +59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 +,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, +104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, +59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 +,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, +110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, +104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, +98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, +101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, +118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, +116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, +184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, +231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, +186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, +174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, +229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, +167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, +142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, +228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, +129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, +186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, +232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, +173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, +173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, +229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, +115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, +114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, +99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, +97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 +,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, +110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 +,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, +114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, +111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, +105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, +101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 +,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 +,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, +110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 +,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 +,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 +,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 +,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, +109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, +116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, +115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, +111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 +,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, +110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, +109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 +,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, +97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, +101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 +,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, +99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, +97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, +116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 +,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 +,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 +,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 +,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 +,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 +,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 +,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 +,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 +,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, +164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, +224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, +164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, +165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, +224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, +178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, +164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, +224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, +190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, +164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, +224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, +133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, +164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, +224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, +135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, +164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, +224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, +173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, +164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, +224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, +174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, +164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, +224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, +176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, +164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, +224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, +128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, +164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, +224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, +178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, +165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, +224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, +156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, +164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, +224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, +130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, +164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, +224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, +182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, +164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, +224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, +101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, +10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 +,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, +112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, +107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, +101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 +,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 +,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, +103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, +99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, +118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 +,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 +,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, +111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, +105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, +97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, +111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, +116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, +97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 +,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, +114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, +111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 +,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, +116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, +105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 +,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, +110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, +111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 +,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 +,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, +101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 +,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 +,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, +105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, +108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, +110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 +,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, +111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, +110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, +44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 +,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, +111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 +,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, +115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, +101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, +104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 +,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, +99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 +,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, +101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, +118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, +115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, +111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, +100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, +112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, +112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, +99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 +,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, +114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, +111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, +110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, +101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 +,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, +108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, +112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, +110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, +115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, +111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, +112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 +,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 +,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, +116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, +32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, +108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, +100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, +60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 +,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, +103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, +101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, +103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 +,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, +101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, +103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 +,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, +47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, +117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, +114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 +,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, +117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, +100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, +32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, +105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, +120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, +114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, +101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 +,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, +116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, +58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, +111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, +111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, +108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, +109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, +110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, +110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, +111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, +105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, +100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 +,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, +108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, +105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, +115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, +116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, +110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, +112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 +,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 +,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, +117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, +102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, +116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 +,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, +114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, +10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 +,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, +111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 +,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, +47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 +,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, +32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, +111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 +,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 +,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, +111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, +32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, +32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, +111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, +110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, +32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 +,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, +115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, +110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, +115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, +111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, +111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, +108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 +,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, +118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, +110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 +,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 +,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, +114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, +108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, +97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, +34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 +,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, +111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, +99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 +,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, +74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, +116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, +110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, +105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 +,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, +102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 +,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 +,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, +105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, +111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 +,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, +115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, +117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, +114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, +47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, +116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 +,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, +110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, +59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, +105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 +,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, +110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, +97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, +105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, +112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 +,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 +,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, +100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 +,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, +105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 +,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 +,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, +116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 +,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, +100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, +116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, +100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 +,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, +116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, +111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, +119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, +101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, +101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, +105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 +,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, +99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, +114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, +101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 +,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 +,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, +97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, +115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, +108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 +,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, +117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, +116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, +115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, +119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, +110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, +62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 +,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 +,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 +,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 +,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 +,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, +114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, +115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 +,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, +101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 +,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, +101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, +13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, +105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 +,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, +103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, +105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 +,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, +111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 +,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, +100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, +100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, +108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, +105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, +114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, +115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, +105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, +114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, +105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 +,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 +,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 +,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, +101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, +101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 +,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, +110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, +115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, +105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, +116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 +,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 +,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, +110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, +105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 +,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 +,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, +116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, +104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, +112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 +,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, +108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, +102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, +99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, +105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 +,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, +101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 +,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 +,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 +,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, +101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, +101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, +110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 +,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, +101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 +,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, +107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, +108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, +112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, +98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, +100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, +105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, +105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, +32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, +104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, +39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 +,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 +,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 +,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, +102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, +114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, +110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, +97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, +119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 +,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 +,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, +102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 +,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, +110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, +100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, +114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, +101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 +,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, +32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, +117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 +,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, +44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, +105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, +116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 +,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, +108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, +110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, +59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 +,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, +104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, +100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, +32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 +,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, +101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 +,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, +105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 +,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, +101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 +,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, +97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, +106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, +112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 +,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, +101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, +114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, +108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 +,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, +34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, +101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, +116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, +109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, +119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 +,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 +,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 +,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 +,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, +100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, +101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, +114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, +111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, +101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, +111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, +103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 +,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, +105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, +101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, +111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, +66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, +32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 +,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, +103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 +,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 +,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, +111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, +97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 +,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, +116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, +61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 +,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 +,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, +101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 +,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, +116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, +103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 +,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 +,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, +111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, +115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, +100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, +117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, +115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, +115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 +,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 +,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, +115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, +116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, +105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, +105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, +97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, +173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, +101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, +118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, +101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, +108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, +117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, +114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, +179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 +,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 +,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, +117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, +101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, +116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, +209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, +209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, +209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, +209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, +208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, +208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, +208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, +208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, +209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, +208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, +208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, +208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, +208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, +208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, +209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, +208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, +209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, +208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, +208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, +209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, +209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, +208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, +208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, +208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, +208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, +208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, +208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, +208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, +209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, +209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, +208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, +208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, +208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, +208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, +208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, +208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, +208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, +208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, +209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, +209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, +209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, +208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, +208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, +208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, +208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, +209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, +208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, +209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, +208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, +208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, +208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, +217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, +216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, +216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, +217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, +216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, +216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, +216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, +216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, +217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, +216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, +217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, +216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, +216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, +216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, +216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, +217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, +216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, +217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, +217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, +217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, +216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, +217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, +216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, +217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, +217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, +216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, +216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, +217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, +216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, +217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, +216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, +217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, +216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, +217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, +216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, +217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, +216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, +217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, +217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 +,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, +34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, +111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 +,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, +105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, +109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 +,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, +105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 +,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, +101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, +108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, +99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, +101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 +,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, +105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, +105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, +99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, +116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 +,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, +114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, +108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 +,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, +111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, +110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 +,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, +111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 +,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 +,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, +100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, +105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, +101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 +,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 +,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, +101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 +,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 +,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, +112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 +,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, +99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, +101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, +114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, +105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, +115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, +112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 +,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, +104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, +104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, +110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 +,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 +,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 +,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, +41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 +,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 +,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, +111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, +105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 +,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, +101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 +,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, +118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 +,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, +117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 +,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, +109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, +105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, +111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, +105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, +114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, +117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 +,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, +105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, +116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, +114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, +116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, +114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, +32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, +101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, +111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, +61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, +111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 +,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, +115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, +115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, +110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, +114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, +116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 +,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, +109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, +121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, +37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 +,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 +,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, +32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, +101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, +61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 +,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, +116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 +,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, +101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 +,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 +,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, +101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, +110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, +110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, +115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, +120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 +,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, +100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 +,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, +34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, +98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 +,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 +,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, +116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, +117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, +116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, +101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, +111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, +100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 +,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 +,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, +32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, +116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, +108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, +115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 +,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, +116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, +102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, +104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, +105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, +105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, +101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, +60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, +32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, +102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, +114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, +110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 +,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 +,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, +105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 +,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, +104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, +115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, +111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 +,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, +105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 +,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 +,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, +108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 +,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, +84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 +,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 +,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, +110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, +112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 +,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, +101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, +115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, +104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, +32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, +114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, +99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, +97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 +,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 +,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, +112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, +104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, +102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, +116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 +,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, +105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 +,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, +116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, +117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, +114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 +,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, +105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 +,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, +34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, +60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, +32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, +116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 +,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 +,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, +104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, +115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 +,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, +114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, +112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, +112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, +114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, +68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, +110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, +104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 +,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 +,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 +,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, +105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, +101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, +101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, +114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, +99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 +,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 +,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, +112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 +,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, +111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, +72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, +114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, +114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, +116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, +105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, +108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, +83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 +,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, +104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, +104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, +101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, +101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, +97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, +99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 +,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, +100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, +32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 +,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, +116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, +112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 +,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, +101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, +114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, +112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 +,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 +,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, +47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, +116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, +101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, +110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, +114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, +101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 +,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, +97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, +115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 +,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, +105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, +105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 +,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, +105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, +105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, +99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, +116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, +111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, +112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, +110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, +110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, +109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, +116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, +111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 +,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 +,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, +109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, +105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, +116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, +111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 +,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, +111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, +116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 +,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, +101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, +118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, +115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, +109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 +,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 +,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, +111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, +99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 +,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, +110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, +105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, +105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, +97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, +104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, +108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, +115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, +32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 +,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, +101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, +111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, +111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 +,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, +110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, +104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, +37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 +,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, +101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 +,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, +110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, +110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, +99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, +117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, +101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, +34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, +97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, +105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, +116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, +44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, +105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, +99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 +,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 +,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, +32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, +101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 +,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, +32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, +101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 +,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, +116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, +108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, +104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, +97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 +,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 +,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, +102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, +116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, +101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, +34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, +111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, +32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, +116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 +,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, +115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 +,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, +115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, +32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 +,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, +101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, +116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, +102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, +111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, +32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, +116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, +103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, +115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 +,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, +111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, +105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, +114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, +101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, +115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, +101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, +32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, +109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, +118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, +105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, +118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, +104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, +112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, +105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, +119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, +102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 +,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, +110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, +116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, +101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, +116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, +101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 +,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, +109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, +101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, +99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 +,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, +121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, +105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 +,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, +110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 +,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, +101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, +32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 +,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, +111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, +122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 +,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, +32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 +,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, +108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, +102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 +,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 +,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, +110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, +32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 +,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, +101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, +111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, +102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 +,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, +112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, +101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, +111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, +69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 +,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, +44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, +101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, +111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, +111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, +108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 +,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 +,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, +116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, +105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, +121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, +101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 +,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 +,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, +115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 +,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, +32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, +111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, +104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, +101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, +116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 +,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 +,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, +110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, +110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, +32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, +115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, +119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, +34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, +97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, +116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, +101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, +108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, +116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 +,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, +101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 +,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, +101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, +116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 +,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, +115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, +116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, +32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, +114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, +32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, +111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 +,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 +,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, +117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, +110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, +116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, +100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, +104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, +114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, +32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 +,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 +,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 +,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, +105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 +,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, +112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, +101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, +100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, +111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, +101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, +111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, +115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, +46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, +109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, +110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, +32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, +32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, +109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, +111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, +109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, +102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 +,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, +111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 +,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, +111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, +32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, +32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 +,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, +102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 +,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, +101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, +111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, +104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 +,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, +97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, +97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 +,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, +112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 +,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, +108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, +32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, +105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, +108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 +,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 +,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, +117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, +104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, +99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, +102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, +110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 +,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, +60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 +,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 +,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, +32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 +,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, +111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, +101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 +,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, +179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, +195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, +97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, +105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, +101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, +116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 +,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, +110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 +,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 +,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, +101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, +116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 +,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, +114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 +,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, +114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, +108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 +,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, +115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 +,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 +,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, +109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 +,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, +99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, +97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 +,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, +104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, +108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, +115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 +,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, +110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, +105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, +46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, +116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, +116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, +97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, +105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 +,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, +110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, +115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, +105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 +,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, +100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 +,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, +100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, +102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, +108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, +112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, +108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, +105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, +117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, +108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 +,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, +112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, +97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, +59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, +58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 +,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, +110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, +102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, +111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 +,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, +110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, +114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, +110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, +101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, +116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 +,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, +99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, +105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, +105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, +108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, +97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, +62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, +108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, +101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, +97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, +111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 +,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, +116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 +,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, +117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, +109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, +111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, +115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, +103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, +114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, +103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, +111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, +105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, +99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, +108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, +110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, +105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, +110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, +105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, +117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, +97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, +10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, +121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, +111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, +101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, +115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, +115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 +,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, +101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, +112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, +105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, +103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, +113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, +100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, +103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 +,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, +97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, +99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 +,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, +48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, +111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, +100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, +105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, +103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 +,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, +97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, +97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, +102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 +,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 +,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 +,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, +97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, +100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, +116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, +103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 +,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, +115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, +115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, +114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, +114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, +102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, +115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 +,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, +101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, +121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, +97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, +104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, +114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 +,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, +105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, +115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 +,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, +101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, +115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, +105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 +,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 +,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, +102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, +105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 +,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 +,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, +111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 +,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, +116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 +,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, +97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 +,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, +114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 +,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, +110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, +97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, +98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, +115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, +103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, +32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, +109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, +110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, +110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, +32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, +112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, +99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 +,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, +32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 +,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, +109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, +100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, +109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, +98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, +116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, +108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, +117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, +34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, +105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, +111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, +97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 +,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, +116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, +115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, +119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 +,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, +102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 +,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, +115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, +100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, +105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 +,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, +10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 +,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, +32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, +110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, +101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, +100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, +103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 +,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, +116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, +110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, +117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, +105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, +98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, +111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, +101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, +101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, +97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, +111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 +,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, +101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, +111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, +121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, +99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, +32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, +121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, +116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, +103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 +,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 +,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 +,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 +,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, +115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, +101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, +119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, +110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 +,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, +101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, +101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, +114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, +108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, +111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 +,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, +105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, +98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, +103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, +118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 +,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 +,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, +112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 +,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 +,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, +101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, +110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, +101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, +34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, +105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, +62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, +114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 +,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 +,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, +108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 +,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 +,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, +115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, +112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 +,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 +,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 +,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, +97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, +110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 +,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, +116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, +111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, +102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 +,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 +,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 +,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, +32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 +,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, +101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 +,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 +,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, +101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, +116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 +,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, +111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, +114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, +111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, +101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, +109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, +101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, +101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 +,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 +,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, +117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 +,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, +104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, +97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, +115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 +,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, +114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, +10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, +105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, +115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, +32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, +101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, +110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 +,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, +104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, +110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, +108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, +110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, +111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, +102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, +97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, +102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, +101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, +114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, +32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, +108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, +119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, +34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 +,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 +,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, +109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, +116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, +105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 +,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, +111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, +108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, +108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, +105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, +101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, +101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, +108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, +105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 +,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, +101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, +116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, +112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, +97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, +105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, +62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, +100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, +102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, +32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 +,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, +114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, +114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, +101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 +,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, +100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 +,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 +,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, +101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, +105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, +115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, +104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, +103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, +104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, +114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, +110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, +101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 +,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, +97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, +122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 +,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, +115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, +101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, +115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, +110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, +32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 +,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 +,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, +116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 +,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, +32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 +,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, +111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, +109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 +,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 +,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 +,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, +208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, +208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, +217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, +173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, +189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, +228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, +180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, +189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, +105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 +,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 +,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, +111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, +114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, +105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 +,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 +,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 +,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, +111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, +105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, +112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, +101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 +,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, +99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, +105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, +110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, +116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, +116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, +98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, +190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, +190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, +128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, +181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, +135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, +129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, +143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, +179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, +190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, +133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, +189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, +131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, +176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, +181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, +190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, +184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, +176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, +176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, +143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, +190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, +130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, +185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, +190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, +129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, +185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, +191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, +176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, +187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, +176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, +181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, +129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, +181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, +190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, +133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, +190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, +190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, +185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, +129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, +184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, +184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, +190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, +190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, +140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, +187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, +176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, +181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, +135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, +176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, +189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, +129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, +184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, +143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, +176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, +189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, +181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, +189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, +181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, +176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, +143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, +131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, +130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, +164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, +224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, +175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, +164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, +224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, +190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, +164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, +224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, +135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, +164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, +224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, +135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, +164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, +224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, +159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, +164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, +224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, +135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, +164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, +224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, +135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, +164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, +224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, +176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, +164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, +224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, +163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, +164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, +224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, +166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, +164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, +224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, +190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, +164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, +224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, +135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, +164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, +224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, +181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, +164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, +224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, +130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, +164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, +224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, +166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, +164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, +224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, +184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, +164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, +224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, +135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, +164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, +224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, +135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, +164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, +224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, +185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, +164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, +224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, +190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, +164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, +224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, +135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, +164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, +224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, +190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, +164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, +224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, +190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, +164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, +224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, +165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, +164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, +224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, +190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, +165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, +224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, +135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, +164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, +224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, +130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, +164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, +224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, +181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, +164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, +224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, +172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, +164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, +224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, +135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, +164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, +224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, +178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, +164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, +224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, +185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, +183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, +136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, +169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, +167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, +132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, +168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, +167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, +132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, +185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, +177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, +132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, +169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, +177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, +173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, +138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, +177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, +132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, +177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, +179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, +172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, +134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, +183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, +132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, +135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, +167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, +132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, +175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, +167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, +138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, +171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, +175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, +132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, +185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, +133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, +180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, +179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, +134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, +132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, +179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, +133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, +132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, +110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, +99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, +110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, +104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, +110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, +105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 +,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, +122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 +,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, +101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, +105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, +118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, +111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, +111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 +,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, +110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 +,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, +108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 +,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, +105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, +112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 +,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 +,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, +97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, +97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, +101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, +101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, +114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, +119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, +105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, +34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, +117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 +,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, +105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 +,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, +116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, +110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, +108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, +108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, +108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, +110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, +110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, +116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, +103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, +111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, +111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, +102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 +,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, +32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, +71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, +105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, +101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 +,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, +100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, +116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, +116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, +105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, +108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, +47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 +,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, +103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, +110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, +111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, +121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, +60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, +32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 +,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, +116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, +109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, +114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, +110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 +,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 +,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, +110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, +110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, +114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 +,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, +111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 +,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, +114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 +,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, +98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, +115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, +104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, +110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, +62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 +,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, +116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 +,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, +108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, +102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, +99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, +118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, +32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, +109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, +105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, +116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 +,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, +114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, +105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, +114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, +69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, +112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 +,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 +,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, +104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, +111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 +,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, +111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, +111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, +110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, +97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, +116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, +115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, +111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, +111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, +104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, +101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, +109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 +,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 +,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, +113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 +,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, +115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 +,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 +,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 +,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, +32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, +116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, +100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 +,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 +,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 +,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, +116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 +,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, +110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, +105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 +,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, +101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, +114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, +102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, +109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, +110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, +116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, +105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 +,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, +32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, +109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 +,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, +104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, +101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, +116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, +116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, +115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, +32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 +,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 +,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 +,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, +100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, +117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, +32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 +,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, +100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, +105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 +,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 +,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 +,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, +116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, +111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, +39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 +,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, +97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 +,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, +102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, +116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 +,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, +104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, +120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, +78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, +111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, +101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, +45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, +117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 +,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, +101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, +114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 +,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, +32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, +108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, +110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, +100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 +,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, +111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, +101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, +116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, +97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, +114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 +,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, +97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, +110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 +,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, +110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, +114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, +111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, +116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 +,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, +100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, +105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, +110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, +32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 +,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, +98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, +101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, +117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, +115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, +108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 +,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, +110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, +116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, +111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 +,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, +116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 +,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 +,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, +32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 +,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 +,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, +117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 +,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, +97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, +115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, +102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, +97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, +108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, +32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 +,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, +32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 +,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, +115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, +101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 +,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, +105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, +108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, +110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 +,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, +97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, +105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, +104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 +,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 +,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, +121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 +,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, +115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, +97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 +,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 +,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, +116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, +97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, +114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 +,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, +115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, +111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 +,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, +108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 +,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 +,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 +,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, +117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, +67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, +100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 +,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, +117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, +114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, +116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, +117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 +,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, +116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, +101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, +99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 +,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 +,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, +102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, +108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, +32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, +117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, +111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, +101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 +,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, +101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 +,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 +,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, +116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 +,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 +,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 +,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 +,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 +,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, +32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, +115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, +116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 +,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, +115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, +108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, +99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, +101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 +,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 +,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, +121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 +,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, +105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, +105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, +116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, +34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 +,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, +115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, +111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, +32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, +115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 +,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, +116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 +,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 +,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, +116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 +,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 +,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, +46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, +116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 +,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, +111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, +98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 +,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, +102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 +,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, +110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, +116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, +109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, +111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, +110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, +111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 +,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, +100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, +116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, +111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, +111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 +,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 +,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, +101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, +101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 +,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, +114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 +,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, +97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 +,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, +91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, +32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, +99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, +101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 +,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 +,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, +110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, +104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, +32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, +99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 +,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 +,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, +110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, +100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, +101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, +101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, +101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, +108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 +,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, +109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 +,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, +119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, +119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, +60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, +97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, +34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, +32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, +101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 +,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, +111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, +105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, +108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, +114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 +,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, +115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, +32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, +100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, +111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, +97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, +97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, +121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, +32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 +,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 +,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, +115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 +,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, +100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 +,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, +62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, +115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 +,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 +,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 +,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, +112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, +32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 +,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 +,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 +,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, +116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, +115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, +101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, +104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, +114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, +58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, +101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, +110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, +32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, +111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, +100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 +,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, +101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 +,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, +116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, +116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, +101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 +,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, +100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, +105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 +,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, +108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, +32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 +,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 +,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, +32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, +101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, +110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, +101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, +114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, +111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, +61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, +101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, +34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 +,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, +116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, +101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 +,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, +119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 +,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, +118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 +,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, +116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 +,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, +99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, +61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, +100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, +101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 +,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 +,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, +101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, +102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 +,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, +120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, +110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, +101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 +,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, +110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, +110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, +101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, +105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, +117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 +,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 +,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, +111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 +,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 +,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, +32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, +32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, +100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, +105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, +98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 +,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, +115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, +98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 +,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, +119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 +,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 +,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 +,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, +105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 +,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 +,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, +114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, +114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, +111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, +101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, +101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, +32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, +102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, +32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, +101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, +114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, +97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 +,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, +115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 +,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 +,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 +,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 +,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 +,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, +116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 +,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, +121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, +101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, +101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, +100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, +116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, +107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 +,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, +105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, +115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, +116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, +60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, +116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, +108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 +,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 +,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, +34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, +116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, +101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 +,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, +110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, +101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, +105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 +,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, +100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 +,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, +104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, +110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, +105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 +,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 +,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, +117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 +,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, +105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 +,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, +32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, +101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, +102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, +111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, +97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, +116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, +104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, +100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 +,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 +,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 +,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, +114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, +116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, +47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, +114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 +,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, +104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, +97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 +,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, +116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, +101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, +116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 +,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, +101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, +110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 +,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, +101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, +101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, +111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, +105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, +110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, +116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, +110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, +113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, +101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 +,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, +32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, +60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, +101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 +,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, +116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, +115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 +,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 +,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 +,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, +186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, +176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, +185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, +129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, +130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, +177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, +181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, +129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, +135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, +184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, +191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, +190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, +190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, +129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, +129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, +129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, +181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, +130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, +188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, +186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, +190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, +129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, +176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, +190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, +130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, +190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, +181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, +170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, +167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, +177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, +185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, +167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, +167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, +132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, +182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, +167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, +179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, +133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, +129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, +138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, +132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, +168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, +167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, +167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, +169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, +174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, +133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, +132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, +132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, +167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, +175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, +177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, +167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, +116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, +115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, +110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, +45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 +,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, +99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, +102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, +108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, +32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 +,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, +100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, +103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, +118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 +,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, +32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, +32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 +,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, +98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 +,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 +,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, +32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, +32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, +58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, +105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 +,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, +105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, +116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, +115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 +,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, +97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 +,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, +115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, +60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, +44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, +108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, +32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, +108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 +,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, +62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 +,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, +97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 +,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 +,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, +111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 +,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 +,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, +99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 +,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 +,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 +,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, +116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, +116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, +116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, +119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, +104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, +116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, +97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, +102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, +104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, +117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, +104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, +117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, +105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 +,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, +100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, +111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, +111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 +,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, +101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, +61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, +101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, +99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 +,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, +110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 +,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, +104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 +,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, +100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, +101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, +111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, +100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, +112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, +116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, +115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, +111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 +,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, +117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, +111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, +116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, +105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, +101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, +114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 +,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, +80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, +110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 +,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, +97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 +,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, +105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 +,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, +116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, +116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, +111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, +61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, +121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, +112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, +13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 +,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 +,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, +112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, +110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 +,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, +32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, +100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, +101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, +100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, +151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, +164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, +224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, +181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, +164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, +224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, +130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, +165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, +224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, +128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, +164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, +224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, +151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, +164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, +224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, +135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, +165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, +224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, +171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, +164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, +224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, +176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, +165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, +224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, +154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, +164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, +224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, +135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, +164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, +224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, +136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, +164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, +224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, +164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, +165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, +224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, +128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, +164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, +224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, +135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, +164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, +224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, +184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, +164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, +224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, +184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, +164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, +224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, +128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, +164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, +224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, +190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, +165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, +224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, +164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, +165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, +224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, +130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, +164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, +224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, +175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, +164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, +224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, +135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, +164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 +,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 +,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, +101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, +112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 +,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 +,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, +34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, +108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, +105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, +32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, +110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, +111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, +100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 +,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 +,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, +116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, +101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, +118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 +,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, +101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 +,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, +110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, +116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 +,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, +118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 +,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, +110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, +104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 +,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, +114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, +111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 +,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 +,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, +100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, +105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, +41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, +101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, +109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 +,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, +115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, +121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, +114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, +109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, +111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, +111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, +101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, +114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, +119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, +116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, +97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, +49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 +,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, +48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, +111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, +121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 +,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 +,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, +114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, +10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 +,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, +32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, +47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 +,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, +116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, +97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, +105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, +208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, +209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, +208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, +208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, +208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, +208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, +208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, +209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, +209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, +208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, +208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, +209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, +208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, +208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, +208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, +208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, +217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, +216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, +217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, +217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, +217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, +216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, +217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, +216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, +217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, +216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, +216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, +216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, +98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, +61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, +116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, +46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, +62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 +,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, +34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, +60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, +104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, +111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, +97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, +34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, +111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, +117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, +116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, +99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, +32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, +62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, +101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, +111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 +,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, +103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 +,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, +99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, +32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, +97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, +112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 +,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, +32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, +111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 +,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, +102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, +104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 +,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, +116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 +,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, +109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, +101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, +101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, +105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, +114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, +32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, +114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 +,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 +,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 +,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, +108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 +,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, +110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, +108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, +115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, +111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, +114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, +100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, +112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, +104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 +,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 +,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 +,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, +97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, +101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, +108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, +116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 +,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, +118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, +111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, +104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, +100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, +116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, +105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 +,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, +105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, +108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, +120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 +,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, +116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, +99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, +100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 +,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, +110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 +,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 +,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, +97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, +108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, +103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, +116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, +101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 +,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 +,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, +116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 +,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, +32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, +101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, +97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, +110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 +,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 +,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, +108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, +117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 +,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, +116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, +115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, +99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, +111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, +109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 +,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, +112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, +107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, +106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, +118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, +108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, +99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, +62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, +101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, +119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, +101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 +,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, +105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 +,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, +104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, +116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 +,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 +,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 +,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 +,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, +101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 +,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 +,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, +101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, +104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, +115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 +,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, +114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 +,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, +108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 +,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 +,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, +104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, +99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 +,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, +32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 +,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 +,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 +,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, +111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, +32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, +46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 +,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, +110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, +116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, +104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, +101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, +111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, +114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, +47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, +116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, +46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, +101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 +,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, +32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, +105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 +,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 +,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 +,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, +112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, +32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 +,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 +,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 +,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 +,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, +115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, +101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, +110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 +,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, +102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, +116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, +108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, +105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 +,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 +,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, +105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, +117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, +101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 +,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, +105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, +99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, +110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 +,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 +,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, +111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, +100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 +,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 +,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, +110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, +104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, +101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, +101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, +114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 +,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 +,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, +119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 +,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 +,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, +97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, +111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, +101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, +97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 +,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, +100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, +100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, +112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 +,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 +,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, +101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, +111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, +116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, +111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, +62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 +,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, +103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, +110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, +121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, +10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, +101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, +111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, +101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 +,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 +,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 +,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 +,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 +,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 +,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 +,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 +,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 +,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 +,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 +,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 +,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 +,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 +,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 +,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 +,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 +,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 +,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 +,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 +,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 +,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 +,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 +,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 +,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 +,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 +,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 +,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 +,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 +,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 +,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 +,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 +,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 +,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 +,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 +,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 +,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 +,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 +,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 +,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 +,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 +,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 +,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 +,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 +,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 +,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 +,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 +,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 +,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 +,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 +,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 +,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 +,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 +,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 +,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 +,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 +,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 +,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 +,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 +,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 +,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 +,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 +,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 +,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 +,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 +,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 +,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 +,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 +,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 +,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 +,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 +,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 +,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 +,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 +,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 +,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 +,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 +,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 +,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 +,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 +,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 +,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 +,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 +,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 +,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 +,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 +,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 +,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 +,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 +,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 +,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, +61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 +,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, +34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 +,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, +116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, +116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 +,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 +,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, +62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, +116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 +,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, +47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, +101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, +58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, +99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, +116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 +,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, +114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, +114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, +115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, +13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 +,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, +101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, +45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, +101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, +105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, +121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, +101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, +61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, +108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 +,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 +,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, +101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, +105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, +100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, +98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, +102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 +,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, +32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, +115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, +121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 +,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, +110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, +101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, +97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, +101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, +110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, +109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, +112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 +,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 +,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 +,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 +,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 +,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, +100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 +,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, +117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, +32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 +,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 +,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, +109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 +,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, +99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, +114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, +101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, +99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, +114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, +110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, +101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, +47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, +120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, +97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, +97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, +103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, +100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, +32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, +102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 +,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, +60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, +114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, +98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 +,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 +,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, +110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, +32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, +101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, +101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, +116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, +32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, +32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, +101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, +116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, +32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, +101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 +,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, +104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, +116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, +45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 +,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 +,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 +,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 +,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 +,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, +32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, +97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, +116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 +,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, +37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 +,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, +47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, +101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, +121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, +116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, +97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, +105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, +112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 +,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, +111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, +114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, +61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 +,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, +100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 +,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, +115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 +,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, +114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, +32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, +101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, +32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 +,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, +114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 +,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, +108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, +34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, +115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 +,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, +32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 +,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, +61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, +108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, +104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 +,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, +32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, +99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, +111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, +102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, +61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, +60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 +,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, +32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, +101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, +102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, +110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, +60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, +116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, +101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 +,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 +,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, +110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, +99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, +104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, +109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, +105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, +105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 +,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, +103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 +,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 +,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, +111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, +101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, +32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 +,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, +105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, +99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, +116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, +60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, +97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, +32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, +101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, +103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, +101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, +111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, +32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 +,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, +115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 +,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, +40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, +97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, +105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, +61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 +,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, +101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 +,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, +116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, +114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, +101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 +,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, +103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 +,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, +105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 +,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, +104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 +,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, +112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, +163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, +131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, +160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, +188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, +131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, +189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, +186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, +130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, +180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, +167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, +167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, +167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, +116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, +84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, +112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 +,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, +32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, +115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, +112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, +116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, +109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 +,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, +105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, +120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, +104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 +,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, +101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, +112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, +41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 +,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, +60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, +120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, +101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 +,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 +,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, +62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, +111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, +112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, +60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, +101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, +62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 +,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, +97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 +,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 +,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 +,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, +141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, +164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, +224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, +168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, +164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, +224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, +141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, +164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, +224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, +154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, +164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, +224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, +190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, +164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, +224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, +149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, +164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, +224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, +130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, +164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, +224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, +190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, +164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, +224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, +188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, +164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, +224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, +105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, +109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, +116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 +,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 +,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 +,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 +,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 +,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 +,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, +101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 +,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, +34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, +47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 +,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, +101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, +100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 +,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, +68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, +61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, +112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 +,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, +97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, +101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, +112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 +,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 +,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, +99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 +,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, +32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, +67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 +,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, +110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 +,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, +116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, +121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, +60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, +118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, +34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, +116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, +110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 +,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, +32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, +101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 +,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, +110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, +32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, +100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, +116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, +32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, +183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, +182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, +183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, +184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, +183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, +177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, +33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 +,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 +,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, +114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, +58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, +119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, +84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 +,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, +47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, +39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, +105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, +101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, +106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, +100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, +101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 +,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 +,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, +34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, +101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, +117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 +,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, +111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 +,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, +105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, +97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, +34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 +,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, +32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, +116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, +34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, +116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, +121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 +,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, +99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, +116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, +32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, +101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 +,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, +46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, +60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 +,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, +115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, +120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, +116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, +115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, +101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 +,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, +39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 +,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 +,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 +,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 +,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 +,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 +,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 +,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 +,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 +,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 +,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 +,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 +,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 +,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 +,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 +,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 +,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 +,224,164,191,224,164,175,224,164,164,224,164,190 +}; diff -Nru thunderbird-140.9.0esr/modules/brotli/common/platform.c thunderbird-140.10.0esr/modules/brotli/common/platform.c --- thunderbird-140.9.0esr/modules/brotli/common/platform.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/platform.c 2026-04-21 14:52:59.000000000 +0000 @@ -4,10 +4,6 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ -#include - -#include - #include "platform.h" /* Default brotli_alloc_func */ diff -Nru thunderbird-140.9.0esr/modules/brotli/common/platform.h thunderbird-140.10.0esr/modules/brotli/common/platform.h --- thunderbird-140.9.0esr/modules/brotli/common/platform.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/platform.h 2026-04-21 14:52:59.000000000 +0000 @@ -24,22 +24,13 @@ #ifndef BROTLI_COMMON_PLATFORM_H_ #define BROTLI_COMMON_PLATFORM_H_ -#include /* memcpy */ +#include +#include /* IWYU pragma: export memcmp, memcpy, memset */ +#include /* IWYU pragma: export exit, free, malloc */ +#include /* should include endian.h for us */ -#include -#include - -#if defined(OS_LINUX) || defined(OS_CYGWIN) || defined(__EMSCRIPTEN__) -#include -#elif defined(OS_FREEBSD) -#include -#elif defined(OS_MACOSX) -#include -/* Let's try and follow the Linux convention */ -#define BROTLI_X_BYTE_ORDER BYTE_ORDER -#define BROTLI_X_LITTLE_ENDIAN LITTLE_ENDIAN -#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN -#endif +#include /* IWYU pragma: export */ +#include /* IWYU pragma: export */ #if BROTLI_MSVC_VERSION_CHECK(18, 0, 0) #include @@ -213,9 +204,23 @@ #define BROTLI_TARGET_LOONGARCH64 #endif +/* This does not seem to be an indicator of z/Architecture (64-bit); neither + that allows to use unaligned loads. */ +#if defined(__s390x__) +#define BROTLI_TARGET_S390X +#endif + +#if defined(__mips64) +#define BROTLI_TARGET_MIPS64 +#endif + +#if defined(__ia64__) || defined(_M_IA64) +#define BROTLI_TARGET_IA64 +#endif + #if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \ defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \ - defined(BROTLI_TARGET_LOONGARCH64) + defined(BROTLI_TARGET_LOONGARCH64) || defined(BROTLI_TARGET_MIPS64) #define BROTLI_TARGET_64_BITS 1 #else #define BROTLI_TARGET_64_BITS 0 @@ -248,13 +253,12 @@ #define BROTLI_LITTLE_ENDIAN 1 #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define BROTLI_BIG_ENDIAN 1 -#elif defined(BROTLI_X_BYTE_ORDER) -#if BROTLI_X_BYTE_ORDER == BROTLI_X_LITTLE_ENDIAN +/* Likely target platform is iOS / OSX. */ +#elif defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 1 -#elif BROTLI_X_BYTE_ORDER == BROTLI_X_BIG_ENDIAN +#elif defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN) #define BROTLI_BIG_ENDIAN 1 #endif -#endif /* BROTLI_X_BYTE_ORDER */ #if !defined(BROTLI_LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 0 @@ -264,12 +268,6 @@ #define BROTLI_BIG_ENDIAN 0 #endif -#if defined(BROTLI_X_BYTE_ORDER) -#undef BROTLI_X_BYTE_ORDER -#undef BROTLI_X_LITTLE_ENDIAN -#undef BROTLI_X_BIG_ENDIAN -#endif - #if defined(BROTLI_BUILD_NO_UNALIGNED_READ_FAST) #define BROTLI_UNALIGNED_READ_FAST (!!0) #elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \ @@ -284,6 +282,46 @@ #endif /* Portable unaligned memory access: read / write values via memcpy. */ +#if !defined(BROTLI_USE_PACKED_FOR_UNALIGNED) +#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6) +#define BROTLI_USE_PACKED_FOR_UNALIGNED 1 +#else +#define BROTLI_USE_PACKED_FOR_UNALIGNED 0 +#endif +#endif /* defined(BROTLI_USE_PACKED_FOR_UNALIGNED) */ + +#if BROTLI_USE_PACKED_FOR_UNALIGNED + +typedef union BrotliPackedValue { + uint16_t u16; + uint32_t u32; + uint64_t u64; + size_t szt; +} __attribute__ ((packed)) BrotliPackedValue; + +static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u16; +} +static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u32; +} +static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u64; +} +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->szt; +} +static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { + BrotliPackedValue* address = (BrotliPackedValue*)p; + address->u64 = v; +} + +#else /* not BROTLI_USE_PACKED_FOR_UNALIGNED */ + static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { uint16_t t; memcpy(&t, p, sizeof t); @@ -299,10 +337,43 @@ memcpy(&t, p, sizeof t); return t; } +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + size_t t; + memcpy(&t, p, sizeof t); + return t; +} static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { memcpy(p, &v, sizeof v); } +#endif /* BROTLI_USE_PACKED_FOR_UNALIGNED */ + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap16, 4, 3, 0) +#define BROTLI_BSWAP16(V) ((uint16_t)__builtin_bswap16(V)) +#else +#define BROTLI_BSWAP16(V) ((uint16_t)( \ + (((V) & 0xFFU) << 8) | \ + (((V) >> 8) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap32, 4, 3, 0) +#define BROTLI_BSWAP32(V) ((uint32_t)__builtin_bswap32(V)) +#else +#define BROTLI_BSWAP32(V) ((uint32_t)( \ + (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ + (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap64, 4, 3, 0) +#define BROTLI_BSWAP64(V) ((uint64_t)__builtin_bswap64(V)) +#else +#define BROTLI_BSWAP64(V) ((uint64_t)( \ + (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ + (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ + (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ + (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU))) +#endif + #if BROTLI_LITTLE_ENDIAN /* Straight endianness. Just read / write values. */ #define BROTLI_UNALIGNED_LOAD16LE BrotliUnalignedRead16 @@ -310,32 +381,20 @@ #define BROTLI_UNALIGNED_LOAD64LE BrotliUnalignedRead64 #define BROTLI_UNALIGNED_STORE64LE BrotliUnalignedWrite64 #elif BROTLI_BIG_ENDIAN /* BROTLI_LITTLE_ENDIAN */ -/* Explain compiler to byte-swap values. */ -#define BROTLI_BSWAP16_(V) ((uint16_t)( \ - (((V) & 0xFFU) << 8) | \ - (((V) >> 8) & 0xFFU))) static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) { uint16_t value = BrotliUnalignedRead16(p); - return BROTLI_BSWAP16_(value); + return BROTLI_BSWAP16(value); } -#define BROTLI_BSWAP32_(V) ( \ - (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ - (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU)) static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) { uint32_t value = BrotliUnalignedRead32(p); - return BROTLI_BSWAP32_(value); + return BROTLI_BSWAP32(value); } -#define BROTLI_BSWAP64_(V) ( \ - (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ - (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ - (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ - (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU)) static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) { uint64_t value = BrotliUnalignedRead64(p); - return BROTLI_BSWAP64_(value); + return BROTLI_BSWAP64(value); } static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) { - uint64_t value = BROTLI_BSWAP64_(v); + uint64_t value = BROTLI_BSWAP64(v); BrotliUnalignedWrite64(p, value); } #else /* BROTLI_LITTLE_ENDIAN */ @@ -464,6 +523,14 @@ #define BROTLI_MIN(T, A, B) (brotli_min_ ## T((A), (B))) #define BROTLI_MAX(T, A, B) (brotli_max_ ## T((A), (B))) +static BROTLI_INLINE int brotli_safe_add_int(int a, int b, int* result) { + if (b > 0 && a > INT_MAX - b) return 0; + if (b < 0 && a < INT_MIN - b) return 0; + *result = a + b; + return 1; +} +#define BROTLI_SAFE_ADD(T, A, B, R) (brotli_safe_add_ ## T((A), (B), (R))) + #define BROTLI_SWAP(T, A, I, J) { \ T __brotli_swap_tmp = (A)[(I)]; \ (A)[(I)] = (A)[(J)]; \ @@ -475,7 +542,7 @@ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) #define BROTLI_TZCNT64 __builtin_ctzll #elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0) -#if defined(BROTLI_TARGET_X64) +#if defined(BROTLI_TARGET_X64) && !defined(_M_ARM64EC) #define BROTLI_TZCNT64 _tzcnt_u64 #else /* BROTLI_TARGET_X64 */ static BROTLI_INLINE uint32_t BrotliBsf64Msvc(uint64_t x) { @@ -506,11 +573,29 @@ /* Default brotli_free_func */ BROTLI_COMMON_API void BrotliDefaultFreeFunc(void* opaque, void* address); +/* Circular logical rotates. */ +static BROTLI_INLINE uint16_t BrotliRotateRight16(uint16_t const value, + size_t count) { + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (uint16_t)(value << ((0U - count) & 0x0F)); +} +static BROTLI_INLINE uint32_t BrotliRotateRight32(uint32_t const value, + size_t count) { + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (uint32_t)(value << ((0U - count) & 0x1F)); +} +static BROTLI_INLINE uint64_t BrotliRotateRight64(uint64_t const value, + size_t count) { + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (uint64_t)(value << ((0U - count) & 0x3F)); +} + BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) { BROTLI_UNUSED(&BrotliSuppressUnusedFunctions); BROTLI_UNUSED(&BrotliUnalignedRead16); BROTLI_UNUSED(&BrotliUnalignedRead32); BROTLI_UNUSED(&BrotliUnalignedRead64); + BROTLI_UNUSED(&BrotliUnalignedReadSizeT); BROTLI_UNUSED(&BrotliUnalignedWrite64); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD16LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE); @@ -531,11 +616,80 @@ BROTLI_UNUSED(&brotli_max_uint32_t); BROTLI_UNUSED(&brotli_min_uint8_t); BROTLI_UNUSED(&brotli_max_uint8_t); + BROTLI_UNUSED(&brotli_safe_add_int); BROTLI_UNUSED(&BrotliDefaultAllocFunc); BROTLI_UNUSED(&BrotliDefaultFreeFunc); + BROTLI_UNUSED(&BrotliRotateRight16); + BROTLI_UNUSED(&BrotliRotateRight32); + BROTLI_UNUSED(&BrotliRotateRight64); #if BROTLI_ENABLE_DUMP BROTLI_UNUSED(&BrotliDump); #endif } +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && \ + !defined(_M_ARM64EC) +/* _mm_prefetch() is not defined outside of x86/x64 */ +/* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +#include +#define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +#define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1) +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_prefetch, 3, 1, 0) +#define PREFETCH_L1(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +#define PREFETCH_L2(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */) +#elif defined(__aarch64__) +#define PREFETCH_L1(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#define PREFETCH_L2(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#else +#define PREFETCH_L1(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#define PREFETCH_L2(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#endif + +/* The SIMD matchers are only faster at certain quality levels. */ +#if defined(_M_X64) && defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 7 +#elif defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 6 +#endif + +#if defined(_MSC_VER) +#define BROTLI_CRASH() __debugbreak(), (void)abort() +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_trap, 3, 0, 0) +#define BROTLI_CRASH() (void)__builtin_trap() +#else +#define BROTLI_CRASH() (void)abort() +#endif + +/* Make BROTLI_TEST=0 act same as undefined. */ +#if defined(BROTLI_TEST) && ((1-BROTLI_TEST-1) == 0) +#undef BROTLI_TEST +#endif + +#if !defined(BROTLI_MODEL) && BROTLI_GNUC_HAS_ATTRIBUTE(model, 3, 0, 3) && \ + !defined(BROTLI_TARGET_IA64) && !defined(BROTLI_TARGET_LOONGARCH64) +#define BROTLI_MODEL(M) __attribute__((model(M))) +#else +#define BROTLI_MODEL(M) /* M */ +#endif + +#if !defined(BROTLI_COLD) && BROTLI_GNUC_HAS_ATTRIBUTE(cold, 4, 3, 0) +#define BROTLI_COLD __attribute__((cold)) +#else +#define BROTLI_COLD /* cold */ +#endif + #endif /* BROTLI_COMMON_PLATFORM_H_ */ diff -Nru thunderbird-140.9.0esr/modules/brotli/common/shared_dictionary.c thunderbird-140.10.0esr/modules/brotli/common/shared_dictionary.c --- thunderbird-140.9.0esr/modules/brotli/common/shared_dictionary.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/shared_dictionary.c 2026-04-21 14:52:59.000000000 +0000 @@ -8,10 +8,6 @@ #include -#include -#include /* malloc, free */ -#include - #include "dictionary.h" #include "platform.h" #include "shared_dictionary_internal.h" @@ -279,7 +275,7 @@ size_t pos = 0; uint32_t chunk_size = 0; size_t total_prefix_suffix_count = 0; - size_t trasform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; + size_t transform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; uint16_t temporary_prefix_suffix_table[256]; /* Skip magic header bytes. */ @@ -333,7 +329,7 @@ for (i = 0; i < dict->num_transform_lists; i++) { BROTLI_BOOL ok = BROTLI_FALSE; size_t prefix_suffix_count = 0; - trasform_list_start[i] = pos; + transform_list_start[i] = pos; dict->transforms_instances[i].prefix_suffix_map = temporary_prefix_suffix_table; ok = ParseTransformsList( @@ -351,7 +347,7 @@ total_prefix_suffix_count = 0; for (i = 0; i < dict->num_transform_lists; i++) { size_t prefix_suffix_count = 0; - size_t position = trasform_list_start[i]; + size_t position = transform_list_start[i]; uint16_t* prefix_suffix_map = &dict->prefix_suffix_maps[total_prefix_suffix_count]; BROTLI_BOOL ok = ParsePrefixSuffixTable( diff -Nru thunderbird-140.9.0esr/modules/brotli/common/shared_dictionary_internal.h thunderbird-140.10.0esr/modules/brotli/common/shared_dictionary_internal.h --- thunderbird-140.9.0esr/modules/brotli/common/shared_dictionary_internal.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/shared_dictionary_internal.h 2026-04-21 14:52:59.000000000 +0000 @@ -10,9 +10,9 @@ #define BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_ #include -#include #include "dictionary.h" +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) diff -Nru thunderbird-140.9.0esr/modules/brotli/common/static_init.h thunderbird-140.10.0esr/modules/brotli/common/static_init.h --- thunderbird-140.9.0esr/modules/brotli/common/static_init.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/static_init.h 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,56 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* + Central point for static initialization. + + In case of "lazy" mode `BrotliXxxLazyStaticInit` is not provided by the + library. Embedder is responsible for providing it. This function should call + `BrotliXxxLazyStaticInitInner` on the first invocation. This function should + not return until execution of `BrotliXxxLazyStaticInitInner` is finished. + In C or before C++11 it is possible to call `BrotliXxxLazyStaticInitInner` + on start-up path and then `BrotliEncoderLazyStaticInit` is could be no-op; + another option is to use available thread execution controls to meet the + requirements. For possible C++11 implementation see static_init_lazy.cc. +*/ + +#ifndef THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* Static data is "initialized" in compile time. */ +#define BROTLI_STATIC_INIT_NONE 0 +/* Static data is initialized before "main". */ +#define BROTLI_STATIC_INIT_EARLY 1 +/* Static data is initialized when first encoder is created. */ +#define BROTLI_STATIC_INIT_LAZY 2 + +#define BROTLI_STATIC_INIT_DEFAULT BROTLI_STATIC_INIT_NONE + +#if !defined(BROTLI_STATIC_INIT) +#define BROTLI_STATIC_INIT BROTLI_STATIC_INIT_DEFAULT +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_EARLY) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY) +#error Invalid value for BROTLI_STATIC_INIT +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +#if defined(BROTLI_EXTERNAL_DICTIONARY_DATA) +#error BROTLI_STATIC_INIT_EARLY will fail with BROTLI_EXTERNAL_DICTIONARY_DATA +#endif +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ diff -Nru thunderbird-140.9.0esr/modules/brotli/common/transform.c thunderbird-140.10.0esr/modules/brotli/common/transform.c --- thunderbird-140.9.0esr/modules/brotli/common/transform.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/transform.c 2026-04-21 14:52:59.000000000 +0000 @@ -4,6 +4,7 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -11,7 +12,7 @@ #endif /* RFC 7932 transforms string data */ -static const char kPrefixSuffix[217] = +static const BROTLI_MODEL("small") char kPrefixSuffix[217] = "\1 \2, \10 of the \4 of \2s \1.\5 and \4 " /* 0x _0 _2 __5 _E _3 _6 _8 _E */ "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 " @@ -27,7 +28,7 @@ "t \4ize \2\xc2\xa0\4ous \5 the \2e "; /* \0 - implicit trailing zero. */ /* Cx _2 _7___ ___ _A _F _5 _8 */ -static const uint16_t kPrefixSuffixMap[50] = { +static const BROTLI_MODEL("small") uint16_t kPrefixSuffixMap[50] = { 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25, 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E, 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C, @@ -36,7 +37,7 @@ }; /* RFC 7932 transforms */ -static const uint8_t kTransformsData[] = { +static const BROTLI_MODEL("small") uint8_t kTransformsData[] = { 49, BROTLI_TRANSFORM_IDENTITY, 49, 49, BROTLI_TRANSFORM_IDENTITY, 0, 0, BROTLI_TRANSFORM_IDENTITY, 0, @@ -160,7 +161,8 @@ 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34, }; -static const BrotliTransforms kBrotliTransforms = { +static const BROTLI_MODEL("small") +BrotliTransforms kBrotliTransforms = { sizeof(kPrefixSuffix), (const uint8_t*)kPrefixSuffix, kPrefixSuffixMap, diff -Nru thunderbird-140.9.0esr/modules/brotli/common/transform.h thunderbird-140.10.0esr/modules/brotli/common/transform.h --- thunderbird-140.9.0esr/modules/brotli/common/transform.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/transform.h 2026-04-21 14:52:59.000000000 +0000 @@ -8,8 +8,7 @@ #ifndef BROTLI_COMMON_TRANSFORM_H_ #define BROTLI_COMMON_TRANSFORM_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff -Nru thunderbird-140.9.0esr/modules/brotli/common/version.h thunderbird-140.10.0esr/modules/brotli/common/version.h --- thunderbird-140.9.0esr/modules/brotli/common/version.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/common/version.h 2026-04-21 14:52:59.000000000 +0000 @@ -18,7 +18,7 @@ BrotliEncoderVersion methods. */ #define BROTLI_VERSION_MAJOR 1 -#define BROTLI_VERSION_MINOR 1 +#define BROTLI_VERSION_MINOR 2 #define BROTLI_VERSION_PATCH 0 #define BROTLI_VERSION BROTLI_MAKE_HEX_VERSION( \ @@ -32,9 +32,9 @@ - interfaces not changed -> current:revision+1:age */ -#define BROTLI_ABI_CURRENT 2 +#define BROTLI_ABI_CURRENT 3 #define BROTLI_ABI_REVISION 0 -#define BROTLI_ABI_AGE 1 +#define BROTLI_ABI_AGE 2 #if BROTLI_VERSION_MAJOR != (BROTLI_ABI_CURRENT - BROTLI_ABI_AGE) #error ABI/API version inconsistency diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/bit_reader.c thunderbird-140.10.0esr/modules/brotli/dec/bit_reader.c --- thunderbird-140.9.0esr/modules/brotli/dec/bit_reader.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/bit_reader.c 2026-04-21 14:52:59.000000000 +0000 @@ -8,15 +8,14 @@ #include "bit_reader.h" -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -const brotli_reg_t kBrotliBitMask[33] = { 0x00000000, +const BROTLI_MODEL("small") +brotli_reg_t kBrotliBitMask[33] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, @@ -27,12 +26,12 @@ 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF }; -void BrotliInitBitReader(BrotliBitReader* const br) { +void BrotliInitBitReader(BrotliBitReader* br) { br->val_ = 0; br->bit_pos_ = 0; } -BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) { +BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* br) { size_t aligned_read_mask = (sizeof(br->val_) >> 1) - 1; /* Fixing alignment after unaligned BrotliFillWindow would result accumulator overflow. If unalignment is caused by BrotliSafeReadBits, then there is @@ -56,7 +55,7 @@ return BROTLI_TRUE; } -BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br, +BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* br, brotli_reg_t n_bits, brotli_reg_t* val) { brotli_reg_t low_val; brotli_reg_t high_val; diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/bit_reader.h thunderbird-140.10.0esr/modules/brotli/dec/bit_reader.h --- thunderbird-140.9.0esr/modules/brotli/dec/bit_reader.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/bit_reader.h 2026-04-21 14:52:59.000000000 +0000 @@ -9,10 +9,6 @@ #ifndef BROTLI_DEC_BIT_READER_H_ #define BROTLI_DEC_BIT_READER_H_ -#include /* memcpy */ - -#include - #include "../common/constants.h" #include "../common/platform.h" diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/decode.c thunderbird-140.10.0esr/modules/brotli/dec/decode.c --- thunderbird-140.9.0esr/modules/brotli/dec/decode.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/decode.c 2026-04-21 14:52:59.000000000 +0000 @@ -6,9 +6,6 @@ #include -#include /* free, malloc */ -#include /* memcpy, memset */ - #include "../common/constants.h" #include "../common/context.h" #include "../common/dictionary.h" @@ -20,6 +17,7 @@ #include "huffman.h" #include "prefix.h" #include "state.h" +#include "static_init.h" #if defined(BROTLI_TARGET_NEON) #include @@ -46,16 +44,19 @@ 255 prefix + 32 base + 255 suffix */ static const brotli_reg_t kRingBufferWriteAheadSlack = 542; -static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, }; /* Static prefix code for the complex code length code lengths. */ -static const uint8_t kCodeLengthPrefixLength[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixLength[16] = { 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4, }; -static const uint8_t kCodeLengthPrefixValue[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixValue[16] = { 0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5, }; @@ -78,6 +79,10 @@ BrotliDecoderState* BrotliDecoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { BrotliDecoderState* state = 0; + if (!BrotliDecoderEnsureStaticInit()) { + BROTLI_DUMP(); + return 0; + } if (!alloc_func && !free_func) { state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState)); } else if (alloc_func && free_func) { @@ -217,7 +222,7 @@ s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - *value = (1U << *value) + bits; + *value = ((brotli_reg_t)1U << *value) + bits; s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE; return BROTLI_DECODER_SUCCESS; @@ -466,6 +471,53 @@ return result; } +/* Reads up to limit symbols from br and copies them into ringbuffer, + starting from pos. Caller must ensure that there is enough space + for the write. Returns the amount of symbols actually copied. */ +static BROTLI_INLINE int BrotliCopyPreloadedSymbolsToU8(const HuffmanCode* table, + BrotliBitReader* br, + brotli_reg_t* bits, + brotli_reg_t* value, + uint8_t* ringbuffer, + int pos, + const int limit) { + /* Calculate range where CheckInputAmount is always true. + Start with the number of bytes we can read. */ + int64_t new_lim = br->guard_in - br->next_in; + /* Convert to bits, since symbols use variable number of bits. */ + new_lim *= 8; + /* At most 15 bits per symbol, so this is safe. */ + new_lim /= 15; + const int kMaximalOverread = 4; + int pos_limit = limit; + int copies = 0; + if ((new_lim - kMaximalOverread) <= limit) { + // Safe cast, since new_lim is already < num_steps + pos_limit = (int)(new_lim - kMaximalOverread); + } + if (pos_limit < 0) { + pos_limit = 0; + } + copies = pos_limit; + pos_limit += pos; + /* Fast path, caller made sure it is safe to write, + we verified that is is safe to read. */ + for (; pos < pos_limit; pos++) { + BROTLI_DCHECK(BrotliCheckInputAmount(br)); + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + } + /* Do the remainder, caller made sure it is safe to write, + we need to bverify that it is safe to read. */ + while (BrotliCheckInputAmount(br) && copies < limit) { + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + pos++; + copies++; + } + return copies; +} + static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) { brotli_reg_t result = 0; while (x) { @@ -1089,7 +1141,7 @@ h->context_index = context_index; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - reps += 1U << code; + reps += (brotli_reg_t)1U << code; BROTLI_LOG_UINT(reps); if (context_index + reps > context_map_size) { return @@ -1124,7 +1176,7 @@ /* Decodes a command or literal and updates block type ring-buffer. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeBlockTypeAndLength( int safe, BrotliDecoderState* s, int tree_type) { brotli_reg_t max_block_type = s->num_block_types[tree_type]; const HuffmanCode* type_tree = &s->block_type_trees[ @@ -1135,7 +1187,7 @@ brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2]; brotli_reg_t block_type; if (max_block_type <= 1) { - return BROTLI_FALSE; + return BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH; } /* Read 0..15 + 3..39 bits. */ @@ -1145,11 +1197,13 @@ } else { BrotliBitReaderState memento; BrotliBitReaderSaveState(br, &memento); - if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE; + if (!SafeReadSymbol(type_tree, br, &block_type)) { + return BROTLI_DECODER_NEEDS_MORE_INPUT; + } if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) { s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE; BrotliBitReaderRestoreState(br, &memento); - return BROTLI_FALSE; + return BROTLI_DECODER_NEEDS_MORE_INPUT; } } @@ -1165,7 +1219,7 @@ } ringbuffer[0] = ringbuffer[1]; ringbuffer[1] = block_type; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } static BROTLI_INLINE void DetectTrivialLiteralBlockTypes( @@ -1202,59 +1256,65 @@ /* Decodes the block type and updates the state for literal context. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeLiteralBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeLiteralBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 0)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 0); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } PrepareLiteralDecoding(s); - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) { - DecodeLiteralBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeLiteralBlockSwitch(BrotliDecoderState* s) { + return DecodeLiteralBlockSwitchInternal(0, s); } -static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch( +static BROTLI_NOINLINE BrotliDecoderErrorCode SafeDecodeLiteralBlockSwitch( BrotliDecoderState* s) { return DecodeLiteralBlockSwitchInternal(1, s); } /* Block switch for insert/copy length. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeCommandBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 1)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 1); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]]; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) { - DecodeCommandBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeCommandBlockSwitch(BrotliDecoderState* s) { + return DecodeCommandBlockSwitchInternal(0, s); } -static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch( - BrotliDecoderState* s) { +static BROTLI_NOINLINE BrotliDecoderErrorCode +SafeDecodeCommandBlockSwitch(BrotliDecoderState* s) { return DecodeCommandBlockSwitchInternal(1, s); } /* Block switch for distance codes. Reads 3..54 bits. */ -static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal( +static BROTLI_INLINE BrotliDecoderErrorCode DecodeDistanceBlockSwitchInternal( int safe, BrotliDecoderState* s) { - if (!DecodeBlockTypeAndLength(safe, s, 2)) { - return BROTLI_FALSE; + BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 2); + if (result != BROTLI_DECODER_SUCCESS) { + return result; } s->dist_context_map_slice = s->dist_context_map + (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS); s->dist_htree_index = s->dist_context_map_slice[s->distance_context]; - return BROTLI_TRUE; + return BROTLI_DECODER_SUCCESS; } -static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) { - DecodeDistanceBlockSwitchInternal(0, s); +static BROTLI_NOINLINE BrotliDecoderErrorCode +DecodeDistanceBlockSwitch(BrotliDecoderState* s) { + return DecodeDistanceBlockSwitchInternal(0, s); } static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch( @@ -1363,6 +1423,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE SkipMetadataBlock(BrotliDecoderState* s) { BrotliBitReader* br = &s->br; + int nbytes; if (s->meta_block_remaining_len == 0) { return BROTLI_DECODER_SUCCESS; @@ -1373,7 +1434,7 @@ /* Drain accumulator. */ if (BrotliGetAvailableBits(br) >= 8) { uint8_t buffer[8]; - int nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; + nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; BROTLI_DCHECK(nbytes <= 8); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; @@ -1390,7 +1451,7 @@ } /* Direct access to metadata is possible. */ - int nbytes = (int)BrotliGetRemainingBytes(br); + nbytes = (int)BrotliGetRemainingBytes(br); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; } @@ -1465,6 +1526,8 @@ static BROTLI_BOOL AttachCompoundDictionary( BrotliDecoderState* state, const uint8_t* data, size_t size) { BrotliDecoderCompoundDictionary* addon = state->compound_dictionary; + int new_size = (int)size; + if (new_size < 0 || (size_t)new_size != size) return BROTLI_FALSE; if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE; if (!addon) { addon = (BrotliDecoderCompoundDictionary*)BROTLI_DECODER_ALLOC( @@ -1479,14 +1542,17 @@ state->compound_dictionary = addon; } if (addon->num_chunks == 15) return BROTLI_FALSE; + if (!BROTLI_SAFE_ADD(int, addon->total_size, new_size, &new_size)) { + return BROTLI_FALSE; + } addon->chunks[addon->num_chunks] = data; addon->num_chunks++; - addon->total_size += (int)size; - addon->chunk_offsets[addon->num_chunks] = addon->total_size; + addon->total_size = new_size; + addon->chunk_offsets[addon->num_chunks] = new_size; return BROTLI_TRUE; } -static void EnsureCoumpoundDictionaryInitialized(BrotliDecoderState* state) { +static void EnsureCompoundDictionaryInitialized(BrotliDecoderState* state) { BrotliDecoderCompoundDictionary* addon = state->compound_dictionary; /* 256 = (1 << 8) slots in block map. */ int block_bits = 8; @@ -1507,7 +1573,7 @@ int address, int length) { BrotliDecoderCompoundDictionary* addon = s->compound_dictionary; int index; - EnsureCoumpoundDictionaryInitialized(s); + EnsureCompoundDictionaryInitialized(s); index = addon->block_map[address >> addon->block_bits]; while (address >= addon->chunk_offsets[index + 1]) index++; if (addon->total_size < address + length) return BROTLI_FALSE; @@ -1753,7 +1819,7 @@ brotli_reg_t npostfix = s->distance_postfix_bits; brotli_reg_t ndirect = s->num_direct_distance_codes; brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit; - brotli_reg_t postfix = 1u << npostfix; + brotli_reg_t postfix = (brotli_reg_t)1u << npostfix; brotli_reg_t j; brotli_reg_t bits = 1; brotli_reg_t half = 0; @@ -1887,6 +1953,9 @@ return BrotliCheckInputAmount(br); } +/* NB: METHOD should return BROTLI_FALSE only in case there is not enough input; + in case of "unsafe" execution, when input is guaranteed to be sufficient, + result is ignored. */ #define BROTLI_SAFE(METHOD) \ { \ if (safe) { \ @@ -1899,6 +1968,22 @@ } \ } +/* NB: METHOD should return BROTLI_DECODER_SUCCESS, BROTLI_DECODER_ERROR_*, or + BROTLI_DECODER_NEEDS_MORE_INPUT; the later two break the processing. */ +#define BROTLI_SAFE_WITH_STATUS(METHOD) \ + { \ + BrotliDecoderErrorCode status; \ + if (safe) { \ + status = Safe##METHOD; \ + } else { \ + status = METHOD; \ + } \ + if (status != BROTLI_DECODER_SUCCESS) { \ + result = status; \ + goto saveStateAndReturn; \ + } \ + } + static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal( int safe, BrotliDecoderState* s) { int pos = s->pos; @@ -1938,7 +2023,7 @@ goto saveStateAndReturn; } if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) { - BROTLI_SAFE(DecodeCommandBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeCommandBlockSwitch(s)); goto CommandBegin; } /* Read the insert/copy length in the command. */ @@ -1959,35 +2044,72 @@ brotli_reg_t bits; brotli_reg_t value; PreloadSymbol(safe, s->literal_htree, br, &bits, &value); - do { - if (!CheckInputAmount(safe, br)) { - s->state = BROTLI_STATE_COMMAND_INNER; - result = BROTLI_DECODER_NEEDS_MORE_INPUT; - goto saveStateAndReturn; - } - if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { - goto NextLiteralBlock; - } - if (!safe) { - s->ringbuffer[pos] = - (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value); - } else { + if (!safe) { + // This is a hottest part of the decode, so we copy the loop below + // and optimize it by calculating the number of steps where all checks + // evaluate to false (ringbuffer size/block size/input size). + // Since all checks are loop invariant, we just need to find + // minimal number of iterations for a simple loop, and run + // the full version for the remainder. + int num_steps = i - 1; + if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) { + // Safe cast, since block_length < steps + num_steps = (int)s->block_length[0]; + } + if (s->ringbuffer_size >= pos && + (s->ringbuffer_size - pos) <= num_steps) { + num_steps = s->ringbuffer_size - pos - 1; + } + if (num_steps < 0) { + num_steps = 0; + } + num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, + &value, s->ringbuffer, pos, + num_steps); + pos += num_steps; + s->block_length[0] -= (brotli_reg_t)num_steps; + i -= num_steps; + do { + if (!CheckInputAmount(safe, br)) { + s->state = BROTLI_STATE_COMMAND_INNER; + result = BROTLI_DECODER_NEEDS_MORE_INPUT; + goto saveStateAndReturn; + } + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } + BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value, + s->ringbuffer, pos, 1); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } else { /* safe */ + do { + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } brotli_reg_t literal; if (!SafeReadSymbol(s->literal_htree, br, &literal)) { result = BROTLI_DECODER_NEEDS_MORE_INPUT; goto saveStateAndReturn; } s->ringbuffer[pos] = (uint8_t)literal; - } - --s->block_length[0]; - BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); - ++pos; - if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { - s->state = BROTLI_STATE_COMMAND_INNER_WRITE; - --i; - goto saveStateAndReturn; - } - } while (--i != 0); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } } else { uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask]; uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask]; @@ -2046,7 +2168,7 @@ } else { /* Read distance code in the command, unless it was implicitly zero. */ if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) { - BROTLI_SAFE(DecodeDistanceBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeDistanceBlockSwitch(s)); } BROTLI_SAFE(ReadDistance(s, br)); } @@ -2240,7 +2362,7 @@ } NextLiteralBlock: - BROTLI_SAFE(DecodeLiteralBlockSwitch(s)); + BROTLI_SAFE_WITH_STATUS(DecodeLiteralBlockSwitch(s)); goto CommandInner; saveStateAndReturn: @@ -2462,6 +2584,8 @@ if (result != BROTLI_DECODER_SUCCESS) { break; } + BROTLI_DCHECK(s->meta_block_remaining_len <= + (int)BROTLI_BLOCK_SIZE_CAP); BROTLI_LOG_UINT(s->is_last_metablock); BROTLI_LOG_UINT(s->meta_block_remaining_len); BROTLI_LOG_UINT(s->is_metadata); @@ -2855,16 +2979,15 @@ /* Escalate internal functions visibility; for testing purposes only. */ #if defined(BROTLI_TEST) -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode*, BrotliBitReader*, brotli_reg_t*); -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) { return SafeReadSymbol(table, br, result); } - -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t*, brotli_reg_t, BrotliDecoderState*); -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) { InverseMoveToFrontTransform(v, l, s); } diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/huffman.c thunderbird-140.10.0esr/modules/brotli/dec/huffman.c --- thunderbird-140.9.0esr/modules/brotli/dec/huffman.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/huffman.c 2026-04-21 14:52:59.000000000 +0000 @@ -8,10 +8,6 @@ #include "huffman.h" -#include /* memcpy, memset */ - -#include - #include "../common/constants.h" #include "../common/platform.h" @@ -26,7 +22,8 @@ ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX) #else #define BROTLI_REVERSE_BITS_BASE 0 -static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { +static BROTLI_MODEL("small") +uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/huffman.h thunderbird-140.10.0esr/modules/brotli/dec/huffman.h --- thunderbird-140.9.0esr/modules/brotli/dec/huffman.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/huffman.h 2026-04-21 14:52:59.000000000 +0000 @@ -9,8 +9,6 @@ #ifndef BROTLI_DEC_HUFFMAN_H_ #define BROTLI_DEC_HUFFMAN_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/prefix.c thunderbird-140.10.0esr/modules/brotli/dec/prefix.c --- thunderbird-140.9.0esr/modules/brotli/dec/prefix.c 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/prefix.c 2026-04-21 14:52:58.000000000 +0000 @@ -0,0 +1,67 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "prefix.h" + +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/constants.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +/* Embed kCmdLut. */ +#include "prefix_inc.h" +#else +BROTLI_COLD BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items) { + static const uint8_t kInsertLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, + 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18}; + static const uint8_t kCopyLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18}; + static const uint8_t kCellPos[11] = {0, 1, 0, 1, 8, 9, 2, 16, 10, 17, 18}; + + uint16_t insert_length_offsets[24]; + uint16_t copy_length_offsets[24]; + insert_length_offsets[0] = 0; + copy_length_offsets[0] = 2; + for (size_t i = 0; i < 23; ++i) { + insert_length_offsets[i + 1] = + insert_length_offsets[i] + (uint16_t)(1u << kInsertLengthExtraBits[i]); + copy_length_offsets[i + 1] = + copy_length_offsets[i] + (uint16_t)(1u << kCopyLengthExtraBits[i]); + } + + for (size_t symbol = 0; symbol < BROTLI_NUM_COMMAND_SYMBOLS; ++symbol) { + CmdLutElement* item = items + symbol; + const size_t cell_idx = symbol >> 6; + const size_t cell_pos = kCellPos[cell_idx]; + const size_t copy_code = ((cell_pos << 3) & 0x18) + (symbol & 0x7); + const uint16_t copy_len_offset = copy_length_offsets[copy_code]; + const size_t insert_code = (cell_pos & 0x18) + ((symbol >> 3) & 0x7); + item->copy_len_extra_bits = kCopyLengthExtraBits[copy_code]; + item->context = (copy_len_offset > 4) ? 3 : ((uint8_t)copy_len_offset - 2); + item->copy_len_offset = copy_len_offset; + item->distance_code = (cell_idx >= 2) ? -1 : 0; + item->insert_len_extra_bits = kInsertLengthExtraBits[insert_code]; + item->insert_len_offset = insert_length_offsets[insert_code]; + } + return BROTLI_TRUE; +} + +BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/prefix.h thunderbird-140.10.0esr/modules/brotli/dec/prefix.h --- thunderbird-140.9.0esr/modules/brotli/dec/prefix.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/prefix.h 2026-04-21 14:52:58.000000000 +0000 @@ -10,9 +10,13 @@ #ifndef BROTLI_DEC_PREFIX_H_ #define BROTLI_DEC_PREFIX_H_ -#include - #include "../common/constants.h" +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif typedef struct CmdLutElement { uint8_t insert_len_extra_bits; @@ -23,711 +27,17 @@ uint16_t copy_len_offset; } CmdLutElement; -static const CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { - { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, - { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, - { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, - { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, - { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, - { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, - { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, - { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, - { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, - { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, - { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, - { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, - { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, - { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, - { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, - { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, - { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, - { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, - { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, - { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, - { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, - { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, - { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, - { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, - { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, - { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, - { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, - { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, - { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, - { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, - { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, - { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, - { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, - { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, - { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, - { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, - { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, - { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, - { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, - { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, - { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, - { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, - { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, - { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, - { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, - { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, - { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, - { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, - { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, - { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, - { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, - { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, - { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, - { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, - { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, - { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, - { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, - { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, - { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, - { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, - { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, - { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, - { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, - { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, - { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, - { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, - { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, - { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, - { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, - { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, - { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, - { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, - { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, - { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, - { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, - { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, -}; +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +BROTLI_INTERNAL extern const BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#else +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items); +BROTLI_INTERNAL extern BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif #endif /* BROTLI_DEC_PREFIX_H_ */ diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/prefix_inc.h thunderbird-140.10.0esr/modules/brotli/dec/prefix_inc.h --- thunderbird-140.9.0esr/modules/brotli/dec/prefix_inc.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/prefix_inc.h 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,707 @@ +const BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { + { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, + { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, + { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, + { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, + { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, + { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, + { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, + { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, + { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, + { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, + { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, + { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, + { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, + { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, + { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, + { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, + { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, + { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, + { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, + { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, + { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, + { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, + { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, + { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, + { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, + { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, + { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, + { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, + { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, + { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, + { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, + { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, + { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, + { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, + { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, + { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, + { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, + { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, + { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, + { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, + { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, + { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, + { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, + { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, + { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, + { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, + { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, + { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, + { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, + { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, + { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, + { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, + { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, + { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, + { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, + { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, + { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, + { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, + { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, + { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, + { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, + { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, + { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, + { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, + { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, + { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, + { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, + { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, + { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, + { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, + { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, + { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, + { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, + { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, + { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, + { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, +}; diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/state.c thunderbird-140.10.0esr/modules/brotli/dec/state.c --- thunderbird-140.9.0esr/modules/brotli/dec/state.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/state.c 2026-04-21 14:52:59.000000000 +0000 @@ -6,19 +6,32 @@ #include "state.h" -#include /* free, malloc */ - -#include - #include "../common/dictionary.h" +#include "../common/platform.h" #include "huffman.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif +#ifdef BROTLI_REPORTING +/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ +void BrotliDecoderOnStart(const BrotliDecoderState* s); +void BrotliDecoderOnFinish(const BrotliDecoderState* s); +#define BROTLI_DECODER_ON_START(s) BrotliDecoderOnStart(s); +#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); +#else +#if !defined(BROTLI_DECODER_ON_START) +#define BROTLI_DECODER_ON_START(s) (void)(s); +#endif +#if !defined(BROTLI_DECODER_ON_FINISH) +#define BROTLI_DECODER_ON_FINISH(s) (void)(s); +#endif +#endif + BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s, brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { + BROTLI_DECODER_ON_START(s); if (!alloc_func) { s->alloc_func = BrotliDefaultAllocFunc; s->free_func = BrotliDefaultFreeFunc; @@ -135,16 +148,6 @@ BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees); } -#ifdef BROTLI_REPORTING -/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ -void BrotliDecoderOnFinish(const BrotliDecoderState* s); -#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); -#else -#if !defined(BROTLI_DECODER_ON_FINISH) -#define BROTLI_DECODER_ON_FINISH(s) (void)(s); -#endif -#endif - void BrotliDecoderStateCleanup(BrotliDecoderState* s) { BrotliDecoderStateCleanupAfterMetablock(s); @@ -174,7 +177,7 @@ group->alphabet_size_limit = (uint16_t)alphabet_size_limit; group->num_htrees = (uint16_t)ntrees; group->htrees = p; - group->codes = (HuffmanCode*)(&p[ntrees]); + group->codes = p ? (HuffmanCode*)(&p[ntrees]) : NULL; return !!p; } diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/state.h thunderbird-140.10.0esr/modules/brotli/dec/state.h --- thunderbird-140.9.0esr/modules/brotli/dec/state.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/state.h 2026-04-21 14:52:59.000000000 +0000 @@ -9,14 +9,10 @@ #ifndef BROTLI_DEC_STATE_H_ #define BROTLI_DEC_STATE_H_ -#include -#include -#include - #include "../common/constants.h" -#include "../common/dictionary.h" #include "../common/platform.h" -#include "../common/transform.h" +#include +#include #include "bit_reader.h" #include "huffman.h" diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/static_init.c thunderbird-140.10.0esr/modules/brotli/dec/static_init.c --- thunderbird-140.9.0esr/modules/brotli/dec/static_init.c 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/static_init.c 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,53 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "static_init.h" + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "prefix.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +static BROTLI_BOOL DoBrotliDecoderStaticInit(void) { + BROTLI_BOOL ok = BrotliDecoderInitCmdLut(kCmdLut); + if (!ok) return BROTLI_FALSE; + return BROTLI_TRUE; +} +#endif /* BROTLI_STATIC_INIT_NONE */ + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +static BROTLI_BOOL kEarlyInitOk; +static __attribute__((constructor)) void BrotliDecoderStaticInitEarly(void) { + kEarlyInitOk = DoBrotliDecoderStaticInit(); +} +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +static BROTLI_BOOL kLazyInitOk; +void BrotliDecoderLazyStaticInitInner(void) { + kLazyInitOk = DoBrotliDecoderStaticInit(); +} +#endif /* BROTLI_STATIC_INIT_EARLY */ + +BROTLI_BOOL BrotliDecoderEnsureStaticInit(void) { +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) + return BROTLI_TRUE; +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) + return kEarlyInitOk; +#else + return kLazyInitOk; +#endif +} + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff -Nru thunderbird-140.9.0esr/modules/brotli/dec/static_init.h thunderbird-140.10.0esr/modules/brotli/dec/static_init.h --- thunderbird-140.9.0esr/modules/brotli/dec/static_init.h 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/dec/static_init.h 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,30 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Central point for static initialization. */ + +#ifndef THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +BROTLI_INTERNAL void BrotliDecoderLazyStaticInitInner(void); +BROTLI_INTERNAL void BrotliDecoderLazyStaticInit(void); +#endif /* BROTLI_STATIC_INIT */ + +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderEnsureStaticInit(void); + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ diff -Nru thunderbird-140.9.0esr/modules/brotli/include/brotli/decode.h thunderbird-140.10.0esr/modules/brotli/include/brotli/decode.h --- thunderbird-140.9.0esr/modules/brotli/include/brotli/decode.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/include/brotli/decode.h 2026-04-21 14:52:59.000000000 +0000 @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -85,9 +85,7 @@ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \ - \ - /* -17 code is reserved */ \ - \ + BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_SWITCH, -17) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, COMPOUND_DICTIONARY, -18) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \ diff -Nru thunderbird-140.9.0esr/modules/brotli/include/brotli/encode.h thunderbird-140.10.0esr/modules/brotli/include/brotli/encode.h --- thunderbird-140.9.0esr/modules/brotli/include/brotli/encode.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/include/brotli/encode.h 2026-04-21 14:52:59.000000000 +0000 @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -283,6 +283,10 @@ * passed to @p alloc_func and @p free_func when they are called. @p free_func * has to return without doing anything when asked to free a NULL pointer. * + * @warning Created instance is "lean"; it does not contain copy of @p data, + * rather it contains only pointer to it; therefore, + * @p data @b MUST outlive the created instance. + * * @param type type of dictionary stored in data * @param data_size size of @p data buffer * @param data pointer to the dictionary data diff -Nru thunderbird-140.9.0esr/modules/brotli/include/brotli/port.h thunderbird-140.10.0esr/modules/brotli/include/brotli/port.h --- thunderbird-140.9.0esr/modules/brotli/include/brotli/port.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/include/brotli/port.h 2026-04-21 14:52:59.000000000 +0000 @@ -239,8 +239,6 @@ #define BROTLI_PUBLIC #endif -/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */ -#if !defined(BROTLI_INTERNAL) #if defined(_WIN32) || defined(__CYGWIN__) #define BROTLI_INTERNAL #elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \ @@ -255,7 +253,6 @@ #else #define BROTLI_INTERNAL #endif -#endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \ @@ -272,20 +269,20 @@ #if defined(_WIN32) #if defined(BROTLICOMMON_SHARED_COMPILATION) #define BROTLI_COMMON_API __declspec(dllexport) -#else +#else /* !BROTLICOMMON_SHARED_COMPILATION */ #define BROTLI_COMMON_API __declspec(dllimport) #endif /* BROTLICOMMON_SHARED_COMPILATION */ #if defined(BROTLIDEC_SHARED_COMPILATION) #define BROTLI_DEC_API __declspec(dllexport) -#else +#else /* !BROTLIDEC_SHARED_COMPILATION */ #define BROTLI_DEC_API __declspec(dllimport) #endif /* BROTLIDEC_SHARED_COMPILATION */ #if defined(BROTLIENC_SHARED_COMPILATION) #define BROTLI_ENC_API __declspec(dllexport) -#else +#else /* !BROTLIENC_SHARED_COMPILATION */ #define BROTLI_ENC_API __declspec(dllimport) #endif /* BROTLIENC_SHARED_COMPILATION */ -#else /* _WIN32 */ +#else /* !_WIN32 */ #define BROTLI_COMMON_API BROTLI_PUBLIC #define BROTLI_DEC_API BROTLI_PUBLIC #define BROTLI_ENC_API BROTLI_PUBLIC diff -Nru thunderbird-140.9.0esr/modules/brotli/include/brotli/types.h thunderbird-140.10.0esr/modules/brotli/include/brotli/types.h --- thunderbird-140.9.0esr/modules/brotli/include/brotli/types.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/include/brotli/types.h 2026-04-21 14:52:59.000000000 +0000 @@ -12,7 +12,7 @@ #ifndef BROTLI_COMMON_TYPES_H_ #define BROTLI_COMMON_TYPES_H_ -#include /* for size_t */ +#include /* IWYU pragma: export */ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef __int8 int8_t; @@ -24,7 +24,7 @@ typedef unsigned __int64 uint64_t; typedef __int64 int64_t; #else -#include +#include /* IWYU pragma: export */ #endif /* defined(_MSC_VER) && (_MSC_VER < 1600) */ /** diff -Nru thunderbird-140.9.0esr/modules/brotli/moz.build thunderbird-140.10.0esr/modules/brotli/moz.build --- thunderbird-140.9.0esr/modules/brotli/moz.build 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/moz.build 2026-04-21 14:52:59.000000000 +0000 @@ -25,7 +25,9 @@ 'dec/bit_reader.c', 'dec/decode.c', 'dec/huffman.c', + 'dec/prefix.c', 'dec/state.c', + 'dec/static_init.c', ] # We allow warnings for third-party code that can be updated from upstream. diff -Nru thunderbird-140.9.0esr/modules/brotli/moz.yaml thunderbird-140.10.0esr/modules/brotli/moz.yaml --- thunderbird-140.9.0esr/modules/brotli/moz.yaml 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/brotli/moz.yaml 2026-04-21 14:52:59.000000000 +0000 @@ -10,8 +10,8 @@ url: https://github.com/google/brotli - release: ed738e842d2fbdf2d6459e39267a633c4a9b2f5d (2023-08-29T11:00:29Z). - revision: ed738e842d2fbdf2d6459e39267a633c4a9b2f5d + release: 4792c8e4c4235f6b501f13dbd07a8b4b253eee21 (2026-04-08T19:24:31Z). + revision: 4792c8e4c4235f6b501f13dbd07a8b4b253eee21 license: MIT @@ -24,8 +24,10 @@ - ".*" - "*" - docs + - go - python - scripts + - java - tests - c/enc - c/tools @@ -48,3 +50,5 @@ - action: move-dir from: '{vendor_dir}/c/dec' to: '{vendor_dir}/dec' + - action: delete-path + path: '{vendor_dir}/c' diff -Nru thunderbird-140.9.0esr/modules/libpref/Preferences.cpp thunderbird-140.10.0esr/modules/libpref/Preferences.cpp --- thunderbird-140.9.0esr/modules/libpref/Preferences.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/modules/libpref/Preferences.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -6209,7 +6209,6 @@ PREF_LIST_ENTRY("media.peerconnection.nat_simulator.network_delay_ms"), PREF_LIST_ENTRY("media.video_loopback_dev"), PREF_LIST_ENTRY("media.webspeech.service.endpoint"), - PREF_LIST_ENTRY("network.gio.supported-protocols"), PREF_LIST_ENTRY("network.protocol-handler.external."), PREF_LIST_ENTRY("network.security.ports.banned"), PREF_LIST_ENTRY("nimbus.syncdatastore."), diff -Nru thunderbird-140.9.0esr/modules/libpref/init/StaticPrefList.yaml thunderbird-140.10.0esr/modules/libpref/init/StaticPrefList.yaml --- thunderbird-140.9.0esr/modules/libpref/init/StaticPrefList.yaml 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/modules/libpref/init/StaticPrefList.yaml 2026-04-21 14:52:59.000000000 +0000 @@ -4999,9 +4999,15 @@ value: 30000 mirror: always +# TCPSocket API +- name: dom.tcpsocket_in_child.enabled + type: RelaxedAtomicBool + value: false + mirror: always + # UDPSocket API - name: dom.udpsocket.enabled - type: bool + type: RelaxedAtomicBool value: false mirror: always @@ -11257,12 +11263,6 @@ value: @IS_NOT_XP_MACOSX@ mirror: always -# How long in milliseconds before timing out to destroy en/decoders gracefully -- name: media.gmp.coder-shutdown-timeout-ms - type: RelaxedAtomicUint32 - value: 1000 - mirror: always - #if defined(XP_LINUX) && defined(MOZ_SANDBOX) # Whether to allow, on a Linux system that doesn't support the necessary # sandboxing features, loading Gecko Media Plugins unsandboxed. However, EME @@ -15403,7 +15403,7 @@ # Set to * to allow all schemes. - name: network.http_index_format.allowed_schemes type: String - value: "file,moz-gio" + value: "file" mirror: never # Enable off-main-thread decompression of network streams diff -Nru thunderbird-140.9.0esr/mozglue/interposers/env_interposer.cpp thunderbird-140.10.0esr/mozglue/interposers/env_interposer.cpp --- thunderbird-140.9.0esr/mozglue/interposers/env_interposer.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/mozglue/interposers/env_interposer.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -40,6 +40,24 @@ return result; } +MFBT_API char* secure_getenv(const char* name) { + static const auto real_secure_getenv = GET_REAL_SYMBOL(secure_getenv); + + pthread_mutex_lock(&gEnvLock); + char* result = real_secure_getenv(name); + pthread_mutex_unlock(&gEnvLock); + return result; +} + +MFBT_API char* __secure_getenv(const char* name) { + static const auto real___secure_getenv = GET_REAL_SYMBOL(__secure_getenv); + + pthread_mutex_lock(&gEnvLock); + char* result = real___secure_getenv(name); + pthread_mutex_unlock(&gEnvLock); + return result; +} + MFBT_API int putenv(char* string) { static const auto real_putenv = GET_REAL_SYMBOL(putenv); diff -Nru thunderbird-140.9.0esr/netwerk/base/Tickler.cpp thunderbird-140.10.0esr/netwerk/base/Tickler.cpp --- thunderbird-140.9.0esr/netwerk/base/Tickler.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/Tickler.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -18,8 +18,6 @@ namespace mozilla { namespace net { -NS_IMPL_ISUPPORTS(Tickler, nsISupportsWeakReference, Tickler) - Tickler::Tickler() : mLock("Tickler::mLock"), mActive(false), @@ -177,9 +175,7 @@ NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSITIMERCALLBACK - explicit TicklerTimer(Tickler* aTickler) { - mTickler = do_GetWeakReference(aTickler); - } + explicit TicklerTimer(Tickler* t) : mTickler(t) {} // nsINamed NS_IMETHOD GetName(nsACString& aName) override { @@ -190,7 +186,7 @@ private: ~TicklerTimer() {} - nsWeakPtr mTickler; + ThreadSafeWeakPtr mTickler; }; void Tickler::StartTickler() { @@ -214,7 +210,7 @@ NS_IMPL_ISUPPORTS(TicklerTimer, nsITimerCallback, nsINamed) NS_IMETHODIMP TicklerTimer::Notify(nsITimer* timer) { - RefPtr tickler = do_QueryReferent(mTickler); + RefPtr tickler(mTickler); if (!tickler) return NS_ERROR_FAILURE; MutexAutoLock lock(tickler->mLock); diff -Nru thunderbird-140.9.0esr/netwerk/base/Tickler.h thunderbird-140.10.0esr/netwerk/base/Tickler.h --- thunderbird-140.9.0esr/netwerk/base/Tickler.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/Tickler.h 2026-04-21 14:52:59.000000000 +0000 @@ -41,7 +41,7 @@ # include "nsISupports.h" # include "nsIThread.h" # include "nsITimer.h" -# include "nsWeakReference.h" +# include "mozilla/ThreadSafeWeakPtr.h" # include "prio.h" class nsIPrefBranch; @@ -59,9 +59,9 @@ 0x4af9, \ {0x9f, 0x7e, 0x9e, 0x83, 0x2d, 0xa3, 0x75, 0x4e}} -class Tickler final : public nsSupportsWeakReference { +class Tickler final : public SupportsThreadSafeWeakPtr { public: - NS_DECL_THREADSAFE_ISUPPORTS + MOZ_DECLARE_REFCOUNTED_TYPENAME(Tickler) NS_INLINE_DECL_STATIC_IID(NS_TICKLER_IID) // These methods are main thread only @@ -78,6 +78,7 @@ private: ~Tickler(); + friend class SupportsThreadSafeWeakPtr; friend class TicklerTimer; Mutex mLock MOZ_UNANNOTATED; nsCOMPtr mThread; diff -Nru thunderbird-140.9.0esr/netwerk/base/nsBaseChannel.cpp thunderbird-140.10.0esr/netwerk/base/nsBaseChannel.cpp --- thunderbird-140.9.0esr/netwerk/base/nsBaseChannel.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/nsBaseChannel.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -41,7 +41,7 @@ } private: - nsIRequest* mRequest; + nsCOMPtr mRequest; }; // Used to suspend data events from mRequest within a function scope. This is diff -Nru thunderbird-140.9.0esr/netwerk/base/nsDownloader.cpp thunderbird-140.10.0esr/netwerk/base/nsDownloader.cpp --- thunderbird-140.9.0esr/netwerk/base/nsDownloader.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/nsDownloader.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -93,6 +93,7 @@ NS_IMETHODIMP nsDownloader::OnDataAvailable(nsIRequest* request, nsIInputStream* inStr, uint64_t sourceOffset, uint32_t count) { + RefPtr self(this); uint32_t n; return inStr->ReadSegments(ConsumeData, this, count, &n); } diff -Nru thunderbird-140.9.0esr/netwerk/base/nsSyncStreamListener.cpp thunderbird-140.10.0esr/netwerk/base/nsSyncStreamListener.cpp --- thunderbird-140.9.0esr/netwerk/base/nsSyncStreamListener.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/nsSyncStreamListener.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -105,6 +105,9 @@ NS_IMETHODIMP nsSyncStreamListener::Available(uint64_t* result) { + // Nested event loop can run code that drops the last external reference. + RefPtr self(this); + if (NS_FAILED(mStatus)) return mStatus; mStatus = mPipeIn->Available(result); diff -Nru thunderbird-140.9.0esr/netwerk/base/nsUDPSocket.cpp thunderbird-140.10.0esr/netwerk/base/nsUDPSocket.cpp --- thunderbird-140.9.0esr/netwerk/base/nsUDPSocket.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/nsUDPSocket.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -114,17 +114,17 @@ //----------------------------------------------------------------------------- NS_IMPL_ISUPPORTS(nsUDPOutputStream, nsIOutputStream) -nsUDPOutputStream::nsUDPOutputStream(nsUDPSocket* aSocket, PRFileDesc* aFD, +nsUDPOutputStream::nsUDPOutputStream(nsUDPSocket* aSocket, PRNetAddr& aPrClientAddr) - : mSocket(aSocket), - mFD(aFD), - mPrClientAddr(aPrClientAddr), - mIsClosed(false) {} + : mSocket(aSocket), mPrClientAddr(aPrClientAddr), mIsClosed(false) {} NS_IMETHODIMP nsUDPOutputStream::Close() { if (mIsClosed) return NS_BASE_STREAM_CLOSED; mIsClosed = true; + if (mSocket->IsSocketClosed()) { + return NS_BASE_STREAM_CLOSED; + } return NS_OK; } @@ -138,9 +138,18 @@ uint32_t* _retval) { if (mIsClosed) return NS_BASE_STREAM_CLOSED; + if (mSocket->IsSocketClosed()) { + mIsClosed = true; + return NS_BASE_STREAM_CLOSED; + } + *_retval = 0; + PRFileDesc* fd = mSocket->GetFD(); + if (!fd) { + return NS_BASE_STREAM_CLOSED; + } int32_t count = - PR_SendTo(mFD, aBuf, aCount, 0, &mPrClientAddr, PR_INTERVAL_NO_WAIT); + PR_SendTo(fd, aBuf, aCount, 0, &mPrClientAddr, PR_INTERVAL_NO_WAIT); if (count < 0) { PRErrorCode code = PR_GetError(); return ErrorAccordingToNSPR(code); @@ -458,7 +467,7 @@ NS_NewPipe2(getter_AddRefs(pipeIn), getter_AddRefs(pipeOut), true, true, segsize, segcount); - RefPtr os = new nsUDPOutputStream(this, mFD, prClientAddr); + RefPtr os = new nsUDPOutputStream(this, prClientAddr); nsresult rv = NS_AsyncCopy(pipeIn, os, mSts, NS_ASYNCCOPY_VIA_READSEGMENTS, UDP_PACKET_CHUNK_SIZE); @@ -1224,8 +1233,6 @@ mPollFlags = (PR_POLL_WRITE | PR_POLL_READ | PR_POLL_EXCEPT); } -bool nsUDPSocket::IsSocketClosed() { return mFD == nullptr; } - NS_IMETHODIMP nsUDPSocket::SendBinaryStream(const nsACString& aHost, uint16_t aPort, nsIInputStream* aStream) { @@ -1247,7 +1254,10 @@ PR_InitializeNetAddr(PR_IpAddrAny, 0, &prAddr); NetAddrToPRNetAddr(aAddr, &prAddr); - RefPtr os = new nsUDPOutputStream(this, mFD, prAddr); + if (!mFD) { + return NS_BASE_STREAM_CLOSED; + } + RefPtr os = new nsUDPOutputStream(this, prAddr); return NS_AsyncCopy(aStream, os, mSts, NS_ASYNCCOPY_VIA_READSEGMENTS, UDP_PACKET_CHUNK_SIZE); } diff -Nru thunderbird-140.9.0esr/netwerk/base/nsUDPSocket.h thunderbird-140.10.0esr/netwerk/base/nsUDPSocket.h --- thunderbird-140.9.0esr/netwerk/base/nsUDPSocket.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/base/nsUDPSocket.h 2026-04-21 14:52:59.000000000 +0000 @@ -36,6 +36,11 @@ nsUDPSocket(); + PRFileDesc* GetFD() { + MOZ_ASSERT(OnSocketThread(), "not on socket thread"); + return mFD; + } + private: virtual ~nsUDPSocket(); @@ -71,6 +76,15 @@ uint64_t mByteWriteCount{0}; }; +inline bool nsUDPSocket::IsSocketClosed() { +#ifdef DEBUG + bool onSTSThread = false; + mSts->IsOnCurrentThread(&onSTSThread); + MOZ_ASSERT(onSTSThread); +#endif + return !mFD; +} + //----------------------------------------------------------------------------- class nsUDPMessage : public nsIUDPMessage { @@ -98,14 +112,12 @@ NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIOUTPUTSTREAM - nsUDPOutputStream(nsUDPSocket* aSocket, PRFileDesc* aFD, - PRNetAddr& aPrClientAddr); + nsUDPOutputStream(nsUDPSocket* aSocket, PRNetAddr& aPrClientAddr); private: virtual ~nsUDPOutputStream() = default; RefPtr mSocket; - PRFileDesc* mFD; PRNetAddr mPrClientAddr; bool mIsClosed; }; diff -Nru thunderbird-140.9.0esr/netwerk/build/components.conf thunderbird-140.10.0esr/netwerk/build/components.conf --- thunderbird-140.9.0esr/netwerk/build/components.conf 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/build/components.conf 2026-04-21 14:52:59.000000000 +0000 @@ -177,6 +177,7 @@ 'cid': '{15629ada-a41c-4a09-961f-6553cd60b1a2}', 'contract_ids': ['@mozilla.org/network/http-activity-distributor;1'], 'type': 'mozilla::net::nsHttpActivityDistributor', + 'singleton': True, 'headers': ['/netwerk/protocol/http/nsHttpActivityDistributor.h'], 'processes': ProcessSelector.ALLOW_IN_SOCKET_PROCESS, }, diff -Nru thunderbird-140.9.0esr/netwerk/build/moz.build thunderbird-140.10.0esr/netwerk/build/moz.build --- thunderbird-140.9.0esr/netwerk/build/moz.build 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/build/moz.build 2026-04-21 14:52:59.000000000 +0000 @@ -41,12 +41,6 @@ "/extensions/auth", ] -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - LOCAL_INCLUDES += [ - "/netwerk/protocol/gio", - ] - - LOCAL_INCLUDES += [ "!/netwerk/dns", "/modules/brotli/dec", diff -Nru thunderbird-140.9.0esr/netwerk/cookie/CookieStorage.cpp thunderbird-140.10.0esr/netwerk/cookie/CookieStorage.cpp --- thunderbird-140.9.0esr/netwerk/cookie/CookieStorage.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/cookie/CookieStorage.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -551,6 +551,8 @@ CookieEntry* aEntry, Cookie* aCookie, const nsACString& aBaseDomain, nsCOMPtr& aPurgedList) { MOZ_ASSERT(aEntry); + CookieKey key(aEntry->mBaseDomain, aEntry->mOriginAttributes); + // remove insecure older cookies until we are within the byte limit // so CHIPS-partitioned cookies will not be detected here since they must be // secure @@ -570,11 +572,17 @@ // remove secure older cookies until we are within the byte limit if (!underLimit) { + // Re-lookup: aEntry may have been freed if pass 1 emptied it. + CookieEntry* entry = mHostTable.GetEntry(key); + if (!entry) { + return; + } MOZ_LOG(gCookieLog, LogLevel::Debug, ("Still too many cookies for partition, purging secure\n")); - MaybePurgeList maybePurgeList(aEntry->GetCookies().Length()); - for (CookieEntry::IndexType i = 0; i < cookies.Length(); ++i) { - CookieListIter iter(aEntry, i); + const CookieEntry::ArrayType& secureCookies = entry->GetCookies(); + MaybePurgeList maybePurgeList(secureCookies.Length()); + for (CookieEntry::IndexType i = 0; i < secureCookies.Length(); ++i) { + CookieListIter iter(entry, i); maybePurgeList.AppendElement(iter); } maybePurgeList.Sort(CompareCookiesByAge()); diff -Nru thunderbird-140.9.0esr/netwerk/dns/DNS.cpp thunderbird-140.10.0esr/netwerk/dns/DNS.cpp --- thunderbird-140.9.0esr/netwerk/dns/DNS.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/DNS.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -113,7 +113,12 @@ } #if defined(XP_UNIX) if (addr->raw.family == AF_LOCAL) { - if (bufSize < sizeof(addr->local.path)) { + // local.path is NOT guaranteed to be NUL-terminated: PR_Accept casts + // PRNetAddr* to struct sockaddr* and Linux sun_path is 108 bytes vs + // our 104, so a peer bound to a >=104-char path fills the whole field + // with non-NUL data. We must write our own terminator, so require + // strictly more than sizeof(path) bytes. + if (bufSize <= sizeof(addr->local.path)) { // Many callers don't bother checking our return value, so // null-terminate just in case. if (bufSize > 0) { @@ -128,26 +133,54 @@ // using the destination's size may cause us to read off the end of the // source. memcpy(buf, addr->local.path, sizeof(addr->local.path)); + buf[sizeof(addr->local.path)] = '\0'; return true; } #endif return false; } +bool NetAddr::ToString(nsACString& aOutput) const { + size_t bufferSize = 0; + if (raw.family == AF_INET) { + bufferSize = INET_ADDRSTRLEN; + } else if (raw.family == AF_INET6) { + bufferSize = INET6_ADDRSTRLEN; + } +#if defined(XP_UNIX) + else if (raw.family == AF_LOCAL) { + // +1 for the NUL terminator that ToStringBuffer writes. + bufferSize = sizeof(local.path) + 1; + } +#endif + + auto handleOrErr = aOutput.BulkWrite(bufferSize, /* aPrefixToPreserve */ 0, + /* aAllowShrinking */ false); + if (handleOrErr.isErr()) { + NS_ABORT_OOM(bufferSize); + return false; + } + auto handle = handleOrErr.unwrap(); + + if (!ToStringBuffer(handle.Elements(), bufferSize)) { + handle.Finish(0, /* aAllowShrinking */ false); + return false; + } + handle.Finish(strlen(handle.Elements()), /* aAllowShrinking */ false); + return true; +} + nsCString NetAddr::ToString() const { nsCString out; - out.SetLength(kNetAddrMaxCStrBufSize); - if (ToStringBuffer(out.BeginWriting(), kNetAddrMaxCStrBufSize)) { - out.SetLength(strlen(out.BeginWriting())); - return out; - } - return ""_ns; + ToString(out); + return out; } void NetAddr::ToAddrPortString(nsACString& aOutput) const { + ToString(aOutput); uint16_t port = 0; GetPort(&port); - aOutput.Assign(nsPrintfCString("%s:%d", ToString().get(), port)); + aOutput.AppendPrintf(":%d", port); } bool NetAddr::IsLoopbackAddr() const { diff -Nru thunderbird-140.9.0esr/netwerk/dns/DNS.h thunderbird-140.10.0esr/netwerk/dns/DNS.h --- thunderbird-140.9.0esr/netwerk/dns/DNS.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/DNS.h 2026-04-21 14:52:59.000000000 +0000 @@ -155,6 +155,7 @@ bool IsIPAddrShared() const; nsresult GetPort(uint16_t* aResult) const; bool ToStringBuffer(char* buf, uint32_t bufSize) const; + bool ToString(nsACString& aOutput) const; nsCString ToString() const; void ToAddrPortString(nsACString& aOutput) const; nsILoadInfo::IPAddressSpace GetIpAddressSpace() const; diff -Nru thunderbird-140.9.0esr/netwerk/dns/DNSPacket.cpp thunderbird-140.10.0esr/netwerk/dns/DNSPacket.cpp --- thunderbird-140.9.0esr/netwerk/dns/DNSPacket.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/DNSPacket.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -52,6 +52,13 @@ return mStatus; } + if (static_cast(response_length) > MAX_SIZE) { + LOG(("FillBuffer response len %d > MAX_SIZE %u", response_length, MAX_SIZE)); + mBodySize = 0; + mStatus = NS_ERROR_UNEXPECTED; + return mStatus; + } + mBodySize = response_length; return NS_OK; } diff -Nru thunderbird-140.9.0esr/netwerk/dns/TRRServiceChild.cpp thunderbird-140.10.0esr/netwerk/dns/TRRServiceChild.cpp --- thunderbird-140.9.0esr/netwerk/dns/TRRServiceChild.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/TRRServiceChild.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -66,6 +66,8 @@ NS_IMETHODIMP TRRServiceChild::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) { + // Must match + // TRRServiceParent::RecvNotifyNetworkConnectivityServiceObservers() if (!strcmp(aTopic, "network:connectivity-service:ip-checks-complete") || !strcmp(aTopic, "network:connectivity-service:dns-checks-complete")) { Unused << SendNotifyNetworkConnectivityServiceObservers( diff -Nru thunderbird-140.9.0esr/netwerk/dns/TRRServiceParent.cpp thunderbird-140.10.0esr/netwerk/dns/TRRServiceParent.cpp --- thunderbird-140.9.0esr/netwerk/dns/TRRServiceParent.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/TRRServiceParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -103,9 +103,22 @@ mozilla::ipc::IPCResult TRRServiceParent::RecvNotifyNetworkConnectivityServiceObservers( const nsCString& aTopic) { + // Must match TRRServiceChild::Observe() + const char* topic = nullptr; + if (!strcmp(aTopic.get(), + "network:connectivity-service:ip-checks-complete-from-socket-" + "process")) { + topic = "network:connectivity-service:ip-checks-complete"; + } else if (!strcmp(aTopic.get(), + "network:connectivity-service:dns-checks-complete-from-" + "socket-process")) { + topic = "network:connectivity-service:dns-checks-complete"; + } else { + return IPC_FAIL(this, "Unexpected notification"); + } nsCOMPtr obs = mozilla::services::GetObserverService(); if (obs) { - obs->NotifyObservers(nullptr, aTopic.get(), nullptr); + obs->NotifyObservers(nullptr, topic, nullptr); } return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/netwerk/dns/effective_tld_names.dat thunderbird-140.10.0esr/netwerk/dns/effective_tld_names.dat --- thunderbird-140.9.0esr/netwerk/dns/effective_tld_names.dat 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/effective_tld_names.dat 2026-04-21 14:52:59.000000000 +0000 @@ -5,8 +5,8 @@ // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. -// VERSION: 2026-03-09_08-24-09_UTC -// COMMIT: 3c5eb8e70837e15570608f2cb5abe8579e09c9b9 +// VERSION: 2026-04-10_20-27-44_UTC +// COMMIT: 8f9e04f2be9098ada07aa3cf13592dfe78870985 // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. @@ -6824,7 +6824,7 @@ // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2026-02-18T15:51:43Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2026-04-10T15:53:10Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -7566,7 +7566,7 @@ // https://www.iana.org/domains/root/db/cipriani.html cipriani -// circle : Amazon Registry Services, Inc. +// circle : Jolly Host, LLC // https://www.iana.org/domains/root/db/circle.html circle @@ -8418,7 +8418,7 @@ // https://www.iana.org/domains/root/db/gop.html gop -// got : Amazon Registry Services, Inc. +// got : Jolly Host, LLC // https://www.iana.org/domains/root/db/got.html got @@ -8790,7 +8790,7 @@ // https://www.iana.org/domains/root/db/joburg.html joburg -// jot : Amazon Registry Services, Inc. +// jot : Jolly Host, LLC // https://www.iana.org/domains/root/db/jot.html jot @@ -12336,6 +12336,10 @@ // concludes Amazon +// Anomaly : https://opencode.ai +// Submitted by Dax Raad +opentunnel.xyz + // Antagonist B.V. : https://www.antagonist.nl/ // Submitted by Sander Hoentjen antagonist.cloud @@ -12889,6 +12893,10 @@ deno.net sandbox.deno.net +// DeployAgent : https://deployagent.com +// Submitted by Danny +deployagent.com + // deSEC : https://desec.io/ // Submitted by Peter Thomassen dedyn.io @@ -13453,6 +13461,10 @@ relay.evervault.app relay.evervault.dev +// Exe : https://exe.dev +// Submitted by Josh Bleecher Snyder +exe.xyz + // Expo : https://expo.dev/ // Submitted by Phil Pluckthun expo.app @@ -13596,6 +13608,7 @@ // Figma : https://www.figma.com // Submitted by Nick Frost +payload.dev figma.site figma-gov.site preview.site @@ -14020,6 +14033,10 @@ *.id.pub *.kin.pub +// HOOC AG : https://www.hooc.ch +// Submitted by Fabrizio Steiner +seprox.hooc.me + // Hoplix : https://www.hoplix.com // Submitted by Danilo De Franco hoplix.shop @@ -14308,6 +14325,18 @@ // Submitted by Stefan Keim js.org +// K2 Cloud : https://k2.cloud/ +// Submitted by K2 Cloud +elastic.k2.cloud +lb.ru-msk.k2.cloud +s3.ru-msk.k2.cloud +website.ru-msk.k2.cloud +lb.ru-spb.k2.cloud +s3.ru-spb.k2.cloud +website.ru-spb.k2.cloud +s3.k2.cloud +website.k2.cloud + // KaasHosting : http://www.kaashosting.nl/ // Submitted by Wouter Bakker kaas.gg @@ -14890,6 +14919,35 @@ *.database.run *.migration.run +// Northwest Nexus dba NuOz : https://nuoz.net/ +// An RFC 1480 locality domain delegate host +// Submitted by Peter Briggs on behalf of NuOz +aberdeen.wa.us +bainbridge-isl.wa.us +bellevue.wa.us +bremerton.wa.us +centralia.wa.us +chehalis.wa.us +forks.wa.us +gig-harbor.wa.us +hoquiam.wa.us +keyport.wa.us +kingston.wa.us +olympia.wa.us +port-angeles.wa.us +port-ludlow.wa.us +port-orchard.wa.us +port-townsend.wa.us +poulsbo.wa.us +redmond.wa.us +renton.wa.us +sea.wa.us +seattle.wa.us +sequim.wa.us +shelton.wa.us +silverdale.wa.us +yarrow-point.wa.us + // Noticeable : https://noticeable.io // Submitted by Laurent Pellegrino noticeable.news @@ -15059,10 +15117,6 @@ // Submitted by Derek Myers pgfog.com -// PageXL : https://pagexl.com -// Submitted by Yann Guichard -pagexl.com - // Pantheon Systems, Inc. : https://pantheon.io/ // Submitted by Gary Dylina gotpantheon.com @@ -15085,6 +15139,10 @@ // Submitted by Steve Leung mypep.link +// Perplexity AI : https://www.perplexity.ai/ +// Submitted by Alec Xiang +pplx.app + // Perspecta : https://perspecta.com/ // Submitted by Kenneth Van Alstyne perspecta.cloud @@ -15745,6 +15803,7 @@ // Stackryze : https://stackryze.com // Submitted by Sudheer Bhuvana +sryze.cc indevs.in // Staclar : https://staclar.com @@ -16092,6 +16151,11 @@ // Submitted by Deus Team deus-canvas.com +// vivenu GmbH : https://vivenu.com/ +// Submitted by Marvin Frick +vivenushop.com +vivenushop.dev + // Voorloper.com : https://voorloper.com // Submitted by Nathan van Bakel voorloper.cloud diff -Nru thunderbird-140.9.0esr/netwerk/dns/nsDNSService2.cpp thunderbird-140.10.0esr/netwerk/dns/nsDNSService2.cpp --- thunderbird-140.9.0esr/netwerk/dns/nsDNSService2.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/nsDNSService2.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -312,12 +312,14 @@ nsTArray::const_iterator iterCopy = mIter; int iterGenCntCopy = mIterGenCnt; + RefPtr addrInfoCopy = mAddrInfo; NetAddr addr; *result = NS_SUCCEEDED(GetNextAddr(0, &addr)); mIter = iterCopy; mIterGenCnt = iterGenCntCopy; + mAddrInfo = std::move(addrInfoCopy); mDone = false; return NS_OK; diff -Nru thunderbird-140.9.0esr/netwerk/dns/nsHostResolver.cpp thunderbird-140.10.0esr/netwerk/dns/nsHostResolver.cpp --- thunderbird-140.9.0esr/netwerk/dns/nsHostResolver.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/dns/nsHostResolver.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -1601,6 +1601,7 @@ newRRSet->GetTrrFetchDurationNetworkOnly()); addrRec->addr_info = builder.Finish(); + addrRec->addr_info_gencnt++; } old_addr_info = std::move(newRRSet); } @@ -1613,6 +1614,7 @@ auto builder = addrRec->addr_info->Build(); builder.SortAddresses(NetAddrIPv6FirstComparator()); addrRec->addr_info = builder.Finish(); + addrRec->addr_info_gencnt++; } PrepareRecordExpirationAddrRecord(addrRec); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/DocumentLoadListener.cpp thunderbird-140.10.0esr/netwerk/ipc/DocumentLoadListener.cpp --- thunderbird-140.9.0esr/netwerk/ipc/DocumentLoadListener.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/DocumentLoadListener.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -3196,6 +3196,7 @@ const nsACString& aReferrerPolicy, const nsACString& aCSPHeader) { LOG(("DocumentLoadListener::EarlyHint.\n")); + RefPtr kungFuDeathGrip(this); mEarlyHintsService.EarlyHint(aLinkHeader, GetChannelCreationURI(), mChannel, aReferrerPolicy, aCSPHeader, GetLoadingBrowsingContext()); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoChannelParams.ipdlh thunderbird-140.10.0esr/netwerk/ipc/NeckoChannelParams.ipdlh --- thunderbird-140.9.0esr/netwerk/ipc/NeckoChannelParams.ipdlh 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoChannelParams.ipdlh 2026-04-21 14:52:59.000000000 +0000 @@ -632,31 +632,6 @@ }; //----------------------------------------------------------------------------- -// GIO IPDL structs -//----------------------------------------------------------------------------- - -struct GIOChannelOpenArgs -{ - URIParams uri; - uint64_t startPos; - nsCString entityID; - IPCStream? uploadStream; - LoadInfoArgs loadInfo; - uint32_t loadFlags; -}; - -struct GIOChannelConnectArgs -{ - uint32_t channelId; -}; - -union GIOChannelCreationArgs -{ - GIOChannelOpenArgs; // For AsyncOpen: the common case. - GIOChannelConnectArgs; // Used for redirected-to channels -}; - -//----------------------------------------------------------------------------- // File IPDL structs //----------------------------------------------------------------------------- diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoChild.cpp thunderbird-140.10.0esr/netwerk/ipc/NeckoChild.cpp --- thunderbird-140.9.0esr/netwerk/ipc/NeckoChild.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoChild.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -13,9 +13,6 @@ #include "mozilla/net/ChildDNSService.h" #include "mozilla/net/CookieServiceChild.h" #include "mozilla/net/DataChannelChild.h" -#ifdef MOZ_WIDGET_GTK -# include "mozilla/net/GIOChannelChild.h" -#endif #include "mozilla/net/FileChannelChild.h" #include "mozilla/net/WebSocketChannelChild.h" #include "mozilla/net/WebSocketEventListenerChild.h" @@ -129,24 +126,6 @@ return true; } -#ifdef MOZ_WIDGET_GTK -PGIOChannelChild* NeckoChild::AllocPGIOChannelChild( - PBrowserChild* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - // We don't allocate here: see GIOChannelChild::AsyncOpen() - MOZ_CRASH("AllocPGIOChannelChild should not be called"); - return nullptr; -} - -bool NeckoChild::DeallocPGIOChannelChild(PGIOChannelChild* channel) { - MOZ_ASSERT(IsNeckoChild(), "DeallocPGIOChannelChild called by non-child!"); - - GIOChannelChild* child = static_cast(channel); - child->ReleaseIPDLReference(); - return true; -} -#endif - PCookieServiceChild* NeckoChild::AllocPCookieServiceChild() { // We don't allocate here: see CookieService::GetSingleton() MOZ_ASSERT_UNREACHABLE("AllocPCookieServiceChild should not be called"); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoChild.h thunderbird-140.10.0esr/netwerk/ipc/NeckoChild.h --- thunderbird-140.9.0esr/netwerk/ipc/NeckoChild.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoChild.h 2026-04-21 14:52:59.000000000 +0000 @@ -41,12 +41,6 @@ PCookieServiceChild* AllocPCookieServiceChild(); bool DeallocPCookieServiceChild(PCookieServiceChild*); -#ifdef MOZ_WIDGET_GTK - PGIOChannelChild* AllocPGIOChannelChild( - PBrowserChild* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs); - bool DeallocPGIOChannelChild(PGIOChannelChild*); -#endif PWebSocketChild* AllocPWebSocketChild(PBrowserChild*, const SerializedLoadContext&, const uint32_t&); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoMessageUtils.h thunderbird-140.10.0esr/netwerk/ipc/NeckoMessageUtils.h --- thunderbird-140.9.0esr/netwerk/ipc/NeckoMessageUtils.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoMessageUtils.h 2026-04-21 14:52:59.000000000 +0000 @@ -117,14 +117,9 @@ ReadParam(aReader, &aResult->inet6.ip.u64[0]) && ReadParam(aReader, &aResult->inet6.ip.u64[1]) && ReadParam(aReader, &aResult->inet6.scope_id); -#if defined(XP_UNIX) - } else if (aResult->raw.family == AF_LOCAL) { - return aReader->ReadBytesInto(&aResult->local.path, - sizeof(aResult->local.path)); -#endif } - /* We've been tricked by some socket family we don't know about! */ + // We've been tricked by some socket family we don't know about. return false; } }; diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoParent.cpp thunderbird-140.10.0esr/netwerk/ipc/NeckoParent.cpp --- thunderbird-140.9.0esr/netwerk/ipc/NeckoParent.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -18,9 +18,6 @@ #include "mozilla/net/WebSocketChannelParent.h" #include "mozilla/net/WebSocketEventListenerParent.h" #include "mozilla/net/DataChannelParent.h" -#ifdef MOZ_WIDGET_GTK -# include "mozilla/net/GIOChannelParent.h" -#endif #include "mozilla/net/DocumentChannelParent.h" #include "mozilla/net/SimpleChannelParent.h" #include "mozilla/net/AltDataOutputStreamParent.h" @@ -330,51 +327,6 @@ return IPC_OK(); } -#ifdef MOZ_WIDGET_GTK -static already_AddRefed GetRequestingPrincipal( - const GIOChannelCreationArgs& aArgs) { - if (aArgs.type() != GIOChannelCreationArgs::TGIOChannelOpenArgs) { - return nullptr; - } - - const GIOChannelOpenArgs& args = aArgs.get_GIOChannelOpenArgs(); - return GetRequestingPrincipal(args.loadInfo()); -} - -PGIOChannelParent* NeckoParent::AllocPGIOChannelParent( - PBrowserParent* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - nsCOMPtr requestingPrincipal = - GetRequestingPrincipal(aOpenArgs); - - nsCOMPtr loadContext; - CreateChannelLoadContext(aBrowser, Manager(), aSerialized, - requestingPrincipal, loadContext); - PBOverrideStatus overrideStatus = - PBOverrideStatusFromLoadContext(aSerialized); - GIOChannelParent* p = new GIOChannelParent(BrowserParent::GetFrom(aBrowser), - loadContext, overrideStatus); - p->AddRef(); - return p; -} - -bool NeckoParent::DeallocPGIOChannelParent(PGIOChannelParent* channel) { - GIOChannelParent* p = static_cast(channel); - p->Release(); - return true; -} - -mozilla::ipc::IPCResult NeckoParent::RecvPGIOChannelConstructor( - PGIOChannelParent* actor, PBrowserParent* aBrowser, - const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) { - GIOChannelParent* p = static_cast(actor); - DebugOnly rv = p->Init(aOpenArgs); - MOZ_ASSERT(rv); - return IPC_OK(); -} -#endif - PSimpleChannelParent* NeckoParent::AllocPSimpleChannelParent( const uint32_t& channelId) { RefPtr p = new SimpleChannelParent(); @@ -432,6 +384,9 @@ mozilla::ipc::IPCResult NeckoParent::RecvPTCPServerSocketConstructor( PTCPServerSocketParent* aActor, const uint16_t& aLocalPort, const uint16_t& aBacklog, const bool& aUseArrayBuffers) { + if (!StaticPrefs::dom_tcpsocket_in_child_enabled()) { + return IPC_FAIL(this, "tcp socket not enabled"); + } static_cast(aActor)->Init(); return IPC_OK(); } @@ -452,6 +407,9 @@ mozilla::ipc::IPCResult NeckoParent::RecvPUDPSocketConstructor( PUDPSocketParent* aActor, nsIPrincipal* aPrincipal, const nsACString& aFilter) { + if (!StaticPrefs::dom_udpsocket_enabled() && aFilter.IsEmpty()) { + return IPC_FAIL(this, "udp socket not enabled"); + } if (!static_cast(aActor)->Init(aPrincipal, aFilter)) { return IPC_FAIL_NO_REASON(this); } diff -Nru thunderbird-140.9.0esr/netwerk/ipc/NeckoParent.h thunderbird-140.10.0esr/netwerk/ipc/NeckoParent.h --- thunderbird-140.9.0esr/netwerk/ipc/NeckoParent.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/NeckoParent.h 2026-04-21 14:52:59.000000000 +0000 @@ -142,17 +142,6 @@ virtual mozilla::ipc::IPCResult RecvPDataChannelConstructor( PDataChannelParent* aActor, const uint32_t& channelId) override; -# ifdef MOZ_WIDGET_GTK - PGIOChannelParent* AllocPGIOChannelParent( - PBrowserParent* aBrowser, const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs); - bool DeallocPGIOChannelParent(PGIOChannelParent* channel); - - virtual mozilla::ipc::IPCResult RecvPGIOChannelConstructor( - PGIOChannelParent* aActor, PBrowserParent* aBrowser, - const SerializedLoadContext& aSerialized, - const GIOChannelCreationArgs& aOpenArgs) override; -# endif PSimpleChannelParent* AllocPSimpleChannelParent(const uint32_t& channelId); bool DeallocPSimpleChannelParent(PSimpleChannelParent* actor); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/PNecko.ipdl thunderbird-140.10.0esr/netwerk/ipc/PNecko.ipdl --- thunderbird-140.9.0esr/netwerk/ipc/PNecko.ipdl 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/PNecko.ipdl 2026-04-21 14:52:59.000000000 +0000 @@ -9,9 +9,6 @@ include protocol PHttpChannel; include protocol PCookieService; include protocol PBrowser; -#ifdef MOZ_WIDGET_GTK -include protocol PGIOChannel; -#endif include protocol PWebSocket; include protocol PWebSocketEventListener; include protocol PTCPSocket; @@ -58,9 +55,6 @@ manages PUDPSocket; manages PDNSRequest; manages PDataChannel; -#ifdef MOZ_WIDGET_GTK - manages PGIOChannel; -#endif manages PSimpleChannel; manages PFileChannel; manages PTransportProvider; @@ -114,9 +108,6 @@ * the parent and the child when we're redirecting to a data: URI. */ async PDataChannel(uint32_t channelId); -#ifdef MOZ_WIDGET_GTK - async PGIOChannel(nullable PBrowser browser, SerializedLoadContext loadContext, GIOChannelCreationArgs args); -#endif async PSimpleChannel(uint32_t channelId); async PFileChannel(); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp thunderbird-140.10.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp --- thunderbird-140.9.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/SocketProcessBridgeParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -47,8 +47,8 @@ transportQueue->Dispatch(NS_NewRunnableFunction( "BackgroundDataBridgeParent::Bind", [endpoint = std::move(aEndpoint), aChannelID]() mutable { - RefPtr actor = - new net::BackgroundDataBridgeParent(aChannelID); + RefPtr actor = + BackgroundDataBridgeParent::Create(aChannelID); endpoint.Bind(actor); })); return IPC_OK(); diff -Nru thunderbird-140.9.0esr/netwerk/ipc/SocketProcessParent.cpp thunderbird-140.10.0esr/netwerk/ipc/SocketProcessParent.cpp --- thunderbird-140.9.0esr/netwerk/ipc/SocketProcessParent.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/SocketProcessParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -99,33 +99,37 @@ const Maybe& aDMDFile) { mMemoryReportRequest = MakeUnique(aGeneration); - PSocketProcessParent::SendRequestMemoryReport( - aGeneration, aAnonymize, aMinimizeMemoryUsage, aDMDFile, - [&](const uint32_t& aGeneration2) { - MOZ_ASSERT(gIOService); - if (!gIOService->SocketProcess()) { - return; - } - SocketProcessParent* actor = gIOService->SocketProcess()->GetActor(); - if (!actor) { - return; - } - if (actor->mMemoryReportRequest) { - actor->mMemoryReportRequest->Finish(aGeneration2); - actor->mMemoryReportRequest = nullptr; - } - }, - [&](mozilla::ipc::ResponseRejectReason) { - MOZ_ASSERT(gIOService); - if (!gIOService->SocketProcess()) { - return; - } - SocketProcessParent* actor = gIOService->SocketProcess()->GetActor(); - if (!actor) { - return; - } - actor->mMemoryReportRequest = nullptr; - }); + PSocketProcessParent::SendRequestMemoryReport(aGeneration, aAnonymize, + aMinimizeMemoryUsage, aDMDFile) + ->Then( + GetCurrentSerialEventTarget(), __func__, + [](uint32_t aGeneration2) { + MOZ_ASSERT(gIOService); + if (!gIOService->SocketProcess()) { + return; + } + SocketProcessParent* actor = + gIOService->SocketProcess()->GetActor(); + if (!actor) { + return; + } + if (actor->mMemoryReportRequest) { + actor->mMemoryReportRequest->Finish(aGeneration2); + actor->mMemoryReportRequest = nullptr; + } + }, + [](mozilla::ipc::ResponseRejectReason) { + MOZ_ASSERT(gIOService); + if (!gIOService->SocketProcess()) { + return; + } + SocketProcessParent* actor = + gIOService->SocketProcess()->GetActor(); + if (!actor) { + return; + } + actor->mMemoryReportRequest = nullptr; + }); return true; } diff -Nru thunderbird-140.9.0esr/netwerk/ipc/moz.build thunderbird-140.10.0esr/netwerk/ipc/moz.build --- thunderbird-140.9.0esr/netwerk/ipc/moz.build 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/ipc/moz.build 2026-04-21 14:52:59.000000000 +0000 @@ -68,7 +68,6 @@ PREPROCESSED_IPDL_SOURCES += [ - "PNecko.ipdl", "PSocketProcess.ipdl", "PSocketProcessBridge.ipdl", ] @@ -79,6 +78,7 @@ "PDocumentChannel.ipdl", "PFileChannel.ipdl", "PInputChannelThrottleQueue.ipdl", + "PNecko.ipdl", "PProxyAutoConfig.ipdl", "PProxyConfigLookup.ipdl", "PSimpleChannel.ipdl", diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelChild.cpp thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.cpp --- thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelChild.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,457 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* 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 "mozilla/net/NeckoChild.h" -#include "GIOChannelChild.h" -#include "nsGIOProtocolHandler.h" -#include "mozilla/dom/ContentChild.h" -#include "mozilla/dom/BrowserChild.h" -#include "nsContentUtils.h" -#include "nsIBrowserChild.h" -#include "nsStringStream.h" -#include "nsNetUtil.h" -#include "mozilla/ipc/IPCStreamUtils.h" -#include "mozilla/ipc/URIUtils.h" -#include "SerializedLoadContext.h" -#include "mozilla/ipc/BackgroundUtils.h" -#include "nsIURIMutator.h" -#include "nsContentSecurityManager.h" -#include "SerializedLoadContext.h" -#include "mozilla/Logging.h" - -using mozilla::dom::ContentChild; - -namespace mozilla { -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) -namespace net { - -GIOChannelChild::GIOChannelChild(nsIURI* aUri) - : mEventQ(new ChannelEventQueue(static_cast(this))) { - SetURI(aUri); - // We could support thread retargeting, but as long as we're being driven by - // IPDL on the main thread it doesn't buy us anything. - DisallowThreadRetargeting(); -} - -void GIOChannelChild::AddIPDLReference() { - MOZ_ASSERT(!mIPCOpen, "Attempt to retain more than one IPDL reference"); - mIPCOpen = true; - AddRef(); -} - -void GIOChannelChild::ReleaseIPDLReference() { - MOZ_ASSERT(mIPCOpen, "Attempt to release nonexistent IPDL reference"); - mIPCOpen = false; - Release(); -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsISupports -//----------------------------------------------------------------------------- - -NS_IMPL_ISUPPORTS_INHERITED(GIOChannelChild, nsBaseChannel, nsIChildChannel) - -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::AsyncOpen(nsIStreamListener* aListener) { - nsCOMPtr listener = aListener; - nsresult rv = - nsContentSecurityManager::doContentSecurityCheck(this, listener); - NS_ENSURE_SUCCESS(rv, rv); - - LOG(("GIOChannelChild::AsyncOpen [this=%p]\n", this)); - - NS_ENSURE_TRUE((gNeckoChild), NS_ERROR_FAILURE); - NS_ENSURE_TRUE( - !static_cast(gNeckoChild->Manager())->IsShuttingDown(), - NS_ERROR_FAILURE); - NS_ENSURE_ARG_POINTER(listener); - NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); - NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); - - // Port checked in parent, but duplicate here so we can return with error - // immediately, as we've done since before e10s. - rv = NS_CheckPortSafety(nsBaseChannel::URI()); // Need to disambiguate, - // because in the child ipdl, - // a typedef URI is defined... - if (NS_FAILED(rv)) { - return rv; - } - - mozilla::dom::BrowserChild* browserChild = nullptr; - nsCOMPtr iBrowserChild; - NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup, - NS_GET_IID(nsIBrowserChild), - getter_AddRefs(iBrowserChild)); - GetCallback(iBrowserChild); - if (iBrowserChild) { - browserChild = - static_cast(iBrowserChild.get()); - } - - mListener = listener; - - // add ourselves to the load group. - if (mLoadGroup) { - mLoadGroup->AddRequest(this, nullptr); - } - - Maybe ipcStream; - mozilla::ipc::SerializeIPCStream(do_AddRef(mUploadStream), ipcStream, - /* aAllowLazy */ false); - - uint32_t loadFlags = 0; - GetLoadFlags(&loadFlags); - - GIOChannelOpenArgs openArgs; - SerializeURI(nsBaseChannel::URI(), openArgs.uri()); - openArgs.startPos() = mStartPos; - openArgs.entityID() = mEntityID; - openArgs.uploadStream() = ipcStream; - openArgs.loadFlags() = loadFlags; - - nsCOMPtr loadInfo = LoadInfo(); - rv = mozilla::ipc::LoadInfoToLoadInfoArgs(loadInfo, &openArgs.loadInfo()); - NS_ENSURE_SUCCESS(rv, rv); - - // This must happen before the constructor message is sent. - SetupNeckoTarget(); - - // The socket transport layer in the chrome process now has a logical ref to - // us until OnStopRequest is called. - AddIPDLReference(); - - if (!gNeckoChild->SendPGIOChannelConstructor( - this, browserChild, IPC::SerializedLoadContext(this), openArgs)) { - return NS_ERROR_FAILURE; - } - - mIsPending = true; - mWasOpened = true; - - return rv; -} - -NS_IMETHODIMP -GIOChannelChild::IsPending(bool* aResult) { - *aResult = mIsPending; - return NS_OK; -} - -nsresult GIOChannelChild::OpenContentStream(bool aAsync, - nsIInputStream** aStream, - nsIChannel** aChannel) { - MOZ_CRASH("GIOChannel*Child* should never have OpenContentStream called!"); - return NS_OK; -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnStartRequest( - const nsresult& aChannelStatus, const int64_t& aContentLength, - const nsACString& aContentType, const nsACString& aEntityID, - const URIParams& aURI) { - LOG(("GIOChannelChild::RecvOnStartRequest [this=%p]\n", this)); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus, - aContentLength, aContentType = nsCString(aContentType), - aEntityID = nsCString(aEntityID), aURI]() { - self->DoOnStartRequest(aChannelStatus, aContentLength, aContentType, - aEntityID, aURI); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, - const URIParams& aURI) { - LOG(("GIOChannelChild::DoOnStartRequest [this=%p]\n", this)); - if (!mCanceled && NS_SUCCEEDED(mStatus)) { - mStatus = aChannelStatus; - } - - mContentLength = aContentLength; - SetContentType(aContentType); - mEntityID = aEntityID; - - nsCString spec; - nsCOMPtr uri = DeserializeURI(aURI); - nsresult rv = uri->GetSpec(spec); - if (NS_SUCCEEDED(rv)) { - // Changes nsBaseChannel::URI() - rv = NS_MutateURI(mURI).SetSpec(spec).Finalize(mURI); - } - - if (NS_FAILED(rv)) { - Cancel(rv); - } - - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - rv = mListener->OnStartRequest(this); - if (NS_FAILED(rv)) { - Cancel(rv); - } -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnDataAvailable( - const nsresult& aChannelStatus, const nsACString& aData, - const uint64_t& aOffset, const uint32_t& aCount) { - LOG(("GIOChannelChild::RecvOnDataAvailable [this=%p]\n", this)); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus, - aData = nsCString(aData), aOffset, aCount]() { - self->DoOnDataAvailable(aChannelStatus, aData, aOffset, aCount); - })); - - return IPC_OK(); -} - -void GIOChannelChild::DoOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, - const uint64_t& aOffset, - const uint32_t& aCount) { - LOG(("GIOChannelChild::DoOnDataAvailable [this=%p]\n", this)); - - if (!mCanceled && NS_SUCCEEDED(mStatus)) { - mStatus = aChannelStatus; - } - - if (mCanceled) { - return; - } - - // NOTE: the OnDataAvailable contract requires the client to read all the data - // in the inputstream. This code relies on that ('data' will go away after - // this function). Apparently the previous, non-e10s behavior was to actually - // support only reading part of the data, allowing later calls to read the - // rest. - nsCOMPtr stringStream; - nsresult rv = - NS_NewByteInputStream(getter_AddRefs(stringStream), - Span(aData).To(aCount), NS_ASSIGNMENT_DEPEND); - if (NS_FAILED(rv)) { - Cancel(rv); - return; - } - - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - rv = mListener->OnDataAvailable(this, stringStream, aOffset, aCount); - if (NS_FAILED(rv)) { - Cancel(rv); - } - stringStream->Close(); -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvOnStopRequest( - const nsresult& aChannelStatus) { - LOG(("GIOChannelChild::RecvOnStopRequest [this=%p status=%" PRIx32 "]\n", - this, static_cast(aChannelStatus))); - - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aChannelStatus]() { - self->DoOnStopRequest(aChannelStatus); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoOnStopRequest(const nsresult& aChannelStatus) { - LOG(("GIOChannelChild::DoOnStopRequest [this=%p status=%" PRIx32 "]\n", this, - static_cast(aChannelStatus))); - - if (!mCanceled) { - mStatus = aChannelStatus; - } - - { // Ensure that all queued ipdl events are dispatched before - // we initiate protocol deletion below. - mIsPending = false; - AutoEventEnqueuer ensureSerialDispatch(mEventQ); - (void)mListener->OnStopRequest(this, aChannelStatus); - - mListener = nullptr; - - if (mLoadGroup) { - mLoadGroup->RemoveRequest(this, nullptr, aChannelStatus); - } - } - - // This calls NeckoChild::DeallocPGIOChannelChild(), which deletes |this| if - // IPDL holds the last reference. Don't rely on |this| existing after here! - Send__delete__(this); -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvFailedAsyncOpen( - const nsresult& aStatusCode) { - LOG(("GIOChannelChild::RecvFailedAsyncOpen [this=%p status=%" PRIx32 "]\n", - this, static_cast(aStatusCode))); - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, [self = UnsafePtr(this), aStatusCode]() { - self->DoFailedAsyncOpen(aStatusCode); - })); - return IPC_OK(); -} - -void GIOChannelChild::DoFailedAsyncOpen(const nsresult& aStatusCode) { - LOG(("GIOChannelChild::DoFailedAsyncOpen [this=%p status=%" PRIx32 "]\n", - this, static_cast(aStatusCode))); - mStatus = aStatusCode; - - if (mLoadGroup) { - mLoadGroup->RemoveRequest(this, nullptr, aStatusCode); - } - - if (mListener) { - mListener->OnStartRequest(this); - mIsPending = false; - mListener->OnStopRequest(this, aStatusCode); - } else { - mIsPending = false; - } - - mListener = nullptr; - - if (mIPCOpen) { - Send__delete__(this); - } -} - -mozilla::ipc::IPCResult GIOChannelChild::RecvDeleteSelf() { - mEventQ->RunOrEnqueue(new NeckoTargetChannelFunctionEvent( - this, - [self = UnsafePtr(this)]() { self->DoDeleteSelf(); })); - return IPC_OK(); -} - -void GIOChannelChild::DoDeleteSelf() { - if (mIPCOpen) { - Send__delete__(this); - } -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsIResumableChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::Cancel(nsresult aStatus) { - LOG(("GIOChannelChild::Cancel [this=%p]\n", this)); - - if (mCanceled) { - return NS_OK; - } - - mCanceled = true; - mStatus = aStatus; - if (mIPCOpen) { - SendCancel(aStatus); - } - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::Suspend() { - NS_ENSURE_TRUE(mIPCOpen, NS_ERROR_NOT_AVAILABLE); - - LOG(("GIOChannelChild::Suspend [this=%p]\n", this)); - - // SendSuspend only once, when suspend goes from 0 to 1. - if (!mSuspendCount++) { - SendSuspend(); - mSuspendSent = true; - } - mEventQ->Suspend(); - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::Resume() { - NS_ENSURE_TRUE(mIPCOpen, NS_ERROR_NOT_AVAILABLE); - - LOG(("GIOChannelChild::Resume [this=%p]\n", this)); - - // SendResume only once, when suspend count drops to 0. - if (!--mSuspendCount && mSuspendSent) { - SendResume(); - } - mEventQ->Resume(); - - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelChild::nsIChildChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelChild::ConnectParent(uint32_t aId) { - NS_ENSURE_TRUE((gNeckoChild), NS_ERROR_FAILURE); - NS_ENSURE_TRUE( - !static_cast(gNeckoChild->Manager())->IsShuttingDown(), - NS_ERROR_FAILURE); - - LOG(("GIOChannelChild::ConnectParent [this=%p]\n", this)); - - mozilla::dom::BrowserChild* browserChild = nullptr; - nsCOMPtr iBrowserChild; - NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup, - NS_GET_IID(nsIBrowserChild), - getter_AddRefs(iBrowserChild)); - GetCallback(iBrowserChild); - if (iBrowserChild) { - browserChild = - static_cast(iBrowserChild.get()); - } - - // This must happen before the constructor message is sent. - SetupNeckoTarget(); - - // The socket transport in the chrome process now holds a logical ref to us - // until OnStopRequest, or we do a redirect, or we hit an IPDL error. - AddIPDLReference(); - - GIOChannelConnectArgs connectArgs(aId); - - if (!gNeckoChild->SendPGIOChannelConstructor( - this, browserChild, IPC::SerializedLoadContext(this), connectArgs)) { - return NS_ERROR_FAILURE; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelChild::CompleteRedirectSetup(nsIStreamListener* aListener) { - LOG(("GIOChannelChild::CompleteRedirectSetup [this=%p]\n", this)); - NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); - NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); - - mIsPending = true; - mWasOpened = true; - mListener = aListener; - - // add ourselves to the load group. - if (mLoadGroup) { - mLoadGroup->AddRequest(this, nullptr); - } - - // We already have an open IPDL connection to the parent. If on-modify-request - // listeners or load group observers canceled us, let the parent handle it - // and send it back to us naturally. - return NS_OK; -} - -void GIOChannelChild::SetupNeckoTarget() { - if (mNeckoTarget) { - return; - } - mNeckoTarget = GetMainThreadSerialEventTarget(); -} - -} // namespace net -} // namespace mozilla diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelChild.h thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.h --- thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelChild.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelChild.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* 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 NS_GIOCHANNELCHILD_H -#define NS_GIOCHANNELCHILD_H - -#include "mozilla/net/PGIOChannelChild.h" -#include "mozilla/net/ChannelEventQueue.h" -#include "nsBaseChannel.h" -#include "nsIUploadChannel.h" -#include "nsIProxiedChannel.h" -#include "nsIResumableChannel.h" -#include "nsIChildChannel.h" -#include "nsIEventTarget.h" -#include "nsIStreamListener.h" - -class nsIEventTarget; - -namespace mozilla { -namespace net { - -class GIOChannelChild final : public PGIOChannelChild, - public nsBaseChannel, - public nsIChildChannel { - public: - using nsIStreamListener = ::nsIStreamListener; - - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_NSICHILDCHANNEL - - NS_IMETHOD Cancel(nsresult aStatus) override; - NS_IMETHOD Suspend() override; - NS_IMETHOD Resume() override; - - explicit GIOChannelChild(nsIURI* uri); - - void AddIPDLReference(); - void ReleaseIPDLReference(); - - NS_IMETHOD AsyncOpen(nsIStreamListener* aListener) override; - - // Note that we handle this ourselves, overriding the nsBaseChannel - // default behavior, in order to be e10s-friendly. - NS_IMETHOD IsPending(bool* aResult) override; - - nsresult OpenContentStream(bool aAsync, nsIInputStream** aStream, - nsIChannel** aChannel) override; - - bool IsSuspended() const; - - protected: - virtual ~GIOChannelChild() = default; - - mozilla::ipc::IPCResult RecvOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, - const URIParams& aURI) override; - mozilla::ipc::IPCResult RecvOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, - const uint64_t& aOffset, - const uint32_t& aCount) override; - mozilla::ipc::IPCResult RecvOnStopRequest( - const nsresult& aChannelStatus) override; - mozilla::ipc::IPCResult RecvFailedAsyncOpen( - const nsresult& aStatusCode) override; - mozilla::ipc::IPCResult RecvDeleteSelf() override; - - void DoOnStartRequest(const nsresult& aChannelStatus, - const int64_t& aContentLength, - const nsACString& aContentType, - const nsACString& aEntityID, const URIParams& aURI); - void DoOnDataAvailable(const nsresult& aChannelStatus, - const nsACString& aData, const uint64_t& aOffset, - const uint32_t& aCount); - void DoOnStopRequest(const nsresult& aChannelStatus); - void DoFailedAsyncOpen(const nsresult& aStatusCode); - void DoDeleteSelf(); - - void SetupNeckoTarget() override; - - friend class NeckoTargetChannelFunctionEvent; - - private: - nsCOMPtr mUploadStream; - - bool mIPCOpen = false; - const RefPtr mEventQ; - - bool mCanceled = false; - uint32_t mSuspendCount = 0; - ; - bool mIsPending = false; - - uint64_t mStartPos = 0; - nsCString mEntityID; - - // Set if SendSuspend is called. Determines if SendResume is needed when - // diverting callbacks to parent. - bool mSuspendSent = false; -}; - -inline bool GIOChannelChild::IsSuspended() const { return mSuspendCount != 0; } - -} // namespace net -} // namespace mozilla - -#endif /* NS_GIOCHANNELCHILD_H */ diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelParent.cpp thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.cpp --- thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelParent.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,324 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* 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 "GIOChannelParent.h" -#include "nsGIOProtocolHandler.h" -#include "mozilla/Assertions.h" -#include "mozilla/dom/ContentParent.h" -#include "mozilla/dom/BrowserParent.h" -#include "mozilla/net/NeckoParent.h" -#include "nsNetUtil.h" -#include "nsIChannel.h" -#include "mozilla/net/NeckoChannelParams.h" -#include "nsIAuthPrompt.h" -#include "nsIAuthPromptProvider.h" -#include "nsISecureBrowserUI.h" -#include "nsQueryObject.h" -#include "mozilla/Logging.h" -#include "mozilla/net/ChannelEventQueue.h" -#include "mozilla/ipc/URIUtils.h" - -using namespace mozilla::dom; -using namespace mozilla::ipc; - -namespace mozilla { -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) -namespace net { - -GIOChannelParent::GIOChannelParent(dom::BrowserParent* aIframeEmbedding, - nsILoadContext* aLoadContext, - PBOverrideStatus aOverrideStatus) - : mLoadContext(aLoadContext), - mPBOverride(aOverrideStatus), - mBrowserParent(aIframeEmbedding) { - mEventQ = new ChannelEventQueue(static_cast(this)); -} - -void GIOChannelParent::ActorDestroy(ActorDestroyReason why) { - // We may still have refcount>0 if the channel hasn't called OnStopRequest - // yet, but we must not send any more msgs to child. - mIPCClosed = true; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsISupports -//----------------------------------------------------------------------------- -NS_IMPL_ISUPPORTS(GIOChannelParent, nsIStreamListener, nsIParentChannel, - nsIInterfaceRequestor, nsIRequestObserver) - -//----------------------------------------------------------------------------- -// GIOChannelParent methods -//----------------------------------------------------------------------------- - -bool GIOChannelParent::Init(const GIOChannelCreationArgs& aOpenArgs) { - switch (aOpenArgs.type()) { - case GIOChannelCreationArgs::TGIOChannelOpenArgs: { - const GIOChannelOpenArgs& a = aOpenArgs.get_GIOChannelOpenArgs(); - return DoAsyncOpen(a.uri(), a.startPos(), a.entityID(), a.uploadStream(), - a.loadInfo(), a.loadFlags()); - } - case GIOChannelCreationArgs::TGIOChannelConnectArgs: { - const GIOChannelConnectArgs& cArgs = - aOpenArgs.get_GIOChannelConnectArgs(); - return ConnectChannel(cArgs.channelId()); - } - default: - MOZ_ASSERT_UNREACHABLE("unknown open type"); - return false; - } -} - -bool GIOChannelParent::DoAsyncOpen(const URIParams& aURI, - const uint64_t& aStartPos, - const nsCString& aEntityID, - const Maybe& aUploadStream, - const LoadInfoArgs& aLoadInfoArgs, - const uint32_t& aLoadFlags) { - nsresult rv; - - nsCOMPtr uri = DeserializeURI(aURI); - if (!uri) { - return false; - } - -#ifdef DEBUG - LOG(("GIOChannelParent DoAsyncOpen [this=%p uri=%s]\n", this, - uri->GetSpecOrDefault().get())); -#endif - - nsCOMPtr ios(do_GetIOService(&rv)); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsAutoCString remoteType; - rv = GetRemoteType(remoteType); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsCOMPtr loadInfo; - rv = mozilla::ipc::LoadInfoArgsToLoadInfo(aLoadInfoArgs, remoteType, - getter_AddRefs(loadInfo)); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - OriginAttributes attrs; - rv = loadInfo->GetOriginAttributes(&attrs); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - nsCOMPtr chan; - rv = NS_NewChannelInternal(getter_AddRefs(chan), uri, loadInfo, nullptr, - nullptr, nullptr, aLoadFlags, ios); - - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - mChannel = chan; - - nsIChannel* gioChan = static_cast(mChannel.get()); - - rv = gioChan->AsyncOpen(this); - if (NS_FAILED(rv)) { - return SendFailedAsyncOpen(rv); - } - - return true; -} - -bool GIOChannelParent::ConnectChannel(const uint64_t& channelId) { - nsresult rv; - - LOG(("Looking for a registered channel [this=%p, id=%" PRIx64 "]", this, - channelId)); - - nsCOMPtr channel; - rv = NS_LinkRedirectChannels(channelId, this, getter_AddRefs(channel)); - if (NS_SUCCEEDED(rv)) { - mChannel = channel; - } - - LOG((" found channel %p, rv=%08" PRIx32, mChannel.get(), - static_cast(rv))); - - return true; -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvCancel(const nsresult& status) { - if (mChannel) { - mChannel->Cancel(status); - } - - return IPC_OK(); -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvSuspend() { - if (mChannel) { - mChannel->Suspend(); - } - return IPC_OK(); -} - -mozilla::ipc::IPCResult GIOChannelParent::RecvResume() { - if (mChannel) { - mChannel->Resume(); - } - return IPC_OK(); -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIRequestObserver -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::OnStartRequest(nsIRequest* aRequest) { - LOG(("GIOChannelParent::OnStartRequest [this=%p]\n", this)); - nsCOMPtr chan = do_QueryInterface(aRequest); - MOZ_ASSERT(chan); - NS_ENSURE_TRUE(chan, NS_ERROR_UNEXPECTED); - - int64_t contentLength; - chan->GetContentLength(&contentLength); - nsCString contentType; - chan->GetContentType(contentType); - nsresult channelStatus = NS_OK; - chan->GetStatus(&channelStatus); - - nsCString entityID; - URIParams uriparam; - nsCOMPtr uri; - chan->GetURI(getter_AddRefs(uri)); - SerializeURI(uri, uriparam); - - if (mIPCClosed || !SendOnStartRequest(channelStatus, contentLength, - contentType, entityID, uriparam)) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::OnStopRequest(nsIRequest* aRequest, nsresult aStatusCode) { - LOG(("GIOChannelParent::OnStopRequest: [this=%p status=%" PRIu32 "]\n", this, - static_cast(aStatusCode))); - - if (mIPCClosed || !SendOnStopRequest(aStatusCode)) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIStreamListener -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::OnDataAvailable(nsIRequest* aRequest, - nsIInputStream* aInputStream, - uint64_t aOffset, uint32_t aCount) { - LOG(("GIOChannelParent::OnDataAvailable [this=%p]\n", this)); - - nsCString data; - nsresult rv = NS_ReadInputStreamToString(aInputStream, data, aCount); - if (NS_FAILED(rv)) { - return rv; - } - - nsresult channelStatus = NS_OK; - mChannel->GetStatus(&channelStatus); - - if (mIPCClosed || - !SendOnDataAvailable(channelStatus, data, aOffset, aCount)) { - return NS_ERROR_UNEXPECTED; - } - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIParentChannel -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::SetParentListener(ParentChannelListener* aListener) { - // Do not need ptr to ParentChannelListener. - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::NotifyClassificationFlags(uint32_t aClassificationFlags, - bool aIsThirdParty) { - // Nothing to do. - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::SetClassifierMatchedInfo(const nsACString& aList, - const nsACString& aProvider, - const nsACString& aFullHash) { - // nothing to do - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::SetClassifierMatchedTrackingInfo( - const nsACString& aLists, const nsACString& aFullHashes) { - // nothing to do - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::Delete() { - if (mIPCClosed || !SendDeleteSelf()) { - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -NS_IMETHODIMP -GIOChannelParent::GetRemoteType(nsACString& aRemoteType) { - if (!CanSend()) { - return NS_ERROR_UNEXPECTED; - } - - dom::PContentParent* pcp = Manager()->Manager(); - aRemoteType = static_cast(pcp)->GetRemoteType(); - return NS_OK; -} - -//----------------------------------------------------------------------------- -// GIOChannelParent::nsIInterfaceRequestor -//----------------------------------------------------------------------------- - -NS_IMETHODIMP -GIOChannelParent::GetInterface(const nsIID& uuid, void** result) { - if (uuid.Equals(NS_GET_IID(nsIAuthPromptProvider)) || - uuid.Equals(NS_GET_IID(nsISecureBrowserUI))) { - if (mBrowserParent) { - return mBrowserParent->QueryInterface(uuid, result); - } - } - - // Only support nsILoadContext if child channel's callbacks did too - if (uuid.Equals(NS_GET_IID(nsILoadContext)) && mLoadContext) { - nsCOMPtr copy = mLoadContext; - copy.forget(result); - return NS_OK; - } - - return QueryInterface(uuid, result); -} - -//--------------------- -} // namespace net -} // namespace mozilla diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelParent.h thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.h --- thunderbird-140.9.0esr/netwerk/protocol/gio/GIOChannelParent.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/GIOChannelParent.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=4 sw=2 sts=2 et tw=80: */ -/* 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 NS_GIOCHANNELPARENT_H -#define NS_GIOCHANNELPARENT_H - -#include "mozilla/net/PGIOChannelParent.h" -#include "mozilla/net/NeckoParent.h" -#include "nsIParentChannel.h" -#include "nsIInterfaceRequestor.h" - -class nsILoadContext; - -namespace mozilla { - -namespace dom { -class BrowserParent; -} // namespace dom - -namespace net { -class ChannelEventQueue; - -class GIOChannelParent final : public PGIOChannelParent, - public nsIParentChannel, - public nsIInterfaceRequestor { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIREQUESTOBSERVER - NS_DECL_NSISTREAMLISTENER - NS_DECL_NSIPARENTCHANNEL - NS_DECL_NSIINTERFACEREQUESTOR - - GIOChannelParent(dom::BrowserParent* aIframeEmbedding, - nsILoadContext* aLoadContext, - PBOverrideStatus aOverrideStatus); - - bool Init(const GIOChannelCreationArgs& aOpenArgs); - - protected: - virtual ~GIOChannelParent() = default; - - bool DoAsyncOpen(const URIParams& aURI, const uint64_t& aStartPos, - const nsCString& aEntityID, - const Maybe& aUploadStream, - const LoadInfoArgs& aLoadInfoArgs, - const uint32_t& aLoadFlags); - - // used to connect redirected-to channel in parent with just created - // ChildChannel. Used during HTTP->FTP redirects. - bool ConnectChannel(const uint64_t& channelId); - - virtual mozilla::ipc::IPCResult RecvCancel(const nsresult& status) override; - virtual mozilla::ipc::IPCResult RecvSuspend() override; - virtual mozilla::ipc::IPCResult RecvResume() override; - - virtual void ActorDestroy(ActorDestroyReason why) override; - - nsCOMPtr mChannel; - - bool mIPCClosed = false; - - nsCOMPtr mLoadContext; - - PBOverrideStatus mPBOverride; - - // Set to the canceled status value if the main channel was canceled. - nsresult mStatus = NS_OK; - - RefPtr mBrowserParent; - - RefPtr mEventQ; -}; - -} // namespace net -} // namespace mozilla - -#endif /* NS_GIOCHANNELPARENT_H */ diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/PGIOChannel.ipdl thunderbird-140.10.0esr/netwerk/protocol/gio/PGIOChannel.ipdl --- thunderbird-140.9.0esr/netwerk/protocol/gio/PGIOChannel.ipdl 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/PGIOChannel.ipdl 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set sw=2 ts=8 et tw=80 ft=cpp : */ - -/* 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 protocol PNecko; -include URIParams; - -//FIXME: bug #792908 (NeckoChannelParams already included by PNecko) -include NeckoChannelParams; - -using PRTime from "prtime.h"; - -namespace mozilla { -namespace net { - -[ManualDealloc, ChildImpl=virtual, ParentImpl=virtual] -async protocol PGIOChannel -{ - manager PNecko; - -parent: - // Note: channels are opened during construction, so no open method here: - // see PNecko.ipdl - - async __delete__(); - - async Cancel(nsresult status); - async Suspend(); - async Resume(); - -child: - async OnStartRequest(nsresult aChannelStatus, - int64_t aContentLength, - nsCString aContentType, - nsCString aEntityID, - URIParams aURI); - async OnDataAvailable(nsresult channelStatus, - nsCString data, - uint64_t offset, - uint32_t count); - async OnStopRequest(nsresult channelStatus); - async FailedAsyncOpen(nsresult statusCode); - - async DeleteSelf(); -}; - -} // namespace net -} // namespace mozilla diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/components.conf thunderbird-140.10.0esr/netwerk/protocol/gio/components.conf --- thunderbird-140.9.0esr/netwerk/protocol/gio/components.conf 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/components.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# 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/. - -Classes = [ - { - 'cid': '{ee706783-3af8-4d19-9e84-e2ebfe213480}', - 'contract_ids': ['@mozilla.org/network/protocol;1?name=moz-gio'], - 'singleton': True, - 'type': 'nsGIOProtocolHandler', - 'headers': ['nsGIOProtocolHandler.h'], - 'constructor': 'nsGIOProtocolHandler::GetSingleton', - 'categories': { 'xpcom-startup': 'nsGIOProtocolHandler' }, - 'protocol_config': { - 'scheme': 'moz-gio', - 'flags': [ - 'URI_STD', - 'URI_DANGEROUS_TO_LOAD', - ], - }, - }, -] diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/moz.build thunderbird-140.10.0esr/netwerk/protocol/gio/moz.build --- thunderbird-140.9.0esr/netwerk/protocol/gio/moz.build 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/moz.build 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# 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/. - -XPCOM_MANIFESTS += [ - "components.conf", -] - -EXPORTS += [ - "nsGIOProtocolHandler.h", -] - -EXPORTS.mozilla.net += [ - "GIOChannelChild.h", - "GIOChannelParent.h", -] - -UNIFIED_SOURCES += [ - "GIOChannelChild.cpp", - "GIOChannelParent.cpp", - "nsGIOProtocolHandler.cpp", -] - -IPDL_SOURCES = [ - "PGIOChannel.ipdl", -] - -include("/ipc/chromium/chromium-config.mozbuild") - -LOCAL_INCLUDES += [ - "/netwerk/base", -] - -FINAL_LIBRARY = "xul" - -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] - -with Files("**"): - BUG_COMPONENT = ("Core", "Widget: Gtk") diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp thunderbird-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp --- thunderbird-140.9.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1027 +0,0 @@ -/* vim:set ts=2 sw=2 et cindent: */ -/* 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 code is based on original Mozilla gnome-vfs extension. It implements - * input stream provided by GVFS/GIO. - */ -#include "nsGIOProtocolHandler.h" -#include "GIOChannelChild.h" -#include "mozilla/Components.h" -#include "mozilla/ClearOnShutdown.h" -#include "mozilla/Logging.h" -#include "mozilla/net/NeckoChild.h" -#include "mozilla/NullPrincipal.h" -#include "nsIPrefBranch.h" -#include "nsIPrefService.h" -#include "nsIObserver.h" -#include "nsCRT.h" -#include "nsThreadUtils.h" -#include "nsProxyRelease.h" -#include "nsIStringBundle.h" -#include "nsMimeTypes.h" -#include "nsNetCID.h" -#include "nsNetUtil.h" -#include "nsServiceManagerUtils.h" -#include "nsIURI.h" -#include "nsIAuthPrompt.h" -#include "nsIChannel.h" -#include "nsIInputStream.h" -#include "nsIProtocolHandler.h" -#include "mozilla/Monitor.h" -#include "prtime.h" -#include -#include - -using namespace mozilla; - -#define MOZ_GIO_SCHEME "moz-gio" -#define MOZ_GIO_SUPPORTED_PROTOCOLS "network.gio.supported-protocols" - -//----------------------------------------------------------------------------- - -// NSPR_LOG_MODULES=gio:5 -LazyLogModule gGIOLog("gio"); -#undef LOG -#define LOG(args) MOZ_LOG(gGIOLog, mozilla::LogLevel::Debug, args) - -//----------------------------------------------------------------------------- -static nsresult MapGIOResult(gint code) { - switch (code) { - case G_IO_ERROR_NOT_FOUND: - return NS_ERROR_FILE_NOT_FOUND; // shows error - case G_IO_ERROR_INVALID_ARGUMENT: - return NS_ERROR_INVALID_ARG; - case G_IO_ERROR_NOT_SUPPORTED: - return NS_ERROR_NOT_AVAILABLE; - case G_IO_ERROR_NO_SPACE: - return NS_ERROR_FILE_NO_DEVICE_SPACE; - case G_IO_ERROR_READ_ONLY: - return NS_ERROR_FILE_READ_ONLY; - case G_IO_ERROR_PERMISSION_DENIED: - return NS_ERROR_FILE_ACCESS_DENIED; // wrong password/login - case G_IO_ERROR_CLOSED: - return NS_BASE_STREAM_CLOSED; // was EOF - case G_IO_ERROR_NOT_DIRECTORY: - return NS_ERROR_FILE_NOT_DIRECTORY; - case G_IO_ERROR_PENDING: - return NS_ERROR_IN_PROGRESS; - case G_IO_ERROR_EXISTS: - return NS_ERROR_FILE_ALREADY_EXISTS; - case G_IO_ERROR_IS_DIRECTORY: - return NS_ERROR_FILE_IS_DIRECTORY; - case G_IO_ERROR_NOT_MOUNTED: - return NS_ERROR_NOT_CONNECTED; // shows error - case G_IO_ERROR_HOST_NOT_FOUND: - return NS_ERROR_UNKNOWN_HOST; // shows error - case G_IO_ERROR_CANCELLED: - return NS_ERROR_ABORT; - case G_IO_ERROR_NOT_EMPTY: - return NS_ERROR_FILE_DIR_NOT_EMPTY; - case G_IO_ERROR_FILENAME_TOO_LONG: - return NS_ERROR_FILE_NAME_TOO_LONG; - case G_IO_ERROR_INVALID_FILENAME: - return NS_ERROR_FILE_INVALID_PATH; - case G_IO_ERROR_TIMED_OUT: - return NS_ERROR_NET_TIMEOUT; // shows error - case G_IO_ERROR_WOULD_BLOCK: - return NS_BASE_STREAM_WOULD_BLOCK; - case G_IO_ERROR_FAILED_HANDLED: - return NS_ERROR_ABORT; // Cancel on login dialog - - /* unhandled: - G_IO_ERROR_NOT_REGULAR_FILE, - G_IO_ERROR_NOT_SYMBOLIC_LINK, - G_IO_ERROR_NOT_MOUNTABLE_FILE, - G_IO_ERROR_TOO_MANY_LINKS, - G_IO_ERROR_ALREADY_MOUNTED, - G_IO_ERROR_CANT_CREATE_BACKUP, - G_IO_ERROR_WRONG_ETAG, - G_IO_ERROR_WOULD_RECURSE, - G_IO_ERROR_BUSY, - G_IO_ERROR_WOULD_MERGE, - G_IO_ERROR_TOO_MANY_OPEN_FILES - */ - // Make GCC happy - default: - return NS_ERROR_FAILURE; - } -} - -static nsresult MapGIOResult(GError* result) { - if (!result) { - return NS_OK; - } - return MapGIOResult(result->code); -} - -/** Return values for mount operation. - * These enums are used as mount operation return values. - */ -enum class MountOperationResult { - MOUNT_OPERATION_IN_PROGRESS, /** \enum operation in progress */ - MOUNT_OPERATION_SUCCESS, /** \enum operation successful */ - MOUNT_OPERATION_FAILED /** \enum operation not successful */ -}; - -//----------------------------------------------------------------------------- -/** - * Sort function compares according to file type (directory/file) - * and alphabethical order - * @param a pointer to GFileInfo object to compare - * @param b pointer to GFileInfo object to compare - * @return -1 when first object should be before the second, 0 when equal, - * +1 when second object should be before the first - */ -static gint FileInfoComparator(gconstpointer a, gconstpointer b) { - GFileInfo* ia = (GFileInfo*)a; - GFileInfo* ib = (GFileInfo*)b; - if (g_file_info_get_file_type(ia) == G_FILE_TYPE_DIRECTORY && - g_file_info_get_file_type(ib) != G_FILE_TYPE_DIRECTORY) { - return -1; - } - if (g_file_info_get_file_type(ib) == G_FILE_TYPE_DIRECTORY && - g_file_info_get_file_type(ia) != G_FILE_TYPE_DIRECTORY) { - return 1; - } - - return nsCRT::strcasecmp(g_file_info_get_name(ia), g_file_info_get_name(ib)); -} - -/* Declaration of mount callback functions */ -static void mount_enclosing_volume_finished(GObject* source_object, - GAsyncResult* res, - gpointer user_data); -static void mount_operation_ask_password( - GMountOperation* mount_op, const char* message, const char* default_user, - const char* default_domain, GAskPasswordFlags flags, gpointer user_data); -//----------------------------------------------------------------------------- -class nsGIOInputStream final : public nsIInputStream { - public: - NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_NSIINPUTSTREAM - - explicit nsGIOInputStream(const nsCString& uriSpec) : mSpec(uriSpec) {} - - void SetChannel(nsIChannel* channel) { - // We need to hold an owning reference to our channel. This is done - // so we can access the channel's notification callbacks to acquire - // a reference to a nsIAuthPrompt if we need to handle an interactive - // mount operation. - // - // However, the channel can only be accessed on the main thread, so - // we have to be very careful with ownership. Moreover, it doesn't - // support threadsafe addref/release, so proxying is the answer. - // - // Also, it's important to note that this likely creates a reference - // cycle since the channel likely owns this stream. This reference - // cycle is broken in our Close method. - - mChannel = do_AddRef(channel).take(); - } - void SetMountResult(MountOperationResult result, gint error_code); - - private: - ~nsGIOInputStream() { Close(); } - nsresult DoOpen(); - nsresult DoRead(char* aBuf, uint32_t aCount, uint32_t* aCountRead); - nsresult SetContentTypeOfChannel(const char* contentType); - nsresult MountVolume(); - nsresult DoOpenDirectory(); - nsresult DoOpenFile(GFileInfo* info); - nsCString mSpec; - nsIChannel* mChannel{nullptr}; // manually refcounted - GFile* mHandle{nullptr}; - GFileInputStream* mStream{nullptr}; - uint64_t mBytesRemaining{UINT64_MAX}; - nsresult mStatus{NS_OK}; - GList* mDirList{nullptr}; - GList* mDirListPtr{nullptr}; - nsCString mDirBuf; - uint32_t mDirBufCursor{0}; - bool mDirOpen{false}; - MountOperationResult mMountRes = - MountOperationResult::MOUNT_OPERATION_SUCCESS; - mozilla::Monitor mMonitorMountInProgress MOZ_UNANNOTATED{ - "GIOInputStream::MountFinished"}; - gint mMountErrorCode{}; -}; - -/** - * Set result of mount operation and notify monitor waiting for results. - * This method is called in main thread as long as it is used only - * in mount_enclosing_volume_finished function. - * @param result Result of mount operation - */ -void nsGIOInputStream::SetMountResult(MountOperationResult result, - gint error_code) { - mozilla::MonitorAutoLock mon(mMonitorMountInProgress); - mMountRes = result; - mMountErrorCode = error_code; - mon.Notify(); -} - -/** - * Start mount operation and wait in loop until it is finished. This method is - * called from thread which is trying to read from location. - */ -nsresult nsGIOInputStream::MountVolume() { - GMountOperation* mount_op = g_mount_operation_new(); - g_signal_connect(mount_op, "ask-password", - G_CALLBACK(mount_operation_ask_password), mChannel); - mMountRes = MountOperationResult::MOUNT_OPERATION_IN_PROGRESS; - /* g_file_mount_enclosing_volume uses a dbus request to mount the volume. - Callback mount_enclosing_volume_finished is called in main thread - (not this thread on which this method is called). */ - g_file_mount_enclosing_volume(mHandle, G_MOUNT_MOUNT_NONE, mount_op, nullptr, - mount_enclosing_volume_finished, this); - mozilla::MonitorAutoLock mon(mMonitorMountInProgress); - /* Waiting for finish of mount operation thread */ - while (mMountRes == MountOperationResult::MOUNT_OPERATION_IN_PROGRESS) { - mon.Wait(); - } - - g_object_unref(mount_op); - - if (mMountRes == MountOperationResult::MOUNT_OPERATION_FAILED) { - return MapGIOResult(mMountErrorCode); - } - return NS_OK; -} - -/** - * Create list of infos about objects in opened directory - * Return: NS_OK when list obtained, otherwise error code according - * to failed operation. - */ -nsresult nsGIOInputStream::DoOpenDirectory() { - GError* error = nullptr; - - GFileEnumerator* f_enum = g_file_enumerate_children( - mHandle, "standard::*,time::*", G_FILE_QUERY_INFO_NONE, nullptr, &error); - if (!f_enum) { - nsresult rv = MapGIOResult(error); - g_warning("Cannot read from directory: %s", error->message); - g_error_free(error); - return rv; - } - // fill list of file infos - GFileInfo* info = g_file_enumerator_next_file(f_enum, nullptr, &error); - while (info) { - mDirList = g_list_append(mDirList, info); - info = g_file_enumerator_next_file(f_enum, nullptr, &error); - } - g_object_unref(f_enum); - if (error) { - g_warning("Error reading directory content: %s", error->message); - nsresult rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - mDirOpen = true; - - // Sort list of file infos by using FileInfoComparator function - mDirList = g_list_sort(mDirList, FileInfoComparator); - mDirListPtr = mDirList; - - // Write column names - mDirBuf.AppendLiteral( - "200: filename content-length last-modified file-type\n"); - - SetContentTypeOfChannel(APPLICATION_HTTP_INDEX_FORMAT); - return NS_OK; -} - -/** - * Create file stream and set mime type for channel - * @param info file info used to determine mime type - * @return NS_OK when file stream created successfuly, error code otherwise - */ -nsresult nsGIOInputStream::DoOpenFile(GFileInfo* info) { - GError* error = nullptr; - - mStream = g_file_read(mHandle, nullptr, &error); - if (!mStream) { - nsresult rv = MapGIOResult(error); - g_warning("Cannot read from file: %s", error->message); - g_error_free(error); - return rv; - } - - const char* content_type = g_file_info_get_content_type(info); - if (content_type) { - char* mime_type = g_content_type_get_mime_type(content_type); - if (mime_type) { - if (strcmp(mime_type, APPLICATION_OCTET_STREAM) != 0) { - SetContentTypeOfChannel(mime_type); - } - g_free(mime_type); - } - } else { - g_warning("Missing content type."); - } - - mBytesRemaining = g_file_info_get_size(info); - // Update the content length attribute on the channel. We do this - // synchronously without proxying. This hack is not as bad as it looks! - mChannel->SetContentLength(mBytesRemaining); - - return NS_OK; -} - -/** - * Start file open operation, mount volume when needed and according to file - * type create file output stream or read directory content. - * @return NS_OK when file or directory opened successfully, error code - * otherwise - */ -nsresult nsGIOInputStream::DoOpen() { - nsresult rv; - GError* error = nullptr; - - NS_ASSERTION(mHandle == nullptr, "already open"); - - mHandle = g_file_new_for_uri(mSpec.get()); - - GFileInfo* info = g_file_query_info(mHandle, "standard::*", - G_FILE_QUERY_INFO_NONE, nullptr, &error); - - if (error) { - if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_MOUNTED) { - // location is not yet mounted, try to mount - g_error_free(error); - if (NS_IsMainThread()) { - return NS_ERROR_NOT_CONNECTED; - } - error = nullptr; - rv = MountVolume(); - if (rv != NS_OK) { - return rv; - } - // get info again - info = g_file_query_info(mHandle, "standard::*", G_FILE_QUERY_INFO_NONE, - nullptr, &error); - // second try to get file info from remote files after media mount - if (!info) { - g_warning("Unable to get file info: %s", error->message); - rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - } else { - g_warning("Unable to get file info: %s", error->message); - rv = MapGIOResult(error); - g_error_free(error); - return rv; - } - } - // Get file type to handle directories and file differently - GFileType f_type = g_file_info_get_file_type(info); - if (f_type == G_FILE_TYPE_DIRECTORY) { - // directory - rv = DoOpenDirectory(); - } else if (f_type != G_FILE_TYPE_UNKNOWN) { - // file - rv = DoOpenFile(info); - } else { - g_warning("Unable to get file type."); - rv = NS_ERROR_FILE_NOT_FOUND; - } - if (info) { - g_object_unref(info); - } - return rv; -} - -/** - * Read content of file or create file list from directory - * @param aBuf read destination buffer - * @param aCount length of destination buffer - * @param aCountRead number of read characters - * @return NS_OK when read successfully, NS_BASE_STREAM_CLOSED when end of file, - * error code otherwise - */ -nsresult nsGIOInputStream::DoRead(char* aBuf, uint32_t aCount, - uint32_t* aCountRead) { - nsresult rv = NS_ERROR_NOT_AVAILABLE; - if (mStream) { - // file read - GError* error = nullptr; - uint32_t bytes_read = g_input_stream_read(G_INPUT_STREAM(mStream), aBuf, - aCount, nullptr, &error); - if (error) { - rv = MapGIOResult(error); - *aCountRead = 0; - g_warning("Cannot read from file: %s", error->message); - g_error_free(error); - return rv; - } - *aCountRead = bytes_read; - mBytesRemaining -= *aCountRead; - return NS_OK; - } - if (mDirOpen) { - // directory read - while (aCount && rv != NS_BASE_STREAM_CLOSED) { - // Copy data out of our buffer - uint32_t bufLen = mDirBuf.Length() - mDirBufCursor; - if (bufLen) { - uint32_t n = std::min(bufLen, aCount); - memcpy(aBuf, mDirBuf.get() + mDirBufCursor, n); - *aCountRead += n; - aBuf += n; - aCount -= n; - mDirBufCursor += n; - } - - if (!mDirListPtr) // Are we at the end of the directory list? - { - rv = NS_BASE_STREAM_CLOSED; - } else if (aCount) // Do we need more data? - { - GFileInfo* info = (GFileInfo*)mDirListPtr->data; - - // Prune '.' and '..' from directory listing. - const char* fname = g_file_info_get_name(info); - if (fname && fname[0] == '.' && - (fname[1] == '\0' || (fname[1] == '.' && fname[2] == '\0'))) { - mDirListPtr = mDirListPtr->next; - continue; - } - - mDirBuf.AssignLiteral("201: "); - - // The "filename" field - nsCString escName; - nsCOMPtr nu = do_GetService(NS_NETUTIL_CONTRACTID); - if (nu && fname) { - nu->EscapeString(nsDependentCString(fname), - nsINetUtil::ESCAPE_URL_PATH, escName); - - mDirBuf.Append(escName); - mDirBuf.Append(' '); - } - - // The "content-length" field - // XXX truncates size from 64-bit to 32-bit - mDirBuf.AppendInt(int32_t(g_file_info_get_size(info))); - mDirBuf.Append(' '); - - // The "last-modified" field - // - // NSPR promises: PRTime is compatible with time_t - // we just need to convert from seconds to microseconds - GTimeVal gtime; - g_file_info_get_modification_time(info, >ime); - - PRExplodedTime tm; - PRTime pt = ((PRTime)gtime.tv_sec) * 1000000; - PR_ExplodeTime(pt, PR_GMTParameters, &tm); - { - char buf[64]; - PR_FormatTimeUSEnglish(buf, sizeof(buf), - "%a,%%20%d%%20%b%%20%Y%%20%H:%M:%S%%20GMT ", - &tm); - mDirBuf.Append(buf); - } - - // The "file-type" field - switch (g_file_info_get_file_type(info)) { - case G_FILE_TYPE_REGULAR: - mDirBuf.AppendLiteral("FILE "); - break; - case G_FILE_TYPE_DIRECTORY: - mDirBuf.AppendLiteral("DIRECTORY "); - break; - case G_FILE_TYPE_SYMBOLIC_LINK: - mDirBuf.AppendLiteral("SYMBOLIC-LINK "); - break; - default: - break; - } - mDirBuf.Append('\n'); - - mDirBufCursor = 0; - mDirListPtr = mDirListPtr->next; - } - } - } - return rv; -} - -/** - * This class is used to implement SetContentTypeOfChannel. - */ -class nsGIOSetContentTypeEvent : public mozilla::Runnable { - public: - nsGIOSetContentTypeEvent(nsIChannel* channel, const char* contentType) - : mozilla::Runnable("nsGIOSetContentTypeEvent"), - mChannel(channel), - mContentType(contentType) { - // stash channel reference in mChannel. no AddRef here! see note - // in SetContentTypeOfchannel. - } - - NS_IMETHOD Run() override { - mChannel->SetContentType(mContentType); - return NS_OK; - } - - private: - nsIChannel* mChannel; - nsCString mContentType; -}; - -nsresult nsGIOInputStream::SetContentTypeOfChannel(const char* contentType) { - // We need to proxy this call over to the main thread. We post an - // asynchronous event in this case so that we don't delay reading data, and - // we know that this is safe to do since the channel's reference will be - // released asynchronously as well. We trust the ordering of the main - // thread's event queue to protect us against memory corruption. - - nsresult rv; - nsCOMPtr ev = - new nsGIOSetContentTypeEvent(mChannel, contentType); - if (!ev) { - rv = NS_ERROR_OUT_OF_MEMORY; - } else { - rv = NS_DispatchToMainThread(ev); - } - return rv; -} - -NS_IMPL_ISUPPORTS(nsGIOInputStream, nsIInputStream) - -/** - * Free all used memory and close stream. - */ -NS_IMETHODIMP -nsGIOInputStream::Close() { - if (mStream) { - g_object_unref(mStream); - mStream = nullptr; - } - - if (mHandle) { - g_object_unref(mHandle); - mHandle = nullptr; - } - - if (mDirList) { - // Destroy the list of GIOFileInfo objects... - g_list_foreach(mDirList, (GFunc)g_object_unref, nullptr); - g_list_free(mDirList); - mDirList = nullptr; - mDirListPtr = nullptr; - } - - if (mChannel) { - NS_ReleaseOnMainThread("nsGIOInputStream::mChannel", dont_AddRef(mChannel)); - - mChannel = nullptr; - } - - mSpec.Truncate(); // free memory - - // Prevent future reads from re-opening the handle. - if (NS_SUCCEEDED(mStatus)) { - mStatus = NS_BASE_STREAM_CLOSED; - } - - return NS_OK; -} - -/** - * Return number of remaining bytes available on input - * @param aResult remaining bytes - */ -NS_IMETHODIMP -nsGIOInputStream::Available(uint64_t* aResult) { - if (NS_FAILED(mStatus)) { - return mStatus; - } - - *aResult = mBytesRemaining; - - return NS_OK; -} - -/** - * Return the status of the input stream - */ -NS_IMETHODIMP -nsGIOInputStream::StreamStatus() { return mStatus; } - -/** - * Trying to read from stream. When location is not available it tries to mount - * it. - * @param aBuf buffer to put read data - * @param aCount length of aBuf - * @param aCountRead number of bytes actually read - */ -NS_IMETHODIMP -nsGIOInputStream::Read(char* aBuf, uint32_t aCount, uint32_t* aCountRead) { - *aCountRead = 0; - // Check if file is already opened, otherwise open it - if (!mStream && !mDirOpen && mStatus == NS_OK) { - mStatus = DoOpen(); - if (NS_FAILED(mStatus)) { - return mStatus; - } - } - - mStatus = DoRead(aBuf, aCount, aCountRead); - // Check if all data has been read - if (mStatus == NS_BASE_STREAM_CLOSED) { - return NS_OK; - } - - // Check whenever any error appears while reading - return mStatus; -} - -NS_IMETHODIMP -nsGIOInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, - uint32_t aCount, uint32_t* aResult) { - // There is no way to implement this using GnomeVFS, but fortunately - // that doesn't matter. Because we are a blocking input stream, Necko - // isn't going to call our ReadSegments method. - MOZ_ASSERT_UNREACHABLE("nsGIOInputStream::ReadSegments"); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsGIOInputStream::IsNonBlocking(bool* aResult) { - *aResult = false; - return NS_OK; -} - -//----------------------------------------------------------------------------- - -/** - * Called when finishing mount operation. Result of operation is set in - * nsGIOInputStream. This function is called in main thread as an async request - * typically from dbus. - * @param source_object GFile object which requested the mount - * @param res result object - * @param user_data pointer to nsGIOInputStream - */ -static void mount_enclosing_volume_finished(GObject* source_object, - GAsyncResult* res, - gpointer user_data) { - GError* error = nullptr; - - nsGIOInputStream* istream = static_cast(user_data); - - g_file_mount_enclosing_volume_finish(G_FILE(source_object), res, &error); - - if (error) { - g_warning("Mount failed: %s %d", error->message, error->code); - istream->SetMountResult(MountOperationResult::MOUNT_OPERATION_FAILED, - error->code); - g_error_free(error); - } else { - istream->SetMountResult(MountOperationResult::MOUNT_OPERATION_SUCCESS, 0); - } -} - -/** - * This function is called when username or password are requested from user. - * This function is called in main thread as async request from dbus. - * @param mount_op mount operation - * @param message message to show to user - * @param default_user preffered user - * @param default_domain domain name - * @param flags what type of information is required - * @param user_data nsIChannel - */ -static void mount_operation_ask_password( - GMountOperation* mount_op, const char* message, const char* default_user, - const char* default_domain, GAskPasswordFlags flags, gpointer user_data) { - nsIChannel* channel = (nsIChannel*)user_data; - if (!channel) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // We can't handle request for domain - if (flags & G_ASK_PASSWORD_NEED_DOMAIN) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - - nsCOMPtr prompt; - NS_QueryNotificationCallbacks(channel, prompt); - - // If no auth prompt, then give up. We could failover to using the - // WindowWatcher service, but that might defeat a consumer's purposeful - // attempt to disable authentication (for whatever reason). - if (!prompt) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Parse out the host and port... - nsCOMPtr uri; - channel->GetURI(getter_AddRefs(uri)); - if (!uri) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - - nsAutoCString scheme, hostPort; - uri->GetScheme(scheme); - uri->GetHostPort(hostPort); - - // It doesn't make sense for either of these strings to be empty. What kind - // of funky URI is this? - if (scheme.IsEmpty() || hostPort.IsEmpty()) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Construct the single signon key. Altering the value of this key will - // cause people's remembered passwords to be forgotten. Think carefully - // before changing the way this key is constructed. - nsAutoString key, realm; - - NS_ConvertUTF8toUTF16 dispHost(scheme); - dispHost.AppendLiteral("://"); - dispHost.Append(NS_ConvertUTF8toUTF16(hostPort)); - - key = dispHost; - if (*default_domain != '\0') { - // We assume the realm string is ASCII. That might be a bogus assumption, - // but we have no idea what encoding GnomeVFS is using, so for now we'll - // limit ourselves to ISO-Latin-1. XXX What is a better solution? - realm.Append('"'); - realm.Append(NS_ConvertASCIItoUTF16(default_domain)); - realm.Append('"'); - key.Append(' '); - key.Append(realm); - } - // Construct the message string... - // - // We use Necko's string bundle here. This code really should be encapsulated - // behind some Necko API, after all this code is based closely on the code in - // nsHttpChannel.cpp. - nsCOMPtr bundleSvc = - do_GetService(NS_STRINGBUNDLE_CONTRACTID); - if (!bundleSvc) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - nsCOMPtr bundle; - bundleSvc->CreateBundle("chrome://global/locale/commonDialogs.properties", - getter_AddRefs(bundle)); - if (!bundle) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - nsAutoString nsmessage; - - if (flags & G_ASK_PASSWORD_NEED_PASSWORD) { - if (flags & G_ASK_PASSWORD_NEED_USERNAME) { - if (!realm.IsEmpty()) { - AutoTArray strings = {realm, dispHost}; - bundle->FormatStringFromName("EnterLoginForRealm3", strings, nsmessage); - } else { - AutoTArray strings = {dispHost}; - bundle->FormatStringFromName("EnterUserPasswordFor2", strings, - nsmessage); - } - } else { - NS_ConvertUTF8toUTF16 userName(default_user); - AutoTArray strings = {userName, dispHost}; - bundle->FormatStringFromName("EnterPasswordFor", strings, nsmessage); - } - } else { - g_warning("Unknown mount operation request (flags: %x)", flags); - } - - if (nsmessage.IsEmpty()) { - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - return; - } - // Prompt the user... - nsresult rv; - bool retval = false; - char16_t *user = nullptr, *pass = nullptr; - if (default_user) { - // user will be freed by PromptUsernameAndPassword - user = ToNewUnicode(NS_ConvertUTF8toUTF16(default_user)); - } - if (flags & G_ASK_PASSWORD_NEED_USERNAME) { - rv = prompt->PromptUsernameAndPassword( - nullptr, nsmessage.get(), key.get(), - nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, &user, &pass, &retval); - } else { - rv = prompt->PromptPassword(nullptr, nsmessage.get(), key.get(), - nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, &pass, - &retval); - } - if (NS_FAILED(rv) || !retval) { // was || user == '\0' || pass == '\0' - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); - free(user); - free(pass); - return; - } - /* GIO should accept UTF8 */ - g_mount_operation_set_username(mount_op, NS_ConvertUTF16toUTF8(user).get()); - g_mount_operation_set_password(mount_op, NS_ConvertUTF16toUTF8(pass).get()); - free(user); - free(pass); - g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_HANDLED); -} - -//----------------------------------------------------------------------------- - -mozilla::StaticRefPtr nsGIOProtocolHandler::sSingleton; - -already_AddRefed nsGIOProtocolHandler::GetSingleton() { - if (!sSingleton) { - sSingleton = new nsGIOProtocolHandler(); - sSingleton->Init(); - ClearOnShutdown(&sSingleton); - } - return do_AddRef(sSingleton); -} - -NS_IMPL_ISUPPORTS(nsGIOProtocolHandler, nsIProtocolHandler, nsIObserver) - -nsresult nsGIOProtocolHandler::Init() { - if (net::IsNeckoChild()) { - net::NeckoChild::InitNeckoChild(); - } - nsCOMPtr prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); - if (prefs) { - InitSupportedProtocolsPref(prefs); - prefs->AddObserver(MOZ_GIO_SUPPORTED_PROTOCOLS, this, false); - } - - return NS_OK; -} - -void nsGIOProtocolHandler::InitSupportedProtocolsPref(nsIPrefBranch* prefs) { - nsCOMPtr ioService = components::IO::Service(); - if (NS_WARN_IF(!ioService)) { - LOG(("gio: ioservice not available\n")); - return; - } - - // Get user preferences to determine which protocol is supported. - // Gvfs/GIO has a set of supported protocols like obex, network, archive, - // computer, dav, cdda, gphoto2, trash, etc. Some of these seems to be - // irrelevant to process by browser. By default accept only sftp protocol so - // far. - nsAutoCString prefValue; - nsresult rv = prefs->GetCharPref(MOZ_GIO_SUPPORTED_PROTOCOLS, prefValue); - if (NS_SUCCEEDED(rv)) { - prefValue.StripWhitespace(); - ToLowerCase(prefValue); - } else { - prefValue.AssignLiteral("" // use none by default - ); - } - LOG(("gio: supported protocols \"%s\"\n", prefValue.get())); - - // Unregister any previously registered dynamic protocols. - for (const nsCString& scheme : mSupportedProtocols) { - LOG(("gio: unregistering handler for \"%s\"", scheme.get())); - ioService->UnregisterProtocolHandler(scheme); - } - mSupportedProtocols.Clear(); - - // Register each protocol from the pref branch to reference - // nsGIOProtocolHandler. - for (const nsDependentCSubstring& protocol : prefValue.Split(',')) { - if (NS_WARN_IF(!StringEndsWith(protocol, ":"_ns))) { - continue; // each protocol must end with a `:` character to be recognized - } - - nsCString scheme(Substring(protocol, 0, protocol.Length() - 1)); - if (NS_SUCCEEDED(ioService->RegisterProtocolHandler( - scheme, this, - nsIProtocolHandler::URI_STD | - nsIProtocolHandler::URI_DANGEROUS_TO_LOAD, - /* aDefaultPort */ -1))) { - LOG(("gio: successfully registered handler for \"%s\"", scheme.get())); - mSupportedProtocols.AppendElement(scheme); - } else { - LOG(("gio: failed to register handler for \"%s\"", scheme.get())); - } - } -} - -bool nsGIOProtocolHandler::IsSupportedProtocol(const nsCString& aScheme) { - for (const auto& protocol : mSupportedProtocols) { - if (aScheme.EqualsIgnoreCase(protocol)) { - return true; - } - } - return false; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::GetScheme(nsACString& aScheme) { - aScheme.AssignLiteral(MOZ_GIO_SCHEME); - return NS_OK; -} - -static bool IsValidGIOScheme(const nsACString& aScheme) { - // Verify that GIO supports this URI scheme. - GVfs* gvfs = g_vfs_get_default(); - - if (!gvfs) { - g_warning("Cannot get GVfs object."); - return false; - } - - const gchar* const* uri_schemes = g_vfs_get_supported_uri_schemes(gvfs); - - while (*uri_schemes != nullptr) { - // While flatSpec ends with ':' the uri_scheme does not. Therefore do not - // compare last character. - if (aScheme.Equals(*uri_schemes)) { - return true; - } - uri_schemes++; - } - - return false; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::NewChannel(nsIURI* aURI, nsILoadInfo* aLoadInfo, - nsIChannel** aResult) { - NS_ENSURE_ARG_POINTER(aURI); - nsresult rv; - - nsAutoCString spec; - rv = aURI->GetSpec(spec); - if (NS_FAILED(rv)) { - return rv; - } - - nsAutoCString scheme; - rv = aURI->GetScheme(scheme); - if (NS_FAILED(rv)) { - return rv; - } - - if (!IsSupportedProtocol(scheme)) { - return NS_ERROR_UNKNOWN_PROTOCOL; - } - - // g_vfs_get_supported_uri_schemes() returns a very limited list in the - // child due to the sandbox, so we only check if its valid for the parent. - if (XRE_IsParentProcess() && !IsValidGIOScheme(scheme)) { - return NS_ERROR_UNKNOWN_PROTOCOL; - } - - RefPtr channel; - if (net::IsNeckoChild()) { - channel = new mozilla::net::GIOChannelChild(aURI); - // set the loadInfo on the new channel - channel->SetLoadInfo(aLoadInfo); - - rv = channel->SetContentType(nsLiteralCString(UNKNOWN_CONTENT_TYPE)); - NS_ENSURE_SUCCESS(rv, rv); - - channel.forget(aResult); - return NS_OK; - } - - RefPtr stream = new nsGIOInputStream(spec); - if (!stream) { - return NS_ERROR_OUT_OF_MEMORY; - } - - RefPtr tmpStream = stream; - rv = NS_NewInputStreamChannelInternal(aResult, aURI, tmpStream.forget(), - nsLiteralCString(UNKNOWN_CONTENT_TYPE), - ""_ns, // aContentCharset - aLoadInfo); - if (NS_SUCCEEDED(rv)) { - stream->SetChannel(*aResult); - } - - return rv; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::AllowPort(int32_t aPort, const char* aScheme, - bool* aResult) { - // Don't override anything. - *aResult = false; - return NS_OK; -} - -NS_IMETHODIMP -nsGIOProtocolHandler::Observe(nsISupports* aSubject, const char* aTopic, - const char16_t* aData) { - if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) { - nsCOMPtr prefs = do_QueryInterface(aSubject); - InitSupportedProtocolsPref(prefs); - } - return NS_OK; -} diff -Nru thunderbird-140.9.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h thunderbird-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h --- thunderbird-140.9.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/gio/nsGIOProtocolHandler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* 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 nsGIOProtocolHandler_h___ -#define nsGIOProtocolHandler_h___ - -#include "nsIProtocolHandler.h" -#include "nsIObserver.h" -#include "nsIPrefBranch.h" -#include "nsStringFwd.h" - -#include "mozilla/Logging.h" -extern mozilla::LazyLogModule gGIOLog; - -class nsGIOProtocolHandler final : public nsIProtocolHandler, - public nsIObserver { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIPROTOCOLHANDLER - NS_DECL_NSIOBSERVER - - static already_AddRefed GetSingleton(); - bool IsSupportedProtocol(const nsCString& aScheme); - - protected: - ~nsGIOProtocolHandler() = default; - - private: - nsresult Init(); - - void InitSupportedProtocolsPref(nsIPrefBranch* prefs); - - static mozilla::StaticRefPtr sSingleton; - nsTArray mSupportedProtocols; -}; - -#endif // nsGIOProtocolHandler_h___ diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -34,7 +34,7 @@ } // static -already_AddRefed +already_AddRefed BackgroundChannelRegistrar::GetOrCreate() { if (!gSingleton) { gSingleton = new BackgroundChannelRegistrar(); @@ -57,8 +57,22 @@ void BackgroundChannelRegistrar::DeleteChannel(uint64_t aKey) { MOZ_ASSERT(NS_IsMainThread()); - mChannels.Remove(aKey); - mBgChannels.Remove(aKey); + RefPtr channel; + mChannels.Remove(aKey, getter_AddRefs(channel)); + RefPtr bgChannel; + mBgChannels.Remove(aKey, getter_AddRefs(bgChannel)); +} + +void BackgroundChannelRegistrar::DeleteChannelIfMatches( + uint64_t aKey, HttpChannelParent* aExpected) { + MOZ_ASSERT(NS_IsMainThread()); + + RefPtr channel; + if (mChannels.GetWeak(aKey) == aExpected) { + mChannels.Remove(aKey, getter_AddRefs(channel)); + } + RefPtr bgChannel; + mBgChannels.Remove(aKey, getter_AddRefs(bgChannel)); } void BackgroundChannelRegistrar::LinkHttpChannel(uint64_t aKey, diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h --- thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundChannelRegistrar.h 2026-04-21 14:52:59.000000000 +0000 @@ -29,12 +29,19 @@ explicit BackgroundChannelRegistrar(); - // Singleton accessor - static already_AddRefed GetOrCreate(); + // Singleton accessors + static already_AddRefed GetOrCreate(); private: virtual ~BackgroundChannelRegistrar(); + // Like DeleteChannel, but only removes the mChannels entry if it matches + // aExpected. Use this in preference to DeleteChannel when the caller knows + // which HttpChannelParent it registered, to avoid accidentally removing an + // entry belonging to a different object that shares the same channel Id. + void DeleteChannelIfMatches(uint64_t aKey, HttpChannelParent* aExpected); + friend class HttpChannelParent; + // A helper function for BackgroundChannelRegistrar itself to callback // HttpChannelParent and HttpBackgroundChannelParent when both objects are // ready. aChannelParent and aBgParent is the pair of HttpChannelParent and diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -10,16 +10,22 @@ namespace net { BackgroundDataBridgeParent::BackgroundDataBridgeParent(uint64_t aChannelID) - : mChannelID(aChannelID), mBackgroundThread(GetCurrentSerialEventTarget()) { + : mChannelID(aChannelID), mBackgroundThread(GetCurrentSerialEventTarget()) {} + +void BackgroundDataBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) { - child->AddDataBridgeToMap(aChannelID, this); + child->RemoveDataBridgeFromMap(mChannelID); } } -void BackgroundDataBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { +already_AddRefed +BackgroundDataBridgeParent::Create(uint64_t aChannelID) { + RefPtr actor = + new BackgroundDataBridgeParent(aChannelID); if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) { - child->RemoveDataBridgeFromMap(mChannelID); + child->AddDataBridgeToMap(aChannelID, actor); } + return actor.forget(); } already_AddRefed diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h --- thunderbird-140.9.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/BackgroundDataBridgeParent.h 2026-04-21 14:52:59.000000000 +0000 @@ -14,7 +14,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BackgroundDataBridgeParent, override) - explicit BackgroundDataBridgeParent(uint64_t aChannelID); + static already_AddRefed Create(uint64_t aChannelID); void ActorDestroy(ActorDestroyReason aWhy) override; already_AddRefed GetBackgroundThread(); void Destroy(); @@ -24,6 +24,7 @@ const TimeStamp& aOnStopRequestStart); private: + explicit BackgroundDataBridgeParent(uint64_t aChannelID); virtual ~BackgroundDataBridgeParent() = default; uint64_t mChannelID; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/HttpChannelParent.cpp thunderbird-140.10.0esr/netwerk/protocol/http/HttpChannelParent.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/HttpChannelParent.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/HttpChannelParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -271,12 +271,15 @@ } // This HttpChannelParent might still have a reference from - // BackgroundChannelRegistrar. - nsCOMPtr registrar = + // BackgroundChannelRegistrar. Only remove our own entry; another + // HttpChannelParent may have been registered under the same channel Id + // (e.g. after a redirect), and we must not remove that entry. + RefPtr registrar = BackgroundChannelRegistrar::GetOrCreate(); MOZ_ASSERT(registrar); - - registrar->DeleteChannel(mChannel->ChannelId()); + if (registrar) { + registrar->DeleteChannelIfMatches(mChannel->ChannelId(), this); + } // If mAsyncOpenBarrier is greater than zero, it means AsyncOpen procedure // is still on going. we need to abort AsyncOpen with failure to destroy @@ -980,6 +983,11 @@ MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aCallback); + if (mIPCClosed) { + aCallback->ReadyToVerify(NS_ERROR_FAILURE); + return NS_OK; + } + // Continue the verification procedure if background channel is ready. if (mBgParent) { aCallback->ReadyToVerify(NS_OK); diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/HttpTransactionParent.cpp thunderbird-140.10.0esr/netwerk/protocol/http/HttpTransactionParent.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/HttpTransactionParent.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/HttpTransactionParent.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -18,6 +18,7 @@ #include "nsIThreadRetargetableStreamListener.h" #include "nsITransportSecurityInfo.h" #include "nsNetUtil.h" +#include "nsProxyRelease.h" #include "nsQueryObject.h" #include "nsSerializationHelper.h" #include "nsStreamUtils.h" @@ -36,11 +37,31 @@ NS_IMETHODIMP_(MozExternalRefCountType) HttpTransactionParent::Release(void) { MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); + + if (!NS_IsMainThread()) { + // Use DecrementWithLimit to atomically decrement only while count > 2. + // This ensures a background thread never drops the count to 1 or 0, + // avoiding the race where the main thread frees the object (via + // ActorDisconnected) between our decrement and the count==1 handling. + auto [success, count] = mRefCnt.DecrementWithLimit<2>(); + if (success) { + NS_LOG_RELEASE(this, count, "HttpTransactionParent"); + return count; + } + // mRefCnt <= 2: the next decrement could trigger Send__delete__ or + // deletion, both of which must happen on the main thread. Transfer + // our reference there without decrementing. + NS_ProxyRelease("HttpTransactionParent::Release", + GetMainThreadSerialEventTarget(), + dont_AddRef(static_cast(this))); + return 1; + } + nsrefcnt count = --mRefCnt; NS_LOG_RELEASE(this, count, "HttpTransactionParent"); if (count == 0) { mRefCnt = 1; /* stabilize */ - delete (this); + delete this; return 0; } @@ -48,17 +69,7 @@ // we are done with this transaction. We should send a delete message // to delete the transaction child in socket process. if (count == 1 && CanSend()) { - if (!NS_IsMainThread()) { - RefPtr self = this; - MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread( - NS_NewRunnableFunction("HttpTransactionParent::Release", [self]() { - mozilla::Unused << self->Send__delete__(self); - // Make sure we can not send IPC after Send__delete__(). - MOZ_ASSERT(!self->CanSend()); - }))); - } else { - mozilla::Unused << Send__delete__(this); - } + mozilla::Unused << Send__delete__(this); return 1; } return count; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp thunderbird-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -525,6 +525,9 @@ ObliviousHttpChannel::AsyncOpen(nsIStreamListener* aListener) { LOG(("ObliviousHttpChannel::AsyncOpen [this=%p, listener=%p]", this, aListener)); + if (mStreamListener) { + return NS_ERROR_ALREADY_OPENED; + } mStreamListener = aListener; nsresult rv = mInnerChannel->SetRequestMethod("POST"_ns); if (NS_FAILED(rv)) { @@ -728,7 +731,8 @@ getter_AddRefs(mBinaryHttpResponse)); } -void ObliviousHttpChannel::EmitOnDataAvailable() { +void ObliviousHttpChannel::EmitOnDataAvailable( + nsIStreamListener* aStreamListener) { if (!mBinaryHttpResponse) { return; } @@ -749,7 +753,7 @@ if (NS_FAILED(rv)) { return; } - rv = mStreamListener->OnDataAvailable(this, contentStream, 0, contentLength); + rv = aStreamListener->OnDataAvailable(this, contentStream, 0, contentLength); Unused << rv; } @@ -759,8 +763,7 @@ LOG(("ObliviousHttpChannel::OnStopRequest [this=%p, request=%p, status=%u]", this, aRequest, (uint32_t)aStatusCode)); - auto releaseStreamListener = MakeScopeExit( - [self = RefPtr{this}]() mutable { self->mStreamListener = nullptr; }); + nsCOMPtr listener = std::move(mStreamListener); if (NS_SUCCEEDED(aStatusCode)) { bool requestSucceeded; @@ -769,11 +772,11 @@ aStatusCode = ProcessOnStopRequest(); } } - Unused << mStreamListener->OnStartRequest(this); + Unused << listener->OnStartRequest(this); if (NS_SUCCEEDED(aStatusCode)) { - EmitOnDataAvailable(); + EmitOnDataAvailable(listener); } - Unused << mStreamListener->OnStopRequest(this, aStatusCode); + Unused << listener->OnStopRequest(this, aStatusCode); return NS_OK; } diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/ObliviousHttpChannel.h thunderbird-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.h --- thunderbird-140.9.0esr/netwerk/protocol/http/ObliviousHttpChannel.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/ObliviousHttpChannel.h 2026-04-21 14:52:59.000000000 +0000 @@ -47,7 +47,7 @@ ~ObliviousHttpChannel(); nsresult ProcessOnStopRequest(); - void EmitOnDataAvailable(); + void EmitOnDataAvailable(nsIStreamListener*); nsCOMPtr mTargetURI; nsTArray mEncodedConfig; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp thunderbird-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -53,12 +53,18 @@ NS_IMETHODIMP ReplacedHttpResponse::SetResponseHeader(const nsACString& header, const nsACString& value, bool merge) { + if (mInVisitHeaders) { + return NS_ERROR_FAILURE; + } return mResponseHeaders.SetHeader(header, value, merge, nsHttpHeaderArray::eVarietyResponse); } NS_IMETHODIMP ReplacedHttpResponse::VisitResponseHeaders(nsIHttpHeaderVisitor* visitor) { - return mResponseHeaders.VisitHeaders(visitor); + mInVisitHeaders = true; + nsresult rv = mResponseHeaders.VisitHeaders(visitor); + mInVisitHeaders = false; + return rv; } } // namespace mozilla::net diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/ReplacedHttpResponse.h thunderbird-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.h --- thunderbird-140.9.0esr/netwerk/protocol/http/ReplacedHttpResponse.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/ReplacedHttpResponse.h 2026-04-21 14:52:59.000000000 +0000 @@ -7,6 +7,7 @@ #include "nsString.h" #include "nsHttpHeaderArray.h" #include "nsIReplacedHttpResponse.h" +#include "mozilla/Atomics.h" namespace mozilla::net { @@ -24,6 +25,7 @@ nsCString mResponseStatusText; nsCString mResponseBody; nsHttpHeaderArray mResponseHeaders; + Atomic mInVisitHeaders{false}; }; } // namespace mozilla::net diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/TLSTransportLayer.cpp thunderbird-140.10.0esr/netwerk/protocol/http/TLSTransportLayer.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/TLSTransportLayer.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/TLSTransportLayer.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -508,8 +508,16 @@ NS_IMETHODIMP TLSTransportLayer::Close(nsresult aReason) { - LOG(("TLSTransportLayer::Close [this=%p reason=%" PRIx32 "]\n", this, - static_cast(aReason))); + bool onSocketThread = OnSocketThread(); + LOG(("TLSTransportLayer::Close [this=%p reason=%" PRIx32 "] sts=%d", this, + static_cast(aReason), onSocketThread)); + + if (!onSocketThread) { + gSocketTransportService->Dispatch(NS_NewRunnableFunction( + "TLSTransportLayer::Close", + [self = RefPtr{this}, aReason] { self->Close(aReason); })); + return NS_OK; + } mInputCallback = nullptr; mOutputCallback = nullptr; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpActivityDistributor.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -33,6 +33,7 @@ uint64_t aExtraSizeData, const nsACString& aExtraStringData) { MOZ_ASSERT(XRE_IsParentProcess() && NS_IsMainThread()); + RefPtr self(this); for (size_t i = 0; i < mObservers.Length(); i++) { Unused << mObservers[i]->ObserveActivity(aHttpChannel, aActivityType, @@ -48,6 +49,7 @@ bool aIsHttp3, uint32_t aActivityType, uint32_t aActivitySubtype, PRTime aTimestamp, const nsACString& aExtraStringData) { MOZ_ASSERT(XRE_IsParentProcess() && NS_IsMainThread()); + RefPtr self(this); for (size_t i = 0; i < mObservers.Length(); i++) { Unused << mObservers[i]->ObserveConnectionActivity( diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpChannel.cpp thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpChannel.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpChannel.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpChannel.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -354,6 +354,7 @@ } nsHttpChannel::~nsHttpChannel() { + MOZ_ASSERT(NS_IsMainThread(), "Must be released on main thread"); PROFILER_MARKER("~nsHttpChannel", NETWORK, {}, TerminatingFlowMarker, Flow::FromPointer(this)); LOG(("Destroying nsHttpChannel [this=%p, nsIChannel=%p]\n", this, @@ -373,42 +374,11 @@ MOZ_ASSERT(NS_SUCCEEDED(rv)); } - ReleaseMainThreadOnlyReferences(); if (gHttpHandler) { gHttpHandler->RemoveHttpChannel(mChannelId); } } -void nsHttpChannel::ReleaseMainThreadOnlyReferences() { - if (NS_IsMainThread()) { - // Already on main thread, let dtor to - // take care of releasing references - return; - } - - nsTArray> arrayToRelease; - arrayToRelease.AppendElement(mAuthProvider.forget()); - arrayToRelease.AppendElement(mRedirectChannel.forget()); - arrayToRelease.AppendElement(mPreflightChannel.forget()); - arrayToRelease.AppendElement(mDNSPrefetch.forget()); - - MOZ_DIAGNOSTIC_ASSERT( - !mEarlyHintObserver, - "Early hint observer should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement(mEarlyHintObserver.forget()); - MOZ_DIAGNOSTIC_ASSERT( - !mChannelClassifier, - "Channel classifier should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement( - mChannelClassifier.forget().downcast()); - MOZ_DIAGNOSTIC_ASSERT( - !mWarningReporter, - "Warning reporter should have been released in ReleaseListeners()"); - arrayToRelease.AppendElement(mWarningReporter.forget()); - - NS_DispatchToMainThread(new ProxyReleaseRunnable(std::move(arrayToRelease))); -} - nsresult nsHttpChannel::Init(nsIURI* uri, uint32_t caps, nsProxyInfo* proxyInfo, uint32_t proxyResolveFlags, nsIURI* proxyURI, uint64_t channelId, @@ -6229,7 +6199,29 @@ //----------------------------------------------------------------------------- NS_IMPL_ADDREF_INHERITED(nsHttpChannel, HttpBaseChannel) -NS_IMPL_RELEASE_INHERITED(nsHttpChannel, HttpBaseChannel) +bool nsHttpChannel::DispatchRelease() { + if (NS_IsMainThread()) { + return false; + } + + NS_DispatchToMainThread( + NewNonOwningRunnableMethod("net::nsHttpChannel::Release", this, + &nsHttpChannel::Release), + NS_DISPATCH_NORMAL); + + return true; +} + +NS_IMETHODIMP_(MozExternalRefCountType) +nsHttpChannel::Release() { + nsrefcnt count = mRefCnt - 1; + if (DispatchRelease()) { + // Redispatched to the main thread. + return count; + } + + NS_IMPL_RELEASE_INHERITED_GUTS(nsHttpChannel, HttpBaseChannel); +} NS_INTERFACE_MAP_BEGIN(nsHttpChannel) NS_INTERFACE_MAP_ENTRY(nsIRequest) @@ -6661,6 +6653,10 @@ // any error. NS_IMETHODIMP nsHttpChannel::AsyncOpen(nsIStreamListener* aListener) { + // doContentSecurityCheck and OnOpeningRequest fire observers that may + // spin nested event loops; hold a strong ref to this. + RefPtr self(this); + AUTO_PROFILER_FLOW_MARKER("nsHttpChannel::AsyncOpen", NETWORK, Flow::FromPointer(this)); nsCOMPtr listener = aListener; @@ -11322,9 +11318,11 @@ const nsACString& aCspHeader) { LOG(("nsHttpChannel::EarlyHint.\n")); - if (mEarlyHintObserver && nsContentUtils::ComputeIsSecureContext(this)) { - LOG(("nsHttpChannel::EarlyHint propagated.\n")); - mEarlyHintObserver->EarlyHint(aLinkHeader, aReferrerPolicy, aCspHeader); + if (nsCOMPtr obs = mEarlyHintObserver) { + if (nsContentUtils::ComputeIsSecureContext(this)) { + LOG(("nsHttpChannel::EarlyHint propagated.\n")); + obs->EarlyHint(aLinkHeader, aReferrerPolicy, aCspHeader); + } } return NS_OK; } diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpChannel.h thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpChannel.h --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpChannel.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpChannel.h 2026-04-21 14:52:59.000000000 +0000 @@ -306,6 +306,7 @@ // Based on the proxy configuration determine the strategy for resolving the // end server host name. ProxyDNSStrategy GetProxyDNSStrategy(); + bool DispatchRelease(); // We might synchronously or asynchronously call BeginConnect, // which includes DNS prefetch and speculative connection, according to @@ -521,8 +522,9 @@ void SetCachedContentType(); private: - // this section is for main-thread-only object - // all the references need to be proxy released on main thread. + // --- MAIN THREAD ONLY OBJECTS --- + // this section is for main-thread-only objects + // all the references need to be released on main thread. // auth specific data nsCOMPtr mAuthProvider; nsCOMPtr mRedirectURI; @@ -537,8 +539,7 @@ // state of whether tracking protection is enabled or not. RefPtr mChannelClassifier; - // Proxy release all members above on main thread. - void ReleaseMainThreadOnlyReferences(); + // --- END OF MAIN THREAD ONLY OBJECTS SECTION --- // Called after the channel is made aware of its tracking status in order // to readjust the referrer if needed according to the referrer default @@ -851,7 +852,7 @@ private: // cache telemetry bool mDidReval{false}; - RefPtr mEarlyHintObserver; + nsCOMPtr mEarlyHintObserver; Maybe mOpenerCallingScriptLocation; RefPtr mWebTransportSessionEventListener; nsMainThreadPtrHandle mOverrideResponse; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpConnection.cpp thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpConnection.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpConnection.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpConnection.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -616,7 +616,8 @@ rv = OnOutputStreamReady(mSocketOut); if (NS_SUCCEEDED(rv) && mContinueHandshakeDone) { - mContinueHandshakeDone(); + auto continuation = std::move(mContinueHandshakeDone); + continuation(); } mContinueHandshakeDone = nullptr; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpHandler.cpp thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpHandler.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpHandler.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpHandler.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -2688,13 +2688,13 @@ MOZ_ASSERT_IF(!nsIOService::UseSocketProcess(), OnSocketThread()); if (ci->IsHttp3()) { - if (!mExcludedHttp3Origins.Contains(ci->GetRoutedHost())) { + { MutexAutoLock lock(mHttpExclusionLock); mExcludedHttp3Origins.Insert(ci->GetRoutedHost()); } mConnMgr->ExcludeHttp3(ci); } else { - if (!mExcludedHttp2Origins.Contains(ci->GetOrigin())) { + { MutexAutoLock lock(mHttpExclusionLock); mExcludedHttp2Origins.Insert(ci->GetOrigin()); } diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpHandler.h thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpHandler.h --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpHandler.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpHandler.h 2026-04-21 14:52:59.000000000 +0000 @@ -803,7 +803,7 @@ "nsHttpConnectionMgr::LastActiveTabLoadOptimization"}; TimeStamp mLastActiveTabLoadOptimizationHit; - Mutex mHttpExclusionLock MOZ_UNANNOTATED{"nsHttpHandler::HttpExclusion"}; + Mutex mHttpExclusionLock{"nsHttpHandler::HttpExclusion"}; public: [[nodiscard]] nsresult NewChannelId(uint64_t& channelId); @@ -826,8 +826,10 @@ #endif private: - nsTHashSet mExcludedHttp2Origins; - nsTHashSet mExcludedHttp3Origins; + nsTHashSet mExcludedHttp2Origins + MOZ_GUARDED_BY(mHttpExclusionLock); + nsTHashSet mExcludedHttp3Origins + MOZ_GUARDED_BY(mHttpExclusionLock); nsTHashSet mExcluded0RttTcpOrigins; // A set of hosts that we should not upgrade to HTTPS with HTTPS RR. nsTHashSet mExcludedHostsForHTTPSRRUpgrade; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpTransaction.cpp thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpTransaction.cpp --- thunderbird-140.9.0esr/netwerk/protocol/http/nsHttpTransaction.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/http/nsHttpTransaction.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -208,8 +208,8 @@ if (NS_FAILED(rv)) return rv; - mConnInfo = cinfo; - mFinalizedConnInfo = cinfo; + mConnInfo = cinfo->Clone(); + mFinalizedConnInfo = mConnInfo; mCallbacks = callbacks; mConsumerTarget = target; mCaps = caps; diff -Nru thunderbird-140.9.0esr/netwerk/protocol/moz.build thunderbird-140.10.0esr/netwerk/protocol/moz.build --- thunderbird-140.9.0esr/netwerk/protocol/moz.build 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/moz.build 2026-04-21 14:52:59.000000000 +0000 @@ -4,7 +4,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/. -DIRS += ["about", "data", "file"] -if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - DIRS += ["gio"] -DIRS += ["http", "res", "viewsource", "websocket", "webtransport"] +DIRS += [ + "about", + "data", + "file", + "http", + "res", + "viewsource", + "websocket", + "webtransport", +] diff -Nru thunderbird-140.9.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp thunderbird-140.10.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp --- thunderbird-140.9.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/res/ExtensionProtocolHandler.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -9,6 +9,8 @@ #include "mozilla/BinarySearch.h" #include "mozilla/Components.h" #include "mozilla/ClearOnShutdown.h" +#include "mozilla/StaticMutex.h" +#include "nsThreadUtils.h" #include "mozilla/dom/Promise.h" #include "mozilla/dom/Promise-inl.h" #include "mozilla/ExtensionPolicyService.h" @@ -20,6 +22,7 @@ #include "mozilla/Omnijar.h" #include "mozilla/RefPtr.h" #include "mozilla/ResultExtensions.h" +#include "mozilla/SyncRunnable.h" #include "mozilla/Try.h" #include "FileDescriptorFile.h" @@ -385,9 +388,24 @@ already_AddRefed ExtensionProtocolHandler::GetSingleton() { + static StaticMutex sMutex; + StaticMutexAutoLock lock(sMutex); if (!sSingleton) { - sSingleton = new ExtensionProtocolHandler(); - ClearOnShutdown(&sSingleton); + if (NS_IsMainThread()) { + sSingleton = new ExtensionProtocolHandler(); + ClearOnShutdown(&sSingleton); + } else { + StaticMutexAutoUnlock unlock(sMutex); + RefPtr r = NS_NewRunnableFunction( + "ExtensionProtocolHandler::GetSingleton", []() { + StaticMutexAutoLock lock(sMutex); + if (!sSingleton) { + sSingleton = new ExtensionProtocolHandler(); + ClearOnShutdown(&sSingleton); + } + }); + SyncRunnable::DispatchToThread(GetMainThreadSerialEventTarget(), r); + } } return do_AddRef(sSingleton); } diff -Nru thunderbird-140.9.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp thunderbird-140.10.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp --- thunderbird-140.9.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/websocket/WebSocketChannelChild.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -29,20 +29,20 @@ NS_IMETHODIMP_(MozExternalRefCountType) WebSocketChannelChild::Release() { MOZ_ASSERT(0 != mRefCnt, "dup release"); - --mRefCnt; + nsrefcnt count = --mRefCnt; NS_LOG_RELEASE(this, mRefCnt, "WebSocketChannelChild"); - if (mRefCnt == 1) { + if (count == 1) { MaybeReleaseIPCObject(); return mRefCnt; } - if (mRefCnt == 0) { + if (count == 0) { mRefCnt = 1; /* stabilize */ delete this; return 0; } - return mRefCnt; + return count; } NS_INTERFACE_MAP_BEGIN(WebSocketChannelChild) @@ -95,15 +95,6 @@ } void WebSocketChannelChild::MaybeReleaseIPCObject() { - { - MutexAutoLock lock(mMutex); - if (mIPCState != Opened) { - return; - } - - mIPCState = Closing; - } - if (!NS_IsMainThread()) { nsCOMPtr target = GetNeckoTarget(); MOZ_ALWAYS_SUCCEEDS(target->Dispatch( @@ -113,6 +104,15 @@ return; } + { + MutexAutoLock lock(mMutex); + if (mIPCState != Opened) { + return; + } + + mIPCState = Closing; + } + SendDeleteSelf(); } diff -Nru thunderbird-140.9.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp thunderbird-140.10.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp --- thunderbird-140.9.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/protocol/webtransport/WebTransportSessionProxy.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -220,17 +220,29 @@ case WebTransportSessionProxyState::INIT: case WebTransportSessionProxyState::DONE: return NS_ERROR_NOT_INITIALIZED; - case WebTransportSessionProxyState::NEGOTIATING: - mChannel->Cancel(NS_ERROR_ABORT); + case WebTransportSessionProxyState::NEGOTIATING: { + nsCOMPtr channel = mChannel; mChannel = nullptr; ChangeState(WebTransportSessionProxyState::DONE); + NS_DispatchToMainThread(NS_NewRunnableFunction( + "WebTransportSessionProxy::CancelChannel", + [channel = std::move(channel)]() { + channel->Cancel(NS_ERROR_ABORT); + })); break; - case WebTransportSessionProxyState::NEGOTIATING_SUCCEEDED: - mChannel->Cancel(NS_ERROR_ABORT); + } + case WebTransportSessionProxyState::NEGOTIATING_SUCCEEDED: { + nsCOMPtr channel = mChannel; mChannel = nullptr; ChangeState(WebTransportSessionProxyState::SESSION_CLOSE_PENDING); + NS_DispatchToMainThread(NS_NewRunnableFunction( + "WebTransportSessionProxy::CancelChannel", + [channel = std::move(channel)]() { + channel->Cancel(NS_ERROR_ABORT); + })); CloseSessionInternal(); break; + } case WebTransportSessionProxyState::ACTIVE: ChangeState(WebTransportSessionProxyState::SESSION_CLOSE_PENDING); CloseSessionInternal(); diff -Nru thunderbird-140.9.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp thunderbird-140.10.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp --- thunderbird-140.9.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -567,10 +567,13 @@ } int32_t afterIndex = aRepLen + ignoreLen; - uint32_t textAfterPos = aInString[afterIndex]; - if (aInLength > afterIndex + 1 && - NS_IS_SURROGATE_PAIR(textAfterPos, aInString[afterIndex + 1])) { - textAfterPos = SURROGATE_TO_UCS4(textAfterPos, aInString[afterIndex + 1]); + uint32_t textAfterPos = 0; + if (afterIndex < aInLength) { + textAfterPos = aInString[afterIndex]; + if (aInLength > afterIndex + 1 && + NS_IS_SURROGATE_PAIR(textAfterPos, aInString[afterIndex + 1])) { + textAfterPos = SURROGATE_TO_UCS4(textAfterPos, aInString[afterIndex + 1]); + } } return !((before == LT_ALPHA && !IsAlpha(text0)) || diff -Nru thunderbird-140.9.0esr/netwerk/system/mac/nsNetworkLinkService.mm thunderbird-140.10.0esr/netwerk/system/mac/nsNetworkLinkService.mm --- thunderbird-140.9.0esr/netwerk/system/mac/nsNetworkLinkService.mm 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/system/mac/nsNetworkLinkService.mm 2026-04-21 14:53:00.000000000 +0000 @@ -711,9 +711,26 @@ bool ipConfigChanged = false; bool dnsConfigChanged = false; + bool skipOnIPConfigChanged = false; for (CFIndex i = 0; i < CFArrayGetCount(aChangedKeys); ++i) { CFStringRef key = static_cast(CFArrayGetValueAtIndex(aChangedKeys, i)); + // Don't call OnIPConfigChanged() if aChangedKeys contains any EAPOL + // notifications. This works around a crash bug deep in macOS system + // code. Our observers should still get reachability notifications, so + // this shouldn't interfere with network functionality. + if (CFStringHasSuffix(key, CFSTR("EAPOL"))) { + CFIndex keyMaxLength = + CFStringGetMaximumSizeForEncoding(CFStringGetLength(key), + kCFStringEncodingUTF8) + + 1; + char* keyBuffer = static_cast(moz_xmalloc(keyMaxLength)); + keyBuffer[0] = 0; + CFStringGetCString(key, keyBuffer, keyMaxLength, kCFStringEncodingUTF8); + LOG(("Skipping OnIPConfigChanged() on changed key %s", keyBuffer)); + free(keyBuffer); + skipOnIPConfigChanged = true; + } if (CFStringHasSuffix(key, kSCEntNetIPv4) || CFStringHasSuffix(key, kSCEntNetIPv6)) { ipConfigChanged = true; @@ -724,7 +741,7 @@ } nsNetworkLinkService* service = static_cast(aInfo); - if (ipConfigChanged) { + if (ipConfigChanged && !skipOnIPConfigChanged) { service->OnIPConfigChanged(); } @@ -803,7 +820,8 @@ ::SCDynamicStoreCreate(nullptr, CFSTR("IPAndDNSChangeCallbackSCF"), NetworkConfigChanged, &storeContext); - CFStringRef patterns[4] = {nullptr, nullptr, nullptr, nullptr}; + CFStringRef patterns[6] = {nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr}; OSStatus err = getErrorCodePtr(mStoreRef); if (err == noErr) { // This pattern is "State:/Network/Service/[^/]+/IPv4". @@ -818,7 +836,16 @@ // This pattern is "Setup:/Network/Service/[^/]+/DNS". patterns[3] = ::SCDynamicStoreKeyCreateNetworkServiceEntity( nullptr, kSCDynamicStoreDomainSetup, kSCCompAnyRegex, kSCEntNetDNS); - if (!patterns[0] || !patterns[1] || !patterns[2] || !patterns[3]) { + // We want to be able to ignore some groups of notifications that contain + // "EAPOL" keys. This works around a crash bug deep in macOS system code. + // This pattern is "State:/Network/Service/[^/]+/EAPOL". + patterns[4] = ::SCDynamicStoreKeyCreateNetworkServiceEntity( + nullptr, kSCDynamicStoreDomainState, kSCCompAnyRegex, CFSTR("EAPOL")); + // This pattern is "State:/Network/Interface/[^/]+/EAPOL". + patterns[5] = ::SCDynamicStoreKeyCreateNetworkInterfaceEntity( + nullptr, kSCDynamicStoreDomainState, kSCCompAnyRegex, CFSTR("EAPOL")); + if (!patterns[0] || !patterns[1] || !patterns[2] || !patterns[3] || + !patterns[4] || !patterns[5]) { err = -1; } } @@ -829,7 +856,7 @@ // that match that pattern list, then create our run loop // source. if (err == noErr) { - patternList = ::CFArrayCreate(nullptr, (const void**)patterns, 4, + patternList = ::CFArrayCreate(nullptr, (const void**)patterns, 6, &kCFTypeArrayCallBacks); if (!patternList) { err = -1; @@ -849,6 +876,8 @@ CFReleaseSafe(patterns[1]); CFReleaseSafe(patterns[2]); CFReleaseSafe(patterns[3]); + CFReleaseSafe(patterns[4]); + CFReleaseSafe(patterns[5]); CFReleaseSafe(patternList); if (err != noErr) { diff -Nru thunderbird-140.9.0esr/netwerk/test/unit/test_gio_protocol.js thunderbird-140.10.0esr/netwerk/test/unit/test_gio_protocol.js --- thunderbird-140.9.0esr/netwerk/test/unit/test_gio_protocol.js 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/test/unit/test_gio_protocol.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -/* run some tests on the gvfs/gio protocol handler */ - -"use strict"; - -function inChildProcess() { - return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; -} - -const PR_RDONLY = 0x1; // see prio.h - -[ - do_test_read_data_dir, - do_test_read_recent, - test_read_file, - do_test_finished, -].forEach(f => add_test(f)); - -function setup() { - // Allowing some protocols to get a channel - if (!inChildProcess()) { - Services.prefs.setCharPref( - "network.gio.supported-protocols", - "localtest:,recent:" - ); - } else { - do_send_remote_message("gio-allow-test-protocols"); - do_await_remote_message("gio-allow-test-protocols-done"); - } -} - -setup(); - -registerCleanupFunction(() => { - // Resetting the protocols to None - if (!inChildProcess()) { - Services.prefs.clearUserPref("network.gio.supported-protocols"); - } -}); - -function new_file_input_stream(file, buffered) { - var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance( - Ci.nsIFileInputStream - ); - stream.init(file, PR_RDONLY, 0, 0); - if (!buffered) { - return stream; - } - - var buffer = Cc[ - "@mozilla.org/network/buffered-input-stream;1" - ].createInstance(Ci.nsIBufferedInputStream); - buffer.init(stream, 4096); - return buffer; -} - -function new_file_channel(file) { - var chan = NetUtil.newChannel({ - uri: file, - loadUsingSystemPrincipal: true, - }); - - return chan; -} - -/* - * stream listener - * this listener has some additional file-specific tests, so we can't just use - * ChannelListener here. - */ -function FileStreamListener(closure) { - this._closure = closure; -} -FileStreamListener.prototype = { - _closure: null, - _buffer: "", - _got_onstartrequest: false, - _got_onstoprequest: false, - _contentLen: -1, - - QueryInterface: ChromeUtils.generateQI([ - "nsIStreamListener", - "nsIRequestObserver", - ]), - - onStartRequest() { - if (this._got_onstartrequest) { - do_throw("Got second onStartRequest event!"); - } - this._got_onstartrequest = true; - }, - - onDataAvailable(request, stream, offset, count) { - if (!this._got_onstartrequest) { - do_throw("onDataAvailable without onStartRequest event!"); - } - if (this._got_onstoprequest) { - do_throw("onDataAvailable after onStopRequest event!"); - } - if (!request.isPending()) { - do_throw("request reports itself as not pending from onStartRequest!"); - } - - this._buffer = this._buffer.concat(read_stream(stream, count)); - }, - - onStopRequest(request, status) { - if (!this._got_onstartrequest) { - do_throw("onStopRequest without onStartRequest event!"); - } - if (this._got_onstoprequest) { - do_throw("Got second onStopRequest event!"); - } - this._got_onstoprequest = true; - if (!Components.isSuccessCode(status)) { - do_throw("Failed to load file: " + status.toString(16)); - } - if (status != request.status) { - do_throw("request.status does not match status arg to onStopRequest!"); - } - if (request.isPending()) { - do_throw("request reports itself as pending from onStopRequest!"); - } - if (this._contentLen != -1 && this._buffer.length != this._contentLen) { - do_throw("did not read nsIChannel.contentLength number of bytes!"); - } - - this._closure(this._buffer); - }, -}; - -function test_read_file() { - dump("*** test_read_file\n"); - // Going via parent path, because this is opended from test/unit/ and test/unit_ipc/ - var file = do_get_file("../unit/data/test_readline4.txt"); - var chan = new_file_channel("localtest://" + file.path); - - function on_read_complete(data) { - dump("*** test_read_file.on_read_complete()\n"); - /* read completed successfully. now read data directly from file, - and compare the result. */ - var stream = new_file_input_stream(file, false); - var result = read_stream(stream, stream.available()); - if (result != data) { - do_throw("Stream contents do not match with direct read!"); - } - run_next_test(); - } - - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} - -function do_test_read_data_dir() { - dump('*** test_read_data_dir("../data/")\n'); - - var dir = do_get_file("../unit/data/"); - var chan = new_file_channel("localtest://" + dir.path); - - function on_read_complete(data) { - dump("*** test_read_data_dir.on_read_complete()\n"); - - // The data-directory should be listed, containing a header-line and the files therein - if ( - !( - data.includes("200: filename content-length last-modified file-type") && - data.includes("201: test_readline1.txt") && - data.includes("201: test_readline2.txt") - ) - ) { - do_throw( - "test_read_data_dir() - Bad data! Does not contain needles! Is <" + - data + - ">" - ); - } - run_next_test(); - } - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} - -function do_test_read_recent() { - dump('*** test_read_recent("recent://")\n'); - - var chan = new_file_channel("recent:///"); - - function on_read_complete(data) { - dump("*** test_read_recent.on_read_complete()\n"); - - // The data-directory should be listed, containing a header-line and the files therein - if ( - !data.includes("200: filename content-length last-modified file-type") - ) { - do_throw( - "do_test_read_recent() - Bad data! Does not contain header! Is <" + - data + - ">" - ); - } - run_next_test(); - } - chan.asyncOpen(new FileStreamListener(on_read_complete)); -} diff -Nru thunderbird-140.9.0esr/netwerk/test/unit/xpcshell.toml thunderbird-140.10.0esr/netwerk/test/unit/xpcshell.toml --- thunderbird-140.9.0esr/netwerk/test/unit/xpcshell.toml 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/test/unit/xpcshell.toml 2026-04-21 14:52:59.000000000 +0000 @@ -623,9 +623,6 @@ ["test_getHost.js"] -["test_gio_protocol.js"] -run-if = ["os == 'linux'"] - ["test_gre_resources.js"] ["test_h2proxy_connection_limit.js"] diff -Nru thunderbird-140.9.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js thunderbird-140.10.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js --- thunderbird-140.9.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/test/unit_ipc/test_gio_protocol_wrap.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -// -// Run test script in content process instead of chrome (xpcshell's default) -// -// - -function run_test() { - Services.prefs.setCharPref( - "network.gio.supported-protocols", - "localtest:,recent:" - ); - - do_await_remote_message("gio-allow-test-protocols").then(() => { - do_send_remote_message("gio-allow-test-protocols-done"); - }); - - run_test_in_child("../unit/test_gio_protocol.js"); -} - -registerCleanupFunction(() => { - Services.prefs.clearUserPref("network.gio.supported-protocols"); -}); diff -Nru thunderbird-140.9.0esr/netwerk/test/unit_ipc/xpcshell.toml thunderbird-140.10.0esr/netwerk/test/unit_ipc/xpcshell.toml --- thunderbird-140.9.0esr/netwerk/test/unit_ipc/xpcshell.toml 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/netwerk/test/unit_ipc/xpcshell.toml 2026-04-21 14:52:59.000000000 +0000 @@ -17,7 +17,6 @@ "!/netwerk/test/unit/test_duplicate_headers.js", "!/netwerk/test/unit/test_event_sink.js", "!/netwerk/test/unit/test_getHost.js", - "!/netwerk/test/unit/test_gio_protocol.js", "!/netwerk/test/unit/test_head.js", "!/netwerk/test/unit/test_headers.js", "!/netwerk/test/unit/test_httpsuspend.js", @@ -136,9 +135,6 @@ ["test_getHost_wrap.js"] prefs = ["network.allow_raw_sockets_in_content_processes=true"] -["test_gio_protocol_wrap.js"] -run-if = ["os == 'linux'"] - ["test_head_wrap.js"] prefs = ["network.allow_raw_sockets_in_content_processes=true"] diff -Nru thunderbird-140.9.0esr/parser/html/nsHtml5TreeOperation.cpp thunderbird-140.10.0esr/parser/html/nsHtml5TreeOperation.cpp --- thunderbird-140.9.0esr/parser/html/nsHtml5TreeOperation.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/parser/html/nsHtml5TreeOperation.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -970,13 +970,22 @@ return NS_OK; } + nsIContent* node = *aOperation.mTemplateNode; + nsIContent* host = *aOperation.mHost; + + if (MOZ_UNLIKELY(node->GetParentNode())) { + Detach(node, mBuilder); + if (MOZ_UNLIKELY(node->GetParentNode())) { + // Can this happen? If it can, give up. + return NS_OK; + } + } + // We failed to attach a new shadow root, so instead attach a template // element and return its content. - nsHtml5TreeOperation::Append(*aOperation.mTemplateNode, *aOperation.mHost, - mBuilder); + nsHtml5TreeOperation::Append(node, host, mBuilder); *aOperation.mFragHandle = - static_cast(*aOperation.mTemplateNode) - ->Content(); + static_cast(node)->Content(); nsContentUtils::LogSimpleConsoleError( u"Failed to attach Declarative Shadow DOM."_ns, "DOM"_ns, mBuilder->GetDocument()->IsInPrivateBrowsing(), @@ -988,6 +997,9 @@ nsIContent* table = *(aOperation.mTable); nsIContent* stackParent = *(aOperation.mStackParent); nsIContent* fosterParent = GetFosterParent(table, stackParent); + if (fosterParent) { + mBuilder->HoldElement(do_AddRef(fosterParent)); + } *aOperation.mParentHandle = fosterParent; return NS_OK; } diff -Nru thunderbird-140.9.0esr/security/ct/CTKnownLogs.h thunderbird-140.10.0esr/security/ct/CTKnownLogs.h --- thunderbird-140.9.0esr/security/ct/CTKnownLogs.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/ct/CTKnownLogs.h 2026-04-21 14:53:00.000000000 +0000 @@ -14,7 +14,7 @@ #include -static const PRTime kCTExpirationTime = INT64_C(1779695596000000); +static const PRTime kCTExpirationTime = INT64_C(1782114585000000); namespace mozilla::ct { diff -Nru thunderbird-140.9.0esr/security/manager/ssl/PSMRunnable.cpp thunderbird-140.10.0esr/security/manager/ssl/PSMRunnable.cpp --- thunderbird-140.9.0esr/security/manager/ssl/PSMRunnable.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/PSMRunnable.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* 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 "PSMRunnable.h" - -namespace mozilla { -namespace psm { - -SyncRunnableBase::SyncRunnableBase() - : Runnable("psm::SyncRunnableBase"), monitor("SyncRunnableBase::monitor") {} - -nsresult SyncRunnableBase::DispatchToMainThreadAndWait() { - nsresult rv; - if (NS_IsMainThread()) { - RunOnTargetThread(); - rv = NS_OK; - } else { - mozilla::MonitorAutoLock lock(monitor); - rv = NS_DispatchToMainThread(this); - if (NS_SUCCEEDED(rv)) { - lock.Wait(); - } - } - - return rv; -} - -NS_IMETHODIMP -SyncRunnableBase::Run() { - RunOnTargetThread(); - mozilla::MonitorAutoLock(monitor).Notify(); - return NS_OK; -} - -nsresult NotifyObserverRunnable::Run() { - mObserver->Observe(nullptr, mTopic, nullptr); - return NS_OK; -} - -} // namespace psm -} // namespace mozilla diff -Nru thunderbird-140.9.0esr/security/manager/ssl/PSMRunnable.h thunderbird-140.10.0esr/security/manager/ssl/PSMRunnable.h --- thunderbird-140.9.0esr/security/manager/ssl/PSMRunnable.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/PSMRunnable.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* 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 PSMRunnable_h -#define PSMRunnable_h - -#include "mozilla/Monitor.h" -#include "nsThreadUtils.h" -#include "nsIObserver.h" -#include "nsProxyRelease.h" - -namespace mozilla { -namespace psm { - -// Wait for the event to run on the target thread without spinning the event -// loop on the calling thread. (Dispatching events to a thread using -// NS_DispatchAndSpinEventLoopUntilComplete would cause the event loop on the -// calling thread to spin.) -class SyncRunnableBase : public Runnable { - public: - NS_DECL_NSIRUNNABLE - nsresult DispatchToMainThreadAndWait(); - - protected: - SyncRunnableBase(); - virtual void RunOnTargetThread() = 0; - - private: - mozilla::Monitor monitor MOZ_UNANNOTATED; -}; - -class NotifyObserverRunnable : public Runnable { - public: - NotifyObserverRunnable(nsIObserver* observer, const char* topicStringLiteral) - : Runnable("psm::NotifyObserverRunnable"), - mObserver(new nsMainThreadPtrHolder( - "psm::NotifyObserverRunnable::mObserver", observer)), - mTopic(topicStringLiteral) {} - NS_DECL_NSIRUNNABLE - private: - nsMainThreadPtrHandle mObserver; - const char* const mTopic; -}; - -} // namespace psm -} // namespace mozilla - -#endif diff -Nru thunderbird-140.9.0esr/security/manager/ssl/SSLServerCertVerification.cpp thunderbird-140.10.0esr/security/manager/ssl/SSLServerCertVerification.cpp --- thunderbird-140.9.0esr/security/manager/ssl/SSLServerCertVerification.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/SSLServerCertVerification.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -99,7 +99,6 @@ #include "ExtendedValidation.h" #include "NSSCertDBTrustDomain.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "RootCertificateTelemetryUtils.h" #include "ScopedNSSTypes.h" #include "SharedCertVerifier.h" diff -Nru thunderbird-140.9.0esr/security/manager/ssl/StaticHPKPins.h thunderbird-140.10.0esr/security/manager/ssl/StaticHPKPins.h --- thunderbird-140.9.0esr/security/manager/ssl/StaticHPKPins.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/StaticHPKPins.h 2026-04-21 14:53:00.000000000 +0000 @@ -726,4 +726,4 @@ static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1782114773318000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1784533762555000); diff -Nru thunderbird-140.9.0esr/security/manager/ssl/moz.build thunderbird-140.10.0esr/security/manager/ssl/moz.build --- thunderbird-140.9.0esr/security/manager/ssl/moz.build 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/moz.build 2026-04-21 14:52:59.000000000 +0000 @@ -127,7 +127,6 @@ "nsTLSSocketProvider.cpp", "OSKeyStore.cpp", "PKCS11ModuleDB.cpp", - "PSMRunnable.cpp", "PublicKeyPinningService.cpp", "RootCertificateTelemetryUtils.cpp", "SecretDecoderRing.cpp", @@ -192,7 +191,11 @@ "ntdll", ] - UNIFIED_SOURCES += [ + # CredentialManagerSecret.cpp includes without WIN32_LEAN_AND_MEAN, + # which pulls in and conflicts with included by other + # files in the same unified translation unit. Compile independently to prevent + # that interference. + SOURCES += [ "CredentialManagerSecret.cpp", ] # Version string comparison is generally wrong, but by the time it would diff -Nru thunderbird-140.9.0esr/security/manager/ssl/nsNSSCallbacks.cpp thunderbird-140.10.0esr/security/manager/ssl/nsNSSCallbacks.cpp --- thunderbird-140.9.0esr/security/manager/ssl/nsNSSCallbacks.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/nsNSSCallbacks.cpp 2026-04-21 14:53:00.000000000 +0000 @@ -7,7 +7,6 @@ #include "nsNSSCallbacks.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "ScopedNSSTypes.h" #include "SharedCertVerifier.h" #include "mozilla/ArrayUtils.h" @@ -20,6 +19,7 @@ #include "mozilla/SpinEventLoopUntil.h" #include "mozilla/StaticPrefs_security.h" #include "mozilla/Unused.h" +#include "mozilla/SyncRunnable.h" #include "mozilla/glean/SecurityManagerSslMetrics.h" #include "mozilla/intl/Localization.h" #include "nsContentUtils.h" @@ -40,6 +40,7 @@ #include "nsNetUtil.h" #include "nsProxyRelease.h" #include "nsStringStream.h" +#include "nsThreadUtils.h" #include "mozpkix/pkixtypes.h" #include "ssl.h" #include "sslproto.h" @@ -546,28 +547,36 @@ } } -class PK11PasswordPromptRunnable : public SyncRunnableBase { +class PK11PasswordPromptRunnable final : public nsIRunnable { public: PK11PasswordPromptRunnable(PK11SlotInfo* slot, nsIInterfaceRequestor* ir) : mResult(nullptr), mSlot(slot), mIR(ir) {} - virtual ~PK11PasswordPromptRunnable() = default; + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIRUNNABLE char* mResult; // out - virtual void RunOnTargetThread() override; private: + ~PK11PasswordPromptRunnable() = default; + + // Accessed only on the main thread. True if any instance of + // PK11PasswordPromptRunnable is already running. static bool mRunning; PK11SlotInfo* mSlot; nsIInterfaceRequestor* mIR; }; +NS_IMPL_ISUPPORTS(PK11PasswordPromptRunnable, nsIRunnable) + bool PK11PasswordPromptRunnable::mRunning = false; -void PK11PasswordPromptRunnable::RunOnTargetThread() { +NS_IMETHODIMP +PK11PasswordPromptRunnable::Run() { MOZ_ASSERT(NS_IsMainThread()); if (!NS_IsMainThread()) { - return; + return NS_ERROR_NOT_SAME_THREAD; } // If we've reentered due to the nested event loop implicit in using @@ -577,7 +586,7 @@ // to fail, but this is better than littering the screen with a bunch of // password prompts that the user will probably just cancel anyway. if (mRunning) { - return; + return NS_OK; } mRunning = true; auto setRunningToFalseOnExit = MakeScopeExit([&]() { mRunning = false; }); @@ -587,7 +596,7 @@ if (!mIR) { rv = nsNSSComponent::GetNewPrompter(getter_AddRefs(prompt)); if (NS_FAILED(rv)) { - return; + return rv; } } else { prompt = do_GetInterface(mIR); @@ -595,12 +604,12 @@ } if (!prompt) { - return; + return NS_ERROR_FAILURE; } if (PK11_ProtectedAuthenticationPath(mSlot)) { mResult = ShowProtectedAuthPrompt(mSlot, prompt); - return; + return NS_OK; } nsAutoString promptString; @@ -613,7 +622,7 @@ promptString); } if (NS_FAILED(rv)) { - return; + return rv; } nsString password; @@ -621,10 +630,11 @@ rv = prompt->PromptPassword(nullptr, promptString.get(), getter_Copies(password), &userClickedOK); if (NS_FAILED(rv) || !userClickedOK) { - return; + return rv; } mResult = ToNewUTF8String(password); + return NS_OK; } char* PK11PasswordPrompt(PK11SlotInfo* slot, PRBool /*retry*/, void* arg) { @@ -633,7 +643,8 @@ } RefPtr runnable(new PK11PasswordPromptRunnable( slot, static_cast(arg))); - runnable->DispatchToMainThreadAndWait(); + MOZ_ALWAYS_SUCCEEDS(SyncRunnable::DispatchToThread( + GetMainThreadSerialEventTarget(), runnable)); return runnable->mResult; } diff -Nru thunderbird-140.9.0esr/security/manager/ssl/nsNSSIOLayer.cpp thunderbird-140.10.0esr/security/manager/ssl/nsNSSIOLayer.cpp --- thunderbird-140.9.0esr/security/manager/ssl/nsNSSIOLayer.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/nsNSSIOLayer.cpp 2026-04-21 14:52:59.000000000 +0000 @@ -13,7 +13,6 @@ #include "NSSCertDBTrustDomain.h" #include "NSSErrorsService.h" #include "NSSSocketControl.h" -#include "PSMRunnable.h" #include "SSLServerCertVerification.h" #include "ScopedNSSTypes.h" #include "TLSClientAuthCertSelection.h" diff -Nru thunderbird-140.9.0esr/security/manager/ssl/nsSTSPreloadList.inc thunderbird-140.10.0esr/security/manager/ssl/nsSTSPreloadList.inc --- thunderbird-140.9.0esr/security/manager/ssl/nsSTSPreloadList.inc 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/ssl/nsSTSPreloadList.inc 2026-04-21 14:53:00.000000000 +0000 @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1784533969259000); +const PRTime gPreloadListExpirationTime = INT64_C(1786952959163000); %% 0--1.de, 1 0-0.io, 1 @@ -16,7 +16,6 @@ 0-1.party, 1 0-24.com, 1 0-24.net, 1 -0-9.com, 1 0-nuisibles.fr, 1 0.com.ms, 1 0.sb, 1 @@ -54,7 +53,6 @@ 00321365.com, 1 00365t.com, 1 0037552.com, 1 -003d88.com, 1 003dyw.com, 1 0047552.com, 1 00484.com, 1 @@ -109,7 +107,6 @@ 02327.net, 1 02349898.xyz, 1 02365t.com, 1 -023sec.com, 1 025500.xyz, 1 02638.net, 1 02n.cn, 1 @@ -187,6 +184,7 @@ 07d88.com, 1 07d88.net, 1 07f.de, 1 +0800-horoscope.com, 1 08000113.nl, 1 0800829988.com, 1 081115.com, 0 @@ -319,7 +317,7 @@ 1-800-mattress.com, 1 1-800-payment.com, 1 1-inv.com, 1 -1-news.net, 1 +1-news.net, 0 1-pujcky-uvery.tk, 1 1-x-bet.com, 1 1-x-bet.ke, 1 @@ -329,6 +327,7 @@ 1-xbet13.com, 1 1-xbet20.com, 1 100-downloads.com, 1 +100000037.xyz, 1 10000hits.tk, 1 10000lab.net, 1 10000rub.gq, 1 @@ -361,6 +360,7 @@ 100beauty.com, 1 100bib.ru, 1 100car.pl, 1 +100cgi.com, 1 100kraz.ga, 1 100nome.com, 1 100pay.com, 1 @@ -459,16 +459,12 @@ 10ve.live, 1 10web.io, 1 10wtac.tk, 1 -10x.to, 1 -10xnation.com, 1 +10xerp.com, 1 11-11.sale, 1 1100.so, 1 -110111011.xyz, 1 11018vip.com, 1 11018xpj.com, 1 110838.com, 1 -110cl.com, 1 -110na.com, 1 1110a24.com, 1 1111365t.com, 1 1111systems.com, 1 @@ -727,6 +723,7 @@ 125c.cn, 1 125colours.tk, 1 125m125.de, 1 +126northmarketing.com, 1 127011.ch, 1 127661.com, 1 1288366.com, 1 @@ -917,8 +914,6 @@ 1620350.com, 1 162263.com, 0 162361.com, 0 -162cr.com, 1 -162ea.com, 1 162jonesrd.ca, 1 163.gd, 1 16321.tk, 1 @@ -1050,7 +1045,6 @@ 1800matress.net, 1 1800mattress.co, 1 1800mattress.net, 1 -1800nopests.com.my, 1 182wh.com, 1 1831365.com, 1 1832365.com, 1 @@ -1261,8 +1255,7 @@ 1q2w.nl, 1 1q365a.com, 1 1r.is, 1 -1rail.com.au, 0 -1roadsquadtransport.com, 1 +1rail.com.au, 1 1rs.nl, 1 1rust.net, 1 1salland.nl, 1 @@ -1285,6 +1278,7 @@ 1strecipes.com, 1 1ststop.co.uk, 1 1ticks.com, 1 +1time.io, 1 1tomplumber.com, 1 1up.it, 1 1v9.im, 1 @@ -1531,7 +1525,6 @@ 2033010.com, 1 2033011.com, 1 2033a.com, 1 -2033c.com, 1 2033z.com, 1 203700.com, 1 204504byse.info, 1 @@ -1612,27 +1605,15 @@ 22delta.com, 1 22emesiecle.com, 0 22lc8.com, 0 -22momo.com, 1 22nd.com, 0 22ndcircuitil.gov, 1 22pagespdx.com, 1 22ssbb.com, 1 -22ssjj.com, 1 -22sskk.com, 1 -22sstt.com, 1 -22tete.com, 1 22times.com, 0 -22ttgg.com, 1 22vetter.st, 1 -22xxjj.com, 1 -22xxyy.com, 1 -22yybb.com, 1 22yydd.com, 1 22yyii.com, 1 22yyjj.com, 1 -22yykk.com, 1 -22yypp.com, 1 -22yyqq.com, 1 22yyss.com, 1 22zt.com, 1 230100.xyz, 1 @@ -1748,7 +1729,6 @@ 253007.com, 1 2531111.ru, 1 254vc.ml, 1 -256br.com, 1 256k.me, 1 258027.xyz, 1 258management.cf, 1 @@ -1759,7 +1739,6 @@ 25friday.com, 1 25genomes.org.uk, 1 25genomes.uk, 1 -25lotto.co.ke, 1 25lotto.com, 1 25may.tk, 1 25percent.me, 1 @@ -1774,8 +1753,6 @@ 263mail.com, 1 269196.com, 1 2698pacificave.com, 1 -26uuu.mobi, 1 -26uuu.us, 1 27.gay, 1 27000.best, 1 2718282.net, 1 @@ -1885,7 +1862,6 @@ 2rsc.net, 1 2sendai.net, 1 2serious.com, 1 -2silosbrewing.com, 1 2target.com, 1 2tausend19.de, 1 2th.me, 1 @@ -1925,7 +1901,6 @@ 30deagosto.tk, 1 30for30podcasts.com, 1 30hb.cn, 1 -30minut.com, 1 30nama1.tk, 1 30parkplace.co.uk, 1 30region.tk, 1 @@ -1934,6 +1909,7 @@ 3100.cf, 1 313xpj.com, 0 314553.com, 1 +315101.xyz, 1 315422.com, 1 315xpj.com, 0 317811111.com, 0 @@ -2017,6 +1993,7 @@ 350pdx.org, 1 3527trail.com, 1 3539783.com, 1 +353digital.ie, 1 3555500.com, 1 3559365.com, 1 356338.com, 1 @@ -2054,7 +2031,7 @@ 360hosting.com.au, 1 360islam.com, 1 360kuvia.fi, 1 -360mediaworks.com, 0 +360mediaworks.com, 1 360organic.com, 1 360primeview.ie, 1 360prokuvat.fi, 1 @@ -2159,24 +2136,15 @@ 369369.xyz, 1 3699.cc, 1 369bin.com, 1 -369dp.com, 1 -369eq.com, 1 -369ex.com, 1 -369ra.com, 1 -369rr.com, 1 36thdistrictcourtmi.gov, 1 372bbb.com, 1 -375337.com, 1 375realty.com, 1 376064.com, 0 377625.com, 1 -377837.com, 1 377854.com, 1 377ks.com, 1 377zzz.com, 1 37889658.com, 0 -379437.com, 1 -379637.com, 1 379700.com, 1 3798.com, 0 37987.com, 1 @@ -2196,6 +2164,7 @@ 3880p.com, 1 38888msc.com, 1 38irkutsk.tk, 1 +390trains.com, 1 392365.com, 0 393335.ml, 0 394553.com, 1 @@ -2254,7 +2223,6 @@ 39sihu.com, 0 39w66.com, 1 3aa365.com, 1 -3abnstore.com, 1 3accounts.ml, 1 3adao.org, 1 3aexpert.com.ua, 1 @@ -2342,7 +2310,6 @@ 3gg365.com, 1 3gokushi.com, 1 3haeuserprojekt.org, 1 -3hh365.com, 1 3i-infotech.com, 1 3ieimpact.org, 1 3ii365.com, 1 @@ -2521,6 +2488,7 @@ 43klive.com, 1 43rddems.org, 1 44-k.com, 1 +44.in.ua, 1 44168365.com, 1 443.one, 0 443.org, 1 @@ -2567,7 +2535,6 @@ 486662.xyz, 1 486773.com, 0 487511.com, 1 -487552.com, 1 48coin.cf, 1 48d88.com, 0 48lipetsk.tk, 1 @@ -2603,6 +2570,7 @@ 4digitiq.nl, 1 4dillusion.tk, 1 4dimension.net, 1 +4dplay.com, 1 4dsoft.com, 1 4dstyle.com, 1 4e8.net, 1 @@ -2652,6 +2620,7 @@ 4o.pw, 0 4ourbest.tk, 1 4paws.co.uk, 1 +4pay.online, 1 4peace.gent, 1 4played.de, 1 4played.vip, 1 @@ -2694,6 +2663,7 @@ 4yuz.net, 1 5.st, 1 50-ottenkov.tk, 1 +500.gov.tw, 1 5000.cx, 1 5000164.com, 1 5000164.jp, 1 @@ -2746,7 +2716,6 @@ 514-media.co.uk, 1 514-media.com, 1 514-media.de, 1 -514-media.fr, 1 514622.com, 1 515188.xyz, 1 517vpn.cn, 1 @@ -2812,7 +2781,6 @@ 51senluo.com, 1 51space.com, 1 51talk.ph, 1 -51tiaojiu.com, 1 51xiongmao.cn, 1 52002a.com, 1 52002b.com, 1 @@ -2857,7 +2825,6 @@ 52chatai.com, 1 52danji.cc, 1 52dashboard.com, 1 -52evar.com, 1 52evar1.com, 1 52hentai.ml, 1 52iv.one, 1 @@ -2886,7 +2853,6 @@ 5533445.com, 1 55365t.com, 1 5557552.com, 1 -555w.org, 1 555zlong.com, 1 556185.com, 1 557.pm, 1 @@ -2896,8 +2862,6 @@ 56011s.com, 0 5611.cf, 1 5611bet.com, 1 -562656.com, 1 -562956.com, 1 5633bet.com, 1 56365t.com, 1 5663.cc, 1 @@ -2907,7 +2871,6 @@ 5676321.com, 1 567666365.com, 1 5677.cf, 1 -568756.com, 1 572223.com, 0 572kb.com, 1 573sss.com, 1 @@ -3026,7 +2989,6 @@ 5tart.tk, 1 5thchichesterscouts.org.uk, 1 5theasthall.com, 0 -5thfloormedia.com, 1 5thgenrams.com, 1 5tiptop.com, 1 5top.nl, 1 @@ -3073,7 +3035,6 @@ 635-888.com, 1 635-988.com, 1 636051.com, 1 -638566.com, 1 6396000.com, 1 63960000.com, 1 639611111.com, 0 @@ -3103,7 +3064,6 @@ 6396vvv.com, 0 6396yyy.com, 1 6396zzz.com, 0 -63fg.com, 1 63gaming.com, 1 64.place, 1 644.ro, 1 @@ -3142,8 +3102,6 @@ 6548877.com, 1 654pk.cn, 0 655ks.com, 1 -658565.com, 1 -659265.com, 1 6601.cf, 1 6602.cf, 1 6602p.com, 1 @@ -3369,6 +3327,7 @@ 69kzvm3f.com, 1 69level.com, 1 69mentor.com, 1 +69wasted.net, 1 6a.nz, 1 6b.com.au, 1 6b.nz, 1 @@ -3397,7 +3356,6 @@ 702341.win, 1 704533.com, 0 705994.com, 1 -708090.ru, 1 70mpg.org, 1 7100.cf, 1 712kb.com, 1 @@ -3521,7 +3479,7 @@ 7graus.pt, 1 7h12.com, 1 7heavencr.com, 1 -7hills-consulting.de, 0 +7hills-consulting.de, 1 7hills.us, 1 7hq.ru, 1 7inci.com, 1 @@ -3537,6 +3495,7 @@ 7ovz.ru, 1 7pixel.ro, 1 7plus.com.au, 1 +7press.com, 1 7proxies.com, 1 7qly.com, 1 7sdre.am, 1 @@ -3559,6 +3518,7 @@ 800999.xyz, 1 800email.com, 1 800ink.com, 1 +800live.com, 1 800mattress.com, 1 800perkins.com, 1 800sports.com, 1 @@ -3688,7 +3648,6 @@ 8349822.com, 1 83ir2k8b.duckdns.org, 1 83kb88.com, 1 -84000.com, 1 84036.ml, 1 842844.com, 1 8444.cf, 1 @@ -3705,7 +3664,6 @@ 84cl.com, 1 84cx.com, 1 84dp.com, 1 -84dt.com, 1 84ek.com, 1 84et.com, 1 84ew.com, 1 @@ -3881,7 +3839,6 @@ 894324.com, 1 8989k3.com, 1 899ks.com, 1 -8a.pw, 1 8ack.de, 1 8ag8.org, 1 8ballbombom.uk, 1 @@ -3914,8 +3871,8 @@ 8time.com, 1 8tuffbeers.com, 1 8ung.online, 1 +8weekchallenge.com.au, 1 8xxxxxxx.com, 1 -8y.network, 0 8yun.cf, 1 8yun.ga, 0 9-11commission.gov, 1 @@ -4016,6 +3973,7 @@ 9098.cf, 1 90daydiet.org, 1 90daysales.com, 1 +90minut.com, 1 90r.jp, 1 90splease.com, 1 91-av.com, 1 @@ -4037,7 +3995,6 @@ 9108.cf, 1 9109.cf, 1 911.gov, 1 -9111s.ru, 0 911216.xyz, 1 9113.cf, 1 9114.cf, 1 @@ -4131,7 +4088,7 @@ 918bbm.co, 1 918bcf.co, 1 918bcw.co, 1 -918bio.co, 1 +918bio.co, 0 918bip.co, 1 918bis.co, 1 918dc04.com, 1 @@ -4205,10 +4162,7 @@ 9245.cf, 1 9246.cf, 1 9247.cf, 1 -924992.com, 1 925silverjewelry.com, 1 -926792.com, 1 -927092.com, 1 9297.co, 1 9297a.co, 1 9297aa.co, 1 @@ -4347,7 +4301,6 @@ 9378.cf, 1 9379.cf, 1 9381.cf, 1 -938193.com, 1 9382.cf, 1 9383.cf, 1 9384.cf, 1 @@ -4480,7 +4433,6 @@ 9578.cf, 1 9579.cf, 1 9580.cf, 1 -95808.com, 1 9581.cf, 1 9582.cf, 1 9584.cf, 1 @@ -4521,9 +4473,9 @@ 9618.cf, 1 9619.cf, 1 9620.cf, 1 +96200.com, 1 9621.cf, 1 9622.cf, 1 -96220.com, 1 96229.com, 1 9623.cf, 1 9624.cf, 1 @@ -4533,7 +4485,6 @@ 9629.cf, 1 9630.cf, 1 9631.cf, 1 -96316.com, 1 9632.cf, 1 9633.cf, 1 96448.com, 1 @@ -4802,7 +4753,6 @@ 999family.com, 0 999salon.co, 1 999zlong.com, 1 -99bt.com, 1 99buffets.com, 1 99dog.com, 1 99furnitureideasandtips.gq, 1 @@ -4822,10 +4772,10 @@ 9ccn.top, 1 9elements.com, 0 9face.com, 1 +9fruit.com, 1 9fvip.net, 1 9gag.com, 1 9hosts.net, 1 -9i0.com, 1 9iwan.net, 1 9jajuice.com, 1 9k262.com, 1 @@ -4908,10 +4858,11 @@ 9mp.ro, 1 9ostech.com, 1 9pkfz.com, 1 -9point6.com, 1 +9point6.com, 0 9ranks.com, 1 9rx.cz, 1 9tailedkitsune.com, 1 +9tnine.net, 1 9to5linux.com, 1 9uelle.jp, 0 9ungnir.xyz, 1 @@ -4940,6 +4891,7 @@ a-raven.corsica, 1 a-rwx.org, 1 a-s-motors.ru, 1 +a-scientificpestcontrol.com, 1 a-shirouto.com, 1 a-starbouncycastles.co.uk, 1 a-stocker.com, 1 @@ -4950,6 +4902,7 @@ a01sa01to.com, 1 a04gameapp.com, 1 a04webapp.com, 1 +a05777.uk, 1 a05webapp.com, 1 a06.ch, 1 a06.me, 0 @@ -4962,6 +4915,7 @@ a11ywatch.com, 1 a13x.uk, 1 a16z.com, 1 +a1billgibsonseptictankservice.com, 1 a1bouncycastlehire.com, 1 a1cashforcar.com.au, 1 a1cdrinks.com, 1 @@ -4975,7 +4929,6 @@ a1scrapmetalrecyclers.com.au, 1 a1scuba.com, 1 a1seowebdirectory.com, 0 -a1speedyrooter.com, 1 a210.online, 1 a24dmng.de, 1 a24help.ru, 1 @@ -5018,6 +4971,7 @@ a9-9.top, 0 a9297.co, 1 a9728.co, 1 +aa-charging.nl, 1 aa-security.be, 1 aa.cx, 1 aa43d.cn, 1 @@ -5079,6 +5033,7 @@ aandachtsmeditatie.nl, 1 aandeautobody.com, 1 aandkevents.co.uk, 1 +aandrpestsolutions.com, 1 aanhpiheritage.gov, 1 aanhuisgebakken.tk, 1 aanlynskool.co.za, 1 @@ -5087,7 +5042,6 @@ aaogaragedoorrepairaustin.com, 1 aaomidi.com, 1 aaoth.xyz, 1 -aap.org, 1 aapa.info, 0 aapant.org.au, 0 aapifund.org, 1 @@ -5179,12 +5133,12 @@ abakan-news.net, 1 abalsa.tk, 1 abambo.tk, 1 +abancommercials.com, 1 abandoned-zone.tk, 1 abandoned.tk, 1 abandonedmines.gov, 1 abanico.tk, 1 abanilla.tk, 1 -abantoclub.com, 1 abantos.tk, 1 abaranov.cf, 1 abaranov.gq, 1 @@ -5261,6 +5215,7 @@ abdelaliezzyn.tk, 1 abdelsater.net, 1 abdened.tk, 1 +abdenterprises.com, 1 abdesign.tk, 1 abdijmale.tk, 1 abditransportinc.com, 1 @@ -5277,10 +5232,10 @@ abdullahavci.org, 1 abdullahavci.org.tr, 1 abdullahavci.tr, 1 -abdullahki.com, 1 abdullahkoyuncu.de, 1 abdullahzubayerofficial.ml, 1 abdulraheem.org, 1 +abdulraheemalick.com, 1 abdulrahman.eu, 1 abdulwahaab.ca, 1 abduramshad.ml, 1 @@ -5319,6 +5274,7 @@ abfluss.com, 1 abg.com.sa, 1 abg.ninja, 1 +abgal.com.au, 1 abgeo.ga, 1 abhaldus.ee, 1 abhandshake.com, 1 @@ -5407,6 +5363,7 @@ abnradiofm.tk, 1 aboat.cc, 1 aboces.org, 1 +abodepestsolutions.com, 1 abogadoperu.com, 1 abogadophd.com, 1 abogadoscav.com, 1 @@ -5637,6 +5594,7 @@ acacia-gardens.co.uk, 1 academiacivilbalonmano.tk, 1 academiacomercialalpina.com, 1 +academiadasaude.net.br, 1 academiadelmolino.com.uy, 1 academiaeureka.tk, 1 academiaofimage.com, 1 @@ -5651,6 +5609,7 @@ academika.tk, 1 academkin.com, 1 academy-awards.ml, 1 +academyb1.ru, 1 academyonlinetoyou.tk, 1 acadeven.com, 1 acadiate.com, 1 @@ -5716,7 +5675,6 @@ access-board.gov, 1 access-nl.org, 1 access-not-allowed.gq, 1 -access-odata.com, 1 access-techniques.com, 1 access-token.tk, 1 access2employment.com, 1 @@ -5729,6 +5687,7 @@ accessibility.gov, 1 accessibilityguidelines.com, 1 accessibledigitallearning.org, 1 +accessibleimpact.org, 1 accessibletravelclub.com, 1 accessibleweb.com, 1 accessingram.com, 1 @@ -5774,8 +5733,7 @@ accpl.co, 1 accreditamento.net, 1 accreditedbuildingservices.com, 1 -accretech.vn, 1 -accsaber.com, 1 +accrue401k.com, 1 accslot.com, 1 accstrading.com, 1 acct-affiliate.com, 1 @@ -5823,7 +5781,6 @@ aceinflatables.com, 1 aceinstituteonline.com, 1 aceitesencantados.com, 1 -acejunkpros.com, 1 acekit-create.com, 1 aceleracaodigital.com, 1 aceleraguria.com.br, 1 @@ -5844,7 +5801,7 @@ acercapartners.com, 1 acereporting.ca, 1 acesaware.org, 1 -acesdenver.com, 1 +acesdenver.com, 0 aceshop702.com, 1 acetaiavaleri.it, 1 acetudy.com, 1 @@ -5902,7 +5859,6 @@ achtpfade.de, 1 achtzehn.de, 1 achtzehn.eu, 1 -achtzig20.de, 0 aci-asiapac.aero, 1 acic-cbit.in, 1 aciclovir.ga, 1 @@ -5913,6 +5869,7 @@ acidtool.com, 1 acierto.com, 1 aciku.com, 1 +acilasevic.com.au, 1 acilicraft.cn, 1 acina.fr, 1 acingov.pt, 1 @@ -5974,6 +5931,7 @@ acousticbuy.com.ua, 1 acoustics.network, 0 acoustics.tech, 1 +acousticshield.tech, 1 acousticsoundrecords.com, 1 acoustictabs.tk, 1 acoustique-tardy.com, 0 @@ -6028,6 +5986,7 @@ acsd-az.gov, 1 acse.net, 1 acsemb.org, 1 +acsense.com, 1 acsiresearch.com, 0 acslogco.com, 1 acsmuhendislik.com.tr, 1 @@ -6094,7 +6053,7 @@ activeclearweb.com, 1 activeexcavator.com, 0 activegateball.tk, 1 -activehealth.com, 1 +activehealth.com, 0 activehire.co.uk, 1 activeleisure.ie, 1 activelife.travel, 1 @@ -6163,7 +6122,7 @@ acuarismo-iquique.tk, 1 acuarius.tk, 1 acuica.co.uk, 1 -acuityfinishing.com, 1 +acuityhcm.com, 1 acuitykp.com, 1 acul.me, 1 aculocity.com, 1 @@ -6173,6 +6132,7 @@ acupuncture.ml, 1 acupuncturecornwall.co.uk, 1 acupuncturefoundation.com, 1 +acupuncturefoundation.org, 1 acupuntura.coach, 1 acupuntura.doctor, 1 acupuntura.institute, 1 @@ -6181,6 +6141,7 @@ acupunturameler.com, 1 acupunturameler.es, 1 acupunturavalencia.xyz, 1 +acura.com.br, 1 acurapartswarehouse.com, 1 acus.gov, 1 acuscribe.com, 1 @@ -6206,13 +6167,7 @@ ad-disruptio.fr, 0 ad-education.com, 1 ad-notam.asia, 1 -ad-notam.co.uk, 1 -ad-notam.com, 1 -ad-notam.de, 1 -ad-notam.it, 1 ad-notam.pt, 1 -ad-notam.uk, 1 -ad-notam.us, 1 ad-s.cn, 1 ad-visions.pl, 1 ad-web.tk, 1 @@ -6244,7 +6199,6 @@ adam.com, 1 adam.id.au, 1 adam.pt, 1 -adamabernathy.com, 1 adamandeva.shop, 1 adamant.ua, 1 adamas-magicus.ru, 1 @@ -6294,7 +6248,6 @@ adappt.ai, 0 adappt.co.uk, 0 adapt-elektronik.com, 1 -adapt-iq.co.nz, 1 adaptationclearinghouse.org, 1 adaptations.uk.com, 1 adaptationtools.com, 1 @@ -6322,7 +6275,6 @@ adassist.nl, 1 adasworks.com, 1 adasystems.uk, 1 -adata-c.kz, 1 adatitleiii.com, 1 adativos.com.br, 1 adats.com, 1 @@ -6412,6 +6364,7 @@ adeldz-foot.cf, 1 adelebeals.com, 1 adelgace.top, 1 +adelhomeservices.com, 1 adeliae.jp, 1 adelicious.co, 1 adelie.org.uk, 1 @@ -6438,10 +6391,10 @@ adex.network, 1 adextremadurafs.tk, 1 adf-safetytools.com, 1 -adf.africa, 1 adf.gov, 1 adfc-nrw.de, 1 adfconsumer.gov.au, 1 +adfirehealth.com, 1 adfisicateca.org, 1 adflegal.org, 0 adfs.pro, 1 @@ -6449,7 +6402,6 @@ adfyl.tk, 1 adg-devochtspecialist.be, 1 adg.is, 1 -adg.vn, 1 adgh.ml, 1 adgift.ro, 1 adgreetz.com, 1 @@ -6491,6 +6443,7 @@ adiraku.co.id, 1 adit.com, 1 aditumconsulting.com, 1 +aditushealth.com.br, 1 adityadees.com, 1 adityaes.eu.org, 1 adityainfotechindia.com, 1 @@ -6520,6 +6473,7 @@ admantium.com, 1 admdr.com, 1 admeco.com, 1 +admeusa.org, 1 admeweb.com, 1 admglass.co.uk, 1 admicos.cf, 1 @@ -6575,10 +6529,10 @@ adnexa.it, 1 adney.land, 1 adnolesh.com, 1 -adnotam.ch, 1 adnscript.tk, 1 adnseguros.es, 1 adolesce.com, 1 +adolfocanto.xyz, 1 adoll.ml, 1 adomani-italia.com, 1 adomicilio.gt, 1 @@ -6614,12 +6568,12 @@ adorkable.social, 1 adorned.ga, 1 adoropets.com.br, 1 +adotta.me, 1 adoucishop.fr, 1 adownloader.org, 1 adp.fr, 1 adphotography.pl, 1 adpot.xyz, 0 -adquest.ro, 1 adr-stock.com, 1 adr.gov, 1 adrafinil.wiki, 1 @@ -6628,6 +6582,7 @@ adreana.com, 1 adregain.com, 1 adregain.ru, 1 +adremtek.com, 1 adrenajump.com.br, 1 adrenalin.is, 1 adrenalin.od.ua, 0 @@ -6643,7 +6598,6 @@ adrianadelrossi.com, 1 adrianagonzalez.tk, 1 adrianajewelry.my, 1 -adrianasantos.me, 0 adrianbechtold.de, 1 adrianbrad.com, 1 adriancitu.com, 1 @@ -6685,12 +6639,13 @@ adsense-arbitrage.com, 1 adseye.tk, 1 adsforcash.ga, 1 +adshooter.com, 1 adsintl.net, 1 adsl2meg.fr, 1 adslink.org, 1 adsmarketing.tk, 1 adsmobilefor.win, 1 -adsmodels.com, 1 +adsmodels.com, 0 adson.at, 0 adson.cz, 0 adson.de, 0 @@ -6712,8 +6667,10 @@ adspu.org, 1 adst.dk, 1 adstasin.com, 1 +adstesting.online, 1 adstop.ga, 1 adstop.ml, 1 +adstriq.com, 1 adstune.com, 1 adsviews.gq, 1 adswoo.com, 1 @@ -6847,7 +6804,6 @@ advertizer.com, 1 adverts.ie, 1 advery.tk, 1 -advgrow.com, 1 advi.no, 1 advice24.tk, 1 advicepay.com, 0 @@ -6913,8 +6869,10 @@ adwork.net, 1 adworldglobal.com, 1 adxperience.com, 1 +adyatanalangit.com, 1 adygeya.cf, 1 adygheya-news.net, 1 +adyton.com, 1 adytonpbc.com, 1 adzie.xyz, 1 adzuna.at, 1 @@ -6967,11 +6925,12 @@ aegee-utrecht.nl, 1 aegee.eu, 1 aegee.org, 1 +aeginity.de, 1 aegis-bot.eu, 1 aegisaccounting.co.uk, 1 aegisalarm.co.uk, 1 aegisalarm.com, 1 -aegisys.com, 1 +aegiscbc.com, 1 aegon.hu, 0 aegrel.ee, 1 aegrel.eu, 1 @@ -6981,9 +6940,11 @@ aeht.eu, 1 aei.ie, 1 aeicommercial.ie, 1 +aeipms.com.au, 1 aeis-api-stg.azurewebsites.net, 1 aeis-api.azurewebsites.net, 1 aejaca.com, 1 +aekb.de, 1 aeksantcugat.tk, 1 aeksistem.com, 1 aekwien.at, 1 @@ -7011,7 +6972,6 @@ aeraulika.it, 1 aere.com, 1 aerelon.de, 1 -aergia.eu, 1 aerialawesome.com, 1 aerialreports.com, 1 aerialworks.ddns.net, 1 @@ -7021,7 +6981,6 @@ aerlux.md, 1 aern.org, 1 aeroalbrook.com, 1 -aerobasegroup.com, 1 aerobiconline.tk, 1 aerobiomasa.com, 1 aerobotz.com, 0 @@ -7042,6 +7001,7 @@ aerojet.com, 1 aeroklub.tk, 1 aerolog.co, 0 +aerometrix.co, 1 aeronautix.com, 1 aeropetz.com.br, 1 aeroplan.tk, 1 @@ -7065,6 +7025,7 @@ aerowillys.tk, 1 aerozone.tk, 1 aertel.ie, 1 +aerztekammer-berlin.de, 1 aerztezentrum.io, 1 aes.org.pt, 1 aesencryption.org, 1 @@ -7127,6 +7088,7 @@ afas-apps.nl, 1 afasim.tk, 1 afasstatus.nl, 1 +afbouw-gevelsupport.nl, 1 afbrunswick.com, 1 afcea.de, 1 afcmrstest.org, 0 @@ -7160,11 +7122,9 @@ aff.gov, 1 aff1xstavka.com, 1 affaire.com, 1 -affairemateriaux.fr, 1 affairs.com, 1 affarsnatverk.nu, 0 affclick.io, 1 -affcreations.com, 1 affect3d.com, 1 affect3dstore.com, 1 affectionate.tk, 1 @@ -7211,7 +7171,7 @@ affordableconnectivity.gov, 1 affordableelectronics.tk, 1 affordablehealthquotesforyou.com, 1 -affordablemedicalusa.com, 0 +affordablemedicalusa.com, 1 affordablepapers.com, 1 affordablevaccinesest.ga, 1 affordacode.com, 1 @@ -7296,14 +7256,13 @@ afrodita.tk, 1 afroditafirm.tk, 1 afroditehotel.tk, 1 -afroenergy.org, 1 afrogospel.tk, 1 afroludi.tk, 1 afroto.com, 0 +afrotv.org.pe, 1 afs-ag.com, 1 afse.fr, 1 afslankstudiovelserbroek.nl, 0 -afsys.com.br, 1 aftamurae.com, 1 after-whoru.tk, 1 afterblokrock.tk, 1 @@ -7388,7 +7347,6 @@ against.tk, 1 againstgynexams.tk, 1 againsttheneighbour.tk, 1 -againsttheodds.es, 1 agalloch.tk, 1 agambition.eu, 1 agamogcloud.com, 1 @@ -7396,6 +7354,7 @@ agapelove.tk, 1 agar-tw.com, 1 agar.kr, 1 +agara-sofvix.com, 1 agarcat.com, 1 agargiulo.com, 1 agari-mj.com, 1 @@ -7452,6 +7411,7 @@ agencetourismemali.ml, 1 agenciaalafia.com.br, 1 agenciacanina.tk, 1 +agenciacoder.com, 1 agenciacorujadesign.com.br, 1 agenciacrown.es, 1 agenciadeperformanceembh.com, 1 @@ -7498,6 +7458,7 @@ agentpak.com, 1 agentpatrolest.ga, 1 agentpoint.website, 1 +agentpress.org, 1 agentprovocateur.com, 1 agentsmith.tk, 1 agentum.ga, 1 @@ -7513,6 +7474,7 @@ ages-its.de, 1 ages-service.de, 1 agesofarda.net, 1 +agesupply.com, 1 ageverif.com, 1 agews.com, 0 agfmedia.com, 0 @@ -7526,7 +7488,6 @@ aggression.tk, 1 aggressivecarwraps.com, 1 aggtechconcrete.com, 1 -aghasahadkhan.com, 1 aghayeva-edler.de, 1 aghdirfood.com, 1 agiairini.cz, 1 @@ -7539,6 +7500,7 @@ agilecraft.com, 1 agilee.io, 1 agilepeopleopsframework.com, 1 +agileviz.com, 1 agilewalls.com, 1 agilextra.com.au, 1 agilicus.ca, 1 @@ -7579,7 +7541,6 @@ agks70.com, 1 agks71.com, 1 agks79.com, 0 -agks8.com, 1 agks83.com, 1 agks87.com, 1 agks888.com, 0 @@ -7628,7 +7589,6 @@ agostiniguyana.com, 1 agostinilimited.com, 1 agostonegro.tk, 1 -agourahillselectric.com, 1 agowa338.de, 1 agpandit.in, 1 agph.org, 1 @@ -7652,6 +7612,7 @@ agricultural-technology.tk, 1 agriculture-schools.com, 1 agriculturejournals.cz, 1 +agridata-ia.com, 1 agrifoodtoday.it, 1 agrifutures.com.au, 1 agrigentonotizie.it, 1 @@ -7675,6 +7636,7 @@ agro.gov.br, 1 agrobank.uz, 0 agrobaza.com.ua, 1 +agrobi.com.ar, 1 agrocabildo.org, 1 agrocare.tk, 1 agroclan.tk, 1 @@ -7757,14 +7719,17 @@ agzy.tw, 1 agzy.vip, 1 aha.io, 1 +ahaber.com.tr, 1 ahanet.tk, 1 ahansen.is, 0 +aharoj.io, 1 ahbap.org, 1 ahccmadison.com, 0 ahccorleone.tk, 1 ahcfacilities.com, 1 ahcpr.gov, 1 ahd.com, 0 +ahdcyber.in, 1 ahealthyjourney.ca, 1 ahegaoroulette.com, 1 ahelos.tk, 1 @@ -7804,7 +7769,6 @@ ahmed-alasadi.tk, 1 ahmed.ovh, 1 ahmed.tk, 1 -ahmedalneaimy.com, 1 ahmedcorp.tk, 1 ahmedelgamalanimations.tk, 1 ahmedkagan.com, 1 @@ -7824,8 +7788,8 @@ ahorrocoop.cl, 1 ahorroenergeticoenhogares.es, 1 ahosamuel.com, 1 +ahosting.net, 1 ahouansou.cz, 1 -ahqf.com, 1 ahrefs.com, 1 ahroproject.org, 1 ahrq.gov, 1 @@ -7847,6 +7811,7 @@ ai-articlehumanizer.cloud, 1 ai-crafters.io, 1 ai-cs.top, 1 +ai-defensesolutions.com, 1 ai-genit.com, 1 ai-kyousei.com, 1 ai-pacs.com, 1 @@ -7861,7 +7826,6 @@ ai00.vip, 1 ai1989.com, 1 ai2-jp.com, 1 -ai47.us, 1 aiabs.co, 1 aiaccinu.eu.org, 1 aiag.org, 1 @@ -7871,7 +7835,6 @@ aiasesoriainmobiliaria.com, 1 aiasnet.it, 1 aiat.net, 1 -aiatsis.gov.au, 1 aiavt-stg-01.com, 1 aib.gov.uk, 1 aibes.org, 1 @@ -7894,13 +7857,13 @@ aicial.co.uk, 1 aickelin.eu, 1 aicpastore.com, 1 +aicreatorvibes.com, 1 aicredit.ro, 1 aicta.ro, 1 aida.org.au, 1 aidablanco.tk, 1 aidaccess.org, 1 aidanamavi.com, 1 -aidanmitchell.uk, 0 aidanmontare.net, 1 aidanpr.com, 1 aidansonlinebooks.com, 1 @@ -7919,10 +7882,12 @@ aidliveers.ga, 1 aido.gq, 1 aidoc.com, 1 +aidong.com, 1 aidoru.net, 1 aidoru.top, 1 aids-dissidents.tk, 1 aids.gov, 1 +aids.org.hk, 1 aie.de, 1 aiesecarad.ro, 1 aievaluare.ro, 1 @@ -8136,6 +8101,7 @@ aircraftnoisemodel.org, 1 aircraftspruce.ca, 1 aircraftspruce.com, 1 +aircrew24.com, 1 aircrewdepot.com, 1 aircrewportpages.com, 1 aircrewtrac.com, 1 @@ -8155,9 +8121,12 @@ airfarecheapeurope.com, 1 airfarecompareprices.com, 1 airfaredealstoindia.com, 1 +airfarefrom.com, 1 +airfarehoteldeals.com, 1 airfaremexicocity.com, 1 airfaresdomestic.com, 1 airfareseconomy.com, 1 +airfaresfrom.com, 1 airfareshotels.com, 1 airfarestoamerica.com, 1 airfarestogermany.com, 1 @@ -8165,6 +8134,7 @@ airfaretousa.com, 1 airfield.gq, 1 airfix.com, 1 +airflightsdeals.com, 1 airflowterravista.com, 1 airflux.fr, 1 airforce-technology.com, 1 @@ -8186,37 +8156,24 @@ airknowledge.gov, 1 airlapse.net, 0 airline-rabota.tk, 1 -airlineairlines.com, 1 -airlineairplane.com, 1 -airlineairports.com, 1 -airlineairways.com, 1 -airlineandhotels.com, 1 -airlineandtickets.com, 1 -airlinebe.com, 1 -airlineblue.com, 1 airlinebookingtickets.com, 1 -airlineby.com, 1 +airlinebuyticket.com, 1 airlinec.com, 1 airlinecheapflightinternationalticket.com, 1 airlinecheapflightticket.com, 1 airlinecheapprices.com, 1 airlinecheaptravel.com, 1 -airlinechicago.com, 1 -airlinedallas.com, 1 airlinedenmark.com, 1 -airlinedomestic.com, 1 airlinefarecheap.com, 1 airlinefarediscount.com, 1 airlinefarelow.com, 1 airlinefareprices.com, 1 airlinefaresdiscount.com, 1 -airlinefee.com, 1 -airlinefirstclass.com, 1 airlineflightcheap.com, 1 +airlineflights.biz, 1 airlineflightsdeals.com, 1 airlineflightsdiscount.com, 1 airlineflightsfares.com, 1 -airlineflightsinternational.com, 1 airlineflightsprices.com, 1 airlineflightsreservations.com, 1 airlineflyingclub.tk, 1 @@ -8225,94 +8182,53 @@ airlinegermany.com, 1 airlinehawaii.com, 1 airlinekorea.com, 1 -airlinelondon.com, 1 airlinenationwide.com, 1 airlinenews.tk, 1 airlinenewzealand.com, 1 airlineoil.com, 1 +airlinep.com, 1 airlineplanetickets.com, 1 -airlinesair.com, 1 airlinesamsterdam.com, 1 -airlinesandhotel.com, 1 -airlinesandtickets.com, 1 -airlinesandtravel.com, 1 airlinesau.com, 1 airlinesaustralia.com, 1 -airlinesboston.com, 1 airlinesbritish.com, 1 -airlinesbrussels.com, 1 -airlinesby.com, 1 -airlinesca.com, 1 airlinescheapfare.com, 1 -airlinescheapflights.com, 1 airlinescheapticket.com, 1 -airlineschicago.com, 1 -airlinesdallas.com, 1 -airlinesdc.com, 1 -airlinesdetroit.com, 1 -airlinesdomestic.com, 1 -airlineseast.com, 1 -airlineseconomy.com, 1 -airlinesfirstclass.com, 1 airlinesfleet.com, 1 airlinesfrom.com, 1 -airlineshouston.com, 1 airlinesingapore.com, 1 -airlinesit.com, 1 airlinesjordan.com, 1 airlineslasvegas.com, 1 -airlineslosangeles.com, 1 airlineslowfare.com, 1 airlinesmiddleeast.com, 1 airlinesname.com, 1 -airlinesnashville.com, 1 -airlinesnewyork.com, 1 airlinesnorthamerica.com, 1 airlinesnyc.com, 1 airlinesofdubai.com, 1 airlinesofmexico.com, 1 -airlinespackages.com, 1 -airlinesparis.com, 1 airlinesphonenumber.com, 1 airlinespolicyhub.com, 1 -airlinessanfrancisco.com, 1 -airlinessingapore.com, 1 +airlinesseating.com, 1 airlinestexas.com, 1 airlinesto.com, 1 -airlinestoalaska.com, 1 -airlinestoamerica.com, 1 airlinestoatlanta.com, 1 -airlinestocanada.com, 1 airlinestochicago.com, 1 -airlinestoeurope.com, 1 -airlinestoflorida.com, 1 -airlinestofrance.com, 1 airlinestogermany.com, 1 airlinestoitaly.com, 1 -airlinestojapan.com, 1 airlinestolasvegas.com, 1 -airlinestolosangeles.com, 1 airlinestomiami.com, 1 -airlinestophoenix.com, 1 -airlinestosingapore.com, 1 +airlinestoorlando.com, 1 airlinestoturkey.com, 1 -airlinestousa.com, 1 -airlinestovegas.com, 1 airlinesturkey.com, 1 -airlinesunitedstates.com, 1 -airlinesvegas.com, 1 -airlinesvietnam.com, 1 airlineti.com, 1 +airlinetic.com, 1 airlineticketscheapflights.com, 1 airlineticketsfrom.com, 1 airlineto.com, 1 airlinetocanada.com, 1 airlinetohawaii.com, 1 -airlinetolasvegas.com, 1 airlinetomiami.com, 1 -airlinetovegas.com, 1 airlinetravelinternational.com, 1 -airlinevegas.com, 1 airlitegroup.com.au, 1 airlok.com.au, 1 airm.aero, 1 @@ -8355,27 +8271,20 @@ airportcyprus.com, 1 airportdc.com, 1 airportfrankfurtgermany.com, 1 -airportgatwick.com, 1 airportgrandhotel.com, 1 airportguam.com, 1 airportholiday.com, 1 airporthotelsgatwick.com, 1 -airportinrome.com, 1 airportknoxville.com, 1 -airportlas.com, 1 airportnz.com, 1 airportofdubai.com, 1 airportpadova.com, 1 airportperth.com, 1 airportsbarcelona.com, 1 -airportsflights.com, 1 -airportsflorida.com, 1 -airportsfo.com, 1 airportstickets.com, 1 airporttaxibudapest.com, 1 airporttransferbudapest.co.uk, 1 airporttransferbudapest.com, 1 -airportturkey.com, 1 airportzo.net.in, 1 airpurifierproductsonline.com, 1 airquestion.org, 1 @@ -8390,8 +8299,8 @@ airship.com, 1 airship.eu, 1 airsidemobile.com, 1 -airslate.com, 1 airsoft.fr, 1 +airsoftgrandeabc.com.br, 1 airsofthub.fr, 1 airsoftpark.cz, 1 airsoftpinoso.tk, 1 @@ -8403,7 +8312,6 @@ airteam.com.au, 1 airtec-france.fr, 1 airterms.cf, 1 -airticketstravel.com, 1 airtimerewards.co.uk, 0 airtrain.gq, 1 airtrolinc.com, 1 @@ -8432,6 +8340,7 @@ aisi316l.net, 1 aising.jp, 1 aisolutions-hammer.at, 1 +aisongchecker.pro, 1 aisp.sg, 1 aispirit.tk, 1 aisrvs.net, 1 @@ -8440,7 +8349,6 @@ aistockcharts.com, 1 aistsist.ga, 1 aistsist.tk, 1 -ait.com.ar, 1 aita.global, 1 aitanaedu.org, 1 aitf-rousai.org, 1 @@ -8542,7 +8450,6 @@ ajsmm.de, 1 ajtmh.org, 1 ajto.pro, 1 -ajukapalme.net, 1 ajvco.com.hk, 1 ajvco.net, 1 ajvocab.com, 1 @@ -8584,7 +8491,7 @@ akaphonelink.com, 0 akaratasker.com, 1 akari.net, 1 -akariforge.com, 1 +akariforge.com, 0 akarisoftware.com, 1 akarisoftware.eu, 1 akaritakai.net, 1 @@ -8623,8 +8530,8 @@ akemineko.tk, 1 akemisp.com.br, 1 akerberri.tk, 1 -akerboom.family, 1 -akerboom.me, 1 +akerboom.family, 0 +akerboom.me, 0 akerboom.org, 1 akerl.com, 1 akerl.org, 1 @@ -8633,7 +8540,6 @@ akesinti.tk, 1 aketzasantacoloma.tk, 1 akf.de, 1 -akfoundationindia.com, 0 akhabar.tk, 1 akhbaralam.cf, 1 akhbareldesh.tk, 1 @@ -8653,6 +8559,7 @@ akimbocore.com, 1 akimeder.tk, 1 akimitsu.co.jp, 1 +akinachan.com, 1 aking.com.my, 0 akinoiro.ru, 1 akinokae.de, 1 @@ -8665,7 +8572,6 @@ akj.io, 1 akkerwinde.tk, 1 akko.wtf, 1 -akkoniq.com, 1 akkordeon-livemusik.de, 1 akkordy-skachat.ga, 1 akkumulator-kereso.hu, 1 @@ -8682,7 +8588,6 @@ akordeoiak.tk, 1 akormatik.com, 1 akostecki.de, 1 -akosuasankofa.com, 1 akouryy.net, 1 akoya.fi, 1 akoyabio.com, 1 @@ -8730,7 +8635,6 @@ aktivace.eu, 1 aktivierungscenter.de, 1 aktivitetatil.com, 1 -aktivpark-lumdatal.de, 1 aktmedurna.com, 1 aktmedurna.se, 1 aktransmission.com, 1 @@ -8830,7 +8734,6 @@ alamitosbaytraders.com, 1 alamoranchhandyman.com, 1 alamotownshipmi.gov, 1 -alana.com.ua, 1 alanalarana.com, 1 alanberger.me.uk, 1 alanbleiweiss.com, 1 @@ -8839,6 +8742,7 @@ alancat.ml, 1 alancolephotography.com, 1 aland.co.uk, 1 +alandeffenderfer.com, 1 alandoyle.com, 1 alandoyle.link, 1 alanforutah.com, 1 @@ -8867,7 +8771,6 @@ alarmnewengland.com, 1 alarmport-security.net, 1 alarmport.cz, 1 -alarmreceiver.com, 1 alarmreceiver.net, 1 alarna.de, 1 alaroche.be, 1 @@ -8988,7 +8891,6 @@ albuterol.ga, 1 albuterolonline.ga, 1 albuterolwithoutprescription.gq, 1 -albuthi.com, 1 albylane.com.au, 1 alca31.com, 0 alcalainos.tk, 1 @@ -9049,6 +8951,7 @@ alderimages.com, 1 aldervets.co.uk, 1 aldevadigital.com, 1 +aldiacademy.com.au, 1 aldien.com.br, 1 aldino-redagno.com, 1 aldipresscentre.co.uk, 1 @@ -9070,6 +8973,7 @@ alector.com, 1 aledoil.gov, 1 aledotx.gov, 1 +aleefgreen.com, 1 aleftinka.tk, 1 alegriafm.tk, 1 alegromania.tk, 1 @@ -9098,6 +9002,7 @@ alelectricista.es, 1 alelin.ml, 1 alemagia.pl, 1 +aleman-auto.com, 1 alemangranada.tk, 1 alen.nl, 1 alena.ga, 1 @@ -9109,7 +9014,7 @@ alendronato.com, 1 alentaja.com, 1 alentaja.fi, 1 -alenvlahovljak.com, 1 +alenvlahovljak.com, 0 alenwich.com, 1 aleph.land, 1 alephsecurity.com, 1 @@ -9120,7 +9025,6 @@ alerrt.org, 1 alert-software.com, 1 alertaenlinea.gov, 1 -alertaspopup.com, 1 alertlogic.com, 1 alertmedia.com, 1 alertoc.gov, 1 @@ -9131,23 +9035,25 @@ alesagglo.net, 1 alescan.it, 1 alesha.tk, 1 -alesizu.net, 1 alesraa-academy.com, 1 alesryjacek.cz, 1 aless.io, 1 alessalopez.exposed, 1 alessandraoliva.tk, 1 alessandrobasi.it, 1 +alessandrokuz.com, 1 alessandrolapiana.com, 1 +alessandrorumi.it, 1 alessandrotravel.com, 1 alessandroz.ddns.net, 1 alessiacornici.com, 1 +alessioligabue.it, 1 alessiomesiano.com, 1 alesto-mail.eu, 1 alesto.at, 1 aleszejdl.cz, 1 aletm.it, 0 -alevel.tech, 0 +alevel.tech, 1 alevi-forum.tk, 1 alevi.tk, 1 alex-klaus.com, 1 @@ -9196,7 +9102,6 @@ alexandre-acaries.fr, 1 alexandre-barret.fr, 1 alexandrebassi.com, 1 -alexandreguarita.com.br, 1 alexandremottier.tk, 1 alexandreshimura.com.br, 1 alexandrevicente.net, 1 @@ -9347,7 +9252,6 @@ algarmatic-automatismos.pt, 1 algarve-1.com, 1 algarve-carhire.net, 1 -algbee.com, 1 algbra.com, 1 alge.xyz, 1 algebra-quiz.com, 1 @@ -9363,7 +9267,6 @@ algoentremanos.com, 1 algoesolutions.com, 1 algoexplorer.io, 1 -algofactory.de, 1 algolia.com, 1 algomadistrictlawassociation.com, 1 algomotion.me, 1 @@ -9399,6 +9302,7 @@ alianet.org, 1 aliansinews.id, 1 aliantsoft.pl, 1 +alianzalabs.com, 1 aliasbox.org, 1 aliasbox.ovh, 1 aliasinfoforums.tk, 1 @@ -9406,7 +9310,6 @@ aliaswp.com, 1 alibabau.tk, 1 alibamu.com, 1 -alibamu.org, 1 alibi-ua.com.ua, 1 alibip.de, 1 alicante-spain.tk, 1 @@ -9429,7 +9332,6 @@ alida.com, 1 aliel.fr, 1 alien-life.tk, 1 -alien.com.co, 1 alien.net.au, 1 alienantfarm.tk, 1 alienclicker.ml, 1 @@ -9469,9 +9371,7 @@ alimanaka-rabesata.tk, 1 aliment-covid19.com, 1 alimentosmcf.com, 1 -alimentsduquebecaumenu.com, 1 alimenty.tk, 1 -alimeta.it, 1 alimtyaz.estate, 1 alimwilliams.tk, 1 alinalamour.com, 1 @@ -9483,6 +9383,7 @@ alinemello.com.br, 1 alineonline.tk, 1 alingroove.com, 1 +alinkbetweennets.de, 1 alinneata.com, 1 alio.lt, 1 aliorange.com, 1 @@ -9500,7 +9401,6 @@ alisoft.gq, 1 alisondavenport.ga, 1 alisonmatter.tk, 1 -alisonswindles.com, 0 alissa-group.com, 1 alissanoir.net, 1 alisstyle.tk, 1 @@ -9576,6 +9476,8 @@ all-mountains.fr, 1 all-music.ml, 1 all-music.tk, 1 +all-payroll-solutions.com, 1 +all-payroll-solutions.de, 1 all-pics.tk, 1 all-rating.tk, 1 all-seo.tk, 1 @@ -9603,7 +9505,6 @@ allaboutnothing.ga, 1 allaboutnothing.gq, 1 allaboutreligions.tk, 1 -allaboutswing.co.uk, 1 allabouttechh.tk, 1 allaboutthekink.org, 1 allaboutyouspa.co.uk, 1 @@ -9621,6 +9522,7 @@ allangirvan.net, 1 allanik.art, 1 allanlopez.tk, 1 +allanspiers.com, 1 allanta.be, 1 allapresenter.com, 1 allarmi.roma.it, 1 @@ -9647,6 +9549,27 @@ allbridges.tk, 1 allbs.pt, 1 allbut.ai, 1 +allbutai.0am.jp, 1 +allbutai.0g0.jp, 1 +allbutai.0j0.jp, 1 +allbutai.0t0.jp, 1 +allbutai.club, 1 +allbutai.daemon.asia, 1 +allbutai.duckdns.org, 1 +allbutai.f5.si, 1 +allbutai.info, 1 +allbutai.keyword-on.net, 1 +allbutai.mydns.bz, 1 +allbutai.mydns.jp, 1 +allbutai.mydns.vc, 1 +allbutai.net, 1 +allbutai.online, 1 +allbutai.org, 1 +allbutai.pgw.jp, 1 +allbutai.server-on.net, 1 +allbutai.shop, 1 +allbutai.wjg.jp, 1 +allbutai.xyz, 1 allbuttpics.com, 1 allcarepharmacy.com, 1 allcelebs.tk, 1 @@ -9656,6 +9579,7 @@ allcloud.com, 1 allcooking.tk, 1 allcookingclub.com, 1 +allcouponat.com, 1 allcourts.tk, 1 allcoveredbyac.com, 1 allcrimea.tk, 1 @@ -9666,7 +9590,6 @@ alldm.ru, 1 alldogs.tk, 1 alldrives.tk, 1 -alldrugs.com, 1 alle-immobilien.ch, 1 alle-zonvakanties.nl, 1 alle.bg, 1 @@ -9702,7 +9625,6 @@ allencrouch.com, 1 allencrouchcfo.com, 1 allendalecounty.gov, 1 -allenhouse.ac.in, 1 allenivory.com, 1 allenkreger.com, 1 allenpcservices.co.uk, 1 @@ -9712,12 +9634,12 @@ allentertainment.de, 1 allenturley.com, 1 allenwillis.ga, 1 -allerbestefreunde.de, 1 allergento.shop, 1 allergento.store, 0 allergictoidiots.tk, 1 allergyweb.cf, 1 allergyweb.ga, 1 +allerhand.design, 1 allerlei-havelte.nl, 1 allerzeiten.com, 1 allerzieleninhetvondelpark.nl, 1 @@ -9775,6 +9697,7 @@ alliancefireandsafety.com, 1 allianceforafreesociety.com, 1 allianceforafreesociety.net, 1 +alliancemannin.com, 1 alliances-globalsolutions.com, 0 alliancesolutionsgrp.com, 1 allianskyrkan.se, 1 @@ -9874,6 +9797,7 @@ allinform.ga, 1 allinformaura.com, 1 allinoutfits.com, 1 +allinparts.ro, 1 allinpdf.com, 1 allinsuranceinformation.com, 1 allintovote.org, 1 @@ -9935,6 +9859,7 @@ allporncomic.com, 1 allpornvids.com, 1 allpost.co, 1 +allprimenumbers.com, 1 allprints.tk, 1 allproptonline.com, 1 allrad-buck.de, 1 @@ -10020,9 +9945,9 @@ allyachts.cf, 1 allyachts.gq, 1 allyfile.com, 1 +allywebsite.com, 1 allyweds.com, 1 almaarkansas.gov, 1 -almaascosmetics.com, 1 almaatlantica.com, 0 almablanca.tk, 1 almabruk.com.ng, 1 @@ -10053,6 +9978,7 @@ almasoft.ga, 1 almastabriz.com, 0 almatinki.com, 1 +almatirecompanies.com, 1 almatytips.com, 1 almawsoa.com, 1 almayadeen.education, 1 @@ -10061,7 +9987,6 @@ almaz-host.tk, 1 almaz-sait-rp.ml, 1 almazroueigroup.ae, 1 -almeera.online, 1 almeerajtour.com, 1 almeeraloyalty.com, 1 almeidaesilvaseguros.com.br, 1 @@ -10073,7 +9998,6 @@ almeva.swiss, 1 almirahomes.com, 1 almirall.com, 1 -almiriatechstore.co.ke, 1 almirvuk.com, 1 almlab.tk, 1 almlc.gov, 1 @@ -10090,7 +10014,6 @@ almufawd.ma, 1 almusbahperfume.com, 0 almut-zielonka.de, 1 -almutawapharmacies.com.kw, 1 almworks.com, 0 almx.net, 1 alnaharnews.net, 1 @@ -10128,7 +10051,6 @@ alonuocsuoi.com, 1 aloo.ga, 1 aloomic.com.au, 1 -aloplay.io, 1 alorimusic.es, 1 aloris-controle.fr, 1 aloro.io, 1 @@ -10136,7 +10058,6 @@ alotso.com, 1 alottajava.com, 1 alov.blog, 1 -alovesinh.com, 1 alp-eastlink-portal-model.azurewebsites.net, 1 alp-samsungca-portal-model.azurewebsites.net, 1 alp-spectrum-portal-model.azurewebsites.net, 1 @@ -10266,6 +10187,7 @@ alrioart.com, 1 alroniks.com, 0 alrowadexchange.com, 1 +alrud.ru, 1 alsaagency.tk, 1 alsabil.tk, 1 alsace-informatique.shop, 1 @@ -10279,7 +10201,6 @@ alsops.cf, 1 alsteadnh.gov, 1 alstertouch.de, 1 -alt-met.ru, 1 alt-pannekow.de, 1 alt-three.com, 0 alt-til-windows.dk, 1 @@ -10287,7 +10208,6 @@ alt.org, 1 alta-densidad.tk, 1 alta-ict.nl, 1 -alta-ritual.com, 1 altabadia.com, 1 altabadia.it, 1 altabash.tk, 1 @@ -10296,6 +10216,7 @@ altabib.me, 1 altabooks.ga, 1 altacomunicazione.tk, 1 +altadenadairy.com, 1 altaef-group.com, 1 altahrim.net, 1 altai-info.ga, 1 @@ -10317,6 +10238,7 @@ altametrics.com, 1 altana.com, 1 altana.de, 1 +altansilver.de, 1 altaplana.be, 1 altarriba.fr, 1 altasierra.co.uk, 1 @@ -10390,7 +10312,6 @@ altieresgomes.com.br, 1 altijdleroy.nl, 1 altijdleroy.online, 1 -altimetrik.com, 1 altimetrique.ca, 1 altimetry.com, 1 altinaypipes.com, 1 @@ -10428,6 +10349,7 @@ altovoltaggio.tk, 1 altoweb.tk, 1 altphotos.com, 1 +altrabio.com, 1 altralamezia.tk, 1 altramarsala.tk, 1 altransport.ca, 1 @@ -10509,6 +10431,7 @@ alwayshowher.tk, 1 alwayslookingyourbest.com, 1 alwaysmine.fi, 1 +alwaysonchat.com, 1 alwayspoweryoga.com, 1 alwin.io, 1 alwistra.eu, 1 @@ -10564,12 +10487,10 @@ amadoraslindas.com, 1 amadorcoe.org, 1 amadorcounty.gov, 1 -amaeruinc.com, 1 amaforro.com, 1 amagdic.com, 1 amagical.net, 0 amagraduates.tk, 1 -amagzine.com, 1 amaiharajuku.com, 1 amaisd.org, 1 amaiz.com, 0 @@ -10645,7 +10566,6 @@ amazarashi.com, 1 amazetimberfurniture.com.au, 1 amazfoods.com.ng, 1 -amazhot.com, 1 amazinations.com, 1 amazing-cars98.tk, 1 amazing-castles.co.uk, 1 @@ -10728,7 +10648,6 @@ ambulanzapediatrica.it, 1 ambulanzaprivata.lombardia.it, 1 ambulanzaprivata.roma.it, 1 -ambulanzeprivate.milano.it, 1 ambulari.cz, 1 ambulatori.it, 1 amcanalense.tk, 1 @@ -10766,6 +10685,7 @@ amelanchiers.tk, 1 amelia-wedding.pl, 1 ameliagb.com, 1 +ameliastudio.co.uk, 1 ameliatillbryssel.se, 1 amelielei.net, 1 amello.de, 1 @@ -10794,7 +10714,6 @@ american-automotive.tk, 1 american-school-search.com, 1 americanaatbrand.com, 1 -americanartwarehouse.com, 1 americanbooks.cf, 1 americanbuzz.tk, 1 americancanyon.gov, 1 @@ -10865,7 +10784,7 @@ amethystcards.co.uk, 1 amethystdevelopment.co.uk, 1 amethystwebsitedesign.com, 1 -ametinsurance.com, 1 +ametinsurance.com, 0 ametrin.biz, 1 amexemp.com, 1 amf.rocks, 1 @@ -10924,6 +10843,7 @@ amimi.tk, 1 amimore.ru, 1 aminafrance.com, 1 +aminatakondeh.me, 1 amineptine.com, 1 aminfarhoodi.tk, 1 aminformatica.ml, 1 @@ -11099,6 +11019,7 @@ amsel305nc.ddnss.de, 1 amsev.de, 1 amsmart.hu, 1 +amsochile.cl, 1 amstelradio.tk, 1 amstelveentje.nl, 1 amsterdam.nl, 1 @@ -11332,13 +11253,16 @@ anciennes-automobiles.fr, 1 anciens.org, 1 ancient-gates.de, 1 +ancient-pain-tattoo.de, 1 ancientlorevillage.com, 1 ancientnorth.com, 1 ancientnorth.nl, 1 +ancitus.com, 1 anclarma.fr, 1 anco.ly, 1 ancolies-andre.com, 0 anconatoday.it, 1 +ancourage.academy, 1 ancuong.com, 1 and-stuff.nl, 1 and-tax.jp, 1 @@ -11445,7 +11369,7 @@ andreiluca.com, 1 andrejbenz.com, 1 andremaciel.pt, 1 -andremalraux.com, 1 +andremalraux.com, 0 andrematosband.tk, 1 andrenguyenvanchau.com, 1 andreoliveira.io, 1 @@ -11514,7 +11438,6 @@ andriekus.tk, 1 andrienko.tk, 1 andrija-gradecak.from.hr, 1 -andro4all.com, 1 android, 1 android-10-inch-tablets.tk, 1 android-center.tk, 1 @@ -11530,8 +11453,8 @@ android-tv.ml, 1 android.com.pl, 1 android.re, 1 +androidapkdata.org, 1 androidcrunch.com, 1 -androidfactory.io, 1 androidfinal.com, 1 androidgaming.tk, 1 androidhack.tk, 1 @@ -11912,6 +11835,7 @@ aniwhen.com, 1 aniya.moe, 1 anja-vastgoed.nl, 1 +anjajoerger.life, 1 anjansundaram.com, 1 anjara.eu, 1 anjocerdena.com, 1 @@ -12085,7 +12009,6 @@ anonase.com, 1 anoncrypto.org, 1 anoneko.com, 1 -anonhq.com, 1 anonicloud.ch, 1 anoniem-domein.nl, 1 anonimizers.tk, 1 @@ -12109,6 +12032,8 @@ anorbank.uz, 1 anordinaryhousewife.com, 1 anorexia-nervosa.tk, 1 +anoria.com, 0 +anosh.se, 1 another.ch, 1 anotherchatsworthfarm.org.uk, 1 anotherfatgeek.net, 1 @@ -12124,13 +12049,14 @@ anova.com, 1 anoxinon.media, 1 anpaju.gq, 1 +anqr.link, 1 anquankongjian.com, 1 anquanssl.com, 1 ans-ge.ch, 0 ans-solutions.com, 1 -ansacaribbeanawards.com, 1 +ansacaribbeanawards.com, 0 ansacoatings.com, 1 -ansamcalfoundation.org, 1 +ansamcalfoundation.org, 0 ansas.net, 0 ansdell.net, 1 anseldam.com, 1 @@ -12243,7 +12169,7 @@ anthrocon.com, 1 anthrocon.net, 1 anthrocon.org, 1 -anthroper.com, 1 +anthroper.com, 0 anthropoid.ca, 1 anti-akw-ac.de, 1 anti-civilisation.tk, 1 @@ -12293,6 +12219,7 @@ antifaschistischeaktioncelle.tk, 1 antifilter.network, 1 antiformiche.it, 1 +antifragilepower.com, 1 antifraud.cf, 1 antifraudcentre-centreantifraude.ca, 1 antifurti.roma.it, 1 @@ -12362,6 +12289,7 @@ antoine-data.tk, 1 antoined.fr, 0 antoinedeschenes.com, 1 +antoineleboyer.com, 1 antoinelounis.com, 1 antoinelounis.xyz, 1 antoineschaller.ch, 0 @@ -12381,7 +12309,6 @@ antoniojr.adv.br, 1 antoniolatimore.com, 1 antoniomarques.eu, 1 -antoniorodriguesadv.com.br, 1 antonios.ch, 1 antonioso.ng, 1 antonioucabinets.com.au, 1 @@ -12504,6 +12431,7 @@ anzing.de, 1 anzio.ca, 1 anztb.org, 1 +ao-gp.org, 1 ao2.it, 1 ao27.net, 1 ao6.works, 1 @@ -12511,6 +12439,7 @@ aoa2.ch, 1 aoadatacommunity.us, 1 aoaprograms.net, 1 +aobaetmo.com, 1 aobogo.com, 1 aod-tech.com, 1 aodisco.co.uk, 1 @@ -12526,10 +12455,8 @@ aok.network, 1 aokae.com, 1 aoken-cf.jp, 1 -aolcollege.com, 1 aomar-mohammedi.tk, 1 aomeikey.org, 0 -aonedatasolution.com, 1 aonhewitt.com.cy, 1 aonhewitt.gr, 1 aonk.bg, 1 @@ -12548,7 +12475,6 @@ aosoracafe.com, 1 aostacarnavals.it, 1 aosus.org, 1 -aotearoa.maori.nz, 1 aotearoafreepress.com, 1 aotearoaleaks.org, 0 aotech.tw, 1 @@ -12604,7 +12530,6 @@ apdtalents.org.tw, 1 apea.com, 1 apec.fr, 1 -apecsustain.com, 1 apedreira.com, 1 apef.ch, 0 apefrog.tk, 1 @@ -12660,7 +12585,6 @@ apfelrat.de, 1 apfhaiti.org, 1 apfm.fr, 1 -apfulfilment.com, 1 apgen.org, 1 apgw.jp, 1 aphantasiac.com, 1 @@ -12668,8 +12592,10 @@ aphelis.net, 1 aphorismen-archiv.de, 1 api-agri.ga, 1 +api-bitrefill.com, 1 api-hany.cf, 1 api.biz.tr, 1 +api.loan, 1 api.lookout.com, 1 api.org.tr, 1 api.recurly.com, 1 @@ -12689,6 +12615,7 @@ apiculture.net, 1 apienergisahomol.com, 1 apifiregroup.com, 1 +apifreaks.com, 1 apigb.com, 1 apigee.com, 1 apigroupinc.com, 1 @@ -12776,7 +12703,7 @@ apokalipsis.tk, 1 apola.best, 1 apolitical.co, 1 -apolloautopecas.com.br, 1 +apollo.dog, 1 apollodiet.com, 1 apollogames.cz, 1 apolloheatingandair.com, 0 @@ -12791,6 +12718,7 @@ apollyon.work, 1 apologrouptv.net, 1 apoly.de, 1 +aponkral.com, 1 aponkral.com.tr, 1 aponkral.dev, 1 aponkral.net, 1 @@ -12799,7 +12727,6 @@ aponkral.org.tr, 1 aponkral.tr, 1 aponow.de, 0 -aponte-systems.com, 1 apophisen.fr, 1 apopka.gov, 1 apoportal.de, 1 @@ -12879,12 +12806,14 @@ appen.com, 1 appen.com.cn, 1 appengine.google.com, 1 +appetiser.com.au, 1 appetto.co, 1 appfollow.io, 1 appgeek.com.br, 1 appgrowing.cn, 1 appgrowing.net, 1 appgurus.com.au, 1 +apphandoff.com, 1 appian-cdn-gov.com, 1 appian-cdn.com, 1 appiancloud-dynamic.com, 1 @@ -12978,7 +12907,6 @@ appo.nl, 1 appodeal.com, 1 appoggiature.fr, 1 -appointible.com, 1 appointment.ga, 1 apponic.com, 1 apponline.com, 1 @@ -13052,6 +12980,7 @@ aprendealvuelo.com, 1 aprendejainternet.tk, 1 aprendele.com, 1 +aprenderalemanonline.com.ar, 1 aprenderjuntos.cl, 1 aprendiendoforexhoy.com, 1 aprendo.com.py, 1 @@ -13133,7 +13062,7 @@ aqenglish.pk, 1 aqihub.info, 1 aqlivia.com, 1 -aqmetrics.com, 0 +aqmetrics.com, 1 aqqrate.com, 1 aqss.rs, 1 aqu.com, 1 @@ -13198,6 +13127,7 @@ aquarestaurantobx.com, 1 aquarillon.fr, 1 aquarium-supplement.net, 1 +aquariumassist.com, 1 aquariumhobby.tk, 1 aquariumhome.tk, 1 aquariymist.tk, 1 @@ -13307,6 +13237,7 @@ ararrl.com, 1 ararrl.net, 1 ararrl.org, 1 +arasdigital.co, 1 arasikackm.com, 1 arasozgun.net, 1 aratum.com, 1 @@ -13353,6 +13284,7 @@ arc.int, 0 arc.net, 1 arc.run, 1 +arca.fst.br, 1 arca.info.ro, 1 arca.live, 1 arcada-company.com, 1 @@ -13364,16 +13296,18 @@ arcadiaeng.com, 1 arcadiaquill.com, 1 arcaik.net, 1 +arcaleus.com, 1 arcana-noctis.tk, 1 +arcanavana.com, 1 arcandadults.org, 1 arcane.no, 1 arcanecoast.ru, 1 arcanefrost.de, 1 arcanehardware.com, 1 +arcanemotorsport.com.au, 1 arcanetides.com, 1 arcarwegrow.pl, 1 arcbouncycastles.co.uk, 1 -arcchildren.org, 1 arcenotas.com, 1 arcese.com, 1 arcgpw.org, 1 @@ -13395,7 +13329,6 @@ archframe.net, 1 archi.ve.it, 1 archicgi.com, 1 -archijobbtp.com, 1 archimede.ovh, 1 archined.nl, 1 archinext.io, 1 @@ -13449,6 +13382,7 @@ arcogb.co, 1 arcoidaho.gov, 1 arcoiriscastellon.tk, 1 +arcolaai.com, 1 arcolapdtx.gov, 1 arcolasecurities.com, 1 arcolatexas.gov, 1 @@ -13492,6 +13426,7 @@ ardeche-guide.com, 1 ardennes.com, 1 ardens.co.uk, 1 +ardent-peche.com, 1 ardentinsure.com.au, 1 ardentsia.com, 1 ardenwolfsky.com, 1 @@ -13553,6 +13488,7 @@ arenlor.com, 1 arenlor.info, 1 arenns.com, 1 +arensinnrettingar.is, 1 arentuna.se, 1 arenzanaphotography.com, 1 areproduktioqn.tk, 1 @@ -13575,7 +13511,6 @@ arezzoportugal.com, 1 arfulus.com, 1 arfycat.com, 1 -arg.zone, 1 argama-nature.com, 1 arganaderm.ch, 0 arganwinkel.nl, 1 @@ -13594,7 +13529,6 @@ argo-vision.com, 1 argo-vision.it, 1 argo.vision, 1 -argolacosmetique.ca, 1 argolacosmetique.com, 1 argon18.com, 1 argon2.online, 1 @@ -13603,7 +13537,7 @@ argos.co.uk, 1 argosasist.co.uk, 1 argosrisk.com, 1 -argoswimvideo.com, 0 +argoswimvideo.com, 1 argotplan.com, 1 argovpay.com, 1 argovpn.com, 1 @@ -13614,7 +13548,6 @@ argyrouminas.digital, 1 argyrouminas.eu, 1 arhan.sh, 1 -arheh.com, 1 arhgrille.com, 1 arhipka.tk, 1 arhitectura.ru, 1 @@ -13735,6 +13668,7 @@ arkaitzmolinuevo.com, 1 arkanpath.com, 1 arkansastitlesearch.com, 1 +arkazys.com, 1 arkcapitaltrading.com, 1 arkdev.fr, 0 arkenstone.ml, 1 @@ -13783,7 +13717,6 @@ armageddonclan.tk, 1 armahackers.tk, 1 armakuni.com, 1 -armamentevolved.com, 1 armancodes.com, 0 armand-colin.com, 1 armanddesign.nl, 1 @@ -13827,12 +13760,12 @@ armorsoft.fr, 1 armorynode.net, 1 armourfloorsnd.com, 1 -armourroofcolorado.com, 1 armourroofinc.com, 1 armsco.fr, 1 armsdr.com, 1 armsteadproject.org, 0 armstrong.com.mx, 1 +armstrongheatingandcooling.com, 1 armstrongremovals.com.au, 0 armtopnews.tk, 1 army-technology.com, 1 @@ -13844,7 +13777,6 @@ armymuseumlahore.pk, 1 armyofflyingmonkeys.com, 1 armyrtf.com.au, 1 -armyuniversity.edu, 1 armywear.ga, 1 arn.com, 1 arn0.cc, 1 @@ -13963,7 +13895,6 @@ arroapp.com.ar, 1 arroba.digital, 1 arrotatore.roma.it, 1 -arrow-api.nl, 1 arrowduty.ml, 1 arrowfastener.com, 1 arrowgrove.com, 0 @@ -14001,6 +13932,7 @@ arsmedica.ch, 1 arsmedika.ru, 1 arsmundi.de, 1 +arssalva.fr, 1 arstechni.ca, 1 arstudentloanhelp.com, 1 art-athens.com, 1 @@ -14017,6 +13949,7 @@ art-khotyn.tk, 1 art-kuchni.tk, 1 art-news.tk, 1 +art-okno.com, 1 art-okon.ru, 1 art-online.tk, 1 art-pix.de, 1 @@ -14109,7 +14042,6 @@ artevos.com, 1 artevos.de, 1 artexhibition.jp, 1 -artextasia.com, 1 artfabrics.com, 1 artfarms.ca, 1 artformcollective.com.au, 1 @@ -14191,7 +14123,6 @@ artistree.io, 1 artistreplugged.com, 1 artistrunwebsite.com, 1 -artium.agency, 1 artivo-gallery.com, 1 artizlibranza.com, 1 artj.jp, 1 @@ -14199,6 +14130,7 @@ artlab.tk, 1 artlantis.nl, 1 artleading.ru, 1 +artless.at, 1 artlifeisgood.com, 0 artlinestix.com.au, 1 artlogo.biz, 1 @@ -14228,7 +14160,6 @@ artolaros.nl, 1 artomalu.tk, 1 artomili.com, 1 -artouch.com, 1 artozoul.fr, 1 artphototravel.net, 1 artplaneta-leto.by, 1 @@ -14249,8 +14180,6 @@ artscanvas.org, 1 artshouse.com.au, 1 artsinbushwick.org, 1 -artslife.com, 1 -artsmagazine.com, 1 artsongcolorado.org, 1 artspac.es, 0 artspark.tk, 1 @@ -14305,9 +14234,9 @@ arviksa.co.uk, 1 arvin.com.co, 1 arvindhariharan.me, 1 +arvindsharma.co.in, 1 arvostettu.fi, 1 arvutiladu.ee, 1 -arvyncerezo.com, 1 arw.me, 1 arwensiberian.tk, 1 arweth.com, 1 @@ -14355,6 +14284,7 @@ as207618.net, 1 as207960.net, 1 as209245.net, 1 +as212024.net, 1 as216318.net, 1 as29.net, 1 as41073.net, 1 @@ -14380,7 +14310,6 @@ asancharge.tk, 1 asandu.eu, 1 asankomara.tk, 1 -asanprop.com, 1 asansol.tk, 1 asantosdev.com, 1 asanuma-clinic.jp, 1 @@ -14414,7 +14343,6 @@ ascamo.tk, 1 ascannes-non-officiel.tk, 1 ascar.us, 1 -ascavia.cz, 1 ascenderhcm.com, 1 ascendi.no, 1 ascendix.com, 0 @@ -14435,6 +14363,7 @@ ascirno.com, 1 ascl.org.uk, 1 asco.com.mx, 1 +ascofiltri.com, 1 ascolibasi.tk, 1 ascom.vi.it, 1 ascopeshipping.co.uk, 1 @@ -14447,7 +14376,6 @@ asdf.one, 1 asdfqwerty.duckdns.org, 1 asdwfwqd.com, 1 -aseannow.com, 1 asecla.com, 1 asecus.ch, 1 aseelanimalhealth.com, 1 @@ -14483,6 +14411,7 @@ asgeirolafs.com, 1 asgfinancialadvisors.com, 1 asgnqpc.com, 1 +ashantiperu.org, 1 ashargrosirparfum.com, 1 asharq.com, 1 ashastalent.com, 0 @@ -14513,7 +14442,6 @@ ashesheriff.gov, 1 ashevillemenshealth.com, 1 ashfak.tk, 1 -ashfordcastle.com, 1 ashgroveclinic.com.au, 1 ashgw.me, 0 ashiba-kagu.com, 1 @@ -14579,7 +14507,6 @@ asiansnus.com, 1 asiansolequeen.com, 1 asiansongs.tk, 1 -asianspa.co.uk, 1 asiantube.tv, 1 asianwebcams.webcam, 1 asiaoptom.com, 1 @@ -14630,6 +14557,7 @@ asker-massasje.no, 1 askerweb.cf, 1 askeverythingonline.com, 1 +askeygeek.com, 1 askfoto.com, 1 askfront.com, 1 askgamblers.com, 1 @@ -14719,7 +14647,7 @@ asphyxia.su, 1 aspi.cz, 1 aspietechygamer.tk, 1 -aspiracloud.com, 1 +aspiracloud.com, 0 aspirantum.com, 1 aspirateur-anti-pollution.fr, 1 aspirateur-univers.com, 1 @@ -14737,7 +14665,9 @@ aspisdata.com, 1 aspjvm.com, 1 aspontes.org, 1 +aspor.com.tr, 1 asportnoy.com, 1 +aspph.org, 1 aspr.gov, 1 aspr.group, 1 asprion.org, 1 @@ -14777,6 +14707,7 @@ assemblee-copropriete.fr, 1 assemblee-nationale.ga, 1 assemblyai.com, 0 +assemblyservice.co.uk, 1 assemblytoolbox.com, 1 assemblywithoutthewalls.org, 1 assens.dk, 0 @@ -14827,7 +14758,6 @@ assistere-in-famiglia.it, 1 assistivebathing.co.uk, 1 assistmedica.com, 1 -assistouest.fr, 1 assistouest.net, 1 assistouest.shop, 1 assmb.ly, 1 @@ -14882,7 +14812,7 @@ astengox.com, 1 astenretail.com, 1 astera-led.com, 1 -astera.com, 1 +astera.com, 0 asterhu.com, 1 asterinu.xyz, 1 asterisk.lol, 1 @@ -14916,6 +14846,7 @@ astqx.com, 1 astraai.com, 1 astraalivankila.net, 0 +astraelle.space, 1 astrakhan-gorod.ga, 1 astrakhan-news.net, 1 astrakhan.cf, 1 @@ -14957,7 +14888,6 @@ astrojunkies.com, 1 astrolab.tk, 1 astroloeches.tk, 1 -astrologeminesolakoglu.com, 1 astrologerumesh.com, 1 astrologic.cf, 1 astrologics.in, 1 @@ -14987,7 +14917,6 @@ astrostart.tk, 1 astroteam.tk, 1 astrovandalistas.cc, 1 -astrox.casino, 1 astroxe.com, 1 astroze.it, 1 astrumadvies.nl, 1 @@ -15027,7 +14956,6 @@ asws.nl, 1 asyadexpress.com, 1 asyaport.com, 1 -asyaturk.org, 1 asyikbelanja.com, 1 asylbarn.no, 1 asylinfo.no, 1 @@ -15100,13 +15028,12 @@ ateitis.net, 1 atelier-aleph.fr, 1 atelier-eddie.nl, 1 -atelier-lebreton.fr, 1 atelier-naruby.cz, 1 atelier-rk.com, 1 atelier-viennois-cannes.fr, 1 atelierbeautebk.com, 1 atelierbw.com, 1 -ateliercommerce.com, 1 +ateliercommerce.com, 0 atelierdelachaine.fr, 0 atelierdelacreation.com, 1 atelierferro.be, 1 @@ -15250,7 +15177,6 @@ atlantischild.hu, 1 atlantisdx.de, 1 atlantisgold.bg, 1 -atlantismd.com, 1 atlantistowingservice.com, 1 atlantiswaterproofing.com, 0 atlantium.tk, 1 @@ -15380,9 +15306,11 @@ atrogi.com, 1 atropos.co, 1 ats.net, 1 +atsfleetservice.com, 1 atsol.com, 1 atspeeds.com, 1 attadigital.com, 1 +attainableresultsgroup.com, 1 attanasioluigi.tk, 1 attatroll.de, 1 attawauganfirect.gov, 1 @@ -15392,6 +15320,7 @@ attendanceondemand.com, 1 attendanceradar.com, 1 attendhealth.com, 1 +attendthesabbath.com, 1 attendu.cz, 0 attengo.ga, 1 attentioninsight.com, 1 @@ -15402,7 +15331,6 @@ atticinsulationexpertshouston.com, 1 atticlightstudio.net, 1 atticode.io, 1 -atticusblog.com, 1 attilavandervelde.nl, 1 attiliospagnolo.it, 1 attinderdhillon.com, 1 @@ -15432,6 +15360,7 @@ atulhost.com, 1 atumfire.ru, 1 atunel.tk, 1 +atvirtual.at, 1 atvlifesaver.net, 1 atvsafety.gov, 1 atwatermn.gov, 1 @@ -15497,7 +15426,6 @@ audifs.com, 0 audilio.it, 1 audio-arte.pt, 1 -audio-detector.com, 1 audio-extractor.net, 1 audio-joiner.com, 1 audio.servemp3.com, 1 @@ -15638,9 +15566,11 @@ aura7chakr.com, 1 aurabasketball.com, 1 aurabasketball.fr, 1 +aurabestari.com, 1 aurac.org.nz, 1 auraedu.me, 1 aurahiemis.tk, 1 +aurahome.studio, 1 aurainfosec.com, 0 aurainfosec.com.au, 0 aurakink.com, 1 @@ -15749,7 +15679,7 @@ austcm.com.au, 1 austenplumbing.com, 1 austercita.tk, 1 -austickcarremoval.com.au, 0 +austickcarremoval.com.au, 1 austillconstruction.com, 1 austin-security-cameras.com, 1 austinbestdjs.com, 1 @@ -15775,7 +15705,6 @@ australianattractions.com.au, 1 australiancattle.dog, 1 australiancurriculum.edu.au, 0 -australiangeographictravel.com, 1 australiangold.net, 1 australianhimalayanfoundation.org.au, 0 australianimmigrationadvisors.com.au, 1 @@ -15987,6 +15916,8 @@ automaatic.com, 1 automagischeberegening.nl, 1 automastercastlerock.com, 1 +automateanything.pro, 1 +automatedcloud.africa, 1 automaticagarage.it, 1 automationlab.it.com, 1 automationpro.me, 1 @@ -16170,7 +16101,6 @@ autoofficina.it, 1 autopadconnect.com, 1 autopapo.com.br, 1 -autopark-ost-fichtner.de, 1 autoparts-for-foreigncars.tk, 1 autoparts-russia.ru, 1 autoparts.im, 1 @@ -16187,6 +16117,7 @@ autopocket.co, 1 autopopaccidentrepair.co.uk, 1 autoportal.tk, 1 +autopot.nl, 1 autopril.com, 1 autoprogconsortium.ga, 1 autops.ma, 1 @@ -16280,7 +16211,6 @@ autozaz.ml, 1 autozuki.com, 1 autres-talents.fr, 1 -auts.fi, 0 autumnhungary.tk, 1 autumnplantfair.nz, 1 autya.ga, 1 @@ -16324,6 +16254,7 @@ avaibooksports.com, 1 avail-sw.io, 1 available.direct, 1 +available.is, 1 availablecastles.com, 1 availablefonts.com, 1 availablereportsest.ga, 1 @@ -16377,7 +16308,6 @@ avanteinversiones.es, 1 avantnr.com, 1 avantumrx.com, 1 -avanwyk.com, 1 avanzbanc.com, 1 avanzza.net, 1 avaralar.tk, 1 @@ -16403,7 +16333,6 @@ avedesk.org, 0 avedisrecovery.com, 1 aveenstra.com, 1 -avegaedge.com, 1 avelengo.org, 1 avellinotoday.it, 1 aveloair.com, 1 @@ -16434,6 +16363,7 @@ avepol.eu, 1 averageinspired.com, 1 averbuch.net, 1 +averbuch.org, 1 averen.co.uk, 1 averge.co.za, 1 averin.pro, 1 @@ -16510,7 +16440,6 @@ aviprime.by, 1 avirahost.com.br, 1 aviruptribedi.com, 1 -avisbabes.com, 1 avishanx.com, 1 avishwebsoft.com, 1 avisodeprivacidad.info, 0 @@ -16582,8 +16511,8 @@ avs.be, 1 avsd01.com, 1 avstack.io, 1 -avstekla.ru, 1 avt-ukraine.com, 1 +avtechno.ru, 1 avtecmedia.com, 0 avto-bazar.tk, 1 avto-signal.cf, 1 @@ -16688,7 +16617,6 @@ awo-sh.de, 1 awoau.com.au, 1 awqaf.gov.ae, 1 -awqaf.gov.ly, 1 awrcourtreporter.com, 1 awrcourtreporters.com, 1 awrcourtreporting.com, 1 @@ -16756,6 +16684,7 @@ axiniteguitars.com, 1 axioinvest.com, 1 axiom4.net, 1 +axioma-ai.ru, 1 axiomametering.com, 1 axiome.cpa, 1 axiomecomptables.ca, 1 @@ -16863,6 +16792,7 @@ aymerick-dupouey.fr, 1 aymhome.top, 0 ayon-games.tk, 1 +ayosante.com, 1 ayothemes.com, 1 ayotteshackelford.com, 1 ayresalpine.com, 1 @@ -17019,6 +16949,7 @@ azimut.fr, 1 azimuth-ast.ru, 1 azimuthint.com, 1 +azimutmedical.com, 1 azinfoolad.com, 1 azingostar.tk, 1 azithromycin.ga, 1 @@ -17101,6 +17032,7 @@ azzorti.com, 1 azzorti.pe, 1 azzurrapelletterie.it, 1 +b-12.ai, 1 b-angel.info, 1 b-b-law.com, 1 b-coal.com, 0 @@ -17116,6 +17048,7 @@ b-lenos.com, 1 b-m-druck.de, 1 b-root-force.de, 1 +b-secure.co, 1 b-services.net, 0 b-swiss.com, 1 b-ticket.ch, 1 @@ -17134,6 +17067,8 @@ b1.work, 1 b1031.com, 1 b11p.com, 1 +b12-labs.com, 1 +b12labs.ai, 1 b131000.com, 0 b1c1l1.com, 1 b1drivers.com, 1 @@ -17168,7 +17103,6 @@ b4r7.de, 1 b4z.eu, 1 b5197.co, 1 -b5dev.com, 1 b5i.net, 1 b61688.com, 1 b62aa.com, 1 @@ -17369,7 +17303,7 @@ babyinthehouse.com.br, 1 babykappy.com, 1 babylonclub.cf, 1 -babymall.hk, 0 +babymall.hk, 1 babymasaze.cz, 1 babymozg.ga, 1 babynamen.nl, 1 @@ -17411,6 +17345,7 @@ bacgroupinc.com, 1 bacgrouppublishing.com, 1 bach-frederiksen.dk, 1 +bacharach.law, 1 bachata.berlin, 1 bachata.info, 1 bache-barre.fr, 1 @@ -17488,7 +17423,6 @@ backwpup.com, 1 backy2.com, 1 backyardaddict.com, 1 -backyardbella.com, 1 backyardchickens.com, 1 backyardtaco.com, 1 backzoneterapi.dk, 1 @@ -17544,6 +17478,8 @@ badf00d.de, 1 badge.rs, 1 badgeboundprep.com, 1 +badgerherald.com, 1 +badgeron.io, 1 badges.fedoraproject.org, 1 badges.stg.fedoraproject.org, 1 badgetree.com, 1 @@ -17576,7 +17512,6 @@ badnjar.rs, 1 badodds.ga, 1 badoinkvr.com, 1 -badoo.com, 1 badoo.com.ar, 1 badoo.de, 1 badoo.eu, 1 @@ -17612,6 +17547,7 @@ baer-concepts.de, 1 baer-holger.de, 0 baer.space, 1 +baerlin-umzuege.de, 1 baesystems-she.com, 1 baeverdock.com, 1 baevserver.ddns.net, 1 @@ -17681,7 +17617,7 @@ bailbondsdirect.com, 1 baildonhottubs.co.uk, 1 baileebee.com, 1 -baileyladders.com.au, 1 +baileyladders.com.au, 0 baileysharborwi.gov, 1 baileystrailsystem.org, 1 baileyventuresllc.com, 1 @@ -17753,7 +17689,6 @@ bakercountysheriffor.gov, 1 bakersafari.co, 1 bakersfieldhomeoffer.com, 1 -bakerviewdentalcentre.com, 1 bakerymazowsze.co.uk, 1 bakesy.shop, 0 bakeup.be, 1 @@ -17795,6 +17730,7 @@ balance.education, 1 balance.equipment, 1 balance.technology, 1 +balanceandtest.com, 1 balancecreamers.ga, 1 balancecreamest.ga, 1 balancedbrawl.net, 1 @@ -17886,6 +17822,7 @@ balluncar.tk, 1 ballweg-tech.de, 1 balneariodearchena.com, 1 +balo2.com, 1 baloch-intelligence.tk, 1 balochism.tk, 1 baloncestoarqueros.tk, 1 @@ -17936,7 +17873,6 @@ bamily.rocks, 1 baming.com, 1 bammatta.ch, 1 -bamoza.com, 1 bampers.tk, 1 ban-list.gq, 1 banabarka.tk, 1 @@ -18019,7 +17955,6 @@ banes.ch, 1 banfieldentertowin.com, 0 banfieldtravel.it, 1 -banfun.org, 1 bangabandhu.tk, 1 bangbangboys.tk, 1 bangberlin.tk, 1 @@ -18039,6 +17974,7 @@ banglargolpo.tk, 1 banglatec.tk, 1 banglets.com, 1 +bangogolufsen.is, 1 bangphai.com, 1 bangsparks.com, 1 bangujero.tk, 1 @@ -18063,12 +17999,14 @@ bankasubeleri.tk, 1 bankbranchlocator.com, 1 bankcib.com, 1 +bankconverter.co.uk, 1 bankcustomer.gov, 1 bankcustomerassistance.gov, 1 bankee.us, 1 bankenconfigurator.nl, 1 banker.vn, 1 bankera.com, 1 +bankers-ins.com, 1 banket-furshet-spb.ru, 1 banketbesteld.nl, 1 bankffin.kz, 0 @@ -18187,13 +18125,14 @@ baravalle.com, 1 baraxolka.ga, 1 baraxolka.ml, 1 +barbar.codes, 1 +barbara-bertagnolli.co.uk, 1 barbara-fuchs-gruene-fuerth.de, 1 barbarabryce.com, 1 barbaraedanielsantos.ga, 1 barbarafabbri.com, 1 barbaramoorman.tk, 1 barbarareynoldsphotography.com, 1 -barbarianbear.art, 1 barbarians.com, 0 barbas.com, 1 barbate.fr, 1 @@ -18207,7 +18146,7 @@ barbiecollectorjapan.gq, 1 barbieforteza.tk, 1 barbinlaw.com, 1 -barbnow.com, 1 +barbnow.com, 0 barbonnetje.nl, 1 barbosha.ru, 1 barbourcountyal.gov, 1 @@ -18241,6 +18180,7 @@ bardiharborow.com, 1 bardoferry.com, 1 bardtech.com, 1 +bardtini.com, 1 barduschinamusic.org, 1 barefoodinrome.it, 1 barelias.tk, 1 @@ -18315,6 +18255,7 @@ barnvets.co.uk, 1 barnwellcountysc.gov, 1 barobax.tk, 1 +barobirlik.org.tr, 1 barobot.net, 1 barocco.by, 1 baroclean.fr, 1 @@ -18347,7 +18288,7 @@ barraqueirotransportes.pt, 1 barrasaccess.com, 1 barratennis.com.br, 1 -barrebody.com.au, 1 +barrebody.com.au, 0 barreiroappraisals.com, 1 barrelfish.org, 1 barrencountyky.gov, 1 @@ -18357,7 +18298,7 @@ barristerconnect.com, 0 barro.ga, 1 barruntos.tk, 1 -barrybulakites.co, 0 +barrybutcher.com, 1 barrycountye911.gov, 1 barrydenicola.com, 0 barrymarkus.tk, 1 @@ -18408,6 +18349,7 @@ bas.sh, 1 bas.surf, 1 bas.work, 1 +basakkayabeauty.com, 1 basalticfarms.com, 1 basauristudios.com, 1 basaveshwaraborewells.tk, 1 @@ -18432,8 +18374,8 @@ basecore.co, 1 based.gr, 1 based.win, 1 +basedoll.cn, 1 basedonline.nl, 1 -basedriver.com, 1 baseerapp.com, 1 baseerat-academy.com, 1 basel-gynaecology.com, 1 @@ -18548,6 +18490,7 @@ bastion-scan.eu, 1 bastionadvokat.ml, 1 bastionentifo.tk, 1 +bastionthermalworks.com, 1 bastisgroup.com, 1 bastolino.de, 1 bastotrekking.pt, 1 @@ -18596,6 +18539,7 @@ batemanbuilds.com, 1 bateriaprofesional.es, 1 baterias.com, 1 +bateriasencasa.com, 1 baterioverolety.cz, 1 batescountymo.gov, 1 batesvillearkansas.gov, 1 @@ -18620,7 +18564,7 @@ batipiscine.com, 1 batipresta.ch, 0 batista.g12.br, 1 -batistasbakery.com, 1 +batistasbakery.com, 0 batitrakya.org, 1 batiweb.tv, 1 batiwebgroup.com, 0 @@ -18648,6 +18592,7 @@ batteryreconditioning.ml, 1 battl-victory-records.com, 1 battle-arena.tk, 1 +battle-scars.org.uk, 1 battlecruiser.ch, 1 battlefield1942.tk, 1 battleforkhashuri.tk, 1 @@ -18658,6 +18603,8 @@ battlemedialab.com, 1 battlerealms.cc, 1 battlerite.tk, 1 +battlescars.org.uk, 1 +battlescarsselfharm.org.uk, 1 battletech.tk, 1 battletrades.net, 1 battreil.tk, 1 @@ -18698,7 +18645,6 @@ baufiexpress.info, 1 baufiexpress.net, 1 baufiexpress.org, 1 -baugelitt.eu, 1 baugemeinschaftbernstein.de, 1 baugeshite.de, 1 bauhaus.cz, 1 @@ -18706,7 +18652,9 @@ bauhoftoo.ee, 1 baukebies.nl, 1 baukelek.tk, 1 +baulio.de, 1 baum-gruenpflege.de, 1 +baumaniswildfire.ca, 1 baumannfabrice.com, 1 baumansound.com, 1 baumbet.ro, 1 @@ -18715,7 +18663,6 @@ baumkletterschule.de, 1 baumkuchen-aus-dresden.de, 0 baummer.com.br, 1 -bauplanmanager.com, 1 baurs.com, 1 bausep.de, 1 bausparkassen.tk, 1 @@ -18727,6 +18674,7 @@ bavaria-feuerloeschershop.de, 1 bavarovillage.com, 1 bavartec.de, 1 +baverdock.com, 1 bavi.tk, 1 bavoogi.com, 1 bawag.at, 1 @@ -18753,7 +18701,6 @@ bayareamustangs.tk, 1 bayareaplasticsurgery.com, 1 bayashi.net, 1 -bayati.me, 1 baycialis.net, 1 baycitymi.gov, 1 baycountyfltax.gov, 1 @@ -18803,7 +18750,6 @@ bazaart.com, 1 bazaart.me, 1 bazaclub.ru, 0 -bazafashion.com, 1 bazahub.club, 1 bazait.com, 1 bazaleev.ru, 1 @@ -18847,6 +18793,7 @@ bbb4all.de, 1 bbbb.loan, 1 bbbbb.men, 1 +bbbexpo.com, 1 bbbff.net, 1 bbbswcmd.org, 1 bbc.co.uk, 0 @@ -19006,6 +18953,7 @@ bdpn.ru, 1 bdrmedia.rs, 1 bdrops.de, 1 +bdsd.pl, 1 bdsm-erotik.com, 1 bdsmbibliothek.net, 1 bdsmcontrol.com, 1 @@ -19180,9 +19128,7 @@ beauty-blog.gq, 1 beauty-form.ir, 1 beauty-haircare.tk, 1 -beauty-salon-lino.com, 1 beauty-schools.com, 1 -beauty-secrets.ir, 1 beauty-stories.tk, 1 beauty-style.ml, 1 beauty-town.tk, 1 @@ -19224,7 +19170,9 @@ beaver-creek.ga, 1 beavercityut.gov, 1 beaverdamautos.com, 1 +beaverdck.com, 1 beaverdoc.com, 1 +beaverdocj.com, 1 beaverdock.ai, 1 beaverdock.co, 1 beaverdock.com, 1 @@ -19233,9 +19181,14 @@ beaverdock.org, 1 beaverdock.us, 1 beaverdock.xyz, 1 +beaverdocl.com, 1 beaverdok.com, 1 beaverdokc.com, 1 +beaverdovk.com, 1 +beaverdoxk.com, 1 beaverdpck.com, 1 +beaverdsck.com, 1 +beaverfock.com, 1 beaverheadcountymt.gov, 1 beaverock.com, 1 beaversock.com, 1 @@ -19258,7 +19211,6 @@ bebefofuxo.com.br, 1 bebemamae.com, 1 bebes.uno, 1 -bebesreborns.com, 1 bebest.gov, 1 bebetrotteur.com, 1 bebidasrd.com, 1 @@ -19305,10 +19257,10 @@ beccaanne.photography, 1 beccajoshwedding.com, 1 bech32.net, 1 -beck.id, 1 beck.pl, 1 beckdesign.tk, 1 becker-annika.de, 1 +becker-maschinen.com, 1 becker.wales, 1 becker8.de, 1 beckermn.gov, 1 @@ -19362,6 +19314,7 @@ bedrijfsfeesten.tk, 1 bedrijfsfotoreportages.nl, 1 bedrijfswasmachine.nl, 1 +bedrijvenparktreurenburg.nl, 1 bedroc.com, 0 bedrockcommunity.ml, 1 bedrockdata.com, 1 @@ -19409,7 +19362,6 @@ beekeepingfiji.com, 1 beeksnetwork.nl, 1 beeliarspirit.org, 1 -beelikeus.pl, 1 beeline.am, 1 beelit.com, 0 beelitz.de, 1 @@ -19424,6 +19376,8 @@ beenox.com, 1 beeone.nl, 1 beep.vip, 1 +beepan.com, 1 +beepanwang.com, 1 beepassvpn.com, 1 beepcar.ru, 1 beeportfolio.com, 1 @@ -19475,6 +19429,7 @@ befaster.fit, 1 beffeet.com, 1 befoodsafe.gov, 1 +before.click, 1 beforeafter.gq, 1 beforethedawn.tk, 1 beforeyoueatoc.com, 1 @@ -19521,6 +19476,7 @@ behealthandrehab.com, 1 behealthoncologia.com, 1 behealthpr.com, 1 +behealthyeveryday.eu, 1 behealthyoga.com, 1 beheeronline.nl, 1 behemoth.cf, 1 @@ -19567,6 +19523,7 @@ bekam.my, 1 bekeltetes.hu, 1 bekendeartiestboeken.nl, 1 +bekey.io, 1 bekmekci.tk, 1 beko.co.uk, 1 beko.ie, 1 @@ -19603,6 +19560,7 @@ belebey.city, 1 beleefheemstede.nl, 1 belegstelle-glashuette.de, 1 +belegvandenbosch.nl, 1 beleidtransitiemodel.nl, 1 beleiu.com, 1 beleiu.de, 1 @@ -19739,6 +19697,7 @@ belrybalka.cf, 1 bels-lijntje.nl, 1 belsilos.com, 1 +belstoneproducts.com, 1 beltanelabrosse.tk, 1 beltar.nl, 1 beltbuckle.pw, 1 @@ -19762,6 +19721,7 @@ bemani.nl, 1 bemawi.com, 1 bembee.tk, 1 +bembem.de, 1 bemergroup.com, 1 bemestarevendasonline.online, 1 bemindful.life, 1 @@ -19799,6 +19759,7 @@ benchling.com, 1 benchmark-dental.com, 0 benchmark-ip.com, 1 +benchmark.ge, 1 benchmarkmonument.com, 1 benchmarkstudio.net, 1 benclarkphotography.com.au, 1 @@ -19881,7 +19842,6 @@ beniajan.tk, 1 benicee.com, 1 benidormcd.tk, 1 -benify.com, 1 benihbaik.com, 1 benimsetin.com, 1 benimsetin.org, 1 @@ -19960,6 +19920,7 @@ bentley.link, 1 bentleyks.gov, 1 bento-kurumaya.co.jp, 1 +bentomesh.com, 1 bentoml.com, 1 bentoncountyia.gov, 1 bentoncountyor.gov, 1 @@ -19969,9 +19930,7 @@ bentonwi.gov, 1 bentpunk.tk, 1 bentrask.com, 1 -benu.cz, 1 benu.rs, 1 -benulekaren.sk, 1 benunapredpis.cz, 1 benward.physio, 1 benwoo.org, 1 @@ -19997,6 +19956,7 @@ bepzi.com, 1 bequ1ck.com, 1 bequiia.com, 1 +bequiz.be, 1 bera.com.au, 1 beran.tk, 1 berandalcorp.tk, 1 @@ -20018,6 +19978,7 @@ bereginya-lada.ru, 1 beregite-zdorovje.ru, 1 beregusha.com, 1 +bereikdenbosch.nl, 1 berekenen.nl, 1 berekenhet.nl, 1 berend.tk, 1 @@ -20067,8 +20028,10 @@ berkhills.com, 1 berksbulls.com, 1 berkshire.com, 1 +berkshiredairy.com, 1 berkshireesupply.com, 0 berksholocaustmuseum.org, 1 +berksmilitaryhistorymuseum.org, 1 berkspa.gov, 1 berkspetcare.com, 1 berkswatertech.com, 1 @@ -20184,6 +20147,7 @@ bert.org, 1 bertaudarthur.fr, 1 bertbrockham.org.uk, 1 +berten.hu, 1 berthaphil.com, 1 berthaundcarlbenzpreis.de, 1 berthawoonsurgery.com.sg, 1 @@ -20225,6 +20189,7 @@ besnard.me, 1 besnik.de, 0 besnik.tk, 1 +besola.de, 1 besole.ch, 1 besolov.tk, 1 besox.be, 1 @@ -20306,7 +20271,7 @@ bestcanvaswallart.com, 1 bestcarscyprus.com, 1 bestcavapoos.com, 1 -bestchoicehomeinspections.com, 1 +bestchoicehomeinspections.com, 0 bestclix.ml, 1 bestcms.tk, 1 bestcockalierpups.com, 1 @@ -20340,6 +20305,7 @@ bestevakantieparken.com, 1 bestevakantieparken.nl, 1 bestfcu.org, 1 +bestfewo.de, 0 bestfidgettoysforadhd.com, 1 bestfinancialcu.org, 1 bestfitnesswatchreview.info, 1 @@ -20350,7 +20316,6 @@ bestgolftrips.ca, 1 besthemes.tk, 1 besthomeandgardenstuff.com, 1 -besthomegenerator.com, 1 besthost.cz, 1 besthouse.co.il, 1 besthumorsite.tk, 1 @@ -20551,7 +20516,7 @@ bestpracticesleidraad.nl, 1 bestpressurewashingchicago.com, 1 bestpricelovers.com, 1 -bestprofessionalchainsaw.com, 1 +bestprofessionalchainsaw.com, 0 bestpromoving.com, 1 bestratedremovals.co.uk, 1 bestratedtransport.com.au, 1 @@ -20562,7 +20527,6 @@ bestroofinginkansascity.com, 1 bestroutes.net, 1 bestsatoshifaucet.ga, 1 -bestsavingscoupon.com, 1 bestsextoys.com, 1 bestsheepadoodles.com, 1 bestshopping.ga, 1 @@ -20710,6 +20674,7 @@ betaa8.com, 1 betaa9.com, 1 betaal.my, 1 +betaaldeseksdates.nl, 1 betaams.net, 1 betabar.dk, 1 betabeat.com, 1 @@ -20717,7 +20682,6 @@ betacs.pro, 1 betadelivery.co.uk, 1 betadwarf.com, 1 -betagro.com, 1 betahyp.de, 1 betandslots.com, 1 betandyou.com, 1 @@ -20741,7 +20705,6 @@ betel.tk, 1 betelgeus.com, 1 betemyja.tk, 1 -betenemy.com, 1 beterewereldbanen.nl, 1 beteroud.nl, 1 betexperts.tk, 1 @@ -20769,6 +20732,7 @@ betmobilenigeria.com, 1 betobaccofree.gov, 1 betolerant.fr, 1 +beton-vloer.nl, 1 beton.ie, 1 betonbewerkingsmachines.be, 1 betongereedschap.be, 1 @@ -20777,11 +20741,13 @@ betonmarkets.info, 1 betonperkasa.com, 1 betonsport.ga, 1 +betonvloerpolijsten.com, 1 betop-lab.com, 1 betor.cz, 1 betor.sk, 1 betordertr.com, 1 betoskip.tk, 1 +betowa.co, 1 betransfer.eu, 1 betreut.at, 1 betreut.de, 1 @@ -20806,7 +20772,6 @@ bettashoerepairs.com.au, 1 bettendorf.gov, 1 bettenhaus-schlafoase.de, 1 -better.ad, 1 better.com, 1 better.fyi, 1 betterbaseball.com, 1 @@ -20814,7 +20779,6 @@ betterboards.net, 1 betterbuiltbasements.com, 1 betterbuiltkitchensandbathrooms.com, 1 -bettercastings.com, 1 bettercleaningcompany.co.uk, 1 bettercommunication.org.uk, 1 bettercrypto.org, 1 @@ -20834,6 +20798,7 @@ betterna.me, 1 betternews.eu, 1 betteroffed.com, 1 +betterprojects.de, 1 betterscience.org, 1 betterscore.net, 1 bettersecurity.co, 1 @@ -20841,6 +20806,7 @@ betterstack.com, 1 bettertax.gov.au, 1 betterteam.com, 1 +betterteamslabs.com, 1 bettertech.pt, 1 bettertechsoftware.com, 1 bettertime.jetzt, 1 @@ -20903,11 +20869,13 @@ bevallarta.com, 1 bevcrushesit.ca, 1 bevedo.com, 1 +bevedo.cz, 1 bevedo.sk, 1 beveiligingscamerawestland.nl, 1 bevelbeer.com, 1 beveragemobileest.ga, 1 beverb.org, 1 +beverdock.com, 1 beverhof.nl, 1 beverley.tk, 1 beverleycounselling.co.uk, 1 @@ -20928,6 +20896,7 @@ bevrijdingsmuseum.nl, 1 bewaredevapi.azurewebsites.net, 1 bewegigsruum.ch, 1 +bewegte-kirche.de, 1 bewegtes-lagern.at, 1 bewegtes-lagern.ch, 1 bewegtes-lagern.com, 1 @@ -20958,7 +20927,7 @@ beyer-on-it.com, 1 beyer-on-it.de, 1 beyer.cloud, 1 -beyer.consulting, 1 +beyer.consulting, 0 beyer.media, 1 beyerautomation.com, 1 beyerm.de, 1 @@ -20995,7 +20964,6 @@ beyondweb.net, 1 beyondzeroacademy-reservations.fr, 1 beyoung.in, 1 -beyoutiful-studio.ro, 1 bezagentstva.cf, 1 bezbarier.org.pl, 1 bezbednostnaradu.com, 1 @@ -21060,6 +21028,7 @@ bgemi.net, 1 bget.org.uk, 1 bgetfuel.co.uk, 1 +bgfalconmedia.com, 1 bgfashion.net, 1 bgfr.net, 1 bggcapital.com, 1 @@ -21122,6 +21091,7 @@ bhuntr.com, 1 bhuttae.com, 1 bhuvanreddy.space, 1 +bhvrl.com.au, 1 bhwfx.com, 1 bhxch.moe, 1 bi-in-beeld.nl, 1 @@ -21168,6 +21138,7 @@ bibi-xxx.com, 1 bibica.net, 1 bibicarrington.com, 1 +bibisaintifik.com, 1 bibit.id, 1 bibitbunga.com, 1 bibitec.de, 1 @@ -21247,7 +21218,6 @@ bidenstopdeportations.com, 1 bidenwhitehouse.gov, 1 bidindustry.com, 1 -bidlab.org, 1 bidman.cz, 1 bidoluindirim.com, 1 bidonline.tk, 1 @@ -21334,12 +21304,15 @@ bigalba.ga, 1 bigambitions.co.za, 1 bigart.tk, 1 +bigassex.com, 1 bigassmonster.com, 1 bigasstubes.com, 1 +bigbadwolf.gay, 1 bigbag.chat, 1 bigbagmanagement.com, 1 bigbagventures.com, 1 bigband.tk, 1 +bigbayou.at, 1 bigbearlakecoins.com, 1 bigbeats.tk, 1 bigbeautysecrets.tk, 1 @@ -21424,7 +21397,6 @@ bigpage.tk, 1 bigpanparties.co.uk, 1 bigphilsrubbishremoval.com, 1 -bigpicturerecords.com, 1 bigpurse.tk, 1 bigrapidstownshipmi.gov, 1 bigrender.tk, 1 @@ -21470,6 +21442,7 @@ bigtexasyardsale.com, 1 bigthree.ga, 1 bigthunder.ca, 1 +bigtime.agency, 1 bigtime.gg, 1 bigtimeiq.com, 1 bigtitsmilf.com, 1 @@ -21480,6 +21453,7 @@ bigudi.eu, 1 biguz.net, 1 bigwaterut.gov, 1 +bigwes.com, 1 bigwest.org, 1 bigwicks.co.uk, 1 bigzoo.com.br, 1 @@ -21631,12 +21605,9 @@ billsteinberg.ca, 1 billusherwood.com, 1 billview.com.au, 1 -billwebb.com.au, 1 billy.pictures, 1 -billybluerecords.com, 1 billybob.tk, 1 billycroan.com, 1 -billyjamrecords.com, 1 billykwok.me, 1 billywig.stream, 1 billywr.com, 1 @@ -21646,6 +21617,7 @@ bimacitizen.com, 1 bimber.nl, 1 bimbingan.tk, 1 +bimbpress.com, 1 bimedis.com, 1 bimilogo.it, 1 bimmerguide.de, 1 @@ -21685,6 +21657,7 @@ binbo.cz, 1 binbo.sk, 1 bind.ch, 1 +binday.ie, 1 bindb.com, 1 binderbud.com, 1 binding-problem.com, 1 @@ -21701,6 +21674,7 @@ bingcheung.com, 1 bingchunmoli.com, 1 bingebooks.com, 1 +bingebracket.com, 1 binghamcountyid.gov, 1 binghamid.gov, 1 bingo-wear.com, 1 @@ -21742,7 +21716,6 @@ bintube.com, 1 bio-disinfestazione.it, 1 bio-dolt-aveyron.fr, 1 -bio-farma.net, 1 bio-feed.org, 1 bio-kertem.hu, 1 bio-medical.com, 1 @@ -21829,6 +21802,7 @@ biokal.nl, 1 biokemonline.com, 1 bioknowme.com, 1 +bioknowme.health, 1 biokoxomodding.tk, 1 biolack.cf, 1 biolact.tk, 1 @@ -21870,7 +21844,6 @@ bionicman.name, 1 bionovanaturalpools.com, 1 biontech24.pl, 1 -biontechworld.com, 1 bioplac.es, 1 bioplaces.at, 1 bioplaces.ch, 1 @@ -21890,7 +21863,6 @@ biosearch.tk, 1 bioseguridad.gob.pa, 1 bioselect.com.cy, 1 -biosency.com, 1 bioshine.com.sg, 1 bioshome.de, 1 biosignalanalytics.com, 1 @@ -21942,7 +21914,6 @@ birdbox.party, 1 birdbutt.com, 1 birdgifs.nz, 1 -birdiehosting.nl, 1 birdist.com, 1 birdrave.com, 1 birdsite.ga, 1 @@ -21971,7 +21942,7 @@ birobidjan.tk, 1 birobidzhan-news.net, 1 birone.tk, 1 -bironthemes.com, 0 +bironthemes.com, 1 birosuli.hu, 1 birouldeimagine.ro, 1 birow.com, 1 @@ -22107,10 +22078,10 @@ bitcoinforthe.world, 1 bitcoingambling.pro, 1 bitcoingroup.ga, 1 +bitcoinguru.cz, 1 bitcoinheaders.net, 1 bitcoinheaders.org, 1 bitcoinindy.com, 1 -bitcoinissafe.com, 1 bitcoinkaufen.news, 1 bitcoinkurs.news, 1 bitcoinkurs.world, 1 @@ -22119,6 +22090,7 @@ bitcoinnews.world, 1 bitcoinnotbombs.com, 1 bitcoinprice.news, 1 +bitcoinsapi.com, 1 bitcoinseed.net, 1 bitcoinsinireland.com, 1 bitcoinskoers.nl, 1 @@ -22199,12 +22171,11 @@ bitrate.tk, 1 bitredirixe.top, 1 bitref.com, 1 -bitrefill.com, 0 +bitrefill.com, 1 bitrefill.info, 1 bitrefill.me, 1 bitronixcode.com, 1 bitsafe.com.my, 1 -bitsalt.com, 1 bitsellx.com, 1 bitseo.ga, 1 bitseo.tk, 1 @@ -22219,7 +22190,6 @@ bitspaceonline.ml, 1 bitstack.nz, 1 bitstage.uk, 1 -bitstorm.org, 1 bitsync.nl, 1 bitten.pw, 1 bittersweetcandybowl.com, 1 @@ -22230,6 +22200,7 @@ bitton.com.au, 1 bittounsi.com, 1 bittrend.ga, 1 +bittube.net, 1 bittylicious.com, 1 bitufa.com.tr, 1 bitumenburundi.com, 1 @@ -22323,6 +22294,7 @@ bizzvisor.site, 0 bj-caffe.tk, 1 bja.gov, 1 +bjargendurhaefing.is, 1 bjarnerest.de, 0 bjarno.xyz, 1 bjbybbs.com, 1 @@ -22330,7 +22302,7 @@ bjcw.com, 1 bjecard.buzz, 1 bjerregaard.me, 1 -bjfconsulting.fr, 0 +bjfconsulting.fr, 1 bjfuli.com, 1 bjjmississauga.com, 1 bjksportscentre.com, 1 @@ -22672,7 +22644,7 @@ blackswancompany.com, 1 blackswirl.com, 1 blacktemplars.tk, 1 -blacktownbuildingsupplies.com.au, 0 +blacktownbuildingsupplies.com.au, 1 blacktube.tv, 1 blacktubes.cf, 1 blacktubes.ga, 1 @@ -22763,6 +22735,7 @@ blastoffdirt.com, 1 blastofftherapy.com, 1 blastoise186.co.uk, 1 +blastover.eu, 1 blasunafotocadadia.com, 1 blathinwheatens.tk, 1 blatnic.eu, 1 @@ -22781,6 +22754,7 @@ blaugelb-frankfurt.de, 1 blauglockenbaum.de, 1 blaumedia.com, 1 +blautube.com, 1 blauwegeit.nl, 1 blauwereigercoaching.nl, 1 blauwgras.nl, 1 @@ -22792,7 +22766,7 @@ blaze-in.com, 1 blazebit.com, 1 blazefire.tk, 1 -blazejmrozinski.com, 1 +blazejmrozinski.com, 0 blazelock.com, 1 blazeweb.ml, 1 blazing.cz, 1 @@ -22897,7 +22871,6 @@ blissplan.com, 1 blissque.com, 1 blissway.tk, 1 -blisterreview.com, 1 blistertrackandtrace.com, 1 blitshift.com, 1 blitz-idee24.de, 1 @@ -22964,7 +22937,6 @@ blockvideo.live, 1 blockwatch.cc, 0 blockxit.de, 1 -blocxx.org, 1 blodeuyn.com, 1 bloeij.nl, 1 bloemendaalsamen.nl, 0 @@ -23046,6 +23018,7 @@ blogtheque.com, 1 bloguerrilla.it, 1 blogvadim.ga, 1 +blogverdict.com, 1 blogworm.eu, 1 blokada.org, 1 blokmap.be, 1 @@ -23161,7 +23134,6 @@ bluegoat.jp, 1 bluegolf.com, 1 bluegrasshospitality.com, 1 -bluegrassprizes.com, 1 bluehaven.ai, 1 bluehavenkinsale.com, 1 bluehawks.in, 1 @@ -23185,10 +23157,10 @@ bluemango-studios.com, 1 bluemat.org, 1 bluemax49ers.com, 1 -bluemodus.com, 1 bluemoonrescue.org, 1 bluemoundtexas.gov, 1 bluemountain-ms.gov, 1 +bluenet.nz, 1 bluenetworks.xyz, 1 blueneuron.tk, 1 blueoakart.com, 0 @@ -23321,12 +23293,11 @@ bmdonline.eu, 1 bme.com, 1 bmelecevolution.com, 1 -bmgc.edu.bd, 1 bmhglobal.com.au, 1 bmicos.com, 1 -bmitelecom.com.br, 1 bmjphotography.tk, 1 bmk-kramsach.at, 1 +bmlogistik.sk, 1 bmm.com.co, 1 bmoattachments.org, 1 bmoe.eu.org, 1 @@ -23370,7 +23341,6 @@ bngsecure.com, 1 bnhhospital.com, 1 bnjpro.dk, 1 -bnkconsulting.info, 1 bnlegalmedia.com, 1 bnnuy.com, 1 bnpl.kz, 1 @@ -23421,7 +23391,6 @@ boat-systems.pl, 0 boatandsailboat.com, 1 boats.com, 0 -boatsandoats.com, 1 boatseller.org, 1 boatsforveterans.org, 1 boattrader.com.au, 1 @@ -23445,6 +23414,7 @@ bobbyoriginal.tk, 1 bobbyrobinson.tk, 1 bobbysdancewear.com, 1 +bobcat-lead.com, 1 bobcat.com, 1 bobcoffee.com.br, 1 bobconnolly.com, 1 @@ -23501,7 +23471,6 @@ bodil.bg, 1 bodin.cz, 1 bodivo.vn, 1 -bodixite.com, 1 bodkov.com, 1 bodlsc.com, 1 bodrumescmagazin.tk, 1 @@ -23537,7 +23506,7 @@ boelsen.net, 1 boem.gov, 1 boemeldonck.nl, 1 -boenderoutdoor.nl, 1 +boenderoutdoor.nl, 0 boengefissaofnoh.nl, 1 boensite.tk, 1 boenyc.gov, 1 @@ -23592,17 +23561,17 @@ bojoproductions.tk, 1 bokaldo.com, 1 bokatas.tk, 1 -bokehandbows.ca, 1 bokf.com, 1 bokhaldari.is, 1 bokhylle.eu, 1 bokkun.jp, 1 bokmassan.se, 1 bokni.ng, 1 +bokorev.ru, 1 bokov.gq, 1 boksburgplumbing.co.za, 1 boksburgsolarsystems.co.za, 1 -bokutake.com, 1 +bokumo.nl, 1 bol.io, 1 bolalocobrews.co.uk, 1 bolaodarico.com.br, 1 @@ -23671,7 +23640,7 @@ boltmobile.ca, 1 bolton-consulting.org, 1 boltonct.gov, 1 -boltup.ai, 1 +boltup.ai, 0 boltz.exchange, 1 boluhaberleri.tk, 1 bolur.is, 1 @@ -23851,6 +23820,7 @@ bookameeting.se, 1 bookbazar.co.in, 1 bookcabaurangabad.com, 1 +bookcheapairline.com, 1 bookcreator.com, 1 bookdubaihome.com, 1 bookergroupjobs.co.uk, 1 @@ -23912,7 +23882,7 @@ bookvuz.tk, 1 bookworld.gr, 1 bookwormstory.social, 1 -bookyourdata.com, 1 +bookyourdata.com, 0 bookyoursmog.com, 1 bool.be, 1 boom2.network, 1 @@ -23933,7 +23903,6 @@ boomtownevents.com, 1 boomtowntrail.com, 1 boomvm.pw, 1 -boon-beauty.com, 1 boonecountyar.com, 1 boonecountyfpdmo.gov, 1 boonecountyil.gov, 1 @@ -23946,7 +23915,6 @@ booox.biz, 1 booox.cc, 1 booox.net, 1 -booox.org, 1 booox.pw, 1 boop.gq, 1 boop.icu, 1 @@ -23968,6 +23936,7 @@ boot-berlin.de, 1 bootcampkatwijk.nl, 1 boothillcasino.com, 1 +booths.cyou, 1 boothukathalu.in, 1 bootlabs.net, 1 bootrading.com, 1 @@ -24016,6 +23985,9 @@ borealcapital.com.br, 1 borealis.gg, 1 borealis.su, 1 +borealisacademy.com, 1 +borealisprotocol.ai, 1 +borealisterminal.com, 1 boreally.org, 1 bored.gr, 1 boredhackers.com, 1 @@ -24118,10 +24090,12 @@ bosquedelasimagenes.tk, 1 bosquedepalabras.com, 0 boss.az, 1 +bosschespoorzone.nl, 1 +bosschestadsdelta.com, 1 +bosschestadsdelta.nl, 1 bossefors.tk, 1 bosseo.id, 1 bosslady.one, 1 -bossmarketing.ca, 1 bossurl.tk, 1 boston-medical-supply.com, 1 boston-molly.tk, 1 @@ -24141,6 +24115,7 @@ bot-manager.pl, 1 bot.country, 1 botabota.ca, 1 +botanical.house, 1 botanicalinstitute.org, 1 botanicoved.com, 1 botaniqlandscapeconsultants.com, 1 @@ -24170,9 +24145,11 @@ botpago.cl, 1 botschaft.digital, 1 botschaften-an-das-volk-gottes.de, 0 +botseller.ai, 1 botsfed.com, 1 botsindiscord.me, 1 botstack.host, 1 +botsuite.pro, 1 botticelli.tk, 1 bottinquebec.com, 1 bottke.berlin, 1 @@ -24190,7 +24167,6 @@ bouchonville-knifemaker.com, 1 bouckaert-usedcars.be, 0 bouckaert.co, 1 -boudah.pl, 1 boudasedesatka.cz, 1 bouffartigue.fr, 1 boufs.be, 1 @@ -24203,6 +24179,7 @@ boulayauventcamping.ca, 1 boulayauventcamping.com, 1 boulayauventscamping.com, 1 +boulderbit.com, 1 boulderbrook.com, 1 bouldercounty.gov, 1 bouldercountyassessor.gov, 1 @@ -24336,7 +24313,9 @@ bouwbedrijfdesmet.be, 1 bouwbedrijfjstam.nl, 1 bouwbedrijfkorstanje.nl, 1 +bouwenaandenbosch.com, 1 bouwenaandenbosch.nl, 1 +bouwenaanshertogenbosch.nl, 1 bouwklikshop.nl, 1 bouwklikweb.nl, 1 bouwma.nl, 1 @@ -24353,6 +24332,7 @@ bowenrealty.com, 1 bowhill.me, 1 bowhunter-ahorn.de, 0 +bowiecroftonendo.com, 1 bowlcake.fr, 1 bowldirectoryest.ga, 1 bowlidex.com, 1 @@ -24361,6 +24341,7 @@ bowmanwilliams.com, 0 bowmar.gov, 1 bownhpd.gov, 1 +bowserbuddy.com.au, 1 bowwowinsurance.com.au, 1 box-it-up.nl, 1 box.bz, 1 @@ -24377,6 +24358,7 @@ boxeldercountyut.gov, 1 boxeomexicano.tk, 1 boxerdogsaspets.com, 1 +boxhive.io, 1 boxhostserver.com, 1 boxing-kangaroo.ga, 1 boxing-videos.com, 1 @@ -24461,10 +24443,9 @@ bpvr.ddns.net, 1 bpvr.nl, 1 bpx.exchange, 1 -bpx.global, 1 bq1.me, 1 bq8.me, 1 -bqgw.info, 1 +bqgw.info, 0 bqgw8.com, 0 bqool.com, 1 bqp.io, 0 @@ -24656,6 +24637,7 @@ brandsafe.io, 1 brandsclub.tk, 1 brandsource.com, 1 +brandsseekers.com, 1 brandstof-prijzen.nl, 1 brandsynergy.pl, 1 brandtechdesign.co.uk, 1 @@ -24810,6 +24792,7 @@ breakinoutpr.com, 1 breakofdawn.tk, 1 breaksome.tech, 1 +breakstonesbutter.com, 1 breakthroughapparel.com, 1 breakthrought1d.org.il, 1 breakwall.ml, 1 @@ -24841,6 +24824,7 @@ breederpodcast.com, 1 breen.com.br, 1 breentwp.gov, 1 +breet.io, 1 breethe.com, 1 breezisaas.com, 1 breezitech.io, 1 @@ -24851,9 +24835,7 @@ brefy.com, 1 brege.org, 1 breger.fr, 1 -bregmanfance.com, 1 bregnedal.dk, 1 -bregner.com, 1 bregroup.com, 1 brehoni.cz, 0 brei.nz, 1 @@ -24899,7 +24881,6 @@ brestnews.tk, 1 brestradio.tk, 1 brestshop.tk, 1 -bretagne-reisen.de, 1 bretania.bzh, 1 bretcarmichael.com, 1 breteuilcommerceartisanat.com, 1 @@ -24921,6 +24902,7 @@ brewcentralny.com, 1 brewerybarbotley.com, 1 brewin.ml, 1 +brewrest.com, 1 brewsouth.com, 1 brex.pw, 1 brexit.tk, 1 @@ -24964,7 +24946,6 @@ brianroadifer.com, 1 briansemrau.com, 1 briansmith.org, 1 -brianterealtygroup.com, 1 brianum.de, 1 brianum.net, 1 brianvalente.tk, 1 @@ -25025,7 +25006,7 @@ bridgesem.com, 1 bridgesofcolorado.gov, 1 bridgestudios.com, 1 -bridgesync.io, 1 +bridgesync.io, 0 bridgethailand28chidlom.com, 1 bridgetmcauliffe.ie, 1 bridgetonmo.gov, 1 @@ -25147,6 +25128,7 @@ britannia.no, 1 britanniapandi.com, 1 british-assessment.co.uk, 1 +britishairlinesflights.com, 1 britishantiquefurniture.co.uk, 1 britishbee.org.uk, 1 britishbee.uk, 1 @@ -25202,6 +25184,7 @@ brn.is, 0 brnchost.com, 1 brndn.io, 1 +brngal.sk, 1 brnogame.com, 1 brnogame.cz, 1 brnogame.online, 1 @@ -25269,6 +25252,7 @@ brokenbowokpd.gov, 1 brokencityllc.ga, 1 brokendollsmuseum.com, 1 +brokenelectronics.com, 1 brokenhands.io, 1 brokenlinkchecker.live, 1 brokenminds.tk, 1 @@ -25424,6 +25408,7 @@ bruidstaarten.tk, 1 bruinmail.nl, 1 bruitparif.fr, 1 +brujobros.com, 1 bruk2fa.no, 1 brukalai.lt, 1 brulewi.gov, 1 @@ -25497,7 +25482,6 @@ bryandrakedrivingschool.co.nz, 1 bryandunnewald.com, 0 bryanfalchuk.com, 1 -bryankaplan.com, 1 bryanlachica.com, 1 bryanley.com, 1 bryanquigley.com, 1 @@ -25506,6 +25490,7 @@ bryanski.tk, 1 bryanstoncc.co.za, 1 bryantluk.com, 1 +bryceboldenscott.com, 1 bryceml.us, 1 bryggebladet.dk, 1 brysoncitync.gov, 1 @@ -25569,7 +25554,6 @@ bslinguistics.co.uk, 1 bslnow.co.uk, 1 bslnowsigns.co.uk, 1 -bsmart.it, 1 bsmsl.com, 1 bsn.cloud, 0 bsnb.com, 1 @@ -25596,7 +25580,6 @@ bst-gmbh.de, 1 bsteele.tk, 1 bstger.ch, 1 -bstoked.net, 1 bsuess.de, 1 bsure.io, 0 bsurfcr.com, 1 @@ -25611,7 +25594,6 @@ bt-kc.de, 1 bt121.com, 0 bt24.ro, 1 -bt780.com, 1 bt85.cn, 0 bt9.cc, 0 btbb.net, 1 @@ -25644,8 +25626,6 @@ btool.eu.org, 1 btorrent.xyz, 1 btp.net, 1 -btpexpert.com, 1 -btpinterim.com, 1 btpritikin.com, 1 btrade.io, 1 btrans.by, 1 @@ -25673,9 +25653,8 @@ btwsa.tk, 1 btwschool.it, 1 btwservice.it, 1 -btwstore.it, 1 btynews.com, 1 -btyr.net, 0 +btyr.net, 1 bu-e.com, 1 buai.cf, 1 buai.gq, 1 @@ -25694,8 +25673,8 @@ bubblelist.tk, 1 bubblesco.tk, 1 bubblespetspa.com, 0 -bubblin.io, 1 bubblyliving.com, 1 +bubcs.com, 1 bublup.com, 1 bubnovsky.org, 1 bubok.com, 1 @@ -25775,7 +25754,6 @@ buddy-development-rabodirectconnect-api.azurewebsites.net, 1 buddy-locator.com, 1 buddy.net, 1 -buddyboss.com, 1 buddyme.me, 1 budeanu.com, 1 budejce.cz, 1 @@ -25792,6 +25770,7 @@ budget.ovh, 1 budget4cast.com, 1 budgetapp.me, 1 +budgetfitter.uk, 1 budgetglasscranbourne.com, 1 budgetheatingorders.com, 1 budgetimize.com, 1 @@ -25833,7 +25812,7 @@ bueroplus.de, 1 buerstaedter-zeitung.de, 1 buesiforquo.cf, 1 -bueteeearchives.net, 1 +buettgens.net, 1 bufete.tk, 1 buff-buff.tk, 1 buffalo-ny-gay-chat.com, 1 @@ -25877,7 +25856,6 @@ bugrayildiz.av.tr, 1 bugreader.com, 1 bugs.chromium.org, 1 -bugwie.com, 1 bugzilla.mozilla.org, 1 buharkeyf1.com, 1 buharlikoltukyikama.com.tr, 1 @@ -25894,6 +25872,7 @@ buildbytes.com, 1 buildconcierge.ga, 1 builddesygner.xyz, 1 +builderhouseplans.com, 1 buildersbroker.com.au, 1 buildersdiscount.net, 1 buildersofthesilentcities.tk, 1 @@ -25926,7 +25905,6 @@ buildsimple.co.uk, 1 buildtestsolutions.com, 1 buildux.com, 1 -buildwealth.uk, 1 buileo.com, 1 builtbyworkhorse.com, 1 builterra2.azurewebsites.net, 1 @@ -25941,6 +25919,7 @@ builtinseattle.com, 1 builtinsf.com, 1 builtinvacuum.com, 1 +builtmaven.com, 1 builtory.my, 1 builtvisible.com, 1 buirey.com, 1 @@ -26038,7 +26017,6 @@ bulutimza.com.tr, 1 bulutkey.com, 1 bulvar.tk, 1 -bumastemra.nl, 1 bumblebee.cf, 1 bumblebeebeekeeping.com, 1 bumblebeekids.uk, 1 @@ -26050,6 +26028,7 @@ bummelwelt.ch, 1 bummelwelt.com, 1 bummelwelt.de, 1 +bumpi.games, 1 bumpi.gq, 1 bumsbesuch.com, 1 bumsbuero.com, 1 @@ -26087,7 +26066,6 @@ bunnybloythost.com, 1 bunnycarenotes.com, 1 bunnydiamond.de, 1 -bunnymaxim.com, 1 bunnymud.com, 1 bunnyvishal.com, 1 bunova.com, 1 @@ -26108,7 +26086,6 @@ buquesdeguerra.tk, 1 buraksercanercin.co, 1 burakuckun.com, 1 -burakurer.com, 1 buralteria.tk, 1 burasicanakkale.com, 0 buratino.tk, 1 @@ -26150,6 +26127,7 @@ burghtstam.tk, 1 burgos.tech, 1 burgoslacrosse.tk, 1 +burgstaller-immobilien.de, 1 burgstetten.de, 1 burhan-autosattlerei.de, 1 buricloud.fr, 1 @@ -26234,11 +26212,13 @@ buryat-mongol.cf, 1 buryatia.tk, 1 burybox.co.uk, 1 +burz.agency, 1 burz.ai, 1 burz.net, 1 burz.one, 1 burz.ro, 1 burza-techniky.cz, 1 +burzagency.com, 1 burzcast.com, 1 burzcast.ro, 1 burzgroup.com, 1 @@ -26283,6 +26263,7 @@ business-secreti.gq, 1 business-secreti.tk, 1 business-swiss.ch, 1 +business-trade.pro, 1 business.facebook.com, 0 business.gov, 0 business.medbank.com.mt, 1 @@ -26370,7 +26351,6 @@ businessgroove.ga, 1 businessgrowth.ga, 1 businessgrowthleaders.com, 1 -businessguide.co.ke, 1 businessgun.ga, 1 businesshandsome.ga, 1 businesshome.ml, 1 @@ -26792,7 +26772,6 @@ buzztrending.tk, 1 buzzword24.de, 1 buzzworld.tk, 1 -buzzybites.com, 1 bv-driver.tk, 1 bv-ferreiradozezere.pt, 1 bvblaboratory.hu, 1 @@ -26810,6 +26789,7 @@ bvisionsmedia.com, 1 bvlos.com.pl, 1 bvlp.com, 1 +bvmary.com, 1 bvng.nl, 1 bvop.org, 1 bvr-nsn.gov, 1 @@ -26819,6 +26799,7 @@ bvrpd-pa.gov, 1 bvusd.org, 1 bvv-europe.eu, 1 +bvwnews.com, 1 bvwphotography.com, 1 bw.codes, 1 bw1970s.com, 1 @@ -26962,6 +26943,7 @@ bytemethod.ca, 1 bytenest.ca, 1 byteofdev.com, 1 +byteorbit.com, 1 bytepen.com, 1 bytepoint-software.nl, 1 bytes.fyi, 1 @@ -27018,7 +27000,6 @@ c-rpg.eu, 1 c-rtx.com, 1 c-sagaseru.com, 1 -c-shock.org, 1 c-solarcity.com, 1 c-tec.nl, 1 c-three.jp, 1 @@ -27098,7 +27079,6 @@ ca-els.com, 1 ca-immobilier.fr, 1 ca-key.de, 1 -ca-saintdie.fr, 1 ca.gparent.org, 1 ca.search.yahoo.com, 0 ca.sk, 1 @@ -27186,6 +27166,7 @@ cache22.nl, 1 cachecounty.gov, 1 cachecrawler.com, 1 +cachedragon.net, 1 cachemosquito.gov, 1 cachepreload.com, 1 cachesheriff.gov, 1 @@ -27275,6 +27256,7 @@ caetanoflotas.es, 1 caetanoretail.pt, 0 caetanotec.pt, 1 +caeusa.net, 1 caf.milano.it, 1 cafe-bg.com, 1 cafe-cliche.tk, 1 @@ -27293,7 +27275,7 @@ cafechesscourt.com, 1 cafechroma.tk, 1 cafecobus.tk, 1 -cafedari.ir, 1 +cafecomcyber.com.br, 1 cafedelcielo.co, 1 cafedesignbooks.com, 1 cafedospescadores.tk, 1 @@ -27314,7 +27296,6 @@ cafesangtao.com, 1 cafeterya.tk, 1 cafethevibes.com, 1 -cafethrive.co.uk, 1 cafevelo.org, 1 cafevs.com, 0 cafexpro.com, 1 @@ -27359,6 +27340,7 @@ cainhoyathletic.com, 1 cainiao.moe, 1 caio.moe, 1 +caiodorosario.com, 1 caipai.fm, 1 caiqueparrot.com, 1 cairnterrier.com.br, 1 @@ -27369,7 +27351,7 @@ cais.de, 1 caise.tk, 1 caissefrancaisedefinancementlocal.fr, 0 -caiteecooper.com, 1 +caithness-business.co.uk, 1 caivps.com, 1 caiwenjian.xyz, 1 caixideal-serralharia.pt, 1 @@ -27422,6 +27404,7 @@ caladan.tk, 1 calaficirecords.cf, 1 calaix.click, 1 +calamai.nl, 1 calamidad.tk, 1 calamp.com, 1 calandrahosting.tk, 1 @@ -27444,7 +27427,6 @@ calcioweb.eu, 1 calcoolator.pl, 1 calcsoft.tk, 1 -calcstructcost.com, 1 calcsub.net, 1 calculadora-de-derivadas.com, 1 calculadora-de-integrales.com, 1 @@ -27464,6 +27446,7 @@ calculatortvers.ga, 1 calculatortvest.ga, 1 calculon.fr, 1 +calculstructure.fr, 1 calcworkshop.com, 1 caldaia.roma.it, 1 caldare.be, 1 @@ -27575,6 +27558,7 @@ calliari.org, 1 calliesalls.com, 1 calligraph.gq, 1 +callinangroup.net, 1 callinsdecor.com.br, 1 callipeg.com, 1 callmewatkins.com, 1 @@ -27768,6 +27752,7 @@ campguaikinima.com, 1 camping-aupigeonnier.fr, 1 camping-dulac-dordogne.com, 1 +camping-fleur-oleron.com, 1 camping-seilershof.de, 1 camping-trentino.it, 1 camping.it, 1 @@ -27780,7 +27765,6 @@ campinghuntingshooting.com, 1 campingpolidor.com, 1 campingprofessionalsest.ga, 1 -campingshop.pl, 1 campingwatchest.ga, 1 campistry.net, 1 camplaza.tk, 1 @@ -27820,6 +27804,7 @@ camslurp.com, 1 camslurp.net, 1 camslurp.org, 1 +camsparty.com, 1 camsupplier.ml, 1 camsupplierers.ga, 1 camtor.ml, 1 @@ -27833,7 +27818,6 @@ can-amchains.com, 1 can-fleet.com, 1 can-tran.com, 1 -canabeinternacional.com, 1 canacreative.asia, 1 canact.com.au, 1 canada-tourisme.ch, 0 @@ -27945,7 +27929,6 @@ candlelightchallenge.tk, 1 candlemakingexplained.com, 1 candlepro.cf, 1 -cando.eu, 1 candogiveguide.org, 1 candt.gr, 1 candy-pop.tk, 1 @@ -28006,6 +27989,7 @@ canlitelefonhatti.ga, 1 canlom.tk, 1 canmipai.com, 1 +cannabiocreuse.fr, 1 cannabis-marijuana.com, 1 cannabis.cafe, 1 cannabisdiscounter.ca, 1 @@ -28014,6 +27998,7 @@ cannabishouseyeg.com, 1 cannabislegality.info, 1 cannabistraininguniversity.com, 1 +cannabivo.com, 1 cannabiz.tk, 1 cannabytes.net, 1 cannacards.ca, 1 @@ -28071,7 +28056,7 @@ canterburynh.gov, 1 canters.tk, 1 cantillons.com, 1 -cantongroup.com, 1 +cantongroup.com, 0 cantonmi.gov, 1 cantonmopolice.gov, 1 cantonms.gov, 1 @@ -28109,9 +28094,7 @@ cap50.be, 1 cap73.fr, 1 cap75.com, 1 -capari.co, 1 caparua.com, 1 -capathsuccess.com, 1 capcut.cn, 1 cape.blue, 1 capeannvacations.com, 1 @@ -28244,10 +28227,11 @@ captainsunshine.tk, 1 captavio.com, 1 captchafox.com, 1 +captech.pe, 1 +captello.com, 1 captify.ca, 1 captivationscience.com, 1 captivationtheory.com, 1 -captmacks.com, 1 captreelegal.nl, 1 capturebilling.com, 1 captured-symphonies.com, 1 @@ -28259,7 +28243,6 @@ car-diagnose.com, 1 car-dismantling.tk, 1 car-expresso.com, 1 -car-hire-lisbon.com, 1 car-keys.tk, 1 car-market.tk, 1 car-seats-store.ga, 1 @@ -28349,6 +28332,7 @@ cardano.eco, 1 cardano.org, 1 cardanoupdates.com, 1 +cardboard.inc, 1 cardbouns.tk, 1 cardcaptorsakura.jp, 1 cardcenter.cc, 1 @@ -28389,21 +28373,12 @@ cardozovargas.cloud, 1 cardozovargas.co, 1 cardozovargas.com, 1 -cardozovargas.com.br, 1 -cardozovargas.email, 1 -cardozovargas.gay, 1 cardozovargas.me, 1 -cardozovargas.men, 1 -cardozovargas.my, 1 cardozovargas.net, 1 cardozovargas.one, 1 -cardozovargas.online, 1 cardozovargas.org, 1 cardozovargas.pro, 1 -cardozovargas.space, 1 -cardozovargas.top, 1 cardozovargas.vip, 1 -cardozovargas.work, 1 cardpresso.com, 1 cardprinter.co.il, 1 cardpyramiders.ga, 1 @@ -28426,6 +28401,7 @@ careapp.com.au, 1 careapptest.dk, 1 carear.com, 1 +careclaimsadjusting.com, 0 carecloud.com, 1 carecm.de, 1 carecode.ai, 0 @@ -28433,6 +28409,7 @@ career-log.jp, 1 career.how, 1 careerandjobsearch.tk, 1 +careerbound.ai, 1 careercapital.co.za, 1 careergigo.com, 1 careerminds.com, 1 @@ -28441,7 +28418,6 @@ careersimulator.com, 0 careersingulf.com, 1 careersinpsychology.org, 1 -careerslevel.com, 1 careersolutionsbymichelle.com, 1 careerstart.co.jp, 1 careertransformed.com, 1 @@ -28461,7 +28437,6 @@ caremore.pt, 1 carenepal.org, 1 carepan.ga, 1 -carepassport.com, 1 carepathinnovations.com, 1 caresco.nl, 1 careshields.sg, 1 @@ -28722,6 +28697,7 @@ carrinhocheiooanointeiro.com.br, 1 carrion.tk, 1 carrnorthamerica.com, 1 +carro.wiki, 1 carroattrezzi.it, 1 carroattrezzi.lazio.it, 1 carroattrezzimilanodaluiso.it, 1 @@ -28833,13 +28809,12 @@ carvalhofer.lu, 1 carver.tk, 1 carvercountymn.gov, 1 -carvoeiro-car-hire.com, 1 carvykti.com, 1 carw.sh, 1 carwashlogin.com, 1 carwashon5th.com, 1 carwind.com, 1 -carwrapinfo.com, 1 +carwrapinfo.com, 0 carwreckcowboy.com, 1 caryl.fr, 1 carymedicalgroup.com, 1 @@ -28930,7 +28905,6 @@ cascavelle.fr, 1 cascavelle.nl, 1 casden.fr, 1 -case-jucu.ro, 1 case-la-rosu.ro, 1 case-vacanza-salento.com, 1 case-ware.info, 1 @@ -29008,6 +28982,7 @@ cash.app, 1 cash.me, 1 cash.nyc, 1 +cash1loans.com, 1 cashamerican.tk, 1 cashati.com, 1 cashbackcow.us, 1 @@ -29025,6 +29000,7 @@ cashdo.co.il, 1 cashdrop.ga, 1 cashewmanufacturers.com, 1 +cashflowdiary.com, 0 cashflowstrategist.com, 0 cashforcarremovalsipswich.com.au, 1 cashfortulsahouses.com, 1 @@ -29220,6 +29196,7 @@ caspe.co, 1 caspeco.dk, 1 caspeco.no, 1 +casper.moi, 1 casperpanel.com, 1 caspi.org.il, 1 caspianlegal.com, 1 @@ -29228,6 +29205,7 @@ caspicards.com, 1 caspiconstruction.com, 1 caspiliving.com, 1 +cassclay.com, 1 casscoroadmi.gov, 1 casscountyia.gov, 1 casscountyil.gov, 1 @@ -29267,7 +29245,6 @@ castible.de, 1 castiel.cf, 1 castilla-comunera.tk, 1 -castillo.club, 1 castillosohail.es, 1 casting-vote.tk, 1 castingallaitaliana.com, 1 @@ -29285,6 +29262,7 @@ castlecapers.com.au, 1 castledurrow.com, 1 castleflame.fr, 1 +castlefordboxingacademy.com, 1 castlehack.ga, 1 castlekingdomstockport.co.uk, 1 castlekingkent.co.uk, 1 @@ -29313,6 +29291,7 @@ casualtime.ga, 1 casusgrillcaribbean.com, 1 cat-encyclopedia.ml, 1 +cat-litter-box.co.uk, 1 cat-problems.ml, 1 cat.casa, 1 cat.fo, 1 @@ -29334,6 +29313,7 @@ catalogobiblioteca.net, 1 catalogodoamor.com, 1 catalogosdemujer.com, 1 +catalogosvirtualesonline.com, 1 catalogueau.com, 0 catalojic.tk, 1 catalonia.tk, 1 @@ -29374,6 +29354,7 @@ catchteamca.gov, 1 catchthestars.org, 1 catchup-enschede.tk, 1 +catchyz.com, 1 catclouds.net, 1 catcontent.cloud, 1 catcoxx.com, 1 @@ -29512,6 +29493,7 @@ cave-browne-cave.com, 1 cave-reynard.ch, 1 cave-vet-specialists.co.uk, 1 +caveat-capital.com, 1 cavecreekaz.gov, 1 cavediverharry.com, 1 cavemax.com, 1 @@ -29535,6 +29517,7 @@ cba.ca, 1 cba.gov.pl, 1 cbaamaga.com, 1 +cbag.net, 1 cbbio.fr, 1 cbc-hire.co.uk, 1 cbc-network.org, 1 @@ -29626,7 +29609,6 @@ ccaptioning.com, 1 ccatpracticetest.com, 1 ccattestprep.com, 1 -ccautomobil.de, 1 ccb.gov, 1 ccbaltics.com, 1 ccbank.bg, 1 @@ -29665,7 +29647,6 @@ cchsthevoice.org, 1 cci.org.co, 1 cciiblog.tk, 1 -cciofficial.com, 1 ccis.rs, 1 cck-law.com, 1 cckguava.com, 1 @@ -29712,7 +29693,6 @@ cctv-supraveghere.ro, 1 cctv-systems.tk, 1 cctvlaw.ga, 1 -cctvonline.cz, 1 cctvsecurityjohannesburg.co.za, 1 cctvview.info, 1 ccu.plus, 1 @@ -29753,7 +29733,6 @@ cdgitalia.org, 1 cdhome.ga, 1 cdhqt.com, 1 -cdibtpjob.com, 1 cdigitale.com, 1 cdirectory.tk, 1 cdkeyprices.com, 1 @@ -29762,7 +29741,6 @@ cdlandb1.com, 1 cdlaserena.tk, 1 cdlinares.tk, 1 -cdlnaturals.com, 1 cdm.guru, 1 cdmcalsace.com, 1 cdmdisinfestazioni.it, 1 @@ -29823,7 +29801,7 @@ ceannard.net, 1 ceatheneum.com, 1 ceba-cuec.ca, 0 -cebek.co.uk, 0 +cebek.co.uk, 1 cebolinha-imaginaria.com, 1 cebrita.tk, 1 cec.com.es, 1 @@ -29912,6 +29890,7 @@ celebraze.tk, 1 celebrex.ga, 1 celebrex100mg.cf, 1 +celebrim.com, 1 celebritiesblog.tk, 1 celebritydailynews.ml, 1 celebrityfakes.tk, 1 @@ -29927,8 +29906,8 @@ celendo.ga, 1 celeraindustries.tk, 1 celesco.eu, 1 -celeste-energie.fr, 1 celestia.tk, 1 +celestial.ug, 1 celestialdental.com, 1 celestialenergies.com.au, 1 celestialmusic.tk, 1 @@ -29969,6 +29948,7 @@ celmedia.cl, 1 celseven.com, 1 celsoazevedo.com, 1 +celta.cl, 1 celtacad.tk, 1 celti.ie.eu.org, 1 celti.name, 1 @@ -30031,6 +30011,7 @@ centexlegal.com, 1 centextlegal.com, 1 centextlitigationservices.com, 1 +centigen.ai, 1 centillionss.com, 1 centimark.com, 1 centio.bg, 1 @@ -30043,6 +30024,7 @@ centralbank.ae, 1 centralbetsers.ga, 1 centralbetsest.ga, 1 +centralcityjuniorkindergarten.com, 1 centralcoasthomeloans.com.au, 1 centralcoaststadium.com.au, 1 centralconvergence.com, 1 @@ -30057,7 +30039,7 @@ centralhaat.com, 1 centralhome.com, 1 centralhq.tk, 1 -centralimpressos.com.br, 0 +centralhub.tech, 1 centralisgroup.com, 0 centralitasbaratas.es, 1 centralkladno.cz, 1 @@ -30074,7 +30056,6 @@ centralstor.ga, 1 centralvalleyharness.org, 1 centralvoice.org, 1 -centrationgame.com, 1 centre-commercial.fr, 1 centre-equestre.net, 1 centre-maiakovski.fr, 1 @@ -30103,7 +30084,6 @@ centroestetico.it, 1 centrofotostudija.lt, 1 centrofugi-pipeti-elta90.com, 1 -centrogaiamexico.com, 1 centrokiri.cl, 1 centrolavoro.org, 1 centromedico.tk, 1 @@ -30148,6 +30128,7 @@ centurytiling.com.au, 1 ceomanipur.nic.in, 1 ceomonthlyest.ga, 1 +cepalabs.cl, 1 cephalexin.ga, 1 cephalexincapsules.ml, 1 cephalexincapsules.tk, 1 @@ -30181,7 +30162,6 @@ cerebrito.com, 1 cerebrito.net, 1 cerebrosano.gov, 1 -cerebrum.com, 1 cerecup.com, 0 ceredowv.gov, 1 ceremonial-magic.com, 1 @@ -30192,6 +30172,7 @@ ceres-corp.org, 0 cerezacomunicacion.com, 1 cerfid.com.pe, 1 +cerinrosario.com.ar, 1 ceris.com, 1 cernac.cz, 1 cernakova.eu, 1 @@ -30206,6 +30187,7 @@ cerrad.com.ua, 1 cerrajeriaamericadelquindio.com, 1 cerrajeriaenvillavicencio.com, 1 +cerratolimo.com, 1 cerritosca.gov, 1 cerrogordo.gov, 1 cerstve-korenie.sk, 1 @@ -30253,6 +30235,7 @@ certnazionale.it, 1 certo-escrow.com, 1 certos.com, 1 +certowl.io, 1 certp.fr, 1 certprep.fr, 0 certpro.uk, 1 @@ -30269,7 +30252,6 @@ cerveny.ch, 1 cervenyjezek.eu, 1 cervera.cat, 1 -cervera.com.br, 1 ces-ltd.co.uk, 0 ces-ltd.com, 1 cesame.ca, 1 @@ -30300,6 +30282,7 @@ cestasdepresente.com.br, 1 cestasedelicias.com.br, 1 cestaswmonline.com.br, 1 +cestgada.com, 1 cestinavass.lol, 1 cestpasviolent.com, 1 cestujnamiru.cz, 1 @@ -30311,12 +30294,14 @@ cetak.com.my, 1 cetamol.com, 1 cetangyuk.com, 1 +cetayadigital.com, 1 cetelem.pt, 1 cetelon.tk, 1 ceti.ga, 1 cetin.cz, 1 cetong.se, 1 cetorebe.tk, 1 +ceu.bg, 1 ceu.edu.ph, 1 ceuniverse.com, 0 ceva-dsp.com, 1 @@ -30411,7 +30396,6 @@ cgconsulting.digital, 1 cgdct.moe, 1 cgelves.com, 1 -cgestiona.com, 0 cgeventoseturismo.com.br, 1 cggs.vic.edu.au, 1 cggsaquatic.com.au, 1 @@ -30420,7 +30404,6 @@ cgknieuwpoort.nl, 1 cglib.xyz, 1 cgmllc.net, 1 -cgo-it.de, 1 cgo.pw, 1 cgp.moe, 1 cgpa-de.org, 1 @@ -30430,7 +30413,6 @@ cgplumbingservice.com, 0 cgps.ch, 1 cgsmart.com, 1 -cgsmotors.com, 1 cgstprayagraj.gov.in, 1 cgt-univ-nantes.fr, 1 cgtburgos.org, 1 @@ -30467,7 +30449,6 @@ chadi.io, 1 chadis.com, 1 chadlenz.ca, 1 -chadstoneapartments.com.au, 1 chadtaljaardt.com, 1 chaghi.tk, 1 chaghionline.tk, 1 @@ -30609,7 +30590,6 @@ chantage.tk, 1 chantalflores.co.uk, 1 chantellbeauty.co.uk, 1 -chantierjob.com, 1 chantuong.org, 1 chanty.com, 1 chanz.com, 1 @@ -30771,6 +30751,7 @@ chasebenefits.com, 1 chasecountyne.gov, 1 chasetrails.co.uk, 1 +chaseyoursky.com, 1 chaskafire.gov, 1 chaskamn.gov, 1 chaskapolice.gov, 1 @@ -30788,7 +30769,6 @@ chat4me.tk, 1 chataberan.cz, 1 chatacademies.org.uk, 1 -chatalmuluk.com, 1 chatarpaullaw.com, 1 chataynazz.ga, 1 chatbarran.tk, 1 @@ -30914,16 +30894,18 @@ cheapervacations.com, 1 cheapessay.net, 1 cheapestdirectdebit.co.uk, 1 -cheapestgamecards.com, 1 +cheapestwaytofly.com, 1 cheapestwebcamsites.com, 1 cheapexpenseers.ga, 1 cheapexpenseest.ga, 1 +cheapfareto.com, 1 cheapflightatlanta.com, 1 cheapflightla.com, 1 cheapflightmexico.com, 1 cheapflightsengland.com, 1 cheapflightsticketstoindia.com, 1 cheapiesystems.com, 1 +cheapinternationalair.com, 1 cheaplasix.tk, 1 cheaplookers.ga, 1 cheaplookest.ga, 1 @@ -30977,6 +30959,7 @@ checka.co.nz, 1 checkandreportlive.com, 1 checkaninvoice.com, 1 +checkbarriere.de, 1 checkblau.de, 1 checkbooknyc.com, 1 checkbot.io, 1 @@ -30991,6 +30974,7 @@ checkfresh.com, 1 checkiday.com, 1 checkingfinder.com, 1 +checkingwork.io, 1 checkjelinkje.nl, 1 checklistbuilder.herokuapp.com, 1 checkmack.cf, 1 @@ -31003,10 +30987,12 @@ checkmin.cf, 1 checkmk.com, 1 checkmyhttps.net, 1 +checkmypageseo.com, 1 checkmypsoriasis.com, 1 checknetworks.com.au, 1 checkngo.com, 1 checkout.google.com, 1 +checkoutexpert.com, 1 checkprograms.com, 1 checkprograms.net, 1 checkr.com, 0 @@ -31015,13 +31001,12 @@ checkrente.nl, 1 checkreview.in, 1 checkrz.com, 1 -checksandbalancesproject.org, 1 checksoft.net, 1 checkspf.net, 1 +checktheworth.com, 1 checktls.nl, 1 checktype.com, 1 checkui.com, 1 -checkurinsurance.com, 1 checkwebsites.net, 1 checkyourmath.com, 1 checkyourprivilege.org, 1 @@ -31044,6 +31029,7 @@ chefaa.com, 1 chefcentral.co.uk, 1 chefcuisto.com, 1 +chefdeck.ai, 1 chefdehome.com, 1 chefforaday.it, 1 chefkentrathbun.com, 1 @@ -31080,8 +31066,8 @@ chelyabinsk-news.net, 1 chema.ga, 1 chemapool.bg, 1 -chemaxon.com, 1 chemengzone.com, 1 +chemeroid.com, 1 chemgenes.com, 1 chemica-us.com, 1 chemical-shark.de, 1 @@ -31130,6 +31116,7 @@ chenyin.work, 1 chequeado.com, 1 chequeo.de, 1 +chequer.software, 1 chequeraccounting.com.au, 1 cheratocono.tk, 1 cherbourg.website, 1 @@ -31176,7 +31163,6 @@ chesolar.cz, 1 chess.katowice.pl, 1 chesspoint.ch, 1 -chesstempo.com, 1 chessustron.pl, 1 chessveterinary.co.uk, 1 chesswiki.org, 1 @@ -31273,7 +31259,6 @@ chietech.com.br, 1 chietitoday.it, 1 chifeng.com.tw, 1 -chiffrer.info, 1 chigwelltreeservices.co.uk, 1 chijb.cc, 1 chikahaku1001vr.jp, 1 @@ -31343,10 +31328,10 @@ chimcanhcut.tk, 1 chime.com, 1 chimebank.com, 1 -chimera.sh, 1 chimerity.com, 1 chimesmusic.com, 1 chimesnewspaper.com, 1 +chimichat.com, 1 chimm.cc, 1 chimpanzee.cf, 1 chimpanzee.net, 1 @@ -31373,7 +31358,6 @@ chinalosers.com, 1 chinamemo.com, 1 chinaoptionsfund.cn, 1 -chinaoptionsfund.com, 1 chinaql.com, 1 chinasearch.tk, 1 chinaseminar.com, 1 @@ -31387,7 +31371,6 @@ chinefrancophonie.fr, 1 chinen-hs41.com, 1 chinese-fuhui.com, 1 -chinese.sc, 1 chinesebrides.ml, 1 chinesedishes.tk, 1 chinesepen.org, 1 @@ -31424,7 +31407,6 @@ chips-scheduler.de, 1 chips.gov, 1 chipset.no, 1 -chipsfuck.fish, 1 chiquian.tk, 1 chirache.com, 1 chirache.fr, 1 @@ -31562,7 +31544,6 @@ chopradionet.tk, 1 choptheknife.com, 1 chordiant.com, 1 -chordify.net, 1 chordmag.com, 1 chordpage.com, 1 chordu.com, 1 @@ -31816,6 +31797,7 @@ chronocarpe.com, 1 chronocolis.ml, 1 chronodelivery.com, 1 +chronology.no, 1 chronometre-en-ligne.com, 1 chronoshop.cz, 0 chronotech.fr, 1 @@ -31899,7 +31881,6 @@ churchillcountynv.gov, 1 churchilldowns.com, 1 churchillhealthcentre.com, 1 -churchlinkpro.com, 1 churchlw.tk, 1 churchmetrics.com, 1 churchofchrist.tk, 1 @@ -32044,7 +32025,6 @@ cimerek.hu, 1 cimetierenotredamedesneiges.ca, 1 cimfax.com, 1 -cimice.it, 1 cimsp.com, 1 cimsp.net, 1 cimtools.net, 1 @@ -32095,7 +32075,6 @@ cinerariosgruporosete.com, 1 cinet.jp, 1 cineterror.tk, 1 -cinevia.org, 1 cinexilio.tk, 1 cinicloud.com, 1 cinicsystems.tk, 1 @@ -32266,6 +32245,7 @@ citiledger.ga, 1 citiswich.com.au, 1 citius.gal, 1 +citizen-shield.com, 1 citizen428.net, 1 citizenewatch.tk, 1 citizenkevin.com, 0 @@ -32308,7 +32288,6 @@ citycreek.studio, 1 citycreekdental.net, 1 citycricket.tk, 1 -cityfacialplastics.com, 1 cityfinances.lv, 1 cityhide.tk, 1 cityhotel.tk, 1 @@ -32524,13 +32503,13 @@ civictheatrenewcastle.com.au, 1 civicunicorn.com, 1 civicunicorn.us, 1 -civil-works-sri.com, 1 civilbikes.com, 1 civilconcretellc.com, 1 civilengineeringhandbook.tk, 1 civilhost.tk, 1 civiliansnews.com, 1 civillines.nl, 1 +civilsimple.com, 1 civiltoday.com, 1 civilvirus.tk, 1 civmob.com, 1 @@ -32602,6 +32581,7 @@ cktennis.com, 1 ckwebsitedesign.ie, 1 ckyalliancefinland.tk, 1 +ckycindia.in, 1 cl-1xbet.com, 1 cl-cloud.spdns.org, 1 cl.search.yahoo.com, 0 @@ -32623,14 +32603,13 @@ claimittexas.gov, 1 claimmosaic.com, 1 claimnote.com, 1 -claimpilot.com, 1 +claimpilot.com, 0 claimsadj.com, 1 claimspharmacy.services, 1 clairebabai.nl, 1 clairegold.com, 1 clairelefort-architectes.com, 1 clairescastles.co.uk, 1 -clairesvall.com, 1 clairette-de-die-lantheaume.fr, 1 clairevoyance.tk, 1 claitec.com, 1 @@ -32800,6 +32779,7 @@ claude.me, 1 claude.photo, 1 claude.site, 1 +claudeapi.com, 0 claudearpi.in, 1 claudearpi.net, 1 claudeleveille.com, 0 @@ -32820,6 +32800,7 @@ claustrofobia.tk, 1 clautopieces.fr, 1 clave2000.com.co, 1 +claveframework.org, 1 clavit4.zone, 1 clawedfrogs.tk, 1 clawington.com, 0 @@ -32838,7 +32819,6 @@ clazzor.eu, 1 clcakes.au, 1 clcakes.com.au, 1 -clclawncare.com, 1 clco.fr, 1 clcv-brest.fr, 1 cldejessey.com, 1 @@ -32849,7 +32829,6 @@ clean-mailbox.com, 1 clean-water-and-sanitation.tk, 1 cleanairdallaspro.com, 1 -cleanandcleaner.net, 1 cleanclearwater.co.uk, 1 cleandetroit.org, 1 cleandrains.com.au, 1 @@ -32870,7 +32849,6 @@ cleanmycurtains.ie, 1 cleanmyfloor.ie, 1 cleanmymattress.ie, 1 -cleanmyupholstery.ie, 1 cleanpeakmascot.com.au, 1 cleanpouches.com, 1 cleanpowerbg.com, 1 @@ -32883,7 +32861,6 @@ cleanslate.sh, 1 cleanspeak.com, 1 cleansquad.in, 1 -cleansweepaa.com, 1 cleantec.show, 1 cleanuri.com, 1 cleanway.dk, 1 @@ -32919,7 +32896,6 @@ clearpicturelegalvideo.com, 1 clearpoint.org, 1 clearpointcreditcounselingsolutions.org, 1 -clearsafetalk.com, 1 clearsailingproperties.com, 1 clearsoftcomputacion.com, 1 clearstone.au, 1 @@ -32960,6 +32936,7 @@ clementsfamily.co, 1 clemta.com, 1 clendeninwv.gov, 1 +cleo-energy.com, 1 cleo.com, 1 cleocinonline.gq, 1 cleopatraescorts.co.uk, 1 @@ -32987,6 +32964,7 @@ clevermo.gov, 1 cleveroad.com, 1 cleveronmobility.com, 1 +clevertp.com, 1 cleververmarkten.com, 1 cleververmarkten.de, 1 clevisto.com, 1 @@ -33030,7 +33008,6 @@ clica.net, 1 click-7979.com, 1 click-cat.tk, 1 -click-generator.com, 1 click2affiliate.xyz, 1 click4click.ga, 1 clickandclaim.me, 1 @@ -33058,7 +33035,6 @@ clickipo.com, 1 clickkon.ml, 1 clicknbook.de, 1 -clickotine.com, 1 clickpeak.digital, 1 clickpharmacy.co.uk, 1 clickphobia.ga, 1 @@ -33160,7 +33136,6 @@ clinicalresearch.my, 1 clinicalsolutions.se, 1 clinicalstats.ga, 1 -clinicaltrialpodcast.com, 1 clinicaltrials.gov, 1 clinicaltrialsarena.com, 1 clinicamagdalena.com.co, 1 @@ -33210,8 +33185,10 @@ clipfor.ge, 1 clipperai.com, 1 clips.ga, 1 +clipverse.studio, 1 cliqit.com.au, 1 cliquetis.ddns.net, 1 +clirnet.com, 1 clive.io, 1 cliveptr.cc, 1 clkbw.com, 1 @@ -33223,7 +33200,7 @@ clnlboard.co.uk, 1 clnnet.ch, 1 clnshrk.club, 0 -cloaker.ru, 0 +cloaker.ru, 1 clochix.net, 1 clock3.com, 1 clockcaster.com, 1 @@ -33232,10 +33209,10 @@ clockka.it, 1 clocklab.design, 1 clocklink.com, 1 +clockworkcrm.com, 1 clodo.it, 1 clodoteam.ga, 1 clog.rocks, 1 -clojurefactory.io, 1 clokdways.com, 1 clomid100mg.ga, 1 clomid50mg.cf, 1 @@ -33317,6 +33294,7 @@ cloudbreaker.net, 1 cloudbrothers.info, 0 cloudbytesconnect.com, 1 +cloudcampuspro.com, 1 cloudcaprice.net, 1 cloudcastles.xyz, 1 cloudcert.org, 1 @@ -33426,6 +33404,7 @@ cloudturing.com, 1 cloudu.de, 1 cloudup.com, 1 +cloudvante.com, 1 cloudvante.com.au, 1 cloudvoor.eu, 1 cloudvoor.net, 1 @@ -33434,6 +33413,7 @@ cloudwave.fr, 1 cloudwayc.com, 1 cloudwayq.com, 1 +cloudwebschool.com, 1 cloudwellmarketing.com, 1 cloudwithlightning.net, 1 cloudykingdom.com, 1 @@ -33487,7 +33467,6 @@ club-soul.tk, 1 club.zj.cn, 1 club1.fr, 1 -club10x.com, 1 clubanimal.cl, 1 clubapk.com, 0 clubatleticonacionalpotosi.tk, 1 @@ -33510,7 +33489,6 @@ clubedegeografia.tk, 1 clubedoberloque.com.br, 1 clubedogis.com.br, 1 -clubedohardware.com.br, 1 clubedojornalismo.com.br, 1 clubedores.com.br, 1 clubeflor.com.br, 1 @@ -33574,7 +33552,7 @@ clubvwgolf.com, 1 clubyachats.com, 1 clubzap.org, 1 -clubzero.co, 1 +clubzero.co, 0 clubzul.com, 1 cluecho.com, 1 cluedosenvivo.com, 1 @@ -33586,7 +33564,6 @@ cluin.org, 1 cluj.help, 1 cluj24.ro, 1 -clun.top, 0 clurinternational.com, 1 clush.pw, 1 cluster.biz.tr, 1 @@ -33600,7 +33577,6 @@ clycat.ru, 1 clyde-tx.gov, 1 clydewi.gov, 1 -cm-agueda.pt, 1 cm-funchal.pt, 1 cm-lagos.pt, 1 cm-law.eu, 1 @@ -33638,6 +33614,7 @@ cmlcpa.ca, 1 cmlex.com, 1 cmlignon.ch, 1 +cmmcinfo.org, 1 cmn-group.com, 0 cmn-groupe.com, 0 cmngroup.com, 0 @@ -33686,7 +33663,6 @@ cn.search.yahoo.com, 0 cn2euportugal.com, 1 cn8522.com, 1 -cna-ecuador.com, 1 cnabogota.tk, 1 cnais.com, 1 cnam-idf.fr, 1 @@ -33702,7 +33678,6 @@ cncn3.cn, 1 cncollege.tk, 1 cncr.ga, 1 -cncs.gov.pt, 1 cnet.com, 1 cnetion.com, 1 cnetw.xyz, 1 @@ -33728,9 +33703,11 @@ cnsbordercellatlas.org, 1 cnslub.ru, 1 cnss.gob.do, 1 +cntl.kz, 1 cntr.fr, 1 +cntras.com, 1 cntraveller.com, 1 -cnv-academy.com, 1 +cnv-academy.com, 0 cnvt.fr, 1 cnxiangxian.com, 1 cnzhengmai.com, 1 @@ -33762,7 +33739,6 @@ coachment.dk, 1 coachnow.io, 1 coachparts.com, 1 -coachspiritual.ro, 1 coactive.ai, 0 coag.gov.au, 1 coalcountyok.gov, 1 @@ -33810,6 +33786,7 @@ cobracastles.co.uk, 1 cobralelie.nl, 1 cobranzasimg.com, 1 +cobs.si, 1 coc.de, 1 coca-colasip.com, 1 cocaine.ninja, 1 @@ -33880,12 +33857,14 @@ codabix.de, 1 codandn.com, 1 codastory.com, 1 +codatey.top, 1 codcourier.org, 1 code-35.com, 0 code-ch.com, 1 code-gen.ca, 1 code-in-plate.tk, 1 code-judge.tk, 1 +code-maze.com, 1 code-poets.co.uk, 1 code-server.host, 1 code-styling.de, 1 @@ -33896,12 +33875,14 @@ code.golf, 1 code.google.com, 1 code.gov, 1 +code0.ai, 1 code4rena.com, 1 code972.com, 1 codeable.dk, 1 codeactive.fr, 1 codeactive.net, 1 codeaegis.com, 1 +codeally.dk, 1 codeandpeace.com, 1 codeandsupply.co, 1 codeberg.org, 1 @@ -33961,9 +33942,9 @@ codenlife.kr, 1 codenlife.xyz, 1 codenode.io, 1 +codeon.ch, 1 codeops.com.tr, 1 codeparva.com, 1 -codepathstudio.com, 1 codepen.com, 1 codepen.io, 1 codephusion.com, 1 @@ -33990,6 +33971,7 @@ codersatlas.co, 1 codersatlas.xyz, 1 coderus.com, 1 +codes-team.com, 1 codes.pk, 1 codesal.solutions, 1 codesandbolts.com, 1 @@ -34033,7 +34015,6 @@ codex.rocks, 1 codexdigital.com, 1 codexio.in, 1 -codexlog.com, 1 codezenith.com, 1 codezeno.com.au, 1 codice-rosso.net, 1 @@ -34060,7 +34041,7 @@ codinghomeworkhelp.net, 1 codinginfinity.me, 1 codingnbb.com, 1 -codingpark.io, 1 +codingpark.io, 0 codingpedia.org, 1 codingrobots.com, 1 codingwithvera.com, 1 @@ -34111,7 +34092,9 @@ coffeewithsvein.com, 1 coffeist.com, 1 coffer.fi, 1 +coffeyagencies.com, 1 coffstotalroofing.com.au, 1 +cofidis-business.it, 1 cofidisperte.it, 1 cofinco.nl, 1 coforge.com, 1 @@ -34188,30 +34171,31 @@ coinpaprika.com, 1 coinpedia.org, 1 coinplay.com, 1 +coinport.com.au, 1 coinrule.com, 1 coins2001.ru, 1 coinscatalog.net, 1 coinsconnect.co.uk, 1 -coinsmat.com, 1 coinsuggest.com, 1 cointosh.jp, 1 cointotaal.com, 1 coinwind.vip, 1 coinx.pro, 1 coiracom.net, 1 -coisapet.com.br, 1 cojam.ru, 1 cojo.eu, 1 cokebar.info, 0 coker.com.au, 1 cokestudiosongs.tk, 1 cokoli.cz, 1 +col-reg.online, 1 col.la, 0 cola-host.tk, 1 colaba.online, 1 colaborame.tk, 1 colaboratorija.lt, 1 colabug.com, 1 +colace.me, 1 colafoodcritic.com, 1 colah.com.au, 1 colapsys.net, 1 @@ -34224,7 +34208,6 @@ colazxk.xyz, 1 colbert.ml, 1 colburnadamswi.gov, 1 -colchesterglobal.com.au, 1 colcomm.com, 1 cold.world, 1 coldcard.com, 1 @@ -34258,7 +34241,6 @@ coleg.gov, 1 colegiocuauhtzin.com.mx, 1 colegiojaimebalmes.es, 1 -colegios.net, 1 colegiotalenti.com, 1 colegiotavera.tk, 1 colemak.com, 1 @@ -34339,7 +34321,6 @@ collector.cf, 1 collectorknives.net, 1 collectorscorner.com, 1 -collectorsystems.com, 1 college-chagall.tk, 1 college-ic.ca, 1 college-sewing.co.uk, 1 @@ -34405,6 +34386,7 @@ collioure.com, 1 colloque-tv.com, 1 colloquio.tk, 1 +collorossodermatology.com, 1 colmcille.org, 1 colnevalleyvets.co.uk, 1 colo-tech.com, 1 @@ -34446,7 +34428,6 @@ colorblindprogramming.com, 1 colorbond.vn, 1 colorbrightongreen.org, 1 -colorcodedlyrics.com, 1 colordetector.click, 1 colorectalpractice.com, 1 colorfularchive.eu.org, 1 @@ -34466,6 +34447,7 @@ colorline.com.br, 1 colorpalette.org, 1 colorpicker.fr, 1 +colorpop.ai, 1 colors.top, 1 colorsbycarin.com, 1 colortronic.tk, 1 @@ -34538,6 +34520,7 @@ comanchecountyks.gov, 1 comanchenationpolice.gov, 1 comanchetexas.gov, 1 +comanda.plus, 1 comanis.fr, 1 comaporter.com, 1 comarcadelaranda.tk, 1 @@ -34567,7 +34550,6 @@ come.ga, 1 come2cook.com, 1 comealong.org, 1 -comeals.com, 1 comeback.no, 1 comebookmark.cf, 1 comebookmark.ga, 1 @@ -34594,6 +34576,7 @@ comet-xray.com, 1 comet.eu.org, 1 comet.tech, 1 +cometa.ro, 1 cometbot.cf, 1 comete-electricite.fr, 1 cometer.co, 1 @@ -34605,7 +34588,6 @@ comex.biz, 1 comfandivirtual.com.co, 1 comff.net, 1 -comfinagro.com.co, 1 comfintouch.com, 0 comfis.nl, 1 comfitsweets.co.uk, 1 @@ -34675,7 +34657,6 @@ commercia.srl, 1 commercial.lviv.ua, 1 commercialbankms.com, 1 -commercialbtp.com, 1 commercialfundinggroupllc.us, 1 commercialkitchensusa.com, 1 commerciallendingusa.com, 1 @@ -34777,13 +34758,11 @@ comp4u.de, 1 compab.it, 1 compactador-vendetta.tk, 1 -compactloan.com, 1 compagnidimerenda.tk, 1 compagniecoupable.fr, 1 compagniedesateliers.com, 0 compagniedesvoyageurs.com, 1 compagniemartin.com, 0 -compagnonsbtp.com, 1 companion-web.net, 1 company-bike.com, 1 company-info-plugins.nl, 1 @@ -34795,12 +34774,12 @@ comparamejor.com, 1 comparatif-moto.fr, 1 comparativadetarifasenergeticas.es, 1 -comparazionequote.net, 1 compare-energie.fr, 1 compareairfaredeals.com, 1 compareer.com, 1 compareleasedlines.co.uk, 1 comparemymobile.com, 1 +compareo.au, 1 compareshow.com, 1 comparesoft.com, 1 comparetaxsoftware.com, 1 @@ -34821,6 +34800,7 @@ compattatori.it, 1 compdermcenter.com, 1 compensadosbello.com.br, 1 +compete4ever.com, 1 competencyassessment.ca, 1 competis.cf, 1 competitiontree.com, 1 @@ -34849,7 +34829,6 @@ complex-organization.com, 1 complexart.ro, 1 complexcoral.ro, 1 -complexorganization.com, 1 complexsystems.fail, 1 compliance-risk.com, 1 compliance-systeme.de, 1 @@ -34858,9 +34837,9 @@ compliancefox.io, 1 compliancehome.com, 1 complianceinsight.ca, 1 -compliancequest.com, 1 compliancerisksoftware.co.uk, 0 compliancessentials.com, 1 +compliantclaw.com, 1 complianz.io, 1 complicescreatifs.com, 1 complifast.com.au, 1 @@ -34871,6 +34850,7 @@ complycheck.co, 1 complyfast.com.au, 1 complyfast.net.au, 1 +complyzero.com, 1 componentcore.com, 1 composite-isfahan.ir, 1 compositedevtec.tk, 1 @@ -34939,7 +34919,7 @@ computerforum.tk, 1 computerforums.net, 1 computerhilfe-feucht.de, 1 -computerinfobits.com, 1 +computerinfobits.com, 0 computerjet.ru, 1 computermaus.com, 1 computernetwerkwestland.nl, 1 @@ -35163,7 +35143,6 @@ congmc.com, 1 congnghe.so, 1 congoproject.tk, 1 -congregacionmitacol.org, 0 congresistas-ap.tk, 1 congresodelospueblos.org, 1 congressmankirk.com, 1 @@ -35232,7 +35211,6 @@ connexio.digital, 1 connext.de, 1 connextglobal.com, 1 -connictro.de, 1 connieetterphotography.com, 1 conning.com, 1 connock.co.uk, 1 @@ -35248,6 +35226,7 @@ conoha.vip, 1 conorbyrd.com, 1 conorjwryan.com, 1 +conorte.mx, 1 conory.com, 1 conova.com, 1 conpins.nl, 1 @@ -35282,7 +35261,6 @@ consegne.it, 1 conseildesarts.ca, 1 conseilgouz.com, 1 -conseiller-juridique.ca, 1 conseils-immo.fr, 1 conseilsmarketing.com, 1 consejoescolar.org, 1 @@ -35326,7 +35304,6 @@ constancescharff.com, 1 constant-rough.de, 1 constant.ga, 1 -constanta2035.ro, 1 constantinocontabilidade.com, 1 constantinschreiber.me, 1 constcorrect.com, 1 @@ -35371,7 +35348,7 @@ consultar.io, 1 consultation.ai, 1 consultation.biz.tr, 1 -consultaveiculopelaplaca.com.br, 1 +consultcolin.eu, 1 consultg.ltd, 1 consultimator.com, 1 consulting-brokerage.tk, 1 @@ -35409,12 +35386,15 @@ consumershempmd.com, 1 consumertesting.com, 1 consumidor.gov, 1 +consumoempauta.com.br, 1 consumptionjunction.com, 1 +consumr.ai, 1 consuwijzer.nl, 1 consyltec.de, 1 contabilidadebhpampulha.com.br, 1 contabilidadebrooklin.com.br, 1 contabilidademassarelli.com.br, 1 +contabooks.md, 1 contact-checker.tk, 1 contact.inc, 1 contact.xyz, 1 @@ -35430,6 +35410,7 @@ contato.vip, 1 contecgmbh.com, 1 contempfleury.com, 1 +contemplativeeducation.org, 1 contemptevoke.com, 1 contenedoresdereciclaje.online, 1 contentcaching.com, 1 @@ -35438,6 +35419,7 @@ contents.ga, 1 contermis.com, 1 contestreviewest.ga, 1 +contextcapture.ai, 1 contextolog.cf, 1 conti-profitlink.co.uk, 1 contiinex.com, 1 @@ -35461,6 +35443,7 @@ contractdirectory.gov, 1 contractorhoustontx.com, 1 contractormountain.com, 1 +contractorsiq.ca, 1 contractorswestga.com, 1 contractwriters.com, 1 contrafactos.tk, 1 @@ -35478,6 +35461,7 @@ contratti.it, 1 contrattipubblici.org, 1 contrel.be, 1 +contribution-margin.com, 1 contributopia.org, 1 contributor.google.com, 1 contro.cf, 1 @@ -35524,12 +35508,14 @@ conversationexchange.com, 1 conversatis.cf, 1 converser.tk, 1 +conversionkings.com.au, 1 conversive.nl, 1 convert-fast.photos, 1 convert.im, 1 convert.io, 1 convert2sql.com, 1 converterkits.com, 1 +convertiam.com, 1 converting.click, 1 convertire-documenti.it, 1 convertr.io, 1 @@ -35596,7 +35582,6 @@ cool110.xyz, 1 coolabaroo.com.au, 1 coolagent-dokumenty.cz, 1 -coolansplanet.com, 1 coolattractions.co.uk, 1 coolblockschool.org, 1 coolboys.ga, 1 @@ -35796,6 +35781,7 @@ corentin-et-rosalie.fr, 1 corepacks.tk, 1 corepartners.com.ua, 1 +corepersonaltrainersmelbourne.com, 1 corephysicians.org, 1 corerad.net, 1 coresecret.de, 1 @@ -35848,7 +35834,6 @@ cornercafe.tk, 1 cornercircle.co.uk, 1 cornergarage.coop, 0 -cornerperk.com, 1 cornerstone.rocks, 1 cornerstonebuildingbrands.com, 1 cornerstonenorthwest.com, 1 @@ -35884,6 +35869,7 @@ coronavirustesting.gov, 1 coronersconnect.co.uk, 1 cororocierodebelen.tk, 1 +corover.ai, 1 corp.goog, 1 corpconsulting.com, 1 corpdocs.com.au, 1 @@ -35932,7 +35918,6 @@ correo-e.mx, 1 correo.club, 1 correo.si, 1 -correotemporal.org, 1 correspond.gq, 1 correspondent.ga, 1 corretoramichelesalvino.com.br, 1 @@ -35971,6 +35956,7 @@ cortestesisat.net, 1 cortex-development.de, 1 cortex-tickets.de, 1 +cortexedi.com, 1 cortexsage.com, 1 cortezco.gov, 1 cortezsanitation.gov, 1 @@ -36051,12 +36037,10 @@ cosmoschaos.net, 1 cosmosearch-azerbaijan.tk, 1 cosmosenalerta.tk, 1 -cosmosfala.com.br, 1 cosmosmkt.com.mx, 1 cosmowords.games, 1 cosmoz.ga, 1 cosmundi.de, 1 -cosmv.org, 1 cosni.co, 1 cosos.gov, 1 cospier.com, 1 @@ -36065,16 +36049,13 @@ cospol.ch, 0 cosset.com.tw, 1 costa-ballena.tk, 1 +costa-blanca.space, 1 costalinux.tk, 1 costaneranorte.cl, 1 costaricadreamers.com, 1 costaricanvillas.com, 1 costazulinmobiliaria.com, 1 -costco.co.jp, 1 -costco.co.kr, 1 -costco.co.nz, 1 -costco.co.uk, 1 -costco.com.au, 1 +costclock.ai, 1 costcoinsider.com, 1 costel.tk, 1 costelcom.co, 1 @@ -36130,6 +36111,7 @@ couetteduvet.fr, 1 cougar-bordeaux.fr, 1 coughlan.de, 1 +coughstep.com, 1 could.jp, 1 couleur-lavande.com, 1 couleursorgue.tk, 1 @@ -36168,10 +36150,10 @@ country-muziek.nl, 1 countryandroses.com, 1 countrybrewer.com.au, 1 +countryfresh.com, 1 countryfunders.com, 1 countrygrid.com, 1 countryhearthbedandbreakfast.com, 1 -countryherald.com, 1 countrymountaininn.com, 1 countrymusicchart.net, 1 countryoutlaws.ca, 1 @@ -36193,11 +36175,15 @@ coupestanley.com, 1 couplay.org, 1 couplesapp.co, 1 +couplesroom.com, 1 coupona.co.il, 1 +couponarrow.com, 1 couponava.com, 0 couponchief.com, 0 +couponcode.co.il, 1 couponcodesme.com, 1 couponim.co.il, 1 +couponoy.com, 1 couponsale.tk, 1 couponzil.com, 0 courage-sachsen.org, 1 @@ -36265,7 +36251,7 @@ couverture-barre.fr, 1 cov.com, 1 covar.com.co, 1 -cove.chat, 1 +covenco.com, 1 coventa.cl, 1 coventry.com, 1 coventrycollege.ac.uk, 1 @@ -36289,7 +36275,7 @@ covershousing.nl, 1 covert.sh, 1 covery.ai, 1 -coveteur.com, 1 +coveteur.com, 0 covettrading.com, 0 covid-19.nhs.uk, 1 covid-19advice.com, 1 @@ -36321,7 +36307,6 @@ covisa.cl, 1 covisian.com, 0 covoiturage.fr, 1 -covybrat.cz, 1 cowbird.org, 1 cowcreek-nsn.gov, 1 coweasy.com, 1 @@ -36427,10 +36412,10 @@ cpsq.fr, 1 cpstest.live, 1 cpstest.org, 1 +cptcreative.com, 1 cptoon.com, 1 cpts-tdm16.fr, 1 cptvl.de, 1 -cpu.biz.tr, 1 cpu.wiki, 1 cpucheu.com, 1 cpufanshop.ga, 1 @@ -36517,7 +36502,6 @@ craftinghand.com, 0 craftist.de, 1 craftmachinec.com, 1 -craftmenu.ru, 1 craftmeow.com, 1 craftmeow.support, 1 craftottawa.ca, 1 @@ -36527,7 +36511,7 @@ crafttalk.tk, 1 craftwarehouse.com, 1 craftwmcp.xyz, 1 -craftychameleonbar.com, 1 +craftychameleonbar.com, 0 craftycove.store, 1 craftydev.design, 1 craftyguy.net, 1 @@ -36649,9 +36633,7 @@ crcc-center.com, 1 crcmc.com.tw, 1 crcncc.org, 1 -crcprojects.in, 1 crcr.pw, 1 -cre-pf.org.au, 0 cre8ivedeals.com, 1 crea-shops.ch, 0 crea.bg, 1 @@ -36671,6 +36653,7 @@ cream-dream.com.ua, 0 creamcastles.co.uk, 1 creamfields.com, 1 +creamlanddairy.com, 1 creamosweb.co, 1 creampiepussytube.com, 1 creamsoft.com, 1 @@ -36679,6 +36662,7 @@ creand.es, 1 creandgroup.com, 1 creandoydesarrollando.com, 1 +creaphism.com, 1 crear-webs-baratas.com, 0 creared.edu.co, 1 crearesiteweb.tk, 1 @@ -36697,8 +36681,9 @@ createcpanama.com, 1 creategyx.ga, 1 createit.com, 1 +createitwithcottage.com, 1 creately.com, 1 -createmvp.com, 1 +createstoke.com, 1 createstudios.com.au, 0 createurshub.com, 1 createwithcynthia.com, 1 @@ -36708,6 +36693,7 @@ creationfox.gq, 1 creations-edita.com, 1 creationsdharmonie.com, 1 +creatisa.cz, 1 creative-cinema.cloud, 1 creative-cinema.de, 1 creative-wave.fr, 1 @@ -36740,7 +36726,6 @@ creativemindslms.tk, 1 creativemotion.io, 1 creativenz.govt.nz, 1 -creativepatterns.io, 1 creativephs.com, 1 creativephysics.ml, 1 creativeqc.com, 1 @@ -36754,12 +36739,12 @@ creativetouchrotherham.co.uk, 1 creativeworks.com.hk, 1 creatividigitali.com, 1 -creativityalliance.com, 0 creativlabor.ch, 1 creativo.biz, 1 creatix.tk, 1 creatomatic.co.uk, 1 creatormetrics.io, 1 +creatorrm.com, 1 creators.direct, 1 creatorsgarten.org, 1 creatorswave.com, 1 @@ -36768,6 +36753,7 @@ creature.social, 1 creayes.com, 1 creaza.nl, 1 +crebi.com.co, 1 crebita.de, 1 creche-noel.com, 1 crechepequenopolegar.com.br, 1 @@ -36780,9 +36766,7 @@ credex.bg, 1 credfacilbeneficios.com.br, 1 crediblemeds.org, 1 -credify.tech, 1 credigo.io, 1 -credimax.com.bh, 1 credin.com.tr, 1 credit-10.com, 1 credit-default-swaps.tk, 1 @@ -36795,6 +36779,7 @@ creditcorponline.com, 0 creditenonstop.ro, 1 crediteurope.ru, 1 +creditfair.in, 1 creditif.tk, 1 creditkarma.ca, 1 creditkarma.com, 1 @@ -36818,7 +36803,6 @@ creditxpert.com, 1 crednox.com, 1 credo.science, 1 -credzy.com, 1 creekcountyonline.com, 1 creekie.me, 1 creeks-coworking.com, 1 @@ -36876,7 +36860,6 @@ creus.jp, 1 creusalp.ch, 0 crew.moe, 1 -crewextension.com, 1 crewnetwork.com, 1 crewplanner.com, 1 crewresourcesinternational.group, 1 @@ -36887,7 +36870,6 @@ crex24.com, 1 crfcap.org, 0 crftvideo.com, 1 -crg-pi.com, 1 crgalvin.com, 1 crgm.net, 1 cri-paris.org, 0 @@ -36908,6 +36890,7 @@ cricpa.com, 1 cricrocket.com, 1 crictechs.com, 1 +cricxline.com, 1 criena.com, 1 criena.net, 1 crigler-najjar.fr, 1 @@ -36994,6 +36977,7 @@ cristi.io, 1 cristiaen.nl, 1 cristian-alexander.tk, 1 +cristianb.cz, 1 cristiandumitru.tk, 1 cristianhares.com, 1 cristianonascimento.ml, 1 @@ -37006,7 +36990,7 @@ cristnasar.tk, 1 cristomisina.tk, 1 cristomoradocusco.tk, 1 -cristyclauserphotography.com, 1 +cristyclauserphotography.com, 0 criteriaproducciones.tk, 1 criterion.ga, 1 critfc.org, 1 @@ -37051,6 +37035,7 @@ crn.li, 1 crnajobsite.com, 1 crnalab.net, 1 +crnsecure.com, 1 croachlife.com, 1 croatia.hr, 1 crobeauty.com, 1 @@ -37097,6 +37082,7 @@ cronometer.com, 1 cronoscentral.be, 1 cronosdev.com, 1 +cronosgrocery.com, 1 crookcountyor.gov, 1 crookedcru.tk, 1 crookedlakelistings.com, 1 @@ -37134,6 +37120,8 @@ crossfitblau.com, 1 crossformer.com, 1 crossfox.red, 1 +crossjoin.com, 1 +crossjoin.pt, 1 crosslifenutrition.co.uk, 0 crosslimit.ga, 1 crossorange.jp, 1 @@ -37158,9 +37146,11 @@ crowdfiber.com, 1 crowdpress.it, 1 crowdsim3d.com, 1 +crowdstack.com, 1 crowdstack.io, 1 crowdsupply.com, 1 croweleaseaccountingexpress.com, 1 +croweserver.com, 1 crowleytxlicensedelectrician.com, 1 crown-beverage.com, 1 crown-building.com, 1 @@ -37199,6 +37189,7 @@ crt2014-2024review.gov, 1 crtevents.co.uk, 1 crtified.me, 1 +crucibl.ai, 1 crucible.io, 1 crudly.ai, 1 cruelalice.net, 1 @@ -37234,6 +37225,7 @@ crustytoothpaste.net, 1 crute.me, 1 crutic.gq, 1 +cruxa.io, 1 cruxreasoning.com, 1 cruzadamorada.tk, 1 cruzrealestatepropertiesllc.com, 1 @@ -37249,6 +37241,7 @@ cryozenic.com, 1 cryp.no, 1 crypt-app.net, 1 +crypt.is-by.us, 1 crypt0cloud.ddns.net, 0 cryptcex.com, 0 cryptcheck.fr, 1 @@ -37262,7 +37255,7 @@ crypticonseattle.com, 1 crypticstench.tk, 1 cryptifo.com, 1 -cryptii.com, 0 +cryptii.com, 1 cryptin-it.com, 1 cryptme.in, 1 crypto-ads.ga, 1 @@ -37335,7 +37328,6 @@ cryptop.ml, 1 cryptoparty.at, 1 cryptoparty.dk, 1 -cryptoparty.in, 1 cryptoparty.tv, 1 cryptopartynewcastle.org, 1 cryptopartyutah.org, 1 @@ -37346,7 +37338,6 @@ cryptorival.com, 1 cryptoscamdb.org, 1 cryptoscope.io, 1 -cryptoseed.org, 1 cryptosender.io, 1 cryptoshot.pw, 1 cryptosolicitations.com, 1 @@ -37471,16 +37462,17 @@ csgo.ac.cn, 1 csgo.net, 1 csgo.su, 1 +csgobans.com, 1 csgodb.net, 1 csgoempire.com, 1 csgoempire.gg, 1 csgofile.tk, 1 csgofinder.eu, 1 csgomtr.com, 1 +csgoskins.gg, 1 csgotwister.com, 1 csgoyournal.com, 1 csharp.love, 1 -csharpfactory.io, 1 csharpmarc.net, 1 cshe.de, 1 cshive-img.com, 1 @@ -37559,14 +37551,11 @@ csx.co.za, 1 csy.hu, 1 csyxy.fi, 1 -cszj.wang, 0 ct-static.com, 1 ct-watches.dk, 1 ct.search.yahoo.com, 0 ctafo.com, 0 ctauditors.gov, 1 -ctbirding.org, 1 -ctc-g.com.sg, 1 ctcloud.ml, 1 ctcom-peru.com, 1 ctconp.org, 1 @@ -37580,6 +37569,7 @@ ctf-albstadt.de, 1 ctf-archive.com, 0 ctf.link, 1 +ctg.com, 0 cthomas.work, 1 cthulhuden.com, 1 ctir.gov.br, 1 @@ -37604,7 +37594,9 @@ ctpe.net, 1 ctpro.net, 1 ctr-sante.eu, 1 +ctrack.org, 1 ctrackcrystal.co.za, 1 +ctrackcrystal.com, 1 ctrl-click.fr, 1 ctrl.blog, 1 ctrl.gr, 0 @@ -37637,6 +37629,7 @@ cubanchino.tk, 1 cubanda.de, 1 cubatel.com, 1 +cubavisa.uk, 1 cubazineers.ga, 1 cubazineest.ga, 1 cubbus.beauty, 1 @@ -37724,6 +37717,7 @@ cukrarnalahoda.cz, 1 cukrinelape.com, 1 cukrzyca.net, 1 +cuktech.tr, 1 cukurbag.ml, 1 culan.dk, 0 culaoxi.com, 0 @@ -37772,6 +37766,7 @@ cumberlandcountync.gov, 1 cumberlandcountynj.gov, 1 cumberlandcountypa.gov, 1 +cumberlanddairy.com, 1 cumberlandrivertales.com, 1 cumberlink.com, 1 cumbiaperuana.tk, 1 @@ -37784,6 +37779,7 @@ cumman.life, 1 cumnock.name, 1 cumnock.org, 1 +cumple21719.cl, 1 cumplegenial.com, 1 cumsext.me, 1 cumshots-video.ru, 1 @@ -37843,6 +37839,7 @@ cure53.de, 1 cureatr.com, 1 cureine.com, 1 +curewiki.health, 1 cureyou.com.tw, 1 curieux.digital, 0 curinline.com, 1 @@ -37882,10 +37879,10 @@ currencyroot.com, 1 current-ip.com, 1 current.com, 0 -currentbitcoin.news, 1 currentchaos.tk, 1 currenteurope.eu, 1 currenthaus.com, 1 +currentlystreaming.com, 1 currycountynm.gov, 1 currycountyor.gov, 1 currynissanmaparts.com, 1 @@ -38023,7 +38020,6 @@ cvalda.tk, 1 cvazquez.es, 1 cvbp.nl, 1 -cvbtp.com, 1 cvc.digital, 1 cvdeexpo.com, 1 cvdesignr.com, 1 @@ -38032,7 +38028,6 @@ cvec.org, 1 cvedetails.com, 1 cvent.com, 1 -cvetochniydom.ru, 1 cvetpodokonnik.tk, 1 cvetybaby.com, 1 cvgenius.com, 1 @@ -38040,7 +38035,6 @@ cvgt.com.au, 1 cvh.hr, 1 cvhunter.hu, 1 -cvj.me, 1 cvjd.me, 0 cvjm.rocks, 1 cvlibrary.co.uk, 1 @@ -38117,6 +38111,7 @@ cxbmystore.com, 1 cxcarepro.com, 1 cxense.com, 1 +cxliving.com, 1 cxologic.com, 1 cxologic.io, 1 cxologic.net, 1 @@ -38126,6 +38121,7 @@ cxpbrasil.com.br, 1 cy.ax, 1 cy.technology, 1 +cyabra.com, 1 cyanhexagon.com, 1 cyanogenupdatetracker.com, 1 cybaa.io, 1 @@ -38192,6 +38188,7 @@ cyberdan.co.uk, 1 cyberdean.fr, 1 cyberdefgeek.com, 1 +cyberdesk.help, 1 cyberdevelopment.es, 1 cyberdiscoverycommunity.uk, 1 cyberdog.ch, 1 @@ -38348,9 +38345,7 @@ cyboshield.com, 1 cybozu.cn, 1 cybozu.com, 1 -cybrient.com, 1 cybrix.io, 1 -cyburbia.org, 1 cycc.cloud, 1 cyclamen.tk, 1 cycleboss45.fr, 1 @@ -38397,6 +38392,7 @@ cynqx.com, 1 cynrgie.fr, 1 cynthiacherry.com, 1 +cyoa.com, 1 cyon.ch, 1 cyp.io, 1 cype.dedyn.io, 1 @@ -38413,6 +38409,7 @@ cypro.co.uk, 1 cyprus-company-for.gr, 1 cyprus-company-service.com, 1 +cyprus-companyformation.com, 1 cyprus-consult.com, 1 cyprustimes.com, 1 cyqual.com, 1 @@ -38482,6 +38479,7 @@ cztt.cz, 1 czwartybrat.pl, 0 czymamdzisimieniny.pl, 1 +czystaprzyjemnosc.eu, 1 czzs.org, 1 d-20.fr, 1 d-consultant.ru, 1 @@ -38491,7 +38489,7 @@ d-eisenbahn.com, 1 d-ku.de, 1 d-macindustries.com, 1 -d-mind.de, 0 +d-mind.de, 1 d-shed.tk, 1 d-soft.tk, 1 d-solutions.com.au, 1 @@ -38545,10 +38543,10 @@ d3ojty55ovjfr5.cloudfront.net, 1 d3rfz9qlehr7mx.cloudfront.net, 1 d3scene.org, 1 +d3un161ynmkt1z.cloudfront.net, 1 d3x.pw, 1 d3xt3r01.tk, 1 d42.no, 1 -d4fx.de, 1 d4insight.com, 1 d4wson.com, 1 d500world.tk, 1 @@ -38582,6 +38580,7 @@ d9397.com, 1 d9728.co, 1 d9and10sports.com, 1 +da-enzo-muenchen.de, 1 da-schaewel.de, 1 da-tex.com.ua, 0 da-tixe.ml, 1 @@ -38676,6 +38675,7 @@ daffodilusa.org, 1 dafont.com, 1 daft.ie, 1 +dafta.sh, 1 dafunda.com, 1 dafuq.xyz, 1 dafyddcrosby.com, 1 @@ -38723,6 +38723,7 @@ daikoz.fr, 1 daileyeducationalservices.com, 1 daili.eu, 1 +daily-mints.com, 1 daily-puzzle.tk, 1 daily-solution.pro, 0 daily-sudoku.tk, 1 @@ -38751,9 +38752,8 @@ dailyillini.com, 1 dailyjigsawpuzzles.net, 1 dailykos.com, 1 -dailykosbeta.com, 1 +dailykosbeta.com, 0 dailylime.kr, 1 -dailylviv.com, 1 dailymedicalinfo.com, 1 dailymotion.com, 1 dailynewsclubs.ga, 1 @@ -38776,12 +38776,14 @@ dailyvpn.com, 1 dailywealth.com, 1 dailywork.ga, 1 -dailyxenang.com, 1 daintonparkgolf.co.uk, 1 dairikab.go.id, 1 dairy.com.sg, 1 dairydata.ie, 1 +dairygold.ie, 1 dairygoldagri.ie, 1 +dairymaiddairy.com, 1 +dairypure.com, 1 daisidaniels.co.uk, 1 daisuki.pw, 1 daisy-peanut.com, 1 @@ -38808,6 +38810,7 @@ dakcess.net, 1 daken.hu, 1 daki-host.tk, 1 +dakiktabela.com, 1 dakin.nyc, 1 daknam.tk, 1 daknob.net, 1 @@ -38816,6 +38819,7 @@ dakota911mn.gov, 1 dakotacil.org, 1 dakotaplainscreditunion.com, 1 +dakotasanitation.com, 1 dakotavalleyrecyclingmn.gov, 1 dal-loop.xyz, 1 dal.net.sa, 1 @@ -38830,6 +38834,7 @@ daldropsbb.com, 1 daleanddollops.com, 1 dalecountyal.gov, 1 +dalelionline.com, 1 daleunavueltaalmundo.com, 1 dalevuelta.tk, 1 dalfsennet.nl, 1 @@ -38865,6 +38870,7 @@ dallmeier.net, 0 dallydushigrill.com, 0 dalmatians.tk, 1 +dals.co.uk, 1 dalsin.ir, 1 daltoncraven.com, 0 daltonmi.gov, 1 @@ -38935,6 +38941,10 @@ danalpay.com, 1 danalytics.com.pe, 1 danamica.dk, 1 +danandissy.co.uk, 1 +danandissy.com, 1 +danandissy.love, 1 +danandissy.wedding, 1 danandrum.com, 1 danangcitytours.com, 1 danarozmarin.com, 1 @@ -38949,6 +38959,7 @@ danca.com, 1 dance-colleges.com, 1 dance-school.tk, 1 +dance-showband.de, 1 dancechart.tk, 1 dancefm.tk, 1 dancenowportal.com, 1 @@ -39056,13 +39067,11 @@ danielhurley.eu, 1 danielhurley.info, 1 danielhurley.org, 1 -danielittlewood.xyz, 1 danielives.co.uk, 1 danielj.tk, 1 danieljamesscott.org, 1 danielkoster.nl, 0 danielle-picchetti.com, 1 -daniellecavazos.com, 1 daniellelazier.com, 1 danielleskosky.com, 1 daniellespringer.tk, 1 @@ -39106,11 +39115,11 @@ danielzuzevich.com, 1 danifabi.eu, 1 danilapisarev.com, 1 +daniliants.com, 1 danilov-abrosimov.org.ua, 1 danish-tool.de, 1 danish.cf, 1 danish.events, 1 -danishbytes.club, 1 danishiqbal.tk, 1 danispage.tk, 1 danituuu7.tk, 1 @@ -39197,7 +39206,6 @@ danwelty.me, 1 danwelty.net, 1 danwelty.org, 1 -danwillenberg.com, 1 danwin.de, 1 danwin1210.de, 1 danwise.online, 1 @@ -39238,7 +39246,6 @@ dare.deals, 1 dare2sell.com.au, 1 darean.ml, 1 -darebioscience.com, 1 daredefydiscover.ca, 1 daredorm.com, 1 darehousingfoundation.org, 1 @@ -39280,6 +39287,7 @@ dark.fail, 1 darkacek.cz, 1 darkag.ovh, 1 +darkainleather.com, 1 darkartstudios.tk, 1 darkbeam.com, 1 darkbit.gr, 1 @@ -39339,6 +39347,7 @@ darksair.org, 1 darkscience.tk, 1 darksecret.dk, 1 +darkseller.in, 1 darkserver.fedoraproject.org, 1 darkserver.stg.fedoraproject.org, 1 darksideprod.tk, 1 @@ -39346,7 +39355,6 @@ darksilver.nl, 1 darkskymap.com, 1 darkskymd.org, 1 -darksoilcbd.com, 1 darksonic.tk, 1 darkspacelab.com, 1 darkspike.tk, 1 @@ -39421,7 +39429,6 @@ dasabomobil.de, 1 dasads.de, 1 dasbaum.ch, 1 -dasble.com, 1 dascan.com.br, 1 dasdanny.de, 1 daseinsfreu.de, 1 @@ -39448,7 +39455,6 @@ dasinternetluegt.at, 1 daskirschhaus.com, 1 dasler.eu, 1 -dasmailarchiv.ch, 1 dasolindustrialpark.tk, 1 dastchin.live, 1 dastelefonbuch.de, 1 @@ -39498,7 +39504,6 @@ datacad.com, 1 datacalle.com, 1 datacandy.com, 0 -datacaptive.com, 1 datacave.is, 1 datacenter-online.com, 1 datacenter.news, 1 @@ -39535,7 +39540,6 @@ dataentry.top, 1 datafactory.co.za, 1 datafinland.com, 1 -datafloq.com, 1 datagir.ir, 0 datagrail.io, 1 datagrid.ga, 1 @@ -39643,6 +39647,7 @@ datenrettung360.at, 1 datenrettung360.de, 1 datenschutz-berlin.de, 1 +datenschutz-consult.de, 1 datenschutz-gruenwald.de, 1 datenschutz-individuell.de, 1 datenschutz-isny.de, 1 @@ -39662,6 +39667,7 @@ datera-solutions.de, 1 dateranker.nl, 1 datessrit.tk, 1 +datex.live, 1 dating-site-rating.co.uk, 1 dating.wedding, 1 datingadvice.gq, 1 @@ -39689,6 +39695,8 @@ datorhjalpen.link, 1 datos-quimsaitw.es, 1 datosfreak.tk, 1 +datost.ai, 1 +datost.com, 1 datovy-portal.cz, 1 datovy-portal.sk, 1 datovyaudit.cz, 1 @@ -39735,7 +39743,6 @@ davecloud.fr, 1 davedavlin.com, 1 daveedave.de, 0 -davegebler.com, 1 davelucia.com, 1 davematthias.com, 1 davemusic.tk, 1 @@ -39799,7 +39806,6 @@ davidgrudl.com, 1 davidhastingseckerd.com, 0 davidheineman.net, 1 -davidho.org, 1 davidhurl.net, 1 davidinteriors.tk, 1 davidje13.com, 1 @@ -39872,6 +39878,7 @@ davimun.org, 1 davinamccall.tk, 1 davinci.guide, 1 +davinciproject.art, 1 davinciwaldorfschool.org, 1 davisboroga.gov, 1 daviscountyelectionsutah.gov, 1 @@ -39884,6 +39891,7 @@ davisrentacar.ro, 1 davisvision.com, 1 davmany.freeboxos.fr, 1 +davodi.hu, 1 davorin.cf, 1 davosalestax.com, 1 davros.eu, 1 @@ -39896,10 +39904,12 @@ davypropper.com, 1 dawaai.pk, 1 daware.io, 1 +dawei.help, 1 dawg.eu, 1 dawgs.ga, 1 dawidpotocki.com, 1 dawidwrobel.com, 1 +dawn0.com, 1 dawnbringer.eu, 1 dawnbringer.net, 1 dawnbyte.ch, 1 @@ -40003,7 +40013,6 @@ dbeilharz.de, 1 dbeilharz.eu, 1 dbentertainment.co.uk, 1 -dbeta.co.uk, 1 dbfopraga-pn.waw.pl, 0 dbgames.info, 1 dbhome.org, 1 @@ -40059,6 +40068,7 @@ dc7342.im, 1 dcache.org, 1 dcain.me, 1 +dcalculator.net, 1 dcard.tw, 1 dcards.in.th, 1 dcareer.tk, 1 @@ -40134,6 +40144,7 @@ dda.gov.ae, 1 ddai.nl, 1 ddatsh.com, 0 +dday.io, 1 ddayantics.xyz, 1 ddays2008.org, 1 ddbservices.co.uk, 1 @@ -40243,6 +40254,7 @@ dealernet.com.br, 1 dealerselectric.com, 1 dealerwriter.com, 1 +dealerxpert.com.br, 1 dealflowpro.io, 1 dealha.com, 1 dealhabibi.com, 1 @@ -40258,7 +40270,7 @@ dealsinaz.com, 1 dealsmagnet.com, 1 dealsomart.com, 1 -dealspotr.com, 1 +dealspotr.com, 0 dealstreet.fr, 1 dealzme.com, 1 deamonmail.tk, 1 @@ -40267,6 +40279,8 @@ deanbank.com, 1 deanconsultancy.co.uk, 1 deano-s.co.uk, 1 +deanprice.com, 1 +deansdairy.com, 1 deanvending.com, 1 deanwest.com, 1 dear-children.ga, 1 @@ -40343,16 +40357,18 @@ deboo.info, 1 debora-singkreis.de, 1 deborahkaty.tk, 1 -deborahmarinelli.eu, 1 +debosschespoorzone.nl, 1 debostero.tk, 1 deboutpourlemali.ml, 1 debra-cz.org, 1 debra-sa.com, 1 debraj.in, 1 +debranddenbosch.nl, 1 debraschilling.de, 1 debrasclassiccleaning.com, 1 debraydesign.com.au, 1 debricked.com, 1 +debrid-downloader.com, 1 debridleech.com, 1 debrunet.nl, 1 debruns.ie, 1 @@ -40377,7 +40393,8 @@ decagames.com, 1 decal-times.com, 1 decalquai.ch, 0 -decamidea.it, 0 +decamidea.it, 1 +decanthouse.com, 1 decathlon.ca, 1 decathlon.co.il, 1 decathlon.com.co, 1 @@ -40490,7 +40507,6 @@ dedoles.cz, 1 dedoles.hu, 1 dedoles.pl, 1 -dedoles.sk, 1 dedurpsidioten.tk, 1 dedyk.gq, 1 dee.pe, 1 @@ -40502,7 +40518,6 @@ deejayladen.de, 1 deejayz.tk, 1 deelauto.club, 1 -deelmee.nl, 1 deelmijnreis.nl, 1 deelodge.art, 0 deeltaxi-regioshertogenbosch.nl, 1 @@ -40600,6 +40615,7 @@ defistablecoin.ai, 1 defkey.com, 1 deflumeriker.com, 1 +defmarks.com, 1 defme.eu, 1 defont.nl, 1 defreitas.no, 1 @@ -40644,10 +40660,13 @@ degreeverify.com, 1 degreeverify.net, 1 degreeverify.org, 1 +degressif.com, 1 +degroenedelta.com, 1 degroetenvanrosaline.nl, 1 degrootenslot.nl, 0 +degrootevlietdenbosch.nl, 1 degroupnews.com, 1 -degruchy.org, 0 +degruchy.org, 1 deguisements-couple.fr, 1 deguisements-gonflables.fr, 1 degustavending.es, 1 @@ -40658,7 +40677,7 @@ dehoga-reisen.de, 1 dehopre.com, 1 dehumanizer.com, 1 -dehuystandarts.nl, 1 +dehuystandarts.nl, 0 dehydrated.io, 1 dei.gov, 1 deiaprint.com, 1 @@ -40743,7 +40762,6 @@ delay-dengi.cf, 1 delaydengy.tk, 1 delaysoft.tk, 1 -delbridge.solutions, 1 delcan.ga, 1 delcan.gq, 1 delcan.ml, 1 @@ -40871,7 +40889,6 @@ deltarisk.com, 0 deltaserat.tk, 1 deltaservers.com.br, 1 -deltasigmachi.org, 1 deltasigmaxi1971.tk, 1 deltasuprimentos.com.br, 1 deltav.ml, 1 @@ -40995,7 +41012,9 @@ denarium.com, 1 denatured.tk, 1 denbar.org, 1 +denbosch-ontwikkelen.nl, 1 denboschdataweek.nl, 1 +denboschinontwikkeling.nl, 1 denboschtimemachine.eu, 1 denboschtimemachine.nl, 1 dencel.lv, 1 @@ -41051,7 +41070,6 @@ denizlicilingir.org, 1 denizlihaber.tk, 1 denizlihaberleri.tk, 1 -denizlihaliyikama.net, 1 denizlisohbet.tk, 1 denizuydur.nl, 1 denk-it.be, 0 @@ -41127,12 +41145,13 @@ dentistabarbarajaqueline.com.br, 1 dentistalagoasanta.com.br, 1 dentisteliege.be, 1 -dentistesdarveauetrioux.com, 1 +dentistnorthmelbourne.com.au, 1 dentistree.in.ua, 1 dentistsgainesvillega.com, 1 dentistslilburnga.com, 1 dentoncounty.gov, 1 dentoncountysheriffjobs.gov, 1 +dentondynamics.co.uk, 1 dentonolab.lt, 1 dentrassi.de, 1 dentrecovery.com, 1 @@ -41169,17 +41188,16 @@ deooyevaar.es, 1 deooyevaar.fr, 1 deooyevaar.nl, 1 +deoperator.nl, 1 deoremann.com, 0 deovergangendan.nl, 1 depaco.com, 1 depagecms.net, 1 -depannage-traceur.fr, 1 depapboeren.tk, 1 departamentoslosolivos.tk, 1 departmentofdefense.tk, 1 departmentofoncology.com, 1 departureboard.io, 1 -depaul-edu.org, 1 depaulmanorestate.com.au, 1 depay.com, 1 depay.fi, 1 @@ -41203,6 +41221,7 @@ dephoro.com, 1 depicus.com, 1 depijp.tk, 1 +depilacionmasculina.ch, 1 depilazione.roma.it, 1 depistage-bejune.ch, 0 depleteduranium.tk, 1 @@ -41215,6 +41234,7 @@ depoalabama.com, 1 depokcity.tk, 1 depolab.com, 1 +depolauncher.cf, 1 depone.net, 0 depoondemand.com, 1 depoone.com, 1 @@ -41281,7 +41301,6 @@ derbyshire-language-scheme.co.uk, 1 derchris.me, 1 derdevel.de, 1 -derdewereldrommelmarkt.nl, 1 derechosanimales.tk, 1 dereddingsklos.nl, 1 dereferenced.net, 1 @@ -41304,6 +41323,7 @@ derinforge.com.au, 1 derinsular.tk, 1 derivative-calculator.net, 1 +derivatives.com.au, 1 derivativeshub.pro, 1 derive.cf, 1 derkach.io, 1 @@ -41334,6 +41354,7 @@ dermu.ai, 1 deroo.org, 1 deroo.tk, 1 +derosmalenseplasdenbosch.nl, 1 derp.army, 1 derpibooru.org, 1 derpicdn.net, 1 @@ -41487,6 +41508,7 @@ desirememory.cf, 1 desirenet.ro, 1 desish.cf, 1 +desitales2.com, 1 desivideos.tk, 1 deskaservices.com, 0 deskdesign.nl, 1 @@ -41518,7 +41540,6 @@ despotika.de, 1 desriresdesjeux.com, 1 desserteagleselvenar.tk, 1 -dessinbtp.com, 1 dessinemoilademocratie.ch, 0 desstrade.com, 1 dest-gottskar-nidingen.se, 1 @@ -41577,13 +41598,12 @@ detecte-fuite.ch, 0 detecte.ch, 0 detectefuite.ch, 0 -detectify.com, 1 detection-canine-punaise-paris.com, 1 detectro.cc, 1 deteken.be, 1 detekenmuze.nl, 1 detektivskaagencija.com, 1 -detektywtd24.pl, 0 +detektywtd24.pl, 1 determapp.de, 1 determinatie.tk, 1 detexpert.ro, 1 @@ -41611,6 +41631,7 @@ detroitzoo.org, 1 detsad.ml, 1 detsad.tk, 1 +detska-boticka.cz, 1 detski.center, 1 detskie-avto-kresla.tk, 1 detuinmuze.nl, 1 @@ -41656,6 +41677,7 @@ dev-mates.com, 1 dev-ms.com, 1 dev-pmcc.net, 1 +dev-schoolnexus.se, 1 dev-sncf-habilitation-web-frc.azurewebsites.net, 1 dev-sncf-immersive.azurewebsites.net, 1 dev-sncf-server1.azurewebsites.net, 1 @@ -41666,7 +41688,6 @@ dev-testing.org, 1 dev-tricks.com, 1 dev-vip.com, 1 -dev-woenenn-node-server.herokuapp.com, 1 dev-ylinternal.com, 1 dev.inc, 1 dev.moe, 1 @@ -41703,6 +41724,7 @@ develify.co, 1 develmaster.tk, 1 develooper.com, 1 +develop.gr, 1 develope.cz, 0 developedbygayuh.my.id, 1 developer.android.com, 1 @@ -41710,6 +41732,7 @@ developer.mydigipass.com, 0 developerdan.com, 1 developerinsider.co, 1 +developers.ddns.net, 1 developers.facebook.com, 0 developmentsites.melbourne, 1 developnorthportfl.gov, 1 @@ -41842,7 +41865,7 @@ devyanijayakar.com, 1 devzero.io, 0 dewalch.net, 1 -dewalt.com, 1 +dewalt.com, 0 dewblog.ml, 1 dewereldwerktthuis.com, 1 dewereldwerktthuis.eu, 1 @@ -41882,7 +41905,6 @@ df-clan.tk, 1 df-team.tk, 1 df1nif.de, 1 -df1paw.de, 1 df3313.com, 1 df3314.com, 1 df3315.com, 1 @@ -41896,14 +41918,15 @@ df5bb.com, 1 df5cc.com, 1 df5dd.com, 1 +dfabrandguide.com, 1 dfactory.co, 1 dfafacts.gov, 1 +dfaschoolmilk.com, 1 dfc.gov, 1 dfctaiwan.org, 1 dffgpro.de, 1 dfg.re, 1 dfiik.com, 1 -dfilip.icu, 1 dfkp.de, 1 dfm.ae, 0 dfmn.berlin, 1 @@ -41983,6 +42006,7 @@ dgschell.com, 1 dgst.cloud, 1 dgt-portal.de, 1 +dgtechsrl.com, 1 dgtl.hosting, 1 dgtl.tools, 1 dgtl.work, 1 @@ -41999,7 +42023,9 @@ dhakabankltd.com, 1 dhamdhamaanchalikcollege.tk, 1 dhani.com, 1 +dhanur.me, 1 dhanushtechno.in, 1 +dharamshi.org, 1 dharmakit.com, 1 dhaus.de, 1 dhautefeuille.eu, 1 @@ -42050,7 +42076,6 @@ diacritical.net, 1 diadiemdangsong.com, 1 diadorafitness.es, 1 -diadorafitness.it, 1 diag.pl, 1 diagilev.ml, 1 diagmechanic.com, 1 @@ -42086,7 +42111,7 @@ dialybiendong.tk, 1 diamant.family, 1 diamant.nyc, 1 -diamantiques.com, 1 +diamantled.be, 1 diamantovaburza.cz, 1 diameb.ua, 1 diamond-hairstyle.dk, 1 @@ -42109,7 +42134,6 @@ dian7la.com, 1 dian7la.space, 1 diana-und-aaron.de, 1 -dianaconsultancy.com, 1 dianaconta.pt, 1 dianadeluxe.net, 1 dianadrive.com, 1 @@ -42176,6 +42200,7 @@ dicelab.co.uk, 1 dicemer.com, 1 dicesites.com, 1 +diceworld.fr, 1 dicgaming.net, 1 dichanho.com, 1 dichvudangkygiayphep.com, 1 @@ -42338,7 +42363,6 @@ dietbrand.eu, 1 dieter.one, 1 dieterglas.de, 1 -dieteticadigital.net, 1 dietfordiabetics.tk, 1 dietherapie.tirol, 1 dieti-natura.com, 1 @@ -42459,6 +42483,7 @@ digital-e-library.tk, 1 digital-eastside.de, 1 digital-echo.io, 0 +digital-forensics.fr, 1 digital-garden.us, 1 digital-home.tk, 1 digital-insurance-engine.com, 1 @@ -42477,7 +42502,6 @@ digital.govt.nz, 1 digital1st.co.uk, 1 digital4starazagora.com, 1 -digitaladl.com.au, 1 digitalagency47.com, 1 digitalagencynetwork.com, 1 digitalakatsuki.com, 1 @@ -42493,9 +42517,10 @@ digitalbox.jp, 0 digitalbridge.com, 1 digitalbridge.com.au, 1 -digitalbuero.eu, 1 +digitalbuyer.com, 1 digitalcanvas.com.br, 1 digitalcarbide.com, 1 +digitalcardmanager.com, 1 digitalcash.cf, 1 digitalcashpalace.com, 1 digitalch.ng, 1 @@ -42529,6 +42554,7 @@ digitale-bibliothek.tk, 1 digitale-gesellschaft.ch, 1 digitale-oekonomie.ch, 1 +digitale-ueberwachung.info, 1 digitaleducationarea.tk, 1 digitaleducationpro.tk, 1 digitalehandtekeningen.nl, 1 @@ -42630,6 +42656,7 @@ digitalvalue.es, 1 digitalwasteland.net, 0 digitalworkplaceforum.com.br, 1 +digitalzenworks.com, 1 digitalzylinder-shop.com, 1 digite.com, 1 digitec.ch, 1 @@ -42640,6 +42667,7 @@ digitese.pt, 1 digithex.com, 1 digithub.tk, 1 +digitizemyvideo.com, 1 digitizer.co.il, 1 digitkon.com, 1 digitoimistopipeline.fi, 1 @@ -42732,7 +42760,6 @@ dimitri-papadimitriou.com, 1 dimitri-papadimitriou.eu, 1 dimitri-papadimitriou.gr, 1 -dimitri.network, 1 dimitris.tk, 1 dimitrovgrad.bg, 1 dimitrovi.tk, 1 @@ -42856,6 +42883,7 @@ direct365.es, 1 directaccident.co.uk, 1 directadmin.com, 1 +directairlineflights.com, 1 directautoverhuur.com, 1 directb2b.ca, 1 directcouriers.com.au, 1 @@ -42877,6 +42905,7 @@ directmedica.fr, 1 directnic.com, 1 directories.cf, 1 +directoriodemedios.com, 1 directorioempresarial.com.co, 1 directoriomedico.com.co, 1 directorios.tk, 1 @@ -42907,7 +42936,6 @@ direktvermarktung-schmitzberger.at, 1 diretonoponto.gq, 1 direwolfsoftware.ca, 1 -dirigeantbtp.com, 1 dirk-dogs.tk, 1 dirk-weise.de, 1 dirkdavid.org, 1 @@ -43000,7 +43028,6 @@ discordsworld.tk, 1 discotek.club, 1 discotheque.tk, 1 -discountduuka.com, 1 discounted.tours, 1 discountforelectronics.tk, 1 discounto.de, 1 @@ -43061,6 +43088,7 @@ disgruntledcode.com, 1 disguise.cf, 1 dishanddat.com, 1 +dishcord.no, 0 dishcrawl.com, 0 dishwashermagic.tk, 1 dishwasherrepair-austin.com, 1 @@ -43157,8 +43185,10 @@ disparada.com.br, 1 dispartilaw.com, 1 dispatched.tk, 1 +displaycalibration.de, 1 displaynote.com, 1 displayrd.com, 1 +displux.de, 1 disposable.link, 1 dispur.nic.in, 1 disroot.org, 1 @@ -43183,6 +43213,7 @@ distempered.tk, 1 disti.com, 1 distilleren.tk, 1 +distillnote.com, 1 distinctdesign2009.com, 1 distinctiveremodeling.com, 1 distinguishedlegal.com, 1 @@ -43196,7 +43227,6 @@ distraction.gov, 1 distraction.tk, 1 distractors.tk, 1 -distri.com.ua, 1 distribucionmayorista.online, 1 distribucionstunel.es, 1 distribuidora-online.com, 1 @@ -43238,6 +43268,7 @@ ditissaskia.nl, 1 ditprint.dk, 1 ditra.ae, 0 +dits-balti.md, 1 ditte-destree.fr, 1 dittvertshus.no, 1 ditxse6.com, 1 @@ -43259,6 +43290,7 @@ divelement.ro, 1 divelyon.fr, 1 diveplan.org, 1 +diveprotocol.org, 1 divergences.eu.org, 1 divernet.com, 1 divernonil.gov, 1 @@ -43297,6 +43329,7 @@ divinefeminineyoga.com, 1 divinemercyparishvld.com, 1 divinemercyparishvlds.com, 1 +divinepathretreat.com, 1 divineprovidenceorphanage.org, 1 divinerooms.com, 1 divinho.com.br, 1 @@ -43324,6 +43357,7 @@ divvy.tk, 1 divyahindi.com, 1 diw-bau.cloud, 1 +diwan.ir, 1 dixa.tech, 1 dixeo.fr, 1 dixibox.com, 1 @@ -43456,7 +43490,6 @@ djhvidal.com, 1 djhypnoticstate.tk, 1 djichtus.tk, 1 -djieno.com, 1 djinstinct.tk, 1 djipanov.com, 1 djjab.com, 1 @@ -43588,7 +43621,6 @@ dksinger.tk, 1 dksoft-2130.ddns.net, 1 dksoft.online, 1 -dkstage.com, 1 dkweb.ml, 1 dkweb.tk, 1 dkwedding.gr, 1 @@ -43608,7 +43640,6 @@ dlclientportal.com, 1 dlcompare.co.uk, 1 dlcompare.com, 1 -dlcompare.de, 1 dlcompare.fr, 1 dlcompare.it, 1 dlcompare.pt, 1 @@ -43622,6 +43653,7 @@ dlf.exchange, 1 dlford.io, 1 dlfsymposium.nl, 1 +dlideas.com, 1 dlitz.net, 1 dll4free.com, 1 dlld.biz, 1 @@ -43680,7 +43712,6 @@ dm1.in, 1 dm4productions.com, 1 dm6.co, 1 -dm7ds.de, 1 dmaglobal.com, 1 dmarc-hd.org, 1 dmarc.dk, 1 @@ -43689,7 +43720,6 @@ dmarcsentry.com, 1 dmarctester.com, 1 dmarcvendors.com, 1 -dmautomek.no, 1 dmbins.com, 1 dmbvideo.com, 1 dmc-cc.de, 1 @@ -43748,11 +43778,11 @@ dmskaspr.com, 1 dmslog.com, 1 dmslog.com.br, 1 +dmsos.ai, 1 dmstechnology.com, 1 dmtcustoms.co.za, 1 dmu.ac.ae, 1 dmunoz.es, 1 -dmvape.us, 0 dmwaste.com, 0 dmwclan.tk, 1 dmxclan.tk, 1 @@ -43763,8 +43793,10 @@ dn42.us, 1 dn9b1f9o30q82.cloudfront.net, 1 dna-agency.it, 1 +dna-clan.eu, 1 dna-technology.ua, 1 dna.li, 0 +dnaclan.eu, 1 dnadk.com, 1 dnaka91.rocks, 1 dnalounge.com, 1 @@ -43891,7 +43923,6 @@ dobavki.club, 1 dobbshvac.com, 1 dobledemichaeljackson.tk, 1 -dobleseo.pro, 1 doblot.com, 1 dobookmark.ml, 1 doboszynski.com, 1 @@ -43931,6 +43962,7 @@ docebo.com, 1 docemeldoces.com, 1 docendo.es, 1 +docesinesqueciveis.com.br, 1 docesmartini.com.br, 1 docfliq.com, 1 docguide.com, 1 @@ -43938,7 +43970,6 @@ dochescu.com, 1 dochub.com, 1 dock.tech, 1 -dock23.de, 1 dockerbook.com, 0 dockerm.com, 1 dockerup.net, 1 @@ -44058,9 +44089,9 @@ dodi-alhelo.tk, 1 dodi-repacks.site, 1 dodiedods.fr, 1 +dodies.lv, 1 dodikod.tk, 1 dodolle.co.uk, 1 -dodopizza.ru, 1 dodotool.com, 1 dodotool.ru, 1 doedelzakken-jsh.tk, 1 @@ -44070,6 +44101,7 @@ doehle-mse.com, 1 doehle-romania.com, 1 doehle-seafront.com, 1 +doehlecentro.net.ph, 1 doehlers.de, 1 doelbeleggen.nl, 1 doeleman.nl, 1 @@ -44109,6 +44141,7 @@ dogespeed.ml, 1 dogfights.tk, 1 dogfriendly.co.uk, 1 +dogfriendlyplaces.eu, 1 doggingclub.tk, 1 doggo-staging.herokuapp.com, 1 doghandling.tk, 1 @@ -44215,6 +44248,7 @@ dollarprofit.tk, 1 dollarrp.pl, 1 dollarweb.cf, 1 +dollbase.cn, 1 dolle-shop.com.ua, 1 dolledout.co.ke, 1 dollestieren.tk, 1 @@ -44233,6 +44267,7 @@ dolomiasdearagon.com, 1 dolomititour.com, 1 dolonki.beauty, 1 +dolorhunter.com, 1 dolorism.com, 1 dolph.de, 1 dolphbit.de, 1 @@ -44309,6 +44344,7 @@ domaza.gq, 1 domaza.ml, 1 domcc.tel, 1 +domdrenazh.ru, 1 domealert.com, 1 domeconseil.fr, 1 domein-direct.com, 1 @@ -44454,6 +44490,7 @@ doncastermoneyman.com, 1 dondiabolo.com, 1 dondonya.com.cn, 1 +doneandbilled.com, 1 donec.tk, 1 donedeal.co.uk, 1 donedeal.ie, 1 @@ -44581,7 +44618,6 @@ doomsdaymag.tk, 1 doomsworld.com, 1 doomtech.net, 1 -doonamis.com, 1 doonvalleytrail.co.uk, 1 doooooops.com, 1 doop.im, 1 @@ -44688,6 +44724,7 @@ dosenpintar.com, 1 doserres.tk, 1 dosgame.club, 1 +dosgatos.shop, 1 dosgratus.tk, 1 dosimabag.com, 1 dosimapress.com, 1 @@ -44775,9 +44812,11 @@ dotyk.me, 1 dotzauer-stb.de, 1 douai.me, 1 -douari.info, 1 douari.jp, 1 +douari.net, 1 +douari.xxx, 1 douban.city, 1 +double-clic.eu, 1 double20.gg, 1 doublearm.in, 1 doublebass-solo.com, 1 @@ -44786,7 +44825,6 @@ doubledees.co.ke, 1 doubledranch.tk, 1 doublefun.net, 1 -doublemars.com, 1 doubleness.gq, 1 doublepotion.com, 1 doublestat.me, 1 @@ -44915,6 +44953,7 @@ dox-box.eu, 1 doxa.tk, 1 doxal.ro, 1 +doxascope.com, 1 doxepin1.gq, 1 doxepinonline.gq, 1 doxford-engine.com, 1 @@ -45012,6 +45051,7 @@ dr-tsanova.com, 1 dr-vlasak.cz, 1 dr-www.de, 1 +dr.com.tr, 1 dr.mg, 1 dr2dr.ca, 1 draabe-nyt.dk, 1 @@ -45128,9 +45168,7 @@ draperutah.gov, 1 drapetra.com.br, 1 drardiving.com, 1 -drardivingcenter.com, 1 dras.hu, 1 -drashna.net, 1 drasocalzado.com, 1 drasoclothes.com, 1 drastic-ds.com, 1 @@ -45175,6 +45213,7 @@ drclear.co.uk, 1 drclub.tk, 1 drcommodore.it, 1 +drcorderocirujanoplastico.com, 1 drcroof.com, 1 drdach.pl, 1 drdamirplasticsurgeon.com, 1 @@ -45201,6 +45240,7 @@ dream-pools.cf, 1 dreamaholic.club, 1 dreamawake.tk, 1 +dreambay.io, 1 dreambbs.tk, 1 dreambed.com, 1 dreamboxpro.com, 1 @@ -45217,11 +45257,12 @@ dreamflux.xyz, 1 dreamforcetv.pro, 1 dreamhostremixer.com, 1 -dreamimd.com, 0 +dreamimd.com, 1 dreaminds.de, 1 dreaminformatique.tk, 1 dreaming.solutions, 1 dreaminjewelz.tk, 1 +dreamithost.com.au, 1 dreamland.sh, 1 dreamlandmagic.com, 1 dreamlandsdesign.com, 1 @@ -45292,6 +45333,7 @@ dresdner-christstollen-von-reimann.de, 1 dresdner-kaffeeroesterei.de, 1 dresdner-mandelstollen.de, 0 +dresdner-wohnung.de, 1 dreso.com, 1 dress-cons.com, 1 dressabelle.tk, 1 @@ -45327,7 +45369,6 @@ drheibel.com, 1 drhildebrand.net, 1 drhiteshpatel.in, 1 -drhogarth.co.uk, 1 drhouserepairs.com, 1 drianpublishing.tk, 1 dribbble.com, 1 @@ -45365,6 +45406,7 @@ drinkieswith.me, 1 drinking.tk, 1 drinklife.tk, 1 +drinkmulu.com, 1 drinkpetrol.com, 1 drinkplanet.eu, 1 drinks.my, 1 @@ -45422,7 +45464,6 @@ drivya.be, 1 drivya.ch, 1 drivya.com, 1 -drivya.nl, 1 driwch.tk, 1 drixn.info, 1 drixn.net, 1 @@ -45441,7 +45482,7 @@ drkbri.ru, 1 drkhsh.at, 1 drks.de, 1 -drksachsen.de, 1 +drksachsen.de, 0 drlandis.com, 1 drlarakiortho.com, 1 drlc.com.au, 1 @@ -45472,7 +45513,6 @@ droid101.com, 1 droidandy.com, 1 droidapp.nl, 1 -droidchart.com, 1 droidguide.ga, 1 droidhere.com, 1 droidtrix.ga, 1 @@ -45508,7 +45548,6 @@ dronix.tk, 1 droomhuis-in-zuid-holland-kopen.nl, 1 drop-zone.tk, 1 -drop.com, 1 dropbox.com, 1 dropboxer.net, 1 dropchat.cf, 1 @@ -45566,6 +45605,7 @@ drt.org.nz, 1 drtanyaescobedo.com, 1 drthalhammer.at, 1 +drthamer.com, 1 drthiagorighetto.com.br, 1 drtimmarch.com, 1 drtimothysteel.com.au, 1 @@ -45684,7 +45724,6 @@ dsgnet.hu, 1 dsgv.de, 1 dsgvo-addon.eu, 1 -dsgvo-analyse.de, 1 dsgvo.name, 1 dsh.io, 1 dshield.org, 1 @@ -45809,7 +45848,6 @@ dubaifitnesschallenge.com, 1 dubaigrandsale.com, 1 dubailuxuryinvestors.com, 1 -dubaimonsters.com, 1 dubaipremiuminvest.com, 1 dubairun.com, 1 dubaisc.ae, 1 @@ -45940,6 +45978,7 @@ dukun.de, 1 dulas.org.uk, 1 dulce-reverie.ro, 1 +dulcebermudez.com, 1 dulcehome.ch, 1 dulceysalado.tk, 1 dulcinea.eu.org, 1 @@ -45949,7 +45988,6 @@ dulmagedentalarts.ca, 1 duloxetinbestellen.gq, 1 duloxetine.gq, 1 -dulse.fr, 1 dulurtekno.co.id, 1 dulux.co.nz, 1 dulux.com.au, 1 @@ -46090,6 +46128,7 @@ dustbox.tk, 1 dustinbrett.com, 1 dustindecker.com, 1 +dustinpurdy.com, 1 dustjacket.one, 1 dustman.tk, 1 dustpla.net, 1 @@ -46160,6 +46199,7 @@ duxi-s-feromonami.ga, 1 duxsco.de, 1 duysondang.name.vn, 1 +duythang.top, 1 duzavo.cz, 1 duzcehaberleri.tk, 1 duzcesondakika.tk, 1 @@ -46185,7 +46225,6 @@ dvgsites.com, 1 dvipadmin.com, 1 dvkg.de, 1 -dvminsight.com, 1 dvn.pt, 1 dvor.ml, 1 dvorek-karlin.cz, 1 @@ -46343,6 +46382,7 @@ dynosend.com, 1 dynsoundmax.tk, 1 dynx.pl, 1 +dyor.io, 1 dypromed.com, 1 dyrenesverden.no, 1 dyrkar.se, 1 @@ -46452,7 +46492,6 @@ dzu.fund, 1 dzus.tk, 1 dzworld.com, 1 -dzyabchenko.com, 0 dzyszla.pl, 1 e-alink.com, 1 e-almott.com, 1 @@ -46462,6 +46501,7 @@ e-balloons.tk, 1 e-bap.net, 1 e-baraxolka.ru, 1 +e-barobirlik.com.tr, 1 e-belgia.tk, 1 e-beyanname.com.tr, 1 e-beyanname.net.tr, 1 @@ -46509,6 +46549,7 @@ e-flotila.cz, 1 e-form.mn, 1 e-frontier.systems, 1 +e-fuels.com, 1 e-games-board.tk, 1 e-gc.de, 1 e-generator.tk, 1 @@ -46552,6 +46593,7 @@ e-medicines.tk, 1 e-migration.ch, 0 e-modusvivendi.com, 1 +e-monteur.nl, 1 e-mutation.com, 1 e-nail.tk, 1 e-name.tk, 1 @@ -46660,7 +46702,6 @@ e34club.com.ua, 1 e365.vip, 1 e36533.com, 1 -e3lan.net, 1 e42.org, 0 e4a.org, 0 e4mc.link, 1 @@ -46723,7 +46764,6 @@ eaglevilletn.gov, 1 eaglewreck.info, 1 eagleyecs.com, 1 -eagrants.com, 1 eahea.org, 1 eai-work-tool.com, 1 eaimty.com, 1 @@ -46780,7 +46820,6 @@ earni.fi, 1 earningsgames.tk, 1 earningthatis.tk, 1 -earnosethroat.co.za, 1 earpconsult.co.uk, 1 earth-performance-indicator.com, 1 earth-quake.tk, 1 @@ -46796,7 +46835,6 @@ earthbound.tk, 1 earthcam.com, 1 earthcam.net, 1 -earthcore.com, 1 earthcorporation.cf, 1 eartheld.tk, 1 earthjustice.org, 1 @@ -46965,6 +47003,7 @@ easynm.cn, 1 easynotary.ch, 1 easyocm.hu, 1 +easyodds.com, 1 easyonlinetest.tk, 1 easypay.bg, 1 easypayment.cf, 1 @@ -46988,7 +47027,6 @@ easyspace-storage.com, 1 easysubmit.tk, 1 easytamil.tk, 1 -easytec-info.de, 1 easytestonline.tk, 1 easytext.ga, 1 easytiles.com, 1 @@ -47031,14 +47069,12 @@ eauclairecounty.gov, 1 eaucube.com, 1 eaugenethomas.cf, 1 -eaujob.com, 1 eauto-cash.de, 1 eautocash.de, 1 eautolease.com, 1 eauxdevienne.fr, 1 eava.ga, 1 eavafm.com, 1 -eawmaas.top, 1 eazy.de, 1 eazy.gr, 1 eazycert.in, 1 @@ -47050,6 +47086,7 @@ eazzhome.com, 1 eazzy.tk, 1 eb-net.de, 1 +eb-suite.com, 1 eb7.jp, 1 eba.com.au, 1 ebac.com, 1 @@ -47163,6 +47200,7 @@ ebuha.ga, 1 ebuku.tk, 1 eburg.ml, 1 +ebury.com, 1 ec-baran.de, 1 ec-bayreuth.de, 1 ec-current.com, 1 @@ -47204,7 +47242,6 @@ ecelembrou.ovh, 1 ecemella.com, 1 ecemi-alu.com, 1 -ecency.com, 1 ecetechsol.com, 1 ecetiner.com, 1 ecfunstalls.com, 1 @@ -47230,7 +47267,6 @@ echoesin.com, 1 echoit.net, 1 echoit.net.au, 1 -echoit.services, 1 echomail.org, 1 echopaper.com, 1 echorecovery.org, 1 @@ -47246,6 +47282,7 @@ echotone.tk, 1 echovintage.com.br, 1 echowave.io, 1 +echs.top, 1 echt.ga, 1 echtcache.ga, 1 echtebbq.nl, 1 @@ -47276,6 +47313,7 @@ eclipse-foundation.eu, 1 eclipse-foundation.hk, 1 eclipse.eu, 1 +eclipse.org, 1 eclipse4academia-startups.com, 1 eclipsebank.com, 1 eclipseforum.tk, 1 @@ -47289,8 +47327,10 @@ eclixo.com, 1 ecmx.eu, 1 ecnetworker.com, 1 +eco-care.gr, 1 eco-derattizzazione.it, 1 eco-nyashky.com.ua, 1 +eco-pestoff.com, 1 eco-price.ru, 1 eco-rally.cz, 1 eco-rubber.ru, 1 @@ -47376,6 +47416,7 @@ ecommercenews.ca, 1 ecommercenews.co.nz, 1 ecommercenews.com.au, 1 +ecommercenews.ie, 1 ecommercenews.in, 1 ecommercenews.uk, 1 ecommerceuropa.eu, 1 @@ -47401,7 +47442,6 @@ economie2.alsace, 1 economiefidu.ch, 0 economipedia.com, 1 -economistebtp.com, 1 economixportal.tk, 1 economizaplay.com.br, 1 economycarrentalscyprus.com, 1 @@ -47524,6 +47564,7 @@ eddi.org.au, 1 eddie.website, 1 eddieeinbinder.com, 1 +eddiemiller.agency, 1 eddmil.es, 0 eddns.de, 1 eddns.eu, 1 @@ -47564,6 +47605,7 @@ edenredbenefits.com, 0 edenvaleplumber24-7.co.za, 1 eder-steiner.at, 1 +ederevx.us, 1 edeseschoolvereniging.nl, 1 edevletkapisi.org, 1 edfdentalcenter.tk, 1 @@ -47605,6 +47647,7 @@ ediberto.tk, 1 edicionanticipada.com, 1 edicionescrimentales.tk, 1 +edificaciongeneracional.com, 1 edik.tk, 1 edikacomptabilite.com, 1 edilane.de, 1 @@ -47612,7 +47655,6 @@ ediliovo.com, 1 edilondon.com, 1 edilservizivco.it, 1 -edilzanini.it, 1 edinbric.scot, 0 edinburghcastle.scot, 0 edirnehaber.tk, 1 @@ -47683,11 +47725,9 @@ edrosd.cf, 1 edrost.tk, 1 edsby.com, 0 -edscha.com, 1 edscolors.com, 1 edservicing.com, 1 edshogg.co.uk, 1 -edsm.net, 1 edsplain.ro, 1 edstem.org, 1 edstep.com, 1 @@ -47719,7 +47759,6 @@ educacaopocos.com.br, 1 educacionnm.ml, 1 educacionvirtual.com.ar, 1 -educaenvivo.com, 1 educandoamihijo.com, 1 educard.co.at, 1 educart.mx, 1 @@ -47740,7 +47779,6 @@ educationgov.tk, 1 educationhighquality.ml, 1 educationism.tk, 1 -educationmalaysia.co.uk, 1 educationone.ml, 1 educationperfect.com, 1 educationportal.ga, 1 @@ -47771,6 +47809,7 @@ eduhublisbon.com, 1 eduid.se, 1 eduif.nl, 0 +edukar.xyz, 1 eduki.com, 1 edukle.com, 0 edularidea.com, 1 @@ -47784,6 +47823,7 @@ edumontclasses.com, 1 edunaut.com.au, 1 edunet.gq, 1 +edunia.io, 1 edunian.com, 1 edunoor.tk, 1 eduoneschool.tk, 1 @@ -47795,7 +47835,6 @@ eduroam.uy, 1 edusanjal.com, 1 eduschool.ml, 1 -edusektor.de, 0 edusenca.nl, 1 edusercontent.com, 1 eduson.pl, 1 @@ -47859,7 +47898,6 @@ eef.com.pe, 1 eegaming.org, 1 eegaming.tk, 1 -eehitus.ee, 0 eeia.com, 1 eeiletudiant.com, 1 eekelen.net, 1 @@ -47959,6 +47997,7 @@ efiglobal.com, 1 efiledcsuperiorcourt.gov, 1 efinanceng.com, 1 +efirbet.com, 1 efirma.com, 1 eflorashop.ch, 1 eflorashop.com, 1 @@ -47991,7 +48030,6 @@ eg-secure.co.jp, 0 eg22.com, 1 eg7.co.jp, 1 -egab.co, 0 egabroaventuras.tk, 1 egais.ml, 1 egal24.de, 1 @@ -48002,7 +48040,6 @@ egbertsen.tk, 1 egc.ink, 1 egdsk.ru, 1 -egegesh.ru, 1 egehem.se, 1 egenya.cl, 0 egeozcan.com, 0 @@ -48011,7 +48048,6 @@ egfl.org.uk, 1 egg-events.com, 1 egg-ortho.ch, 1 -eggblast.com, 1 eggc.at, 1 eggel.ch, 1 eggen.dk, 1 @@ -48043,7 +48079,9 @@ eggrolls.ml, 1 egh.ir, 1 egiftcards.be, 1 +egiftified.com, 1 egilopaseryh.tk, 1 +eginfracloud.uk, 1 egins.tk, 1 egipet-tiz.tk, 1 egiptwakacje.tk, 1 @@ -48072,7 +48110,6 @@ egoscolumn.tk, 1 egotripproductions.org, 1 egoutierrpaquette.ca, 1 -egov.digital, 1 egrabby.com, 1 egrasmanipur.nic.in, 1 egreensvape.com, 1 @@ -48107,7 +48144,6 @@ egzotique.com, 1 eh-huebner-stiftung.de, 1 ehaccp.it, 1 -ehachettefle.com, 1 eharmony.ca, 1 eharmony.com, 1 ehazi.hu, 1 @@ -48172,6 +48208,7 @@ eifel-adventure.de, 1 eifel.website, 1 eifelstuebchen.de, 1 +eiffageconstruction.com, 1 eigenaardig.tk, 1 eigenbubi.de, 1 eigendeeg.eu, 1 @@ -48221,7 +48258,6 @@ eino.world, 1 einreiseanmeldung.de, 1 einsatzstiefel.info, 1 -einstein-themanandhismind.net, 1 einsteinathome.org, 1 einsteinbros.com, 1 einsteinium.fr, 1 @@ -48252,7 +48288,6 @@ eisenzelt.de, 1 eisernes-kreuz.tk, 1 eiskratzer-bedrucken.de, 0 -eisneramperadvisory.com, 1 eit-solutions.com.au, 1 eit-web.de, 0 eitbtaldea.eus, 1 @@ -48330,6 +48365,7 @@ ekloz.org, 1 ekmanager.tk, 1 ekmo.cz, 1 +eknotec.co, 1 eko69.pl, 1 ekoazyl.pl, 1 ekobudisantoso.net, 1 @@ -48390,7 +48426,6 @@ elaboratefiction.com, 1 elad.wtf, 1 eladalfassa.com, 1 -eladerezo.com, 1 elaegypt.org, 1 elahejalilvand.com, 1 elaheze.com, 0 @@ -48496,7 +48531,7 @@ eldiario.net, 1 eldiedesign.com, 1 eldin.ba, 1 -eldinturkic.com, 0 +eldinturkic.com, 1 eldisagjapi.de, 1 eldorado.aero, 1 eldoradocylinders.com, 1 @@ -48517,7 +48552,6 @@ electionpresidentiellegabon2009.ga, 1 elections-sintmaartengov.org, 1 elections.ca, 1 -electionsbycounty.com, 1 electionsdatabase.com, 1 electionsshelbytn.gov, 1 electmikewaters.com, 1 @@ -48535,14 +48569,16 @@ electricalandelectronicsengineerinformation.ga, 1 electricalengineeringapp.com, 1 electricalengineers.tk, 1 +electricalfencingedenvale.co.za, 1 +electricalfencingroodepoort.co.za, 1 electricalmalibu.com, 1 -electricaloakpark.com, 1 electricalpacificpalisades.com, 1 electricalwestlakevillage.com, 1 electricannihilation.tk, 1 electricbeast.co, 1 electriccoin.co, 1 -electricdosvientos.com, 1 +electricfencealberton.co.za, 1 +electricfencelonehill.co.za, 1 electricfencingpinetown.co.za, 1 electricfireplaces.tk, 1 electricgatemotoralberton.co.za, 1 @@ -48553,28 +48589,21 @@ electricgypsies.nl, 1 electrichome.fr, 1 electriciancenturion24hours.co.za, 1 -electriciannewburypark.com, 1 electricianpacificpalisades.com, 1 electricianpretoria24-7.co.za, 1 electricians-roodepoort.co.za, 1 electriciansportelizabeth.co.za, 1 -electricianthousandoaks.com, 1 electricienasnieres.fr, 1 electricimagination.co.uk, 1 electricity.tk, 1 electricityplans.com, 1 electrickiwi.co.uk, 1 electricmalibu.com, 1 -electricmoorpark.com, 1 electrico.tk, 1 -electricoakpark.com, 1 electricpower.tk, 1 electricpulp.com, 1 -electricsimivalley.com, 1 -electricwestlakevillage.com, 1 electricwokstore.com, 1 electriczone.tk, 1 -electrijob.com, 1 electrochef.es, 1 electrocomplect.com.ua, 1 electrodomesticos.tk, 1 @@ -48601,7 +48630,6 @@ electronic-ignition-system.com, 1 electronicafacil.net, 1 electronicaripol.es, 1 -electronicfiddling.com, 1 electronics.com.bd, 1 electronicshelpcare.net, 1 electronicssrit.tk, 1 @@ -48711,6 +48739,7 @@ elektryczka.pl, 1 elelenin.cf, 1 elemac.com.my, 1 +elemarket.pl, 1 elemenik.com, 1 elemenop.tk, 1 element-ppf.com, 1 @@ -48729,7 +48758,6 @@ elementarium.cf, 1 elementarium.ga, 1 elementarythegame.com, 1 -elementarywave.com, 0 elementblend.com, 1 elementbookings.com, 1 elementedigitale.ro, 1 @@ -48784,6 +48812,7 @@ eleplant.fi, 1 elepover.com, 1 elesconditedelola.com, 1 +elestoque.org, 1 eletem.org, 1 eletminosegert.ro, 1 eletom.pl, 1 @@ -48869,7 +48898,6 @@ eliava-gartenbau.de, 1 elibidore.ml, 1 elicdn.com, 1 -elidiaz.com, 1 elie.net, 1 elielaloum.com, 0 elifelabs.com, 1 @@ -48880,6 +48908,7 @@ eligibility.com, 1 eligible.com, 1 eligibleapi.com, 1 +eligimed.com, 1 eligrey.com, 1 eliguli.com, 1 elijahbrown.tk, 1 @@ -48939,6 +48968,7 @@ elite-porno.ru, 1 elite-tools.tk, 1 elite-units.tk, 1 +elite.cards, 1 elite.memorial, 1 elite12.de, 1 eliteaccounting.co.nz, 1 @@ -48962,7 +48992,6 @@ eliteensino.com.br, 1 elitefintechglobal.com, 1 elitegameservers.net, 1 -eliteheatgroup.co.uk, 1 eliteholidaylights.com, 1 elitehouse.tk, 1 eliteimsolutions.com, 1 @@ -48987,7 +49016,6 @@ elitmedopt.ru, 1 elixi.re, 1 elixir.bzh, 1 -elixirfactory.io, 1 elizabethcitync.gov, 1 elizabethefle.com, 1 elizabethgreenfield.com, 1 @@ -49152,11 +49180,11 @@ elsas.tk, 1 elsbouslanostraaficio.tk, 1 elsector7.tk, 1 -elselingerie.com, 1 elsemanariodesalamanca.tk, 1 elsg.co.uk, 1 elshop1eu.com, 1 elshou.com, 1 +elslab.com, 1 elsoundspeakers.com, 1 elstravato.com, 1 elsuccionador.com, 1 @@ -49199,6 +49227,7 @@ elverdaderoamor.tk, 1 elvermann.de, 1 elvikom.co.uk, 1 +elvikom.pl, 1 elviraszabo.com, 1 elvis-atouchofgold.com, 1 elvis-presley.tk, 1 @@ -49229,7 +49258,6 @@ emabot.tk, 1 emacitylife.com, 1 emad7.tk, 1 -emagazine.com, 1 emagicone.com, 1 emaging-productions.fr, 1 emaging.fr, 1 @@ -49281,11 +49309,14 @@ emarhotel.bg, 1 emarketingmatters.com, 1 emas-beja.pt, 1 +ematravelmorocco.com, 1 emavending.club, 1 emavok.eu, 1 emazrin.tk, 1 emazzanti.net, 1 emba.au, 1 +embaleo.com, 1 +embaleo.es, 1 embarcados.com.br, 0 embark.studio, 0 embarkok.com, 1 @@ -49303,7 +49334,8 @@ ember.dedyn.io, 1 emberit.com, 1 emberlife.com, 1 -embibe.com, 1 +embersolutions.uk, 1 +embibe.com, 0 emblemhealth.com, 1 embodiaacademy.com, 1 embodiaapp.com, 1 @@ -49315,9 +49347,9 @@ embracecontext.com, 1 embracethedarkness.co.uk, 1 embracezine.tk, 1 -embraco.com, 1 embrapolsul.com.br, 1 embryooptions.com, 1 +embuscadedividendo.com.br, 1 embutidoselpipi.com, 1 emby.cloud, 1 emcado.com, 1 @@ -49534,7 +49566,6 @@ employeemanual.com.au, 1 employeesupport.co.uk, 1 employer.gov, 1 -employer411.com, 1 employeradmin.com, 1 employersolutionsgroup.com, 0 employersupport.co.uk, 1 @@ -49562,6 +49593,7 @@ empower.ae, 1 empoweraces.com, 1 empowerdb.com, 1 +empowerdxlab.com, 1 empowered-decision.com.au, 1 empoweredpatientradio.com, 1 empoweren.com, 1 @@ -49651,7 +49683,6 @@ enai.eu, 1 enalean.com, 1 enam.gov.in, 1 -enamae.net, 1 enaminestore.com, 1 enamonada.com, 1 enasher.com, 1 @@ -49678,6 +49709,7 @@ encirca.com, 0 encircleapp.com, 1 enclavecairns.com.au, 1 +encloud-gs.com, 1 encode.host, 1 encontra-me.org, 1 encontracarros.pt, 1 @@ -49747,6 +49779,7 @@ endlesswebsite.tk, 1 endo-shika.info, 1 endocarditis.au, 1 +endodanli.com, 1 endofevolution.com, 1 endofinternet.goip.de, 1 endoflife.date, 1 @@ -49757,6 +49790,7 @@ endorsec.com, 1 endorsec.de, 1 endorsia.io, 1 +endosave.de, 1 endoscope.bg, 1 endpipe.com, 1 endplasticwaste.org, 0 @@ -49766,6 +49800,7 @@ endsoftwarepatents.org, 1 endspamwith.us, 1 endstation-chaos.de, 1 +endura.company, 1 enduranceseries.ca, 1 enduro-center.pt, 1 enduroxtrem.tk, 1 @@ -49902,6 +49937,7 @@ enfinnit.com, 1 enflow.nl, 1 enfluentia.com, 1 +enforcegate.com, 1 enforcement-trends-dev.azurewebsites.net, 1 enforcement-trends-test.azurewebsites.net, 1 enforcement-trends.azurewebsites.net, 1 @@ -49957,8 +49993,8 @@ enginess.io, 1 engins.fr, 1 enginsight.com, 1 -enginsjob.com, 1 enginytech.com, 1 +engitix.com, 1 engl-amps.com, 1 engl-amps.net, 1 engl-customshop.com, 1 @@ -49968,6 +50004,7 @@ engl-distribution.de, 1 engl-distribution.net, 1 engl-systems.de, 1 +englandbeach.com, 1 englandgenealogy.co.uk, 1 englandlearn.com, 0 englandschool.tk, 1 @@ -50041,7 +50078,6 @@ enkelpaamelding.no, 1 enker.tk, 1 enkolaysertifika.com, 1 -enkosi.com.au, 1 enkrypt.com, 1 enky.be, 1 enlacemedik.com, 1 @@ -50063,7 +50099,6 @@ ennori.jp, 1 ennova.com, 0 ennovationtech.eu, 1 -enoahinc.com, 1 enodais.gr, 1 enofmusic.com, 1 enoisdaturma.tk, 1 @@ -50176,6 +50211,7 @@ entheogens.com, 1 entheor.com, 1 enthrallinggumption.com, 1 +entia.systems, 1 enticingai.com, 1 entitlementtrap.com, 1 entityfiling.com, 1 @@ -50341,6 +50377,7 @@ eod.su, 1 eofster.com, 1 eogresources.com, 1 +eohm.org, 1 eol-team.tk, 1 eola.co, 1 eolasinnovation.com, 1 @@ -50367,7 +50404,7 @@ eov2.com, 1 ep-cortex.com, 1 ep-plus.jp, 1 -epa.gov, 1 +epa.gov, 0 epagos.com.ar, 1 epagos.mx, 1 epaoig.gov, 1 @@ -50433,7 +50470,6 @@ epicvistas.de, 1 epidastudio.com, 1 epidauros.be, 1 -epieos.com, 1 epigrafes-led-farmakeia.gr, 1 epikchat.com, 1 epilazione.it, 1 @@ -50458,7 +50494,6 @@ eplenet.tk, 1 epliar.com, 1 eplus.group, 1 -epluse.com, 1 eplustech.eu, 1 epm-bg.com, 1 epmcentroitalia.it, 1 @@ -50569,7 +50604,6 @@ equivid.ga, 1 equmeniakyrkanhallunda.se, 1 equt.cloud, 1 -er.tl, 1 era-edta-reg.org, 1 eradication-nuisibles-pro.fr, 1 eradoom.net, 1 @@ -50602,6 +50636,7 @@ erclaim.com, 1 erctra.com, 1 erda.gov, 1 +erdecoshop.de, 0 erdekesseg.com, 1 erdelyireceptek.ro, 1 erdethamburgeronsdag.no, 1 @@ -50626,7 +50661,6 @@ ergaomnes.cz, 1 ergaran.tk, 1 ergela-djakovo.hr, 1 -ergobaby.com, 0 ergobyte.eu, 1 ergobyte.gr, 1 ergodark.com, 1 @@ -50638,7 +50672,6 @@ ergosg.com, 1 ergostoel.nl, 1 ergotherapie-schaab.de, 1 -ergotherapie.fr, 1 erguinsaat.com, 1 erholungsrechner.de, 1 erhvervsposten.dk, 1 @@ -50710,7 +50743,6 @@ eriksson-lavotha.se, 1 erikswan.com, 1 erinaceinae.com, 1 -erinandken.net, 1 erincarmody.cf, 1 eriner.me, 1 eringmaguire.com, 1 @@ -50763,6 +50795,7 @@ erosads.com, 1 erosbeautyandwellness.com, 1 eroscomixitalia.tk, 1 +erosmowy.pl, 1 erosofia.tk, 1 erosveneziani.cz, 1 erosvet.cz, 1 @@ -50785,6 +50818,7 @@ erpid.info, 1 erpnext.com, 1 erpollo.com, 1 +erpuas.com, 1 erraen.org.ua, 1 erreguete.gal, 1 errekaweb.tk, 1 @@ -50937,6 +50971,11 @@ escortlistings.ph, 1 escortlistingsuk.co.uk, 1 escorto.cc, 1 +escortserviceleiden.nl, 1 +escortserviceschiphol.com, 1 +escortservicezaanstad.nl, 1 +escortservicezeeland.nl, 1 +escortsuper.com, 1 escortz.gq, 1 escoteiros.tk, 1 escovator-records.tk, 1 @@ -50957,8 +50996,8 @@ esd.cc, 1 esdacademy.eu, 1 esdarat.ml, 1 +esdcybersecurity.eu, 1 esdiscuss.org, 1 -esdisena.es, 1 esdrasluna.com, 1 esds.com.br, 1 eseances.ch, 1 @@ -51004,6 +51043,7 @@ esiliati.org, 1 esilva.me, 1 esilverstone.pl, 1 +esim.io, 1 esimy.net, 1 esiptvpro-max.com, 1 esitc-paris.fr, 1 @@ -51074,6 +51114,7 @@ espacioweb.tk, 1 espacoalimentoesaude.com.br, 1 espacosaudesuplementos.com.br, 1 +espaiarrela.com, 1 espaiblancandorra.ga, 1 espaiblancandorra.gq, 1 espaiblancandorra.ml, 1 @@ -51086,7 +51127,6 @@ especes.org, 1 especializasaudecursos.com.br, 1 especiallysilver.com, 1 -especificosba.com.ar, 1 espectro.tk, 1 espejo.tk, 1 espejocofrade.tk, 1 @@ -51106,7 +51146,6 @@ espivblogs.net, 1 esplendorecosmeticos.com.br, 1 esploria.com, 1 -espocada.com, 1 espoonkumi.fi, 0 esport-agency.fr, 1 esporte.casino, 1 @@ -51250,7 +51289,6 @@ estocq.fr, 1 estoense.com, 1 estomp.de, 1 -estonia.ee, 0 estoniananonymous.tk, 1 estoniantrade.ee, 1 estonoentraenelexamen.com, 1 @@ -51292,7 +51330,6 @@ esu.moe, 1 esu.wiki, 1 esu.zone, 1 -esubasta.ar, 1 esunapena.tk, 1 esunenin.tk, 1 esuretynew.azurewebsites.net, 1 @@ -51403,6 +51440,7 @@ ethernium.fun, 1 etheron.com, 1 etherpad.nl, 1 +etherphon.com, 1 ethersys.fr, 1 ethiack.com, 0 ethical-home.co.uk, 1 @@ -51460,6 +51498,7 @@ etrades.tk, 1 etre-belle.tk, 1 etre-vivant.fr, 0 +etreatify.com, 1 etrecosmeticderm.com, 1 etrialsolutions.ca, 1 etrialsolutions.com, 1 @@ -51556,25 +51595,33 @@ euleres.tk, 1 eulerhermes.be, 1 eulerhermes.bg, 1 +eulerhermes.ch, 1 eulerhermes.co.jp, 1 eulerhermes.co.nz, 1 eulerhermes.co.uk, 1 eulerhermes.co.za, 1 eulerhermes.com, 1 eulerhermes.com.hk, 1 +eulerhermes.com.sg, 1 eulerhermes.com.tr, 1 eulerhermes.cz, 1 eulerhermes.de, 1 +eulerhermes.dk, 1 +eulerhermes.ee, 1 eulerhermes.es, 1 eulerhermes.fi, 1 eulerhermes.fr, 1 eulerhermes.gr, 1 eulerhermes.hk, 1 +eulerhermes.hu, 1 +eulerhermes.ie, 1 eulerhermes.it, 1 eulerhermes.kr, 1 eulerhermes.lv, 1 eulerhermes.my, 1 eulerhermes.nl, 1 +eulerhermes.pl, 1 +eulerhermes.ro, 1 eulerhermes.se, 1 eulerhermes.sg, 1 eulerhermes.sk, 1 @@ -51583,13 +51630,13 @@ eulessplumbers.com, 1 euman.ml, 1 eumananc.ro, 1 +eumenis.com, 1 eumk6.ml, 1 eunep.com, 1 eunetworks.com, 1 eung.ga, 1 eunicetan.com, 1 eunomy.io, 1 -eupack.pl, 1 eupay.de, 1 euphoriaonline.tk, 1 euphoriareign.com, 1 @@ -51609,6 +51656,7 @@ eurekatownshipmi.gov, 1 eurekka.me, 0 euren.se, 1 +euripidis.photography, 1 euritaprinter.com, 0 eurmarketing.com, 1 euro-cdm.org, 1 @@ -51823,6 +51871,7 @@ evansville-wy.gov, 1 evansvillewi.gov, 1 evantageglobal.com, 1 +evanter.hu, 1 evantynan.com, 0 evanwang0.com, 1 evaolson.se, 1 @@ -51845,8 +51894,8 @@ eve-ua.com, 1 eve.tax, 1 eve0s.com, 1 -eveandi.health, 1 eveaz.com, 1 +evec.in, 1 eveco-mebel.ga, 1 evedanjailbreak.com, 1 evehryday.com, 1 @@ -51956,8 +52005,7 @@ everfi.com, 1 everfine.com.tw, 1 everfree.win, 1 -evergarden.cn, 0 -evergladesfarmequipment.com, 1 +evergarden.cn, 1 everglow.co.jp, 1 evergood.com.br, 1 evergreen.je, 1 @@ -51978,7 +52026,6 @@ everling.lu, 1 everlong.org, 1 everly.market, 1 -evermade.fi, 1 evermed.au, 1 evermed.com.au, 1 evernaut.com, 1 @@ -51997,7 +52044,6 @@ everwaking.com, 0 everwelloh.com, 1 everwinter.tk, 1 -every-day-life.com, 0 every-day.nl, 1 every.one, 1 everyad.co.il, 1 @@ -52019,7 +52065,6 @@ everyex.com, 1 everyeye.it, 1 everykidoutdoors.gov, 1 -everymail.me, 1 everyoneadmins.tk, 1 everysaving.ae, 1 everysaving.ca, 1 @@ -52080,6 +52125,7 @@ evin.tk, 1 evisa.us.com, 1 evisos.cl, 1 +evisos.com, 1 evisos.com.ar, 1 evisos.com.mx, 1 evisos.es, 1 @@ -52089,6 +52135,7 @@ evlconsulting.com.au, 1 evlilikilan.com, 1 evlqa1sp1tzb05zo-reoo0vhj9a1t5pousfudnkg.com, 0 +evlv.energy, 1 evmodssweden.se, 1 evo-ai.com, 1 evo-exchange.com, 1 @@ -52110,12 +52157,11 @@ evolution-x.org, 1 evolution.codes, 1 evolutionbp.es, 1 -evolutionhomecorp.com, 1 evolutioninflatables.co.uk, 1 evolutionlife.za.com, 1 evolutionmining.com, 1 evolutionmuaythai.com, 1 -evolutionosteopathy.co.uk, 1 +evolutionosteopathy.co.uk, 0 evolutive-records.tk, 1 evolutlabs.com, 1 evoluxion.co, 1 @@ -52124,6 +52170,7 @@ evolveagency.gr, 1 evolvedevlabs.de, 1 evolvemodular.ca, 1 +evolveorbit.com, 1 evolvetechnologies.co.uk, 1 evolvewithquantum.com, 1 evolvicity.org, 1 @@ -52149,7 +52196,6 @@ evropaedu.ru, 1 evscicats.com, 1 evscstudentwifi.com, 1 -evseadapters.com, 1 evsinemasistemleri.tk, 1 evstatus.com, 0 evt.com, 1 @@ -52178,6 +52224,7 @@ ewg-garching.de, 1 ewgalerie.com, 0 ewgri.gov, 1 +ewhalellc.com, 1 ewie.name, 1 ewighost.com, 1 ewigkeit.blog, 1 @@ -52232,10 +52279,12 @@ examika.ru, 1 examone.com, 1 exampaperarchive.com, 1 +example.li, 1 example.ng, 1 exampleessays.com, 1 examroll.fr, 1 examroo.nl, 0 +examroom.ai, 1 examsite.tk, 1 examsmate.in, 1 examsoft.com, 1 @@ -52312,6 +52361,7 @@ excontinuum.de, 1 excursiones.tk, 1 exe-boss.tech, 1 +exe.xyz, 1 exec.institute, 1 execbar.com, 1 execom68.tk, 1 @@ -52329,7 +52379,6 @@ exelonline.nl, 1 exelreporters.com, 1 exelreporting.com, 1 -exelya.fr, 1 exemples-de-stands.com, 1 exer.fr, 1 exercise.com, 1 @@ -52362,7 +52411,6 @@ exip.ga, 1 exira.com, 1 exist.ru, 1 -exitbydeath.com, 1 exito-e.com, 1 exitoseguro.tk, 1 exitreality.tk, 1 @@ -52419,6 +52467,7 @@ expatriate.pl, 0 expe.voyage, 1 expectful.com, 0 +expectingplus.com, 1 expediteplus-asia.com, 1 expediteplus.biz, 1 expediteplus.ca, 1 @@ -52498,7 +52547,6 @@ explode.tk, 1 explodie.org, 1 explohub.com, 1 -exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 exploited.cz, 1 @@ -52620,8 +52668,6 @@ exstirpo.com, 1 ext-code.com, 1 extact.com, 1 -extendedteam.co, 1 -extendedteam.net, 1 extendet.tk, 1 extendresources.com, 0 extendwings.com, 1 @@ -52689,6 +52735,7 @@ extremelawsest.ga, 1 extremeleadprogram.com, 1 extremelycorporate.ca, 0 +extrememanual.net, 1 extrememusclepump.com, 1 extremepeptides.com, 1 extremeprojects.tk, 1 @@ -52713,7 +52760,6 @@ exxpozed.co.uk, 1 exxpozed.eu, 1 exzibit.net, 1 -eyaqueen.com, 1 eyasc.nl, 1 eye-move.nl, 1 eye-vet.co.uk, 1 @@ -52751,7 +52797,6 @@ eylog.co.uk, 1 eymon.llc, 1 eynio.com, 1 -eyodin.com, 1 eyoo.link, 1 eyps.net, 1 eytosh.net, 1 @@ -52762,11 +52807,9 @@ ezadmin.se, 1 ezakazivanje.rs, 1 ezakopane.pl, 1 -ezalba.com, 0 ezcater.com, 1 ezcesspoollongisland.com, 1 ezcourseonline.com, 1 -ezdog.press, 1 ezec.com.tw, 1 ezee-fix.co.uk, 1 ezekia.com, 1 @@ -52788,6 +52831,7 @@ eznetworks.com.br, 0 ezo.io, 1 ezochat.com, 1 +ezopus.com, 1 ezorgportaal.nl, 1 ezprints.com, 1 ezrent.tk, 1 @@ -52797,7 +52841,7 @@ ezscrapbooksest.ga, 1 ezshopper.co.uk, 1 ezsun.co, 1 -ezuz-fe.com, 1 +eztempmail.com, 1 ezvolt.com.br, 1 ezyentry.com.au, 1 ezygentechnology.com, 1 @@ -52915,7 +52959,6 @@ faberoclub.tk, 1 fabfrenchinsurance.com, 1 fabfrugalmama.com, 1 -fabian-fingerle.de, 1 fabian-ising.de, 1 fabian-klose.com, 1 fabian-klose.de, 1 @@ -52999,7 +53042,6 @@ fac.gov, 1 faca.gov, 1 facadatabase.gov, 1 -facan-godollo.hu, 1 facanabota.com, 1 facanabota.com.br, 1 facanacaveira.com, 0 @@ -53082,6 +53124,7 @@ factfocus.com, 1 factis.com, 1 factnsoftware.com, 1 +factobat.fr, 1 factor.cc, 0 factor10.com, 1 factorchave.com, 1 @@ -53224,6 +53267,7 @@ fairmountfireco.gov, 1 fairplay.im, 1 fairporthots.com, 1 +fairportliquor.com, 1 fairtprm.com, 1 fairtrade010.nl, 1 fairviewcounseling.org, 1 @@ -53252,7 +53296,6 @@ faithfulroad.org, 1 faithleaks.org, 0 faithnc.gov, 1 -faithriders.com, 0 faixaazul.com, 1 faizan.net, 1 faizanullah.com, 1 @@ -53262,6 +53305,7 @@ fajn-shop.cz, 1 fajnshop.sk, 1 fajode.net, 1 +fajxo.sk, 1 fakat.tk, 1 fake-show.ga, 1 fakeaddress.net, 1 @@ -53296,9 +53340,7 @@ falaeapp.org, 1 falastin.tk, 1 falbros.com, 1 -falcatus-dalmatians.hu, 1 falce.in, 1 -falcema.com, 1 falchion.tk, 1 falck.dk, 1 falcom.co.jp, 1 @@ -53318,6 +53360,8 @@ falegname-roma.it, 1 falegname.roma.it, 1 falegnameria.milano.it, 1 +falfurriasbutter.com, 1 +falixnodes.net, 1 falkenbergthomsen.dk, 1 falkenthal.org, 1 falkentyre.com, 1 @@ -53406,7 +53450,7 @@ familleseux.net, 1 familleshilton.com, 1 family-clinic.tk, 1 -family-intervention.com, 1 +family-intervention.com, 0 familyace.cz, 1 familyandfriends-railcard.co.uk, 1 familybusinessatlantic.ca, 1 @@ -53416,7 +53460,6 @@ familyd-c.com, 1 familydoctor.ru, 1 familyhookups.com, 1 -familyjpierre.com, 1 familylab.de, 1 familyparties.co.uk, 1 familyrecipe.co.uk, 1 @@ -53463,7 +53506,6 @@ fancygaming.dk, 1 fancypanty.cf, 1 fancywow.com, 1 -fandars.com, 1 fandeconcours.be, 1 fandeev.tk, 1 fander.it, 1 @@ -53472,6 +53514,7 @@ fanescu.ro, 1 fanfareokselaar.tk, 1 fanfiction.tk, 1 +fanfile.net, 1 fanflix.co, 1 fang-den-sommer.de, 1 fangban.net, 1 @@ -53497,11 +53540,11 @@ fansdb.cc, 1 fansdefoot.fr, 1 fansniper.com, 1 +fansop.com, 1 fanspace.io, 1 fansport.space, 1 fansta.jp, 1 fanstake.com, 1 -fanstuff.ru, 1 fantacast.it, 1 fantasiatravel.hr, 1 fantasmma.tk, 1 @@ -53547,7 +53590,6 @@ fanzhe.com, 1 fanzine-nimbus.tk, 1 faortega.org, 1 -fap.link, 1 fap.no, 1 fapcoholic.com, 1 fapiis.gov, 1 @@ -53555,6 +53597,7 @@ fapplepie.com, 1 fapplesauce.com, 1 fapzone.tk, 1 +faq-helper.com, 1 faq.ie, 1 faqbite.com, 1 faqexchangeest.ga, 1 @@ -53587,6 +53630,7 @@ fareinternational.com, 1 farenheit.net, 1 faresair.com, 1 +faresfrom.com, 1 fareto.com, 1 fareuntrasloco.it, 1 farexpress.it, 1 @@ -53630,8 +53674,10 @@ farmerbrossamples.com, 1 farmerfairness.gov, 1 farmers.gov, 1 +farmerschilemarket.com, 1 farmersfridge.com, 0 farmersgirlkitchen.co.uk, 1 +farmforte.com, 1 farmhouse.com.my, 1 farmhouse.com.sg, 1 farming.co.uk, 1 @@ -53644,6 +53690,7 @@ farmtransparency.org, 1 farmus-spb.ru, 1 farmvilleva.gov, 1 +farnboroughairport.com, 1 faro-car-hire.co.uk, 1 faro.com, 1 farodistribuidora.com.br, 1 @@ -53670,6 +53717,7 @@ fartoon.cz, 1 fartoons.cz, 1 fartypants.com, 1 +farwestlive.com, 1 faryaz.tk, 1 fasab-portcenter.se, 1 fasad.eu, 1 @@ -53688,9 +53736,6 @@ fashioncourses.tk, 1 fashioncrib.co.za, 1 fashiondaily.tk, 1 -fashiondays.bg, 1 -fashiondays.hu, 1 -fashiondays.ro, 1 fashiondesign.ml, 1 fashiondex.com, 1 fashiondistrict.org, 1 @@ -53703,7 +53748,10 @@ fashionforyou.ga, 1 fashionfreaks.tk, 1 fashionfuture.tk, 1 -fashiongonerogue.com, 1 +fashiongirl.be, 1 +fashiongirl.ch, 1 +fashiongirl.es, 1 +fashiongirl.fi, 1 fashionhome.tk, 1 fashionhometex.com, 1 fashionht.com, 1 @@ -53830,6 +53878,7 @@ fastimg.net, 1 fastknighki.ga, 1 fastknigi.ml, 1 +fastlane.express, 1 fastlaneimportautorepair.com, 1 fastme.co, 1 fastmeet.tk, 1 @@ -53840,6 +53889,8 @@ fastpaper.gq, 1 fastpeoplesearch.com, 1 fastphox.com, 1 +fastplaygames.com, 1 +fastplumbingmilwaukee.com, 1 fastpresence.com, 1 fastproxycat.ml, 1 fastproxyforfree.gq, 1 @@ -53849,7 +53900,6 @@ fastscanapp.com, 1 fastserv.pl, 1 fastshop.com.pl, 0 -faststage.ch, 1 fasturl.ml, 1 fastvanya.com, 1 fastvelocityers.ga, 1 @@ -53879,7 +53929,6 @@ fatih-catering.com, 1 fatihingemisi.com, 1 fatimamoldes.com.br, 1 -fatimaonlinepharmacy.com, 1 fatimarojo.com, 1 fatlabwebsupport.com, 1 fatnerdstock.com, 1 @@ -53890,14 +53939,12 @@ fattailcall.com, 0 fattorino.it, 1 fatturegeko.eu, 1 -fatty.io, 1 fattyink.com, 1 fatumagro.bg, 1 faturan.com.tr, 1 fatvalley.at, 1 fatzebra.com.au, 1 fau-bremen.tk, 1 -fau.re, 1 fau8.ml, 1 fauceton.cf, 1 fauceton.tk, 1 @@ -53910,6 +53957,7 @@ faunathreads.com, 1 faunatrek.com, 1 faus-moliner.com, 1 +faustodiiorio.com, 1 fautchen.eu, 1 fauteuil-bebe.fr, 1 fauv.art, 1 @@ -53988,10 +54036,10 @@ fbilab.gov, 1 fbk.moe, 1 fbo.gov, 1 -fbo.network, 1 fboerman.nl, 1 fboglich.com.ar, 1 fbowling.com, 1 +fbpred.xyz, 1 fbrief.org, 1 fbsbx.com, 1 fbscontenttest.com, 1 @@ -54000,7 +54048,6 @@ fbwat.ch, 1 fbwifi.com, 1 fc-corvinul.tk, 1 -fc-rostov.ru, 1 fc-software.it, 1 fc8882.net, 1 fca-tools.com, 1 @@ -54024,7 +54071,6 @@ fcdordrecht.tk, 1 fcforum.net, 1 fcgmd.gov, 1 -fcgundlach.de, 1 fcht.fr, 1 fcic.gov, 1 fcitasc.com, 1 @@ -54103,7 +54149,6 @@ fecskefeszekotthonom.hu, 1 fecyt.es, 1 fed-shashek.spb.ru, 1 -fed.monster, 1 fed51.com, 1 fedai.org, 1 fedbizopps.gov, 1 @@ -54198,6 +54243,7 @@ feedingonmanna.org, 1 feedkovacs.hu, 1 feedmail.org, 1 +feedon.ai, 1 feedready.eu, 1 feedstringer.com, 1 feedthefood.com, 1 @@ -54258,7 +54304,7 @@ feiertage-ferien.com, 1 feignandfolly.tk, 1 feiki.tk, 1 -feikuai.tv, 1 +feikuai.tv, 0 feildel.fr, 1 feilen.de, 1 feilestrokestown.com, 1 @@ -54266,13 +54312,13 @@ feirlane.org, 0 feiromo.com, 1 feistore.com.tw, 1 +feistyduck.com, 1 feisworld.com, 0 feitam.es, 1 feittinf.org.br, 0 feixiang.eu.org, 1 feixiang.pp.ua, 1 feiya.ng, 1 -fejasport.hu, 1 fejervar.hu, 1 fejlaw.com.au, 0 fejo.dk, 1 @@ -54331,7 +54377,6 @@ felsenheimer.tk, 1 feltencie.com, 1 feltons.me, 0 -feltresca.it, 1 feluck.de, 1 female-costumes.tk, 1 femalebeauty.my.id, 1 @@ -54339,6 +54384,7 @@ femalefoodie.com, 1 femalehumorers.ga, 1 femalehumorest.ga, 1 +femalepersonaltrainer.com.au, 1 femaleteamest.ga, 1 femboy.fan, 1 femboys.pics, 1 @@ -54401,7 +54447,6 @@ fenogent.com, 1 fenom.ga, 1 fenris.ovh, 1 -fenritec.eu, 0 fenritec.fr, 1 fense.cf, 1 fense.ml, 1 @@ -54655,8 +54700,6 @@ ffiec.gov, 1 ffis.me, 0 ffl123.com, 1 -fflone.com, 1 -ffmradio.de, 1 ffn-connect.de, 1 ffnm.org, 1 ffprofile.com, 1 @@ -54673,6 +54716,7 @@ ffzeven.de, 1 fgalegaciclismo.es, 1 fgeiger.dnshome.de, 1 +fgf-companion.com, 1 fggpay.com, 1 fgh-ma.de, 1 fgh-zertifizierung.de, 1 @@ -54704,6 +54748,7 @@ fhba.com.au, 1 fhburger.ru, 1 fhcdn.xyz, 1 +fhd.agency, 1 fhdhelp.de, 0 fhdhilft.de, 0 fhersoberanes.tk, 1 @@ -54744,7 +54789,6 @@ fhsroyalbanner.com, 1 fhsseniormens.club, 1 fhstation.com, 1 -fhstatus-chinese.com, 1 fhv-waldhausen.de, 1 fhwechat.com, 1 fhzhs.com, 1 @@ -54785,10 +54829,9 @@ fiddlestickstoys.com.au, 1 fidele-g-hd.co.jp, 1 fidelis-it.ch, 1 -fidelis-it.net, 1 +fidelis-it.net, 0 fidelity-services.com, 1 fidelity.co.jp, 1 -fidelitybank.com.gh, 1 fidelityhomestead.com, 1 fidelitysound.es, 1 fides.ch, 1 @@ -54812,6 +54855,7 @@ fieldelectriconline.com, 1 fieldgroupny.com, 1 fieldsgynroboticsurgery.com, 1 +fieldstat.com, 1 fieldworkbrewing.com, 1 fieldworks.ne.jp, 1 fiemmeimpianti.it, 1 @@ -54819,6 +54863,7 @@ fierman.eu, 0 fierman.net, 0 fierman.us, 0 +fierrettsphere.com, 1 fierscleaning.nl, 1 fieryaura.eu, 1 fiesta-mk5-limited-edition.nl, 1 @@ -54840,7 +54885,6 @@ fifaultimatemod.tk, 1 fifauteam.com, 1 fifehg.org.uk, 1 -fifemedicalgroup.co.uk, 1 fiff.de, 0 fifpro.org, 0 fifr.nl, 1 @@ -54856,7 +54900,7 @@ figandgoat.com, 1 figaroparrucchiere.it, 1 figbytes.biz, 1 -figbytes.com, 1 +figbytes.com, 0 figgy.mk, 1 figherie.it, 1 fighribali.tk, 1 @@ -54947,6 +54991,7 @@ filiotech.com, 1 filiotech.pl, 1 filip-prochazka.com, 0 +filipi.no, 1 filipinasdailynews.tk, 1 filipinochinese.tk, 1 filipinostaff.uk, 1 @@ -54970,7 +55015,6 @@ filmbest.tk, 1 filmbrain.com, 1 filmcorner.tk, 1 -filmdates.co.uk, 1 filmedonstage.com, 1 filmezzunk.hu, 1 filmfestivalflix.com, 1 @@ -55041,12 +55085,14 @@ finaktiv.tk, 1 final-expense-quotes.com, 1 final-rest.co.uk, 1 +final-spark.com, 1 final-x.com, 1 finalashes.tk, 1 finalfate.tk, 1 finalfoursteam.tk, 1 finalfourstream.tk, 1 finalgambit.band, 1 +finalizatextil.com.br, 1 finalleopard.tk, 1 finalmenteazul.pt, 1 finalonline.tk, 1 @@ -55088,7 +55134,6 @@ finansified.com, 1 finansinspektionen.se, 1 finansy.tk, 1 -finanz-planer.net, 1 finanzasydinero.com, 1 finanzen-az.com, 1 finanzen-weblog.de, 1 @@ -55110,10 +55155,12 @@ fincent.xyz, 1 finch.am, 1 finch.ga, 1 +finchleyhandyman.com, 1 finchnest.co.uk, 1 fincities.tk, 1 fincura.com, 1 find2career.com, 1 +findahelpline.com, 1 findahero.com.au, 1 findairconditioningers.ga, 1 findairconditioningest.ga, 1 @@ -55123,7 +55170,6 @@ findapinball.com, 1 findautoloan.ml, 1 findbalancedliving.com, 1 -findbestfirm.com, 1 findblockchaingames.com, 1 findbugs.net, 1 findby.co.kr, 1 @@ -55149,7 +55195,6 @@ findjeen.com, 1 findlayohio.gov, 1 findlimitsers.ga, 1 -findlocalproduce.co.uk, 1 findmacrophage.com, 1 findmail.ga, 1 findmassmoney.gov, 1 @@ -55222,8 +55267,8 @@ finilaviolence.gc.ca, 1 finishingpasteers.ga, 1 finishingpasteest.ga, 1 -finishrich.com, 1 finisron.in, 0 +finista.com.tr, 1 finitecarbon.com, 0 finity.com, 1 finkelstein.fr, 1 @@ -55242,7 +55287,6 @@ finn-thorben.me, 1 finn.io, 1 finnclass.cz, 1 -finndel.no, 1 finnema.eu, 1 finnhjelpemidler.no, 1 finnishclothing.tk, 1 @@ -55257,6 +55301,7 @@ finprison.net, 1 finqk.nl, 1 finqueslaromanica.com, 1 +finroom.io, 1 fins.money, 1 finsecurity.eu, 1 finsight.com, 1 @@ -55312,8 +55357,8 @@ firecore.cn, 1 firecore.com, 1 firecry.org, 1 +firedbyroger.com, 1 firedemons.tk, 1 -firedo.de, 1 firedup4success.com, 1 fireems.ai, 1 fireeye.tk, 1 @@ -55324,6 +55369,7 @@ fireflygatlinburg.com, 1 firehada.com, 1 firehousemouse.com, 1 +firehustle.net, 1 fireintheholevideos.tk, 1 fireleadership.gov, 1 firelinkshrine.xyz, 1 @@ -55373,6 +55419,7 @@ firmant.me, 1 firmapi.com, 1 firmatour.it, 1 +firmen.directory, 1 firmendb.com, 0 firmennie-crossovki.tk, 1 firmenwerbung-vermarktung.de, 1 @@ -55407,9 +55454,7 @@ firstbaptistchurchofchrist.org, 1 firstbaptistfargo.com, 1 firstbooks.ml, 1 -firstbridge.io, 1 firstbus.co.uk, 1 -firstcall.cloud, 1 firstcallnc.com, 1 firstcapitalfcu.com, 1 firstcentralsavings.com, 1 @@ -55423,6 +55468,7 @@ firstclassleisure.co.uk, 1 firstclassnuisance.tk, 1 firstclinic.tk, 1 +firstcoastbillinggroup.com, 1 firstcoastteaco.com, 1 firstcolonyengraving.com, 1 firstcommunity.com, 1 @@ -55448,7 +55494,6 @@ firstload.tk, 1 firstmall.de, 1 firstmarket.tech, 1 -firstmarketscanner.com, 1 firstname.tk, 1 firstnet.gov, 1 firstnetwork.cf, 1 @@ -55519,7 +55564,6 @@ fishingzone.bg, 1 fishman.idv.tw, 1 fishoftheday.tv, 1 -fishseller.shop, 1 fishserver.net, 1 fishspecies.nz, 1 fishtacos.blog, 1 @@ -55564,7 +55608,6 @@ fitcrewhn.com, 1 fite.family, 0 fitecleaningservices.com, 1 -fitequilibrio.com.br, 1 fitfactory.lv, 1 fitfingers.shop, 1 fitflaop.ga, 1 @@ -55578,7 +55621,6 @@ fitleads.nl, 1 fitlinewellnesscoach.com, 1 fitmommyinheels.com, 1 -fitmybike.eu, 0 fitness-uhr.net, 1 fitness-world.ga, 1 fitness.edu.au, 0 @@ -55599,7 +55641,6 @@ fitnutkatie.com, 1 fito.tk, 1 fitodifesa.it, 1 -fitosofia.com, 1 fitotovar.ru, 1 fitpass.co.in, 1 fitrecepty.info, 1 @@ -55620,6 +55661,7 @@ five15.net, 1 fiveboosts.xyz, 1 fiveclassauto.com, 1 +fivecrm.com, 1 fivefortheroad.com, 1 fiveminute.tk, 1 fivepb.me, 1 @@ -55627,7 +55669,6 @@ fiverr.com, 1 fiveslice.pizza, 1 fivestar.et, 1 -fivestaraussie.com, 1 fivethirtyeight.com, 1 fiveyearsahead.com, 1 fivolodigital.com, 1 @@ -55643,6 +55684,8 @@ fixabzar.com, 1 fixator10.ru, 1 fixcyprus.cy, 1 +fixedcostagents.com, 1 +fixedcostclaw.com, 1 fixedfeeplacements.co.uk, 1 fixedgear.tk, 1 fixedpricemovers.com, 0 @@ -55655,6 +55698,7 @@ fixi.dk, 1 fixiecommerce.com, 1 fixingscrews.co.uk, 1 +fixitrange.com, 1 fixm.aero, 1 fixmobile.online, 1 fixmyvisit.com, 1 @@ -55667,6 +55711,7 @@ fixplusflex.de, 1 fixpoint.co.at, 1 fixpoint.systems, 1 +fixrein-reinigung.de, 1 fixtesisat.com, 1 fixthetimeline.com, 1 fixthetimeline.org, 1 @@ -55711,7 +55756,6 @@ fjerhammer.dk, 1 fjharcu.com, 1 fjkl.uk, 1 -fjnuacm.top, 1 fjordbank.ee, 1 fjordbank.lt, 1 fjordboge.dk, 1 @@ -55737,7 +55781,6 @@ flabutelov.tk, 1 flacandmp3.ml, 1 flacon.tk, 1 -fladnag.net, 1 flaeskeklubben.dk, 1 flaeskeklubben.eu, 1 flagcdn.com, 1 @@ -55763,19 +55806,19 @@ flagpedia.asia, 1 flagpedia.net, 1 flagriculture.gov, 1 -flags.games, 1 +flags.games, 0 flagshipmerchantservices.com, 1 flagstone-magazin.ro, 0 flagstri.com, 1 flagyl-500-mg.ga, 1 flair.nl, 1 flaironline.nl, 1 +flam-bz.com, 1 flam.lu, 1 flam.studio, 1 flaman-h7a.fr, 1 flamanville.fr, 1 flamby.ovh, 1 -flameflyff.com, 1 flamehaze.tk, 1 flamellugano.com, 1 flamencoshoes.tk, 1 @@ -55801,7 +55844,6 @@ flanagan.tk, 1 flanderslaw.com, 1 flanga.io, 0 -flangespreader.eu, 1 flanigan.tk, 1 flannel.co.jp, 1 flanschspreizer.at, 1 @@ -55822,7 +55864,6 @@ flash.homes, 1 flashbackband.tk, 1 flashbeat.tk, 1 -flashcardsmobile.com, 1 flashcover.com.br, 1 flasheschile.tk, 1 flashgamedev.tk, 1 @@ -55855,7 +55896,6 @@ flathome.co.jp, 1 flaticons.net, 1 flatlandchurch.com, 0 -flatmail.net, 1 flatmail.pl, 1 flatmatehub.com.au, 1 flatpackmates.co.uk, 1 @@ -55971,6 +56011,7 @@ flexgs.net, 1 flexhyp.de, 1 flexi-dance.pl, 1 +flexi-scale.com.my, 1 flexi.org, 1 flexiblenetflow.com, 1 flexibsd.com, 1 @@ -55993,7 +56034,6 @@ flextribly.xyz, 1 flextudo.com, 1 flexundfix.de, 1 -flexve.com, 1 flexworkhero.de, 1 flfamily.org, 1 flfl.de, 1 @@ -56020,6 +56060,7 @@ flightdiary.ga, 1 flightdiary.gq, 1 flightfrankfurt.com, 1 +flighthonolulu.com, 1 flighthub-sms.com, 1 flightjackets.tk, 1 flightrights.gov, 1 @@ -56027,7 +56068,9 @@ flightschoolbooking.com, 1 flightschoolcandidates.gov, 1 flightschoolxxi.com, 1 +flightstimes.com, 1 flightti.com, 1 +flightticketsto.com, 1 flightzero.cf, 1 fliino.com, 1 fliino.eu, 1 @@ -56055,7 +56098,6 @@ flippers-leuven.be, 1 flipphotography.ga, 1 flipping.land, 0 -flipsidevr.com, 1 flipsidexr.com, 1 fliptable.org, 1 flipweb.tk, 1 @@ -56088,6 +56130,7 @@ flocktofedora.org, 1 floenergy.sg, 1 floepsie.nl, 1 +floerens.eu, 1 floersheimer-openair.de, 1 floffi.media, 1 flofr.gov, 1 @@ -56100,7 +56143,7 @@ flokylab.com, 1 floline.fr, 1 flom.fi, 1 -flomaru.com, 0 +flomaru.com, 1 flomax385.tk, 1 flomeyer.de, 1 floodboss.ml, 1 @@ -56117,6 +56160,8 @@ flooring-long-island.com, 1 flooringbidest.ga, 1 flooringsourcetx.com, 1 +floorplans.com, 1 +floorrescue.com, 1 floors4lessbay.com, 1 floosak.co, 1 flooz.trade, 0 @@ -56216,6 +56261,7 @@ floth.at, 1 flothost.com, 1 flothow.com, 1 +flothow.com.py, 1 floucloud.id, 1 flourishdx.com, 1 flourishgrazingevents.co.uk, 1 @@ -56321,7 +56367,6 @@ fluidbb.co.uk, 1 fluids.ac.uk, 1 fluidsealing.com.au, 1 -fluig.com, 1 fluitbeurt.nl, 1 flukestar.tk, 1 flukeydudes.org, 1 @@ -56339,9 +56384,9 @@ fluteandpianoteaching.co.uk, 1 flutedrinks.com, 1 flutterappdev.com, 1 -flutterfactory.io, 1 flutterwave.com, 1 fluui.com.br, 1 +fluuxly.com, 1 flux.today, 0 flux360.net, 1 fluxforge.com, 1 @@ -56401,6 +56446,7 @@ flyingspaghettimonsterdonationsfund.nl, 1 flyingtomorocco.com, 1 flyingtutorsers.ga, 1 +flylcpa.com, 1 flylcpa.gov, 1 flylvia.com, 1 flymfr.com, 1 @@ -56417,6 +56463,7 @@ flyspace.ga, 1 flyspace.ml, 1 flyssh.net, 1 +flystarflight.com, 1 flyswoop.com, 1 flyten.ir, 1 flythecopter.tk, 1 @@ -56450,7 +56497,6 @@ fmhy.net, 1 fmi.gov, 1 fminsight.net, 1 -fmjansen.com, 1 fmlife.tk, 1 fmm-creative.com, 1 fmn.nl, 1 @@ -56468,6 +56514,7 @@ fmstudio.com.ua, 1 fmt-live.de, 1 fmussatmd.com, 1 +fn.com.my, 1 fn.com.sg, 1 fn.my, 1 fn.sg, 1 @@ -56498,6 +56545,7 @@ fnlife.com.my, 1 fnn-creameries.com, 1 fnncreameries.com, 1 +fnnfoods.com, 1 fnof.ch, 1 fnordserver.eu, 1 fnpro.eu, 1 @@ -56518,6 +56566,7 @@ focanamoda.com.br, 1 focanocliente.com.br, 1 focenter.com, 1 +focomentoring.com.br, 1 focored.com, 1 focus2career.com, 0 focusbet-api.com, 1 @@ -56571,6 +56620,7 @@ folf.codes, 1 folhageral.com, 1 foliagefriend.com, 1 +foliencenter24.com, 1 folio.no, 1 foljeton.dk, 0 folk.as, 1 @@ -56616,7 +56666,6 @@ fonds-dieter.be, 1 fondsnieuws.nl, 1 fondsvermittler.com, 1 -fondy.ua, 1 fondzee.cz, 1 fonemisitme.com, 1 foneria.com.tr, 0 @@ -56891,7 +56940,7 @@ fordlibrarymuseum.gov, 1 fordpartsgiant.com, 1 fordpartsprime.com, 1 -fordsbranch.church, 1 +fordsbranch.church, 0 fordservicetraining.com, 1 fordshop.by, 0 fordtrac.com.br, 1 @@ -56941,6 +56990,8 @@ foresttownrcwi.gov, 1 forestvets.com, 1 forever.gq, 1 +foreverboxesr.us, 1 +foreverboxesrus.com, 1 foreverbreak.com, 1 foreverclean.com, 1 forevercollage.com, 1 @@ -57012,7 +57063,7 @@ formalize.com, 1 formalux.com.au, 1 formand.ru, 1 -formanov.com, 1 +formanov.com, 0 formap.co, 1 formapi.io, 1 formascan.fr, 1 @@ -57153,6 +57204,7 @@ fortknoxster.com, 1 fortmatic.com, 1 fortnanov.com, 1 +fortnet.online, 1 fortnightlyofeugene.org, 1 fortnitedb.com, 1 fortnitemagic.ga, 1 @@ -57256,7 +57308,6 @@ fossa.com, 1 fossagarrafoni.tk, 1 fossbots.org, 1 -fossboxen.com, 1 fossewayflowers.co.uk, 1 fossewayflowers.com, 1 fossiilid.info, 1 @@ -57290,7 +57341,6 @@ fotoarchiv-niederrhein.de, 1 fotoblog.nrw, 1 fotobodyart.nl, 0 -fotobrb.de, 1 fotobringer.de, 1 fotobrinke.de, 1 fotochip.tk, 1 @@ -57352,6 +57402,7 @@ foucheplumbers.com, 1 foudufafa.de, 0 fougereettralala.fr, 1 +found.com, 1 foundationalucc.com, 1 foundationassure.com, 0 foundationmaintenance.com, 1 @@ -57405,7 +57456,6 @@ fowesolutions.net, 1 fowlmanor.tk, 1 fowlsmurf.net, 1 -fowos.de, 1 fox-zulu.de, 1 fox.my, 0 fox13now.com, 1 @@ -57448,6 +57498,7 @@ foxygf.com, 1 foxytubes.com, 1 foyale.io, 1 +foyue.org, 1 fozzels.com, 1 fozzie.co.uk, 1 fozzie.space, 1 @@ -57457,18 +57508,20 @@ fpalzira.es, 1 fpasca.com, 1 fpc.gov, 1 +fpcdn.io, 1 fpcorporatefinance.eu, 1 -fpcs-anchorage.com, 1 fpcslidell.org, 1 fpds.gov, 1 fpersona.com, 1 fpf.ch, 1 fpf.org, 1 fpgamania.com, 1 +fpjscdn.net, 1 fpki.sh, 1 fpline.jp, 1 fpmafi.com, 1 fpnet.tk, 1 +fpnpmcdn.net, 1 fpoe.eu, 1 fppq.org.br, 1 fprinnovaciones.es, 1 @@ -57583,7 +57636,6 @@ framedog.tk, 1 framegame.ch, 1 framemo.org, 1 -framenails.fr, 1 framer.ai, 1 framer.com, 1 framer.live, 1 @@ -57616,7 +57668,6 @@ francelight.fr, 1 francenum.gouv.fr, 1 francepandi.fr, 0 -francerent.com, 1 francesca-and-lucas.com, 1 francescazambon.it, 0 francescocozza.it, 1 @@ -57818,7 +57869,6 @@ freak-zone.tk, 1 freakguitars.tk, 1 freaksites.dk, 0 -freaktofit.com, 1 freakyawesome.agency, 1 freakyawesome.art, 1 freakyawesome.band, 1 @@ -57894,6 +57944,7 @@ free-nation.tk, 1 free-obmen.ml, 1 free-ppp.jp, 1 +free-premium-accounts.com, 1 free-printablehq.com, 1 free-printablemap.com, 1 free-quotes.info, 1 @@ -57909,7 +57960,6 @@ free.mg, 1 free.sh, 1 free.tools, 1 -free4allsw.com, 0 free6to12yo.gq, 1 freeadhdquiz.com, 1 freeaf.gq, 1 @@ -57975,6 +58025,7 @@ freedomhkg.info, 1 freedomhouse.org, 1 freedomisslavery.tk, 1 +freedomjonkoping.se, 1 freedomkiaparts.com, 1 freedomlab.io, 1 freedomonline.bg, 1 @@ -58092,6 +58143,7 @@ freeschematest.com, 1 freeschool.cf, 1 freescorefast.com, 1 +freeseedsonline.com, 1 freesexvideo.pro, 1 freesexvidz.com, 1 freeshell.de, 1 @@ -58149,6 +58201,7 @@ freezoneplan.com, 1 freezvon.ru, 1 freform.club, 1 +fregercosmetics.co.il, 1 freibesetzt.tk, 1 freiboth.ddns.net, 1 freie-software.net, 1 @@ -58225,10 +58278,8 @@ fresh.co.il, 1 fresh4.co.uk, 1 freshbean.club, 1 -freshbooks.com, 0 freshcar.bg, 1 freshcode.nl, 1 -freshdesk-apps-by-invantive.com, 1 freshempire.gov, 1 freshersworld.ml, 1 fresherwalkins.tk, 1 @@ -58248,6 +58299,7 @@ freshrss.eu, 1 freshrss.nl, 1 freshsexpics.com, 1 +freshslots.net, 1 freshsnap.org.au, 1 freshtest.tk, 1 freshwave.gr, 1 @@ -58267,7 +58319,6 @@ freundinnen-urlaub.de, 0 freundinnenausflug.de, 0 freundlieb.ch, 1 -frexxi.com, 1 freyapearls.com.au, 1 frgal.cz, 1 fribourgviking.net, 1 @@ -58311,6 +58362,7 @@ friendlydabs.com, 1 friendlydecorator.ca, 1 friendlydesigner.ca, 1 +friendlys.com, 1 friendofthehoneybee.co.uk, 1 friendofthehoneybee.org, 1 friends-online.tk, 1 @@ -58402,6 +58454,7 @@ frogeducation.com, 1 frogeducation.com.au, 1 froger.me, 1 +frogeye.fr, 1 froggitt.com, 1 froginfra.net, 1 froglms.com, 1 @@ -58413,7 +58466,6 @@ frogsonamission.de, 1 frogstar.com, 1 frogtest.co.uk, 1 -frogtown.capital, 1 froh-s.com, 1 froh.co.jp, 1 frohsinnoberzier.de, 1 @@ -58452,7 +58504,7 @@ frontecho.top, 1 fronteers.nl, 0 fronteimoveis.com.br, 1 -fronteiralivre.com.br, 1 +fronteiralivre.com.br, 0 frontenddev.org, 1 fronterasblog.tk, 1 frontierbrasil.tk, 1 @@ -58466,24 +58518,27 @@ frontline.cloud, 1 frontline6.com, 0 frontlinepolicies.com, 1 +frontmymail.com, 1 frontofthehouse.com, 1 frontrouge.fr, 1 froogo.co.uk, 1 frosinonetoday.it, 1 frost.com, 1 frost.kiwi, 1 +frostbits.net, 1 frostbytex.ca, 1 frostexpert.ru, 1 frostfire.tk, 1 frostland.net, 1 frostland.pro, 1 +frostleap.com, 1 frostprotection.co.uk, 1 frostwarning.com, 1 frostwolf.tk, 1 frosty-gaming.xyz, 1 frosty.sk, 1 frosty.style, 1 -frostyclub.com, 1 +frostyclub.com, 0 frostymr.com, 0 frostysummers.com, 1 frothy285.com, 1 @@ -58522,6 +58577,7 @@ frugro.be, 1 fruit-chat.com, 1 fruit-farm.tk, 1 +fruit-rush.com, 1 fruit.ga, 1 fruitbouquets.com, 1 fruitdiva.com, 1 @@ -58583,7 +58639,6 @@ fseo.tk, 1 fsfi.is, 1 fsg.one, 1 -fsharpfactory.io, 1 fsicourses.net, 1 fsinf.at, 1 fsk.fo, 0 @@ -58626,7 +58681,6 @@ fstpn.shop, 1 fstpn.si, 1 fstpn.uk, 1 -fsty.uk, 1 fsub.de, 1 fsvoboda.cz, 1 ft.com, 0 @@ -58638,6 +58692,8 @@ ftcollinswindows.com, 1 ftcscout.org, 1 ftcunion.org, 1 +ftczech.com, 1 +ftczech.cz, 1 fte-automotive.com, 1 ftek.com, 1 ftfgroup.us, 1 @@ -58833,6 +58889,7 @@ fullmetalconsulting.tk, 1 fullmoondesignhouse.tk, 1 fullmoonhentai.tk, 1 +fullmouthdentalimplants.com.au, 1 fullpaisa.com, 1 fullsize.ml, 1 fullsizefordclub.tk, 1 @@ -58841,6 +58898,7 @@ fulltxt.ml, 1 fully-covered.tk, 1 fully-hair.tk, 1 +fullzest.com, 1 fultoncountyar.gov, 1 fultoncountyil.gov, 1 fultoncountyilelections.gov, 1 @@ -58855,7 +58913,6 @@ fumilink.com, 1 fumotousa.com, 1 fun-baby.ru, 1 -fun-bounce.co.uk, 1 fun-day.tk, 1 fun-life.com.tw, 0 fun-tasia.co.uk, 1 @@ -58883,6 +58940,7 @@ fundacionfranciscofiasco.org, 1 fundacionindigo.tk, 1 fundacionlaboral.org, 1 +fundacionpaideia.com.ar, 1 fundacionsiempreadelante.org, 1 fundacionsilverina.org, 1 fundacjamatkiewy.pl, 1 @@ -58898,11 +58956,12 @@ fundera.com, 1 fundex.id, 1 fundiggitydog.co.nz, 1 -funding-zone.com, 1 +funding-zone.com, 0 fundingoptions.com, 1 fundingpartner.dk, 1 fundingpartner.no, 1 fundingpartner.se, 1 +fundinvestmenttools.com, 1 fundky.com, 1 fundkyapp.com, 1 fundmatellc.com, 1 @@ -58987,6 +59046,7 @@ funinthesunboating.com, 1 funio.com, 1 funk-austria.com, 1 +funk-gruppe.ch, 1 funk-gruppe.de, 1 funk-gruppe.it, 1 funk-gruppe.li, 1 @@ -59111,7 +59171,6 @@ furniture-warehouse.co.za, 1 furnitureconcept.co.uk, 1 furniturefashion.com, 1 -furnitureforlife.com, 1 furnitureplustt.com, 1 furnitureproduction.tk, 1 furnituresolutions.tk, 1 @@ -59208,7 +59267,7 @@ fut21gen.com, 1 futa.agency, 1 futa.wiki, 1 -futabadc.jp, 1 +futacockinside.me, 1 futalis.de, 1 futarara.ga, 1 futaritomo.tk, 1 @@ -59259,6 +59318,7 @@ futuregrowthva.com, 1 futureimmigration.net, 1 futuremadein.eu, 1 +futurenode.dk, 1 futureofyoucdc.sg, 1 futureplan.de, 1 futureplanet.tk, 1 @@ -59301,12 +59361,12 @@ fuzzlemann.de, 1 fuzzy.domains, 1 fuzzylogic.tk, 1 +fv-judo-im-norden.de, 1 fvap.gov, 1 fvdm.com, 1 fveevaete.com, 1 fvg.io, 1 fvivas.com, 1 -fvledilizia.it, 1 fvr-concept.be, 1 fw-einsatz.de, 1 fwaux.de, 1 @@ -59331,6 +59391,7 @@ fx-rating.com, 1 fx-w.io, 1 fx.to, 1 +fx0817.dpdns.org, 1 fxci.com, 1 fxcm-arabic.com, 1 fxcm-chn.com, 1 @@ -59454,6 +59515,7 @@ g1313g.com, 1 g15ubezpieczenia.pl, 1 g2-inc.com, 1 +g20.org, 1 g2jp.uk, 1 g2pla.net, 1 g2risksolutions.com, 1 @@ -59482,8 +59544,8 @@ g8energysolutions.co.uk, 1 g9297.co, 1 g9728.co, 1 -g9kingnine.xyz, 1 ga-digitazion.com, 1 +ga-rew.com, 1 ga.fr, 1 ga4wp.com, 1 gaaog.com, 1 @@ -59560,7 +59622,6 @@ gadanie.cf, 1 gadanie.ml, 1 gadatel.ml, 1 -gaddiel.in, 1 gaddini.it, 1 gadget-freak.cf, 1 gadget-hat.tk, 1 @@ -59644,7 +59705,6 @@ gaku-nkc.net, 1 gala.im, 1 gala.kiev.ua, 0 -galabands.info, 1 galact.tk, 1 galaksidot.tk, 1 galaktika-znakomstv.tk, 1 @@ -59683,7 +59743,6 @@ galaxystaking.space, 1 galaxysweeper.com, 1 galaxytracker.tk, 1 -galecommercial.com, 1 galefacialplastics.com, 1 galenguyer.com, 1 galenreasoner.com, 1 @@ -59729,7 +59788,7 @@ galio.lt, 1 galiuzvejoti.org, 1 galive.ga, 1 -galix.com, 1 +galix.com, 0 galizae-sports.tk, 1 gallagher.com, 1 gallagherperformance.com, 1 @@ -59794,13 +59853,13 @@ gamblingaffiliatevoice.com, 1 gamblingconsulting.expert, 1 gamburger.tk, 1 -gamcore.com, 1 game-club.me, 1 -game-designers.net, 1 +game-designers.net, 0 game-dominion.tk, 1 game-gentle.com, 1 game-net.ml, 1 game-repack.site, 1 +game-serverhosting.de, 1 game.es, 1 game4less.com, 1 game818play.com, 1 @@ -59858,6 +59917,7 @@ gameloft.ga, 1 gamelok.ga, 1 gamemakers.tk, 1 +gamenetwork.pl, 1 gamenew.tk, 1 gameofbooks.de, 1 gameonespirit.tk, 1 @@ -59890,7 +59950,6 @@ gamereactor.pt, 1 gamereactor.se, 1 gamerepository.ga, 1 -gameres.com, 1 gamering.cf, 1 gamerkings.tk, 1 gamers-community.tk, 1 @@ -59907,7 +59966,6 @@ gamertelligence.com, 1 gamertrashers.ga, 1 gamerturk.tk, 1 -gamerwelfare.com, 1 gamerzdot.com, 1 games-rt.ru, 1 games-station.tk, 1 @@ -59977,6 +60035,7 @@ gamingmeets.com, 1 gamingo.news, 1 gamingph.com, 1 +gamingpowerpc.com, 1 gamingregulation.com, 1 gamingtech.es, 1 gamingterritory.com, 1 @@ -60011,6 +60070,7 @@ gandalfservice.com, 1 gandmfamilydental.com, 1 gandour.com, 0 +gandysdairy.com, 1 gangbangs.tk, 1 ganggalbichler.at, 1 gangnamcool.com, 1 @@ -60052,11 +60112,13 @@ gaponov.tk, 1 garage-leone.com, 0 garage.click, 1 +garage.management, 1 garage042.bg, 1 garage15.com.ua, 1 garagechief.com, 1 garagedejan.ch, 1 garagedoorflorida.com, 0 +garagedoorpartsuk.co.uk, 1 garagedoorrepaircedarhilltx.com, 1 garagedoorrepairs-sanantonio.com, 1 garagedoors4less-sanantonio.com, 1 @@ -60064,13 +60126,13 @@ garagemhermetica.org, 1 garagen-crew.de, 1 garagenet.com, 1 -garageportcenter.se, 1 garageworks.in, 1 garanteasy.com, 1 garantieabschluss.de, 1 garantikoza.org, 1 garantplus.kz, 1 garaventa.com, 1 +garaz.cz, 1 garbage-juice.com, 1 garbarinocatalogo.com, 1 garbuszus.de, 1 @@ -60105,9 +60167,9 @@ gardnerbender.com, 1 garduri-electrice-animale.ro, 1 gardurialuminiuiasi.ro, 1 +garelickfarms.com, 1 garethbowker.com, 1 garethbowker.uk, 1 -garethdesign.co.uk, 1 garethkirk.com, 1 garethkirkreviews.com, 1 garfieldairlines.net, 1 @@ -60197,7 +60259,6 @@ gasbarkenora.com, 1 gasenergy.kz, 1 gasesdelaguajira.com, 1 -gasestepiesa.ro, 1 gasfitermaipu.cl, 1 gasherde.tk, 1 gashtline.ir, 1 @@ -60316,13 +60377,11 @@ gaycammers.com, 1 gaychatrooms.tk, 1 gaycock4u.com, 0 -gayest.gay, 1 gayfeedr.com, 1 gayfish.org, 1 gayfish.party, 1 gayfr.live, 1 gayfr.online, 1 -gayfr.social, 1 gayga.gov, 1 gaygeeks.de, 1 gayhotmovies.com, 1 @@ -60339,7 +60398,6 @@ gaytor.rent, 1 gaytorrent.ru, 1 gaytravel4u.com, 1 -gaytubec.com, 1 gayukai.net, 1 gaz-connect.ru, 1 gazapos.ga, 1 @@ -60378,7 +60436,6 @@ gbfoundation.org, 1 gbhem.org, 1 gbhosts.com, 1 -gbi-etalon.ru, 1 gbinsta.com, 1 gbiotech.tk, 1 gbisigma.com, 1 @@ -60425,7 +60482,7 @@ gcode.space, 1 gcoded.de, 1 gconcept.tk, 1 -gconstruction.org, 1 +gconstruction.org, 0 gcoption.pro, 1 gcorevape.ca, 1 gcqd.fr, 1 @@ -60445,7 +60502,6 @@ gcwatx.gov, 1 gcwcid1tx.gov, 1 gcwholistic.com, 1 -gd-ots.com, 1 gda.gov.lb, 1 gdacs.org, 1 gdandb.com, 1 @@ -60494,6 +60550,7 @@ gearboxhero.com, 1 gearev.net, 1 gearfinder.nl, 1 +gearhut.lk, 1 gearnews.tk, 1 gearset.com, 1 gearsupply.com, 0 @@ -60561,7 +60618,6 @@ geeklair.net, 1 geeklan.co.uk, 1 geekmagazine.com.br, 1 -geekmiao.com, 1 geekofeminin.com, 1 geekplay.fr, 1 geekport.net, 1 @@ -60687,10 +60743,12 @@ gemailt.net, 1 gemaskeerd.nl, 1 gematik.de, 1 +gemawardian.com, 1 gemax-online.de, 1 gembet99.com, 1 gemdirt.com, 1 gemeenschapsraaddeweere.nl, 1 +gemeente-s-hertogenbosch.nl, 1 gemeentedevesting.nl, 1 gemeentegeschiedenis.nl, 1 gemeentehub.nl, 1 @@ -60732,7 +60790,6 @@ genderidentiteit.nl, 1 gendermedjournal.it, 1 gendrin.com, 1 -gendundrupa.ch, 0 gene-drive.com, 1 gene-drives.com, 1 geneacdn.net, 1 @@ -60767,6 +60824,7 @@ general-anesthesia.com, 1 general-directorate-of-administration.gov.lb, 1 general-insurance.tk, 1 +generalarcade.com, 1 generalassemb.ly, 1 generalcustomshop.com.br, 1 generali-investments-portal.cz, 1 @@ -60783,7 +60841,6 @@ generateurdesmiley.tk, 1 generation-clic.net, 1 generation247.nl, 1 -generationcloud.fr, 1 generationgoat.com, 1 generationnext.pl, 0 generationsweldom.com, 1 @@ -60871,7 +60928,7 @@ geniuswin.it, 1 geniuszone.biz, 1 genkisushi.com.hk, 1 -genlack.com, 0 +genlack.com, 1 gennaroabete.duckdns.org, 1 gennerator.com, 1 gennet.com, 1 @@ -60900,7 +60957,6 @@ genomic-surveillance.com, 1 genomic-surveillance.net, 1 genomic-surveillance.org, 1 -genomicslab.in, 1 genoog.com, 1 genoplot.com, 1 genorma.com, 1 @@ -60975,6 +61031,7 @@ geo-television.de, 1 geoapps.nl, 0 geoarchive.tk, 1 +geobattles.xyz, 1 geocaching.hu, 1 geocar.com, 1 geocell.website, 1 @@ -61078,6 +61135,7 @@ georgiaclean.com, 1 georgiacollaborative.com, 1 georgiacriminaldefense.com, 1 +georgiadreamsrealty.com, 1 georgiainfo.ga, 1 georgianews.ml, 1 georgiangames.gq, 1 @@ -61123,17 +61181,19 @@ geotrust.com.ru, 1 geotruth.net, 1 geourl.me, 1 +geovertix.com, 1 geowest.tk, 1 gepassociati.cloud, 1 gepgroup.gr, 1 gepo69.net, 1 gepps.de, 0 geppy.im, 1 -gequma.de, 1 gera-haushaltsaufloesung.de, 1 gerainano.com, 1 geraintwhite.co.uk, 1 gerald-zojer.com, 1 +geraleks.ru, 1 +geralyntaylor.com, 1 geranium.dk, 1 gerard-klooster.net, 1 gerardforcada.com, 1 @@ -61205,6 +61265,7 @@ geruestbau-grupp.de, 1 gerum.dynv6.net, 0 gerwinvanderkamp.nl, 1 +ges2l.com, 1 gesamenvat.nl, 1 gesath.co, 1 gesath.com, 1 @@ -61229,6 +61290,7 @@ gestaoboa.com.br, 1 gestaoclub.com.br, 1 gestcoelho.com, 1 +gestii.com.br, 1 gestion-optimum.com, 1 gestion-verificaciones.com.ar, 1 gestionaleamica.com, 1 @@ -61257,6 +61319,7 @@ get.how, 1 getabear.com, 1 getacrane.co.uk, 1 +getactionseptic.com, 1 getahearing.com, 0 getaldea.com, 1 getalink.ga, 1 @@ -61272,6 +61335,7 @@ getback.ch, 1 getbacktosport.com, 0 getbalitour.com, 1 +getbeaverdock.com, 1 getbellhop.co, 1 getbenepass.com, 1 getblogger.ru, 1 @@ -61293,7 +61357,7 @@ getcarina.com, 1 getcerta.com, 1 getchip.cc, 1 -getclarity.life, 1 +getclarity.life, 0 getcleanworx.co.uk, 1 getclever.marketing, 1 getcloak.com, 1 @@ -61386,6 +61450,7 @@ getnib.com, 1 getnikola.com, 1 getonwikipedia.com, 1 +getotoq.com, 1 getoxley.com, 1 getpagespeed.com, 1 getpaidclub.tk, 1 @@ -61397,6 +61462,7 @@ getpeachy.org, 1 getpet.lt, 1 getplus.com.au, 1 +getprimepicksusa.com, 1 getpro.plumbing, 1 getprohealth.com, 1 getpromo.cf, 1 @@ -61408,6 +61474,7 @@ getrealgifts.com, 1 getrelish.com, 1 getresilience.org, 1 +getrestorationexperts.com, 1 getriebeservice-gse.de, 0 getroman.com, 1 getroom.in, 1 @@ -61433,6 +61500,7 @@ getswadeshi.com, 1 getsweep.com, 1 gett-group.com, 1 +gettaxesright.com, 1 getteamninja.com, 1 gettext.tk, 1 gettheanchor.org, 1 @@ -61555,6 +61623,7 @@ gg9297.co, 1 gg9397.com, 1 gg9728.co, 1 +ggb.world, 1 ggchamber.com, 1 ggddrenthe.nl, 1 ggdrop.com, 1 @@ -61566,7 +61635,7 @@ gglks.com, 1 ggmmontascale.it, 1 ggpoker.com, 1 -ggpuketi.com, 1 +ggpuketi.com, 0 ggretrobox.com, 1 ggrks.lol, 1 ggs-marschallstrasse.de, 1 @@ -61602,7 +61671,6 @@ gheorghesarcov.ga, 1 gheorghesarcov.tk, 1 ghereben.xyz, 1 -ghettonetflix.de, 1 gheymatokharid.com, 1 ghgkhalsaschool.com, 1 ghi.gov, 1 @@ -61620,6 +61688,7 @@ ghostbustersuk.tk, 1 ghostcarve.ml, 1 ghostcir.com, 0 +ghostcms.fr, 1 ghostdesign.tk, 1 ghostdog.ga, 1 ghostdragon.tk, 1 @@ -61628,8 +61697,7 @@ ghosthost.site, 1 ghosthunting.dk, 1 ghostinbox.pl, 1 -ghostinfluence.com, 1 -ghostkeys.eu, 1 +ghostkeys.eu, 0 ghostlight.tk, 1 ghostmail.no, 1 ghostmarket.io, 1 @@ -61646,6 +61714,7 @@ ghosttrades-university.de, 1 ghostutils.tk, 1 ghostwritershigh.com, 1 +ghosty.link, 1 ghotokbaba.com, 1 ghou.me, 1 ghowell.io, 1 @@ -61727,7 +61796,6 @@ giesela.io, 1 gif-avatars.com, 1 gif.tips, 0 -gifbook.io, 1 giff.com.mx, 1 gifhelittlestars.co.uk, 1 gifsonline.tk, 1 @@ -61736,7 +61804,6 @@ giftbasketsoverseas.com, 1 giftbasketswindsor.com, 1 giftbit.com, 1 -giftedconsortium.com, 1 giftedmodels.com, 1 giftex.cz, 1 giftexperts.com, 1 @@ -61794,7 +61861,6 @@ gigatron.tk, 1 gigawa.lt, 1 gigawattz.com, 1 -gigbh.com, 1 gigent.xyz, 1 giggear.com.au, 1 gigharborsound.com, 1 @@ -61803,12 +61869,14 @@ gigiscloud.servebeer.com, 1 giglink.club, 1 gigloog.tk, 1 +gigodata.com, 1 gigs.com, 1 gigsremote.com, 1 gigtakaful.bh, 1 gigwise.com, 1 giigle.cf, 1 gijonshiro.tk, 1 +gijotech.com, 1 gikovatelojavirtual.com.br, 1 gil.gg, 1 gilandrad.tk, 1 @@ -61817,6 +61885,7 @@ gilbertosimoni.tk, 1 gilbertsvilleny.gov, 1 gildan.com, 1 +gildeddesignstudio.com, 1 gildenhost.de, 1 gileadpac.com, 1 gilescountytn.gov, 1 @@ -61907,7 +61976,6 @@ giovinco.tk, 1 gip-carif-idf.net, 1 gip-carif-idf.org, 1 -gipelpsb.fr, 1 giper.ga, 1 giperfast.tk, 1 gipernn.ru, 1 @@ -61915,7 +61983,6 @@ gippert-klein.de, 1 gipsplitka.ru, 1 gipuzkoabasket.tk, 1 -giraffe.net, 1 giraffeduck.com, 1 giraffenland.de, 1 giraffes.org, 1 @@ -61969,8 +62036,6 @@ gisbornecabs.com.au, 1 giscadlimited.com, 1 gisellapiano.tk, 1 -gisher.me, 1 -gisher.news, 1 gisher.org, 1 gisher.video, 1 gishiko.net, 1 @@ -62011,6 +62076,7 @@ gitns.net, 1 gitns.nl, 1 gitns.org, 1 +gitring.com, 1 gitschberg-sport.it, 1 gitstuff.tk, 1 gittigidiyor.com, 1 @@ -62085,7 +62151,6 @@ gjrick.tw, 1 gjung.com, 1 gk-it.ru, 1 -gkanev.com, 1 gkcmp.com.br, 1 gkconsultancy.tk, 1 gkdforum.eu.org, 1 @@ -62123,7 +62188,7 @@ gladwellentertainments.co.uk, 1 gladwork.tk, 1 gladysstrickland.com, 1 -glaeser-it.de, 1 +glaeser-it.de, 0 glaesle.cloud, 1 glahcks.com, 1 glama.ai, 1 @@ -62161,6 +62226,7 @@ glass.fish, 1 glass.google.com, 1 glass.photo, 1 +glass24.pl, 1 glassact.com, 0 glasschmuck-millefiori.de, 1 glasscometro.com.au, 1 @@ -62184,7 +62250,7 @@ glasstechnics.be, 1 glassworld.tk, 1 glaston.com, 1 -glastuershop24.de, 0 +glastuershop24.de, 1 glaswerk-mellenbach.de, 1 glaswolsite.tk, 1 glattbach.de, 1 @@ -62229,7 +62295,7 @@ glenmarieproperties.com, 0 glenmarkpharma.sk, 1 glenmorewisconsin.gov, 1 -glennfitzpatrick.com, 1 +glennfitzpatrick.com, 0 glennhamers.nl, 1 glenntrede.com, 0 glennvillega.gov, 1 @@ -62325,11 +62391,11 @@ globalentertainment.ga, 1 globalepsilon.com, 1 globalfaraday.com, 1 -globalflavorjourney.com, 1 globalformat.de, 1 globalfuhui.com, 1 globalgamingalmanac.com, 1 globalgaragesale.net, 1 +globalgassprings.com, 1 globalgate.cc, 1 globalgivingtime.com, 1 globalgovernancewatch.org, 1 @@ -62338,11 +62404,10 @@ globalhomeautomation.ca, 1 globalhomicideers.ga, 1 globalhorses.de, 1 -globalincomeexperts.com, 1 +globalhubb.ro, 1 globalind.com.au, 1 globalink.tk, 1 globalinvestorgate.com, 1 -globalios.net, 1 globalipaction.ch, 1 globalisierung-fakten.de, 1 globalitac.com, 1 @@ -62454,6 +62519,7 @@ gloning.name, 1 glont.net, 1 gloomy.tk, 1 +gloow.nl, 1 glorenza.org, 1 gloria-mundi.eu, 1 gloria.fi, 1 @@ -62529,7 +62595,6 @@ gm207.com, 0 gm5.com.br, 1 gmaetk.com, 1 -gmageorgia.com, 1 gmail, 1 gmail.com, 0 gman.bot, 1 @@ -62557,7 +62622,6 @@ gmmb.com, 1 gmo-cybersecurity.com, 1 gmoadvocacia.com.br, 1 -gmod.de, 1 gmopconsortium.org, 1 gmpark.dk, 1 gmpartsdb.com, 1 @@ -62609,7 +62673,6 @@ gnosco.net, 1 gnosis.bg, 1 gnrinfo.tk, 1 -gns.gov.pt, 1 gns3.com, 1 gnu.style, 1 gnuand.me, 1 @@ -62654,6 +62717,7 @@ go2sh.de, 1 go2ubl.nl, 1 go4games.ro, 0 +go4it.fr, 1 go4it.ro, 0 go4rest.de, 1 go5.io, 1 @@ -62678,12 +62742,14 @@ goathub.io, 0 goatlord.tk, 1 goatstore.ca, 1 +goaudits.com, 1 gobarrelroll.com, 1 gobebra.com, 1 gobeline.com, 1 gobetweenfilms.com, 1 gobi.tk, 1 gobiernousa.gov, 1 +goblacksheep.io, 1 goblintears.com, 1 gobookmart.com, 1 gobouncy.co.uk, 1 @@ -62712,7 +62778,6 @@ godalivetpalandet.tk, 1 godall.tk, 1 godan.tech, 1 -godanriver.com, 1 godark.uk, 1 godating.tk, 1 godaxen.tv, 1 @@ -62784,7 +62849,6 @@ goetheschule-giessen.de, 1 goetic.space, 1 goettinger-katzenschutz.de, 1 -goetzinger-web.de, 1 goexam.net, 0 gofabcnc.com, 1 gofelix.de, 1 @@ -62831,11 +62895,12 @@ going-dutch.tk, 1 going.com, 1 goingawesomeplaces.com, 1 +goingbeyondsunday.com, 1 +goingblack.org, 1 goinggreenshow.gq, 1 goingnz.com, 1 goingreen.com.au, 1 goirlanda.es, 1 -goiymua.com, 1 goizalde.tk, 1 gojpt.com, 1 gokaygurcan.com, 1 @@ -62868,6 +62933,7 @@ goldcoast-plumbing.com.au, 1 goldcoastasian.com, 1 goldcoastit.com.au, 1 +goldcoastpersonaltrainers.com, 1 goldcoastphotographycourses.com, 1 goldcreek.tk, 1 golddealer.com, 1 @@ -62889,6 +62955,7 @@ goldeneyesantafe.com, 1 goldenfashion.co.za, 1 goldenfawz.com, 1 +goldengatexpress.org, 1 goldenglow.fans, 1 goldenhillsoftware.com, 1 goldenhilltower.com, 1 @@ -62906,6 +62973,7 @@ goldenshiny.com, 1 goldenstatetrailers.com, 1 goldensunmfg.com, 1 +goldenswordllc.com, 1 goldentech.ca, 1 goldentechelectronics.net, 1 goldentip.cf, 1 @@ -62997,7 +63065,7 @@ golikes.ml, 1 golink.co, 0 golkowreporters.com, 1 -golnet.hu, 1 +golnet.hu, 0 goloa.fr, 1 goloaninsurance.tk, 1 goloborodko.net, 1 @@ -63009,7 +63077,6 @@ golser.info, 1 gomadisonfence.com, 1 gomagic.org, 1 -gomarket33.com, 1 gomasa.net, 1 gomasy.jp, 1 gomasy.net, 1 @@ -63027,6 +63094,7 @@ gomicrophone.ml, 1 gomine.tk, 1 gomiso.com, 1 +gommers.org, 1 gommista.roma.it, 1 gomods.link, 1 gomoon.com, 1 @@ -63082,6 +63150,7 @@ gooddatingsites.ml, 1 gooddayatwork.co.uk, 1 gooddomain.co, 1 +gooddomain.com, 1 gooddomainna.me, 1 goodearth.com.tw, 1 goodees.com, 1 @@ -63139,6 +63208,7 @@ goodwillnfp.org, 1 goodwillnne.org, 1 goodwin43.ru, 0 +goodybalt.ru, 1 goodydoggy.com, 1 goodyearsotn.co.uk, 1 goofy.gr, 1 @@ -63167,7 +63237,6 @@ goon.university, 1 goondocks.io, 1 goonersworld.co.uk, 1 -goontu.be, 1 gooodnews.ga, 1 goooo.info, 1 goorm.io, 1 @@ -63311,7 +63380,7 @@ gosq.co, 1 gosq.com, 1 gossiptimes.tk, 1 -gossweiler.com, 1 +gossweiler.com, 0 gost-energo.ru, 1 gostargazer.com, 1 gostargazing.co.uk, 1 @@ -63441,12 +63510,13 @@ govotetn.gov, 1 govquarter.gq, 1 govsales.gov, 1 +govsentinel.com.br, 1 govtjobs.blog, 1 +govtjobweb.com, 1 govtrack.us, 1 govvacationrewards.com, 1 govype.com, 1 gow220.ru, 1 -gowager.co.uk, 1 gowalk.de, 1 gowancommunications.com, 1 gowanusbooks.com, 1 @@ -63523,7 +63593,6 @@ gptunnel.ru, 1 gpu.nu, 1 gpupods.cloud, 1 -gpuserver.kz, 1 gpwatimes.org, 1 gpwih.com, 1 gpwmd-portal.org, 1 @@ -63576,7 +63645,6 @@ gradinacufluturi.ro, 1 gradinarit.com, 1 gradingcontractornc.com, 1 -gradinitasamariteanulcluj.ro, 1 gradintel.com, 1 gradle.com, 1 gradle.org, 1 @@ -63702,6 +63770,7 @@ grandmasfridge.org, 0 grandmasternetwork.com, 1 grandmusiccentral.com.au, 1 +grandoaksevent.com, 1 grandpachy.tk, 1 grandpad.biz, 1 grandpad.net, 1 @@ -63766,6 +63835,7 @@ granulate.io, 1 grape33.com, 1 grapee.jp, 1 +grapeintentions.com, 1 grapevine.is, 1 graph.org, 1 graphe.gq, 1 @@ -63867,7 +63937,6 @@ gravityresearchgroup.gq, 1 gravityresearchgroup.tk, 1 gravytrain.tk, 1 -grawe-blog.at, 1 gray.network, 1 grayarrow.com, 1 graycat.ml, 1 @@ -63993,6 +64062,7 @@ greenangels.com.ua, 1 greenartistsswiss.ch, 0 greenassembly.fr, 1 +greenband.com.au, 1 greenbat57.fr, 1 greenbaytechsupport.com, 1 greenbrickgroup.com, 1 @@ -64068,7 +64138,6 @@ greenopedia.com, 1 greenopeningsers.ga, 1 greenopeningsest.ga, 1 -greenpal.jp, 1 greenpanda.de, 1 greenparkgroup.ca, 1 greenpartyofnewmilford.org, 1 @@ -64116,6 +64185,7 @@ greenwhitearmy.tk, 1 greenwichbiosciences-influence-beta.azurewebsites.net, 1 greenwichentertainment.com, 1 +greenwichfirst.com, 1 greenwichvillage.nyc, 0 greenwiki.ca, 1 greenwithdecor.com, 1 @@ -64123,6 +64193,7 @@ greenwoodne.gov, 1 greenwoodny.gov, 1 greenwoodtwpcrawfordpa.gov, 1 +greenypitch.com, 1 greenytimes.com, 1 greenyway.com, 1 greenzved.tk, 1 @@ -64181,6 +64252,7 @@ grenti.eu, 1 grenzach.com, 1 grepable.com, 1 +grepular.com, 1 gresak.io, 0 greshamhistorical.org, 1 gresrewop.ca, 1 @@ -64208,6 +64280,7 @@ greymuzzlemanor.org, 1 greypanel.com, 1 greyrectangle.com, 1 +greyrockgroup.co.uk, 1 greyskymedia.com, 1 greysolonballroom.com, 1 greystonesmovement.com, 1 @@ -64330,7 +64403,6 @@ gromasikov.tk, 1 gromman.com, 1 gromovphotography.tk, 1 -grondius.com, 1 grondwerkencooreman.be, 1 groningerkustvaart.tk, 1 gronngronn.no, 1 @@ -64376,6 +64448,7 @@ groundball.tk, 1 groundcaresolutionsllc.com, 1 groundfm.tk, 1 +groundjerusalem.com, 1 groundmc.net, 1 groundsdirect.com, 1 groundspan.com, 1 @@ -64445,6 +64518,7 @@ growery.org, 1 growglam.com, 1 growidentity.com, 1 +growin.com, 1 growingallthings.co.uk, 1 growinghumankindness.com, 1 growinguncomfortable.com, 1 @@ -64463,7 +64537,7 @@ growthtoysers.ga, 1 growthtoysest.ga, 1 growthwheel.net, 1 -growy.ch, 0 +growy.ch, 1 grozdanov.tk, 1 grozny-news.net, 1 grozter.se, 1 @@ -64511,7 +64585,6 @@ grundlage.fi, 1 grundlagen-computer.de, 1 grundrauschen-publishing.de, 1 -grundrauschen.pub, 1 grundschulratgeber.de, 1 grundskoleboken.ga, 1 grundskoleboken.gq, 1 @@ -64525,7 +64598,6 @@ grupatvogzivota.tk, 1 grupcarles.com, 1 grupdedansa.tk, 1 -grupdigital.com, 1 gruphepsi.tk, 1 grupo-famia.tk, 1 grupo-rbd.com, 1 @@ -64545,13 +64617,13 @@ grupoentregas.com, 1 grupoeurodesign.com, 1 grupofarmavip.pt, 1 -grupoharbour.com, 1 grupoice.com, 1 grupoicp.pt, 1 grupoimb.pt, 1 grupoiwana.tk, 1 grupokls.com, 1 grupolegalsgf.com, 1 +grupolmsvisao.com.br, 1 grupomacroex.com, 1 grupomanquecura.tk, 1 grupomazzucco.com, 1 @@ -64631,6 +64703,7 @@ gslb.co, 1 gsm-info.tk, 1 gsmbrick.com, 1 +gsmface.hu, 1 gsmkungen.com, 1 gsmmedia.tk, 1 gsmsale.nl, 1 @@ -64644,7 +64717,6 @@ gsplast.com, 1 gsrank.org, 1 gsrc.io, 1 -gss.ind.br, 1 gstackrankers.com, 1 gstcalc.nz, 1 gstehlik.com, 1 @@ -64680,6 +64752,7 @@ gtdnordic.fi, 1 gtecnophone.com, 1 gtestepourvous.fr, 1 +gtettemer.com, 1 gti.cx, 1 gtk-tim.ru, 1 gtlaun.ch, 0 @@ -64687,6 +64760,7 @@ gtm-server.com, 1 gtm.com.pl, 1 gtmetrix.com, 1 +gtmops.fr, 1 gtmotive.com, 1 gtn-pravda.ru, 1 gtonline.ml, 1 @@ -64696,14 +64770,24 @@ gtrtc.com, 1 gtrwebdesign.nl, 0 gts-tradgard.se, 1 -gts-varmepumpar.se, 1 +gts-varmepumpar.se, 0 gts.org, 1 gtsb.io, 1 gtslotcars.com, 1 gtsoftware.gr, 1 gtupgrade.eu, 1 +gtw0.africa, 1 +gtw0.asia, 1 +gtw0.cl, 1 +gtw0.com, 1 +gtw0.cz, 1 +gtw0.eu, 1 +gtw0.ke, 1 gtw0.mx, 1 +gtw0.net, 1 +gtw0.nz, 1 gtw0.org, 1 +gtw0.tw, 1 gtwaction.org, 1 gtxmail.de, 1 gtxthere.tk, 1 @@ -64748,8 +64832,8 @@ guardiancodewebservices.com, 1 guardiandigital.com, 1 guardianerm.net, 1 +guardianexercise.com.au, 1 guardiansiot.ddns.net, 1 -guardiantransmissions.com, 1 guardiapretoriana.tk, 1 guarever.tk, 1 guarrato.tk, 1 @@ -64887,6 +64971,7 @@ guido-leenders.eu, 1 guidoclub.fr, 1 guidopedia.ga, 1 +guignard.me, 1 guild.xyz, 1 guilded.gg, 1 guildgearscore.cf, 1 @@ -64915,6 +65000,7 @@ guinder.com.br, 1 guineapig101.com, 1 guineapigmustach.es, 1 +guineecheck.org, 1 guinel-johnson.fr, 0 guinguetteclovis.com, 1 guise.tk, 1 @@ -65006,7 +65092,7 @@ gupy.io, 1 gura.moe, 1 guralptechnic.com, 1 -gurbetilan.com, 0 +gurbetilan.com, 1 guri.ml, 1 gurkantuna.com, 1 gurl.eu.org, 1 @@ -65020,6 +65106,7 @@ gurugamer.com, 1 gurumobile.tk, 1 gurunanakdarvar.tk, 1 +gurunpa.com, 1 gururi.com, 1 gurusewa.net, 1 guruworld.tk, 1 @@ -65162,6 +65249,7 @@ gwnmarketing.com, 1 gworkspace.lt, 1 gworld.cf, 1 +gwq5210.com, 1 gwsquickwash.com, 1 gwy15.com, 1 gxbank.my, 1 @@ -65172,6 +65260,7 @@ gxmyqy.net, 1 gyaanprasaar.tk, 1 gyannews.ga, 1 +gyapak.in, 1 gyas.nl, 1 gybagardlin.tk, 1 gycis.me, 1 @@ -65188,6 +65277,7 @@ gying.si, 1 gyjbyev.ga, 1 gyllander.tk, 1 +gyllenbuste.online, 1 gylly.net, 1 gym.com, 1 gymagine.ch, 1 @@ -65259,6 +65349,7 @@ h-node.org, 1 h-server.myfirewall.org, 1 h-var.com, 1 +h.box, 1 h.fo, 1 h.hk.cn, 1 h.lu, 1 @@ -65275,7 +65366,6 @@ h11.moe, 1 h18.nl, 1 h1ctf.com, 1 -h2.ee, 1 h2020faros.eu, 1 h24.org, 1 h2b.cz, 1 @@ -65341,7 +65431,6 @@ habboinside.tk, 1 habbolibres.tk, 1 habboon.pw, 1 -habbstars.org, 1 habbzohotel.tk, 1 habedieeh.re, 1 habeeba.tk, 1 @@ -65372,6 +65461,7 @@ habitville.com, 1 hable.kr, 1 hablemosdenutricion.com, 1 +habpar.com.br, 1 habr.ee, 1 habra-adm.ru, 1 habrastorage.org, 1 @@ -65422,6 +65512,7 @@ hackerfa.tk, 1 hackerflare.com, 1 hackerforums.tk, 1 +hackerhermanos.com, 1 hackerhotel.nl, 1 hackeriet.se, 1 hackerinfo.ml, 1 @@ -65484,6 +65575,7 @@ hacquemand.be, 1 hacquemand.co, 1 hacquemand.com, 1 +hacquemand.fr, 1 hacsapp.co.uk, 1 hadaly.fr, 1 hadan-it.com, 0 @@ -65581,8 +65673,10 @@ hair-dressing.tk, 1 hair-extension.tk, 1 hair-extensions.tk, 1 +hair-rituals.de, 1 hairathome.cz, 1 hairbrushes.tk, 1 +hairbymeagan.com, 1 haircareblog.tk, 1 haircareology.com, 1 haircode.gr, 1 @@ -65669,7 +65763,6 @@ halatik.com.ua, 1 halbbit.eu, 1 halberstadt.tk, 1 -halbich.design, 1 halco.org, 1 halcraft.tk, 1 halcyonsbastion.com, 1 @@ -65725,6 +65818,7 @@ hallofoddities.tk, 1 hallofworlds.online, 1 halloway.tk, 1 +halloween.tf, 1 halloweenmusic.org, 1 hallsonsservices.com, 1 hallspumpandwellservice.net, 0 @@ -65769,7 +65863,6 @@ hambot.fr, 1 hamburg1.de, 1 hamburgcode.com, 1 -hamburger-reinigung.de, 1 hamburger-umzuege.de, 1 hamburger-wirtschaft.de, 1 hamburgerland.tk, 1 @@ -65813,7 +65906,6 @@ hammerhead.tk, 1 hammernews.tk, 1 hammerofdamnation.tk, 1 -hammerofthor-india.com, 1 hammerstorm.ga, 1 hammertonbarbados.com, 1 hammondwi.gov, 1 @@ -65852,6 +65944,7 @@ hanakohealth.de, 1 hanakovydny.cz, 1 hanan.cz, 1 +hananiastores.com, 1 hanaringo.com, 1 hanatan.net, 1 hanazono.tokyo, 1 @@ -65881,14 +65974,12 @@ handheldsound.com, 1 handhockeyers.ga, 1 handhockeyest.ga, 1 -handicap-job.com, 1 handicappingsportsers.ga, 1 handicappingsportsest.ga, 1 handicapzero.org, 1 handicraftsman.tk, 1 handigehannie.nl, 1 handinhandhrd.eu, 1 -handler.lt, 1 handler.lv, 1 handlerparts.com, 1 handlerparts.de, 1 @@ -65909,6 +66000,7 @@ handphones.tk, 1 handpresso.com, 1 handsender-express.com, 1 +handshake.co.za, 1 handsome-samurai.jp, 1 handsomeabel.tk, 1 handsonscience.com.au, 1 @@ -66022,11 +66114,11 @@ hanwhalife.com, 1 hanxv.pw, 1 hanys.xyz, 1 +hanyuguide.com, 1 hanzcollection.online, 1 hanzi-trainer.org, 1 hanzoslot.com, 1 hao-zhang.com, 1 -haokiettoanthu.org, 1 haorenka.co, 1 haos.hopto.org, 1 haoskin.com.tw, 1 @@ -66036,6 +66128,7 @@ haoz.tk, 1 haozhexie.com, 1 haozi.me, 1 +hapekkarma.eu, 1 hapfox.de, 1 hapi.agency, 1 hapijs.cn, 1 @@ -66089,7 +66182,6 @@ happyfoolss.com, 1 happyfun.tk, 1 happyfuture.tk, 1 -happygadget.me, 1 happygardencenter.com.br, 1 happygeek.com, 1 happygiftapp.com, 1 @@ -66119,7 +66211,6 @@ happyteamlabs.com, 1 happytime.gq, 1 happytours.cf, 1 -happytoys.com.br, 1 happytugs.com, 1 happyukgo.com, 1 happywater.my, 1 @@ -66142,7 +66233,6 @@ harabar.ml, 1 harabe.ga, 1 harahanla.gov, 1 -harajiplastic.ir, 1 harakeke.net, 1 harald-pfeiffer.de, 1 harambo.cf, 1 @@ -66163,6 +66253,7 @@ harborhillsdaycamp.com, 1 harborspringslistings.com, 1 harboursport.co.nz, 1 +harboursprayfoam.com, 1 hard-drive-recovery-blog.tk, 1 hard.email, 1 hardatack.tk, 1 @@ -66255,8 +66346,8 @@ harmim.cz, 0 harmlesspeopleers.ga, 1 harmlesspeopleest.ga, 1 +harmny.ai, 1 harmonicasireland.com, 0 -harmonizely.com, 0 harmony-labradoodles.nl, 1 harmony-trader.com, 1 harmonyeg.net, 1 @@ -66436,12 +66527,12 @@ hasjob.co, 1 haskellar.gov, 1 haskellcountytx.gov, 1 +haslin.com.au, 1 hasmoralsers.ga, 1 hasmoralsest.ga, 1 hass-server.pp.ua, 1 hassan-kuordish.tk, 1 hassana.com.sa, 1 -hassanhardware.com, 1 hassans.tk, 1 hassclan.tk, 1 hasselbach-dellwig.de, 1 @@ -66451,6 +66542,8 @@ hasstopped.com, 1 hastadoktor.com, 1 hastati.tk, 1 +haste.it, 1 +hastings.com.br, 1 hastingsapplianceservice.com.au, 1 hastingsdirect.com, 1 hastingsmi.gov, 1 @@ -66538,6 +66631,7 @@ hautzentrum-innenstadt.de, 1 havaci.tk, 1 havadurumu15gunluk.org, 1 +havahaberleri.com, 1 havana-club.com, 1 havanaheritage.org, 1 havarijna-sluzba-bratislava.sk, 1 @@ -66638,7 +66732,6 @@ hazarainternational.com, 1 hazarapeople.com, 1 hazaristan.asia, 1 -hazbin.org, 1 haze-productions.com, 1 hazelhof.nl, 1 hazelkid.tk, 1 @@ -66657,7 +66750,6 @@ hazza.net, 1 hb.by, 1 hb5197.com, 0 -hb8522.com, 1 hb9397.com, 1 hb9ikn.ch, 1 hba1crechner.de, 1 @@ -66685,6 +66777,7 @@ hbsslaw.co.uk, 1 hbsslaw.com, 1 hbsvzos.nl, 1 +hbtinsaat.com, 1 hbudd.com, 0 hbussmann.com, 1 hbweb.io, 1 @@ -66765,7 +66858,7 @@ hdpornpicture.com, 1 hdrams.com, 1 hdrcomercio.com.br, 1 -hdrezka.live, 1 +hdrezka.live, 0 hdrezka2018.tk, 1 hdrtranscon.com, 0 hds-lan.de, 1 @@ -66837,6 +66930,7 @@ healmaster.net, 1 healmyhearttoday.ga, 1 healmynation.com, 1 +healtalyzer.com, 1 healtbeautyturkey.tk, 1 health-and-beauty-news.net, 1 health-ashlandcounty-oh.gov, 1 @@ -66850,6 +66944,7 @@ health-solutions.de, 1 health-toolbox.com, 1 health-tourism.com, 1 +health-union.com, 1 health.gov, 1 health.gov.ly, 1 health.graphics, 1 @@ -66859,7 +66954,6 @@ health4food.com, 1 health4life.tk, 1 healthabundant.ga, 1 -healthactive.co, 0 healthadaptive.ga, 1 healthalbuquerque.tk, 1 healthalternativemedicine.tk, 1 @@ -66878,6 +66972,7 @@ healthawareness.cf, 1 healthbanfield.tk, 1 healthbank.io, 1 +healthbeautyaftercare.nl, 1 healthbeltsville.tk, 1 healthbinghamton.tk, 1 healthbit.com.br, 1 @@ -66946,6 +67041,7 @@ healthdaily.ga, 1 healthdallas.tk, 1 healthdata.gov, 1 +healthdatalab.com, 1 healthdatavalley.nl, 1 healthdelta.ga, 1 healthdenver.tk, 1 @@ -66963,6 +67059,7 @@ healthequity.com, 1 healtherm.co.jp, 1 healthessence.ga, 1 +healthexport.info, 1 healthfalcon.ga, 1 healthfame.ga, 1 healthfiesta.ga, 1 @@ -67154,7 +67251,6 @@ healthyankee.ga, 1 healthyarizona.tk, 1 healthyarkansas.tk, 1 -healthybeauty365bn.com, 1 healthyburn.tk, 1 healthychoices.tk, 1 healthyclinic.tk, 1 @@ -67445,7 +67541,6 @@ heitepriem.de, 1 heitepriem.info, 1 heiwa-valve.co.jp, 1 -heizoil-vergleich.de, 1 hejazultra.org, 1 hejl.xyz, 1 hejlhome.cz, 1 @@ -67654,7 +67749,6 @@ help911.com, 1 helpadmin.net, 0 helpamericavote.gov, 1 -helpatmyhome.com, 1 helpc.eu, 1 helpcalculator.tk, 1 helpchange.ru, 1 @@ -67671,7 +67765,6 @@ helplisted.com, 1 helpmainstreet.com, 1 helpmij.cf, 1 -helpnet.ro, 1 helpout.us, 1 helpowl.com, 1 helppc.com.ua, 1 @@ -67762,6 +67855,7 @@ hennikernh.gov, 1 henningkerstan.de, 1 henningkerstan.org, 1 +henningsvaerfyr-privatmegleren.no, 1 hennymerkel.com, 1 henradplumbing.co.uk, 1 henri-feuillade.tk, 1 @@ -67841,11 +67935,11 @@ her123.win, 1 herald-review.com, 1 herald.ga, 1 +heraldcourier.com, 1 heraldik-wiki.de, 1 heraldmakassar.com, 1 heratnews.tk, 1 herba-belgie.be, 1 -herbacom.ro, 1 herbalhouse.tk, 1 herbalife.ru, 1 herbalifereport.tk, 1 @@ -67867,7 +67961,6 @@ herbivorization.com, 1 herblaysurseine.fr, 1 herbnal.com, 1 -herboristerie-dufayel.fr, 1 herbosia.fr, 1 herbreathonglass.tk, 1 herbsociety.org, 1 @@ -67889,6 +67982,7 @@ herenstraatvoorburg.tk, 1 herenvanholland.nl, 1 hereplus.me, 0 +heresthespace.com, 1 heretic-guild.com, 1 hereticle.com, 1 hereticmaniacs.tk, 1 @@ -67913,7 +68007,7 @@ herlimit.com, 1 hermaj.com, 1 hermanbrouwer.nl, 1 -hermandevries.com, 1 +hermandevries.com, 0 hermann-hesse-kolleg.de, 1 hermann-wagener.de, 1 hermanncomm.com, 1 @@ -67925,7 +68019,6 @@ hermesawards.com, 1 hermesoft.at, 1 hermessenger.fr, 1 -hermetas.org, 1 hermetien.tk, 1 hermietkreeft.site, 0 herminghaus24.de, 1 @@ -67961,6 +68054,7 @@ heronhallacademy.org.uk, 1 heroofkings.com, 1 heroplusgroup.com, 0 +heroxin.com, 1 herpderpderpderp.com, 1 herpes-no.com, 1 herq.top, 0 @@ -67976,7 +68070,6 @@ herrfirm.com, 1 herriman.gov, 1 herriman.net, 1 -herringadvancemachine.com, 1 herringsresidence.be, 1 herritage.ga, 1 herrkal.eu, 1 @@ -68004,7 +68097,6 @@ herzzuherz.de, 1 hes.com.cy, 1 hesabraslaw.com, 1 -hesabtube.com, 1 hesama.tk, 1 hesaplama.net, 1 hesapozeti.com.tr, 1 @@ -68042,6 +68134,7 @@ hetdebat.tk, 1 hetene.nl, 1 hetfundament.team, 1 +heth.me, 1 hethely.ch, 1 hetiservices.com, 1 hetjop.nl, 1 @@ -68076,6 +68169,7 @@ hewlettharbor.gov, 1 hex.nl, 1 hex.tech, 1 +hexa-ra.com, 1 hexagon-e.com, 1 hexagonengg.com, 1 hexalinq.com, 1 @@ -68128,6 +68222,7 @@ heydenbluth.de, 1 heydorff.duckdns.org, 1 heydudd.com, 1 +heyete.com, 1 heyfiesta.com, 1 heyfranky.com, 1 heyghost.io, 1 @@ -68136,7 +68231,6 @@ heyjoecoffee.com, 1 heyjoflyer.win, 1 heylogin.com, 1 -heynowbots.com, 1 heyomg.com, 1 heyplay.eu.org, 1 heysora.net, 1 @@ -68153,6 +68247,7 @@ hf51-domeinen.nl, 1 hf51.nl, 1 hfa3.org, 1 +hfam.chat, 1 hfh-gmbh.de, 1 hfholidays.co.uk, 1 hfikq8.cf, 1 @@ -68173,11 +68268,12 @@ hgcityca.gov, 1 hgfa.fi, 1 hghsells.com, 1 -hgmaranatha.nl, 1 +hgmaranatha.nl, 0 hgnet.com.br, 1 hgpowerglue.nl, 1 hgseo.me, 1 hgseo.net, 1 +hgsss.org, 1 hgtwa.com.au, 1 hgvnet.de, 1 hgwld.com, 1 @@ -68191,6 +68287,7 @@ hh5197.co, 1 hh6729.co, 1 hh6957.co, 1 +hh90a2962zk.sn.mynetname.net, 1 hh9297.co, 1 hh9397.com, 1 hh9728.co, 1 @@ -68228,10 +68325,8 @@ hibin.tk, 1 hibiny.ru, 1 hibiscuscoastfinancialservices.com.au, 1 -hibiscuscommunications.com, 1 hibiscusprintshop.com, 1 hiboomapp.com, 1 -hibrid-turf.com, 1 hiccupsandjuice.co.uk, 1 hicklinghacks.co.uk, 1 hickmancountytn.gov, 1 @@ -68243,6 +68338,7 @@ hicoria.com, 1 hicts.nl, 1 hiczp.com, 1 +hidalgodigital.com, 1 hidashin.co.jp, 1 hidbo.de, 1 hidden-audio.de, 1 @@ -68251,9 +68347,7 @@ hiddendragon.ml, 1 hiddenempire.tk, 1 hiddenhand.finance, 1 -hiddenhillselectric.com, 1 hiddenhillsexteriorlighting.com, 1 -hiddenhillslighting.com, 1 hiddenimage.ml, 1 hiddenmalta.net, 1 hiddenpalms.tk, 1 @@ -68377,15 +68471,14 @@ hightechtexan.com, 1 highthcahempflower.com, 1 hightop.com, 0 -hightwist.show, 1 highvibes.hu, 1 highway11north.tk, 1 +highway2as.com, 1 highway54.tk, 1 highway71autoparts.com, 1 highwaytohoell.de, 1 highwayzen.org, 1 highworldnet.ga, 1 -higilopocht.li, 1 higsegeirl.com, 1 higueras.tk, 1 hiig.edu.ee, 1 @@ -68393,6 +68486,7 @@ hiiumeretuulepark.ee, 1 hiiw.cloud, 1 hiiw.de, 1 +hijyenbelgesi.tr, 1 hik-cloud.com, 1 hikagestudios.com, 1 hikarilan.life, 1 @@ -68470,7 +68564,6 @@ himcy.ga, 1 himei.city, 1 himeji-kanbee.jp, 1 -himens.com, 0 himiku.com, 1 himj.de, 1 himnosycanticos.org, 1 @@ -68495,7 +68588,6 @@ hinesitecoding.com, 1 hingle.me, 1 hinhanhykhoa.com, 1 -hinit.no, 1 hinkel.tk, 1 hinketsujyoshi-no-torisetsu.com, 1 hinotify.io, 1 @@ -68532,6 +68624,7 @@ hippocamp.io, 1 hippogriffhaven.com, 1 hippogriffhaven.net, 1 +hippohealthcare.in, 1 hippolini-herold.de, 1 hiprax.com, 1 hiprosun.com, 1 @@ -68543,20 +68636,19 @@ hiq.se, 1 hiq.sh, 1 hiqonline.co.uk, 0 -hirake55.com, 1 +hiram.tr, 1 hiramoto-ph.com, 1 hiramvlgohio.gov, 1 hirano-shikaclinic.com, 1 +hiratadai-piano.com, 1 hireabouncycastle.net, 1 hirechrisfinazzo.com, 1 hirecities.cf, 1 hirecities.ml, 1 hirecitiesers.ga, 1 hirecitiesest.ga, 1 -hirecto.io, 1 hireinsight.io, 1 hirel.gq, 1 -hirerecruiters.io, 1 hireshield.com, 1 hirevets.gov, 1 hirevo.eu, 1 @@ -68576,7 +68668,6 @@ hirorock.tk, 1 hirosehp.jp, 1 hiroshimacalling.org, 1 -hirotaka.org, 1 hirsch-lawyer.tk, 1 hirschbergertal.de, 1 hirtz.pm, 1 @@ -68598,6 +68689,7 @@ hispatrofeo.com, 1 hisregistries.net, 1 hisregistries.org, 1 +hiss.com.sg, 1 hisscentralen.se, 1 hisscraft.se, 1 hissgruppen.com, 1 @@ -68645,6 +68737,7 @@ hitecnologia.com.br, 1 hitekcomputing.net, 1 hitekmechanical.com, 1 +hitekstore.com, 1 hitel.tk, 1 hiteshchandwani.com, 1 hitflow.fr, 1 @@ -68857,7 +68950,6 @@ hny.co, 1 hnyp.hu, 1 ho10.pl, 1 -hoaas.no, 1 hoahop.tk, 1 hoanghaiauto.vn, 1 hoangvangioi.com, 1 @@ -68888,6 +68980,7 @@ hobokenrecords.tk, 1 hobonline.tk, 1 hobroefterskole.dk, 1 +hobsonplumbing.com, 1 hoccovua.vn, 1 hochatown.gov, 1 hochhaus.us, 1 @@ -68902,6 +68995,7 @@ hochzeit-cm.at, 1 hochzeit-dana-laurens.de, 1 hochzeit-saufzeichnungen.tk, 1 +hochzeitsfotograf.photography, 1 hochzeitsplaner-rodgau.de, 1 hochzeitsregion.at, 1 hochzeitstypen.de, 1 @@ -68944,6 +69038,7 @@ hofapp.de, 1 hofbraeu-muenchen.de, 1 hoferdach.de, 1 +hoffland.org, 1 hoffmanig.com, 1 hoffmannresearch.ca, 1 hoffmanns-ballonshop.de, 1 @@ -69070,7 +69165,6 @@ hollandrailservices.com, 1 hollandrailservices.com.au, 1 hollandsewolken.nl, 1 -hollandsweb.com, 1 hollandwi.gov, 1 hollermann.eu, 1 hollistermo.gov, 1 @@ -69089,6 +69183,7 @@ hollyspringsfarmnac.com, 1 hollyspringsms.gov, 1 hollywoodbios.com, 1 +hollywooddriver.com, 1 hollywoodhelicopters.com, 1 hollywoodstars.tk, 1 hollyworks.com, 1 @@ -69141,7 +69236,7 @@ holysmart.top, 1 holyspiritpalmyra.com, 1 holyspiritweb.org, 1 -holyszko.com, 1 +holyszko.com, 0 holytransaction.com, 1 holywhite.com, 1 holywr.it, 1 @@ -69201,7 +69296,6 @@ homebuilder.tk, 1 homebutton.tk, 1 homecache.ga, 1 -homecaprice.com, 1 homecareplus.cl, 1 homecaster.ga, 1 homecatch.ga, 1 @@ -69341,6 +69435,7 @@ homeeagle.ga, 1 homeelectricalupdates.com, 1 homeer.com, 1 +homeevcharger.ie, 1 homeexperience.tk, 1 homefacialpro.com, 0 homeflag.ga, 1 @@ -69377,7 +69472,6 @@ homeinvasion.tk, 1 homeinvention.tk, 1 homejapanese.ml, 1 -homekeep.com, 1 homekiss.ga, 1 homekitdaily.de, 1 homelab.farm, 1 @@ -69523,7 +69617,6 @@ homyak.gq, 1 homygo.eu, 1 homyremedies.com, 1 -honaragah.com, 1 honatec.tech, 1 honda2wheelerparts.com, 1 honda2wheelersindia.com, 1 @@ -69608,6 +69701,7 @@ hoogsreporting.com, 1 hoogstraatseschaakclub.tk, 1 hoogveen.tk, 1 +hook-esport.fr, 1 hookah-crm.ru, 1 hookah-uae.com, 1 hookahfoil.ru, 1 @@ -69738,6 +69832,7 @@ horoscopo.ml, 1 horotoday.tk, 1 horovod.im, 1 +horozo.com, 1 horrell.ca, 1 horrendous-servers.com, 1 horror-forum.de, 1 @@ -69856,7 +69951,7 @@ hostesstrainingers.ga, 1 hostesstrainingest.ga, 1 hostfact.nl, 1 -hostfi.com.br, 1 +hostfi.com.br, 0 hostfission.com, 1 hostfree12.tk, 1 hostgreet.com, 1 @@ -69882,6 +69977,7 @@ hostinghaus.tk, 1 hostinghelp.guru, 1 hostinginnederland.nl, 1 +hostingopenclaw.com, 1 hostingorservers.com, 1 hostingphp.ch, 1 hostingsolutions.cz, 1 @@ -69978,6 +70074,7 @@ hotel3232nyc.com, 1 hotel43.com, 1 hotelandplace.com, 1 +hotelbarbutter.com, 1 hotelbiz.cf, 1 hotelbiz.ga, 1 hotelbiz.gq, 1 @@ -70159,7 +70256,6 @@ houselocal.co.uk, 1 housemart.company, 1 housemouse.tk, 1 -houseofaceonline.com, 1 houseofbrighde.co.uk, 1 houseoffilters.com, 1 houseofhipsters.com, 1 @@ -70278,6 +70374,7 @@ howto-connect.com, 1 howto-outlook.com, 0 howtobehealthy.tk, 1 +howtodesignwebsite.com, 1 howtogeek.com, 1 howtogeekpro.com, 1 howtogosolar.org, 0 @@ -70323,7 +70420,6 @@ hp-67.com, 1 hp-lexicon.org, 1 hp42.de, 1 -hpac-portal.com, 1 hpage.com, 1 hpbn.co, 1 hpc.mil, 1 @@ -70386,6 +70482,7 @@ hrcrew.com.au, 1 hrd-sec.com, 1 hrd.pl, 1 +hrdinaadcera.cz, 1 hrdns.de, 1 hreflang.info, 1 hrej.eu, 1 @@ -70399,7 +70496,6 @@ hrjob.ml, 1 hrjob.tk, 1 hrk.aero, 1 -hrkfamilylaw.com, 1 hrknuddel.de, 1 hrlab.de, 1 hrlive.ga, 1 @@ -70434,7 +70530,7 @@ hrwsba.gov, 1 hrxkauppa.fi, 1 hry.cz, 1 -hrzblt.eu, 0 +hrzblt.eu, 1 hs-flensburg.de, 1 hs-group.net, 1 hs-hire.co.uk, 1 @@ -70476,6 +70572,7 @@ hsselite.com, 1 hst.edu, 1 hst.tc, 1 +hstcompass.com, 1 hstoyanov.com, 1 hsts.eu, 1 hsts.ovh, 1 @@ -70524,6 +70621,7 @@ htljobs.at, 1 htlle.at, 1 htm-partners.com, 1 +htmag.co.il, 1 htmainternational.com, 1 htmanager.fr, 1 htmarketingsolutions.com.au, 1 @@ -70568,6 +70666,7 @@ httpmaster.net, 1 https.com.tw, 1 https.dk, 1 +https.gs, 1 https.jetzt, 1 httpsalarm.com, 1 httpsarnemergan.ml, 1 @@ -70767,7 +70866,6 @@ huitaodang.com, 0 hukkatavara.com, 1 hukuhauchi.com, 1 -hukukiayna.com, 1 hulaginswoodworking.com, 1 hulet.tech, 1 hulii.com, 0 @@ -70801,6 +70899,7 @@ humanesdemadrid.tk, 1 humanewolf.com, 1 humanhairgo.tk, 1 +humanholic.hr, 1 humanidad.tk, 1 humaninterest.com, 1 humaniora.com, 1 @@ -70954,7 +71053,6 @@ huntvac.com, 1 huny.eu.org, 1 hunzai.tk, 1 -huoduan.com, 1 huohu-sports.com, 1 huohuo.cf, 1 huohuo.ml, 1 @@ -70967,6 +71065,8 @@ hurdafiyatlari.site, 1 hurdaphysio.fi, 1 hurinkazan2020.com, 1 +hurix.ai, 1 +hurix.com, 1 hurling.net, 1 huron.tk, 1 huronsd.gov, 1 @@ -70982,13 +71082,13 @@ hurstiharrell.tk, 1 hurstvilleentertainmentcentre.com, 1 hurstvilleentertainmentcentre.com.au, 1 -hurt-orange.pl, 1 hurtigrabat.dk, 1 hurtigtinternet.dk, 1 husakbau.at, 1 huseyinemre.tech, 1 huseyinpala.com, 1 hushfile.it, 1 +hushhush.ai, 1 hushlayer.com, 1 hushpuppiesobuv.ru, 1 husic.net, 0 @@ -70999,7 +71099,7 @@ huskygifts.com, 1 huskyinc.us, 0 huskysat.org, 1 -huskytaildigital.com, 1 +huskytaildigital.com, 0 husqvarnamoped.se, 1 hustlerstate.tk, 1 hustlersuniversityapp.com, 1 @@ -71063,7 +71163,6 @@ hwchronicle.com, 1 hwe.nz, 1 hwehealthiertogether.nhs.uk, 1 -hwholdsworth.com.au, 1 hwinfo.tk, 1 hwnd.io, 1 hwr-barsinghausen.de, 1 @@ -71142,9 +71241,11 @@ hydronium.tk, 1 hydronix-bg.com, 1 hydrooneombudsman.com, 1 +hydropoolandspa.com, 1 hydroposev.com, 1 hydrosaat.ch, 1 hydroscans.com, 1 +hydroscape-group.co.uk, 1 hydrosense.click, 1 hydrosila.com, 0 hydroturbine.info, 0 @@ -71152,6 +71253,7 @@ hydrozone.fr, 1 hyec.jp, 1 hyfood.it, 1 +hygeiadairy.com, 1 hygienet.be, 1 hygraph.com, 1 hyhealth.it, 1 @@ -71180,7 +71282,6 @@ hyperalgesia.com, 1 hyperautomotive.com.au, 1 hyperblast-universe.tk, 1 -hyperblocks.tech, 1 hyperbolecomics.com, 1 hyperbolic-mayonnaise-interceptor.ovh, 1 hypercritical.co, 1 @@ -71279,6 +71380,7 @@ hysh.org, 1 hystats.net, 1 hysupchile.cl, 1 +hytale.com, 1 hytaleid.com, 1 hytaletrack.com, 1 hytravel.it, 1 @@ -71303,7 +71405,6 @@ hyzy.fr, 1 hz601.org, 1 hzbk.org, 0 -hzmpower.com, 1 hzqdl.com, 1 hztgzz.com, 1 hzuuuz.top, 1 @@ -71380,17 +71481,16 @@ i9728.co, 1 i9s.in, 1 ia-tools.com, 1 -ia.net, 1 ia1000.com, 1 iaa.ee, 1 iaabc.org, 1 iaata.info, 1 iabot.tk, 1 -iac-indooraircare.com, 1 iacee.org, 1 iacono.com.br, 0 iactor.co.jp, 1 iactu.info, 1 +iacuwise.com, 1 iadore.tk, 1 iadschool.com, 1 iadttaveras.com, 1 @@ -71414,6 +71514,7 @@ iam.soy, 1 iamafricacampaign.com, 1 iamafricacampaign.org, 1 +iamalive.store, 1 iambhatti.tk, 1 iamcloud.de, 1 iamconnected.eu, 1 @@ -71472,6 +71573,7 @@ ias-gruppe.net, 1 ias.co.jp, 1 ias.ua, 1 +iasme.co.uk, 1 iassess.eu, 1 iaswc.org, 1 iat-sia.org, 1 @@ -71481,7 +71583,6 @@ iav.com, 1 iav.de, 1 iava.ind.br, 1 -iavalley.edu, 1 iawg.gov, 1 iawx.net, 1 iaxx.eu, 1 @@ -71541,6 +71642,7 @@ ibm.iobb.net, 1 ibm3.com, 1 ibmaspera.com, 1 +ibmc.com, 1 ibmix.de, 1 ibmreturns.gov.in, 1 ibmsonline.org, 1 @@ -71565,7 +71667,6 @@ ibug.io, 1 ibuildings.com, 1 ibuildings.nl, 1 -ibuildutd.com, 1 ibuki.run, 1 ibuluxe.com, 1 ibuprofens.gq, 1 @@ -71603,6 +71704,7 @@ iccloyalty.com, 1 iccorporateinteriors.com.au, 1 iccupplatoon.tk, 1 +iccus.net, 1 iccxx.cn, 0 icd-codes.org, 1 icd360s.de, 1 @@ -71618,7 +71720,6 @@ iceberg.ddns.me, 1 icebike.org, 1 icebook.co.uk, 1 -icebound.cc, 0 icebound.win, 1 iceboxstudio.tk, 1 icecars.net, 0 @@ -71658,7 +71759,6 @@ ich-hab-die-schnauze-voll-von-der-suche-nach-ner-kurzen-domain.de, 1 ich-tanke.de, 0 icharme.fr, 1 -ichasco.com, 1 ichbinein.org, 1 ichbinhuebi.de, 1 ichbinkeinfreier.com, 1 @@ -71673,6 +71773,7 @@ ichijoh.co.jp, 1 ichisound.ml, 1 ichitaka.tk, 1 +ichitaso.com, 1 ichizenn.com, 1 ichkannmitgestalten.de, 1 ichmt.org, 1 @@ -71753,6 +71854,7 @@ icsense.com, 1 icst.tk, 1 icsti.org, 1 +ict-community.nl, 1 ict-oldehove.nl, 1 ict-radar.com, 0 ict-radar.nl, 0 @@ -71842,7 +71944,6 @@ ideahubnepal.org, 1 ideaktiv.com, 1 ideal-social.com, 1 -ideal.ee, 1 ideal.shop, 1 idealabs.tk, 1 idealadvogadosbh.com.br, 1 @@ -71889,6 +71990,7 @@ idee-lq.de, 1 idee-lq.net, 1 ideefactory.de, 1 +ideesrecettes.net, 1 idehvector.com, 1 ideiasefinancas.com.br, 1 ideice.gob.do, 1 @@ -71952,13 +72054,12 @@ idlxb.com, 1 idmanagement.gov, 1 idmaster.ml, 1 +idmc-gcfsm.org, 0 idmmovers.com, 1 idmod.org, 1 idn.gov.pt, 0 idndomain.tk, 1 -idndx.com, 1 idnic.net, 1 -idnpacific.com, 1 ido.nl.eu.org, 1 idohost.tk, 1 idol-bikes.ru, 1 @@ -71974,7 +72075,6 @@ idraetsmusik.dk, 1 idratherbequilting.com, 1 idraulico-roma.it, 1 -idraulico-roma.org, 1 idraulico.roma.it, 1 idrissi.eu, 1 idrivegroup.ie, 1 @@ -71994,7 +72094,7 @@ idute.com, 0 idvchile.cl, 1 idvl.de, 1 -idw.pt, 1 +idw.pt, 0 idwebtools.tk, 1 idxforza.com, 1 idyeslogistics.com, 1 @@ -72038,7 +72138,6 @@ iexaminer.org, 1 if-news.ru, 1 if0.ru, 1 -ifacservice.be, 0 ifactfind.com.au, 1 ifactfind.io, 1 ifadian.club, 1 @@ -72080,6 +72179,7 @@ ifminvestors.com, 1 ifminvestors.com.au, 1 ifmsa-lahore.tk, 1 +ifncredite.ro, 1 ifnet.fr, 1 ifoa.it, 1 ifohancroft.com, 1 @@ -72155,6 +72255,7 @@ igloodigitalworkplace.ca, 1 igloodigitalworkplace.com, 1 igloodigitalworkplaces.ca, 1 +igloolab.co, 1 igloopartnerportal.com, 1 igloopreview.ca, 1 iglosujemy.pl, 1 @@ -72204,7 +72305,6 @@ igramming.com, 1 igranit.md, 1 igraonicalara.tk, 1 -igrarium.com.ua, 1 igreja.digital, 1 igrek.co.jp, 1 igrinka.ua, 1 @@ -72229,9 +72329,9 @@ iha6.com, 1 ihacares.com, 1 ihakkitekin.com, 1 -ihatebackground.com, 0 ihatethissh.it, 1 ihaunt.co.uk, 1 +ihawp.com, 1 ihazurip.com, 1 ihc.im, 1 ihda.org, 1 @@ -72298,7 +72398,6 @@ iiinhoj.com, 1 iiipublishing.com, 1 iiit.pl, 1 -iiitint.online, 1 iinehp.com, 1 iinf.in, 1 iinix.com, 1 @@ -72327,7 +72426,6 @@ ijianli.cn, 1 ijji.tv, 1 ijk.nl, 1 -ijm.com, 1 ijmondlijn.nl, 1 ijmuiderstrand.tk, 1 ijnokmpl.cf, 1 @@ -72338,7 +72436,6 @@ ijsj.ie, 1 ijsselglas.nl, 1 ijubt.cf, 1 -ijunohana.jp, 1 ijustwanttomeetmyheroes.com, 1 ika.monster, 1 ikachalife.com, 1 @@ -72354,7 +72451,6 @@ ikeacareers.co.uk, 1 ikebuku.ro, 1 ikecosta.com, 1 -ikeda-ic.com, 1 ikedaquotes.org, 1 ikenmeyer.com, 1 ikenmeyer.eu, 1 @@ -72397,7 +72493,6 @@ ikuda.eu, 1 ikudo.top, 1 ikumi.us, 1 -ikutin.id, 1 ikvts.de, 1 ikwildjworden.com, 1 ikwileendomein.tk, 1 @@ -72450,6 +72545,7 @@ ilgisaglik.com, 1 ilhan.name, 1 ilhombek.ml, 1 +ilia.ae, 1 iliad78.net, 1 iliamna.media, 1 iliastsi.net, 1 @@ -72471,6 +72567,7 @@ ilin.xyz, 1 iling.me, 1 iliny.hu, 1 +ilio.com, 1 ilionsky.com, 1 iljadr.be, 1 ilkeston.cc, 1 @@ -72484,7 +72581,6 @@ illegalpornography.com, 1 illegalpornography.me, 1 illerzell.de, 1 -illiah.com, 1 illicitart.ca, 1 illicitdigital.com, 1 illimitmail.com, 1 @@ -72555,6 +72651,7 @@ ils.lt, 1 ilsalvagente.it, 1 ilsedelangeforum.tk, 1 +ilsofvilnius.lt, 1 iltec.ru, 1 iltis.live, 1 iltis.rocks, 1 @@ -72565,6 +72662,7 @@ ilug-ktm.tk, 1 iluman.tk, 1 ilumantio.tk, 1 +ilumina2photo.es, 1 iluminatia.com, 1 ilunion.tk, 1 ilusionistas.tk, 1 @@ -72614,6 +72712,7 @@ imagevillage.ir, 1 imageworkscorporation.com, 1 imageworld.tk, 1 +imaginablefutures.com, 1 imaginarium.tk, 1 imaginary.ca, 1 imaginary.stream, 1 @@ -72634,7 +72733,6 @@ imagisphe.re, 1 imajjeans.com, 1 imakash.gq, 1 -imakin.nl, 1 imamenu.com, 1 imamiyadental.jp, 1 imanageproducts.co.uk, 1 @@ -72653,7 +72751,6 @@ imarketing.pe, 1 imarotulos.com, 1 imasa.com.br, 1 -imashtech.com, 1 imask.ml, 1 imask.tk, 1 imastudent.com, 1 @@ -72816,7 +72913,7 @@ immobiliensachverstaendiger-waiblingen.de, 1 immobilienservice-website.de, 1 immobilier-realiste.fr, 1 -immobilier-swiss.ch, 0 +immobilier-swiss.ch, 1 immobilier.org.il, 1 immobilier92.net, 1 immobilierlibourne.com, 1 @@ -72874,7 +72971,6 @@ immunetolerance.org, 1 immunoboost.be, 1 immunowell-jcv-portal.com, 1 -immutable.com, 0 imnabrasive.com, 1 imnhealth.com, 1 imnot.uk, 1 @@ -72892,7 +72988,6 @@ imobiliariarealdream.com.br, 1 imobilien.tk, 1 imoe.fun, 0 -imojob.com, 1 imol.ai, 1 imola.com.ua, 1 imolights.com, 1 @@ -72970,11 +73065,11 @@ imphotep.net, 1 impianti.it, 1 impiantofotovoltaico.roma.it, 1 -impiricus.com, 1 implant418.jp, 1 implantologiadentalgt.com, 1 implanttrade.hu, 1 implementconsultinggroup.com, 1 +implementorsinsights.com, 1 implicitsuccess.com, 1 implosion.tk, 1 import-shopping.de, 1 @@ -73089,6 +73184,7 @@ in-ua.com, 1 in.search.yahoo.com, 0 in2core.com, 1 +in6.to, 1 inab.me, 1 inaji.com, 1 inakasoftware.com, 1 @@ -73110,7 +73206,6 @@ inarigal.com, 1 inarizona.tk, 1 inastia.fr, 1 -inatel.br, 1 inavegas.com, 1 inawe.life, 1 inawisdom.com, 1 @@ -73122,7 +73217,8 @@ inbox.com, 1 inbox.google.com, 1 inbox.gq, 1 -inboxen.org, 1 +inboxen.org, 0 +inboxmonster.com, 1 inboxsms.tk, 1 inboxxme.com, 1 incarceratedwombats.com, 1 @@ -73281,7 +73377,6 @@ indianbridalservices.com, 1 indianbrides.cf, 1 indiancreekvillagepdfl.gov, 1 -indianculture.gov.in, 1 indiandramasonline.tk, 1 indianengineer.tk, 1 indianet.tk, 1 @@ -73314,6 +73409,7 @@ indiaworlddigital.tk, 1 indicana.pl, 1 indicatifs.fr, 1 +indicelectronics.com, 1 indichosts.net, 1 indicia.nl, 1 indico.tk, 1 @@ -73324,7 +73420,6 @@ indiemovementest.ga, 1 indiereview.tk, 1 indieweb-endpoints.cc, 1 -indieweb.rocks, 1 indigartbeading.ca, 1 indigartbeading.com, 1 indigenous.gov.au, 1 @@ -73336,6 +73431,7 @@ indigoblack.com.au, 1 indigobooks.gq, 1 indigodergisi.com, 1 +indigojewelers.com, 1 indigosakura.com, 1 indigterms.com, 1 indihome.co.id, 1 @@ -73349,6 +73445,7 @@ indirimkuponumarketim.com, 1 indirimlim.com, 1 indironline.com, 1 +indistopia.com, 1 inditip.com, 1 indivicloud.me, 0 individualizedshirts.com, 1 @@ -73374,7 +73471,6 @@ indoidnews.ga, 1 indonesiatrip.tk, 1 indoor-kletterwald.de, 1 -indoorbattingcages.net, 1 indoorlandmarks.com, 1 indopress.tk, 1 indorepack.com, 1 @@ -73471,7 +73567,6 @@ infermiere.roma.it, 1 inferno.co.uk, 1 infertilitycure.tk, 1 -inffin-portal.de, 1 infi.ch, 1 inficom.org, 1 infidel.org, 1 @@ -73481,6 +73576,7 @@ infihow.com, 1 infinbank.com, 1 infinether.net, 1 +infinicore.co.zw, 1 infinifit.store, 1 infinipharm.com, 1 infinitblog.de, 1 @@ -73490,7 +73586,7 @@ infinitenews.cf, 1 infinitenews.ml, 1 infiniteserieslabs.com, 1 -infinitetimetoact.com, 1 +infinitetoast.com, 1 infinitewealth.com.au, 1 infinitiofallentownparts.com, 1 infinitiofaugustaparts.com, 1 @@ -73543,7 +73639,6 @@ influencetechpr.com, 1 influentsolutions.ch, 1 influnest.com, 1 -influo.com, 1 info-beamer.com, 1 info-bolivia.tk, 1 info-compusciencetech.tk, 1 @@ -73640,6 +73735,7 @@ infopreneur.blog, 1 infoprofuse.com, 1 infopulse.com, 1 +infopumpkin.com, 1 infopuntzorg.nl, 0 inforabota.tk, 1 inforata.com, 1 @@ -73738,6 +73834,7 @@ infradio.am, 1 infradive.com, 1 infraedifice.com, 1 +infraenlinea.com, 1 infrafor.us, 1 infragardnational.org, 1 infralicht.nl, 1 @@ -73782,8 +73879,8 @@ ingegnereambientale.tk, 1 ingemmologie.com, 1 ingenesis.com, 1 +ingeni.ink, 1 ingeniasas.com, 1 -ingenieurbatiment.com, 1 ingenieure-website.de, 1 ingenious-development.tk, 1 ingenium.si, 1 @@ -73824,8 +73921,8 @@ ingress.com, 1 ingridbai.me, 1 ingrijimbatraniladomiciliu.ro, 1 -ingrijireauto.ro, 1 ingticos.com, 1 +ingtt.com, 1 ingushetia.tk, 1 ingushetiya-news.net, 1 ingwaz.org, 1 @@ -73860,7 +73957,6 @@ initrandom.com, 1 injerry.com, 1 injigo.com, 0 -injuryactive.com, 1 injurylawyers.com, 1 injurylawyersphoenixaz.com, 1 injust.cf, 1 @@ -73882,13 +73978,13 @@ inkedin.com, 1 inkedindarkness.com, 1 inkflaremagazine.com, 1 -inkforall.com, 1 inkhor.se, 1 inkibra.net, 1 inkjets-inks.tk, 1 inkjin.com, 1 inkliners.tk, 1 inklingsnews.com, 1 +inko-lang.org, 1 inkognito.cf, 1 inkognito.ga, 1 inkognito.gq, 1 @@ -73919,7 +74015,6 @@ inlink.ltd, 1 inlink.one, 1 inlock.ai, 1 -inlocon.de, 1 inlumi.com, 1 inmaaa.cf, 1 inmateintake.com, 1 @@ -73961,6 +74056,7 @@ innerpeace.tk, 1 innerspace.ae, 1 innewsweekly.com, 1 +innexis.com, 1 innico.cf, 1 inniger.be, 1 innio.com, 1 @@ -73980,17 +74076,14 @@ innosec.ch, 1 innosoftfusiongo.com, 1 innosysdelft.com, 1 -innoteil.com, 1 innoteknology.com, 1 innova-online.at, 1 innova-scape.info, 1 innovacoachgroup.com, 1 innovairservices.ch, 0 -innovamarketing.com, 1 innovamedical.co.uk, 1 innovaptor.at, 1 innovaptor.com, 1 -innovareai.com, 0 innovate-indonesia.com, 1 innovateohio.gov, 1 innovateohioplatform.gov, 1 @@ -74011,6 +74104,7 @@ innovent.com, 1 innover.se, 1 innovex-inc.com, 1 +innovexus.io, 1 innoviafilms.com, 0 innoviahome.com, 1 innovinity.io, 1 @@ -74100,7 +74194,6 @@ insecure.org.je, 1 insee.com.vn, 1 insegne.roma.it, 1 -inser.com.co, 1 inserta.tk, 1 insertcoin.fr, 1 insertcredit.com, 1 @@ -74167,6 +74260,7 @@ inspired-creations.co.za, 1 inspired-lua.org, 1 inspiredbyannefrank.com, 1 +inspiredbyfrustration.com, 1 inspiredcaresolutions.com, 1 inspiredelements.co.uk, 1 inspiredentalwellness.com, 1 @@ -74238,7 +74332,6 @@ instantluxe.com, 1 instantluxe.de, 1 instantly.ai, 1 -instantmoron.com, 1 instantpage.tk, 1 instantprint.co.uk, 1 instantreplay.tk, 1 @@ -74305,7 +74398,6 @@ insurebuysest.ga, 1 insured-event.tk, 1 insuredcloud.ga, 1 -insuredcreativity.com, 1 insurekidsnow.gov, 1 insuremycar.ru, 1 insureon.com, 1 @@ -74459,12 +74551,11 @@ interallied.org, 1 interativashop.com.br, 1 interbank.pe, 1 -interbase.org, 1 interbec.com, 0 interblink.tk, 1 interbulit.com, 1 interc0der.tk, 1 -intercaribbean.com, 1 +intercaribbean.com, 0 intercariforef.org, 1 intercars.bg, 1 interchangehq.com, 1 @@ -74559,10 +74650,11 @@ internationaldesigncomp.com, 1 internationalepolitik.de, 0 internationalfashionjobs.com, 1 +internationalflightstickets.com, 1 internationalfm.tk, 1 +internationalfrom.com, 1 internationaljoustingleague.tk, 1 internationallaborlaw.com, 1 -internationalmedicaleducation.co.uk, 1 internationalschool.it, 1 internationalschoolcommunity.com, 1 internationaltalento.it, 1 @@ -74593,9 +74685,10 @@ internethosting.nl, 1 internethypothekenbank.de, 1 internetinhetbuitengebied.nl, 1 -internetional.nl, 1 +internetional.nl, 0 internetivo.com, 1 internetk.tk, 1 +internetkollen.se, 1 internetkunskap.se, 1 internetline.tk, 1 internetmagaz.tk, 1 @@ -74645,7 +74738,6 @@ intersolute.de, 1 interspar.at, 1 interspence.com, 1 -intersport.com.kw, 1 interspot.nl, 1 interssl.com, 1 interstateautomotiveinc.com, 0 @@ -74665,6 +74757,7 @@ intervention.io, 1 interview-suite.com, 0 interview-test-taker.com, 1 +interviewform.com, 1 interviewpipeline.co.uk, 1 interviewstarsers.ga, 1 interviewstarsest.ga, 1 @@ -74783,12 +74876,14 @@ invenpro.tech, 1 inventarioti.serveftp.net, 1 inventati.org, 1 +inventialifescience.com, 1 inventify.com, 1 inventionjudgeers.ga, 1 inventionjudgeest.ga, 1 inventions-home.tk, 1 inventionsteps.com.au, 1 inventivashop.com, 1 +inventivehq.com, 1 inventix.nl, 1 invento.tk, 1 inventortesters.ga, 1 @@ -74835,6 +74930,7 @@ investigazione.milano.it, 1 investigazione.roma.it, 1 investinamerica.gov, 1 +investindenbosch.com, 1 investinestonia.com, 0 investingdiary.cn, 1 investinginamerica.gov, 1 @@ -74855,7 +74951,6 @@ investisiya.az, 1 investment-adh.com, 1 investment.com, 1 -investmentanalysethat.com, 1 investmentmonitor.ai, 1 investmentpal.com, 1 investmentrankingsers.ga, 1 @@ -74869,7 +74964,6 @@ investorcom.com, 1 investoren-beteiligung.de, 1 investorforms.com, 1 -investorimpulse.com, 1 investorloanshub.com, 1 investormonkey.com, 1 investorplace.com, 1 @@ -74930,6 +75024,7 @@ inzestfreunde.de, 1 inzichtmeditatie.nl, 1 inzidenz.eu, 1 +inzite.com, 1 io-markets.com, 0 io.kg, 1 io.nl.eu.org, 1 @@ -74974,7 +75069,6 @@ ionescuvlad.eu, 1 ionescuvlad.me, 1 iongroup.com, 1 -ionhowto.com, 1 ionicframework.com, 0 ionicshop.xyz, 1 ionize.cloud, 1 @@ -74985,6 +75079,7 @@ ionstudio.pe, 1 ionutnica.ro, 1 ionx.co.uk, 1 +iop.intuit.com, 1 iopex.com, 1 iopool.us, 1 ioretreat.com, 1 @@ -75016,6 +75111,7 @@ iotstadslab.nl, 1 ioville.com, 1 iowa80.com, 1 +iowabankers.com, 1 iowacolonytx.gov, 1 iowacorncountry.com, 1 iowadol.gov, 1 @@ -75083,6 +75179,7 @@ ipdfreedom.me, 1 ipdgroup.com.au, 1 ipdistrimart.com, 1 +ipelint.com, 1 ipemcomodoro.com.ar, 1 iperconnessi.it, 1 iperon.net, 1 @@ -75108,7 +75205,6 @@ iphonekaitori.tokyo, 0 iphonemobile.ro, 1 iphoneunlock.nu, 1 -ipicolorissa.com, 1 ipid.me, 1 ipidkun.com, 1 ipigri.tk, 1 @@ -75121,6 +75217,7 @@ iplabs.com, 1 iplabs.de, 1 iplayradio.net, 0 +iplead.org, 1 ipleak.net, 1 ipledgeonline.org, 0 iplicense.org, 1 @@ -75218,6 +75315,7 @@ iq-robot.com, 1 iqbeauty.pl, 1 iqcybersolutions.com, 1 +iqmod.me, 1 iqor.com, 1 iqos.ml, 1 iqphone.cf, 1 @@ -75314,7 +75412,6 @@ irenictherapy.com, 1 irentcar.com.tw, 1 ireps.gov.in, 1 -iresearchservices.com, 1 iresineworld.tk, 1 irf2.pl, 1 irfanweb.cf, 1 @@ -75373,6 +75470,8 @@ irlprable.tk, 1 irma-gadalka.tk, 1 irmag.ru, 1 +irmcon.ca, 1 +irmcon.com, 1 irmgard-woelfle.de, 1 irmgardkoch.com, 1 irmo.hr, 1 @@ -75444,7 +75543,6 @@ iryodatumoguide.com, 1 irzumshafiq.tk, 1 is-an.org, 1 -is-and.com, 1 is-cloud.ddns.net, 1 is-coming-for-you.run, 1 is-in-hyper.space, 1 @@ -75459,7 +75557,6 @@ isaac.run, 1 isaaccomputerscience.org, 1 isaaccs.org, 1 -isaacdgoodman.com, 1 isaacgolding.com, 1 isaackabel.cf, 1 isaackabel.ga, 1 @@ -75570,7 +75667,6 @@ isitdoneyet.gov, 1 isitef.com, 1 isitnuclearwaryet.com, 1 -isitpatchtuesday.com, 1 isitrest.info, 1 isitshotime.com, 1 iska.plus, 0 @@ -75653,7 +75749,6 @@ ismekkurs.com, 1 ismena.bg, 1 ismetroburning.com, 1 -ismiledental.ro, 1 isminc.com, 1 ismmed.org, 1 ismywebsitepenalized.com, 1 @@ -75667,7 +75762,6 @@ iso27032.com, 1 isobook.ml, 1 isoc-dc.org, 1 -isofartak.com, 1 isognattori.com, 1 isoip.org, 1 isolation-exterieur-94.fr, 1 @@ -75711,6 +75805,7 @@ ispmedipv6.se, 1 ispn.edu.ar, 1 ispro-ng.com, 1 +ispro-ng.help, 1 ispsoft.pro, 1 isputinstillpresident.com, 1 ispymissions.ga, 1 @@ -75758,6 +75853,7 @@ issuerconsulting.com, 1 issues.email, 1 issuetrak.com, 1 +issundries.com, 1 issww.top, 1 ist-analys.com, 1 ist-analyse.com, 1 @@ -75862,7 +75958,6 @@ it-stek.ru, 1 it-support-schmid.ch, 1 it-tainment.de, 1 -it-tekniker.nu, 1 it-ti.me, 1 it-volgograd.tk, 1 it-wars.com, 1 @@ -75941,8 +76036,7 @@ itbrief.news, 1 itbrouwerij.be, 1 itbsinistre.com, 1 -itc-lucke.com, 0 -itc.gov.mn, 1 +itc-lucke.com, 1 itcamefromtheunderground.tk, 1 itcarolina.com, 1 itcase.pro, 1 @@ -76011,10 +76105,12 @@ ithakama.com, 1 ithakama.cz, 1 ithca.om, 1 +ithesk.com, 1 ithical.be, 1 +ithil.ai, 1 ithillel.ua, 1 ithinc.net, 1 -ithmaarbank.com, 0 +ithmaarbank.com, 1 ithriveedinburgh.org.uk, 1 ithuthuat.vn, 1 itibharari.edu.in, 1 @@ -76023,6 +76119,7 @@ itinerariummentis.org, 1 itineris.co.uk, 1 itinero.xyz, 1 +itinnovations.biz, 1 itioc10.tk, 1 itis.gov, 1 itis4u.ch, 1 @@ -76035,7 +76132,7 @@ itlife.tk, 1 itlitera.com, 1 itlog.tk, 1 -itlogic.com.au, 1 +itlogic.com.au, 0 itludens.com, 1 itma.ie, 1 itmastersupport.tk, 1 @@ -76096,7 +76193,6 @@ its-schindler.de, 1 its-taxi.nl, 1 its-v.de, 1 -its.ax, 1 its.gov, 1 its420somewhere.com, 1 its5oclock.eu, 1 @@ -76114,14 +76210,13 @@ itsbait.com, 1 itsbananas.life, 1 itsbas.nl, 1 +itsbirthday.net, 1 itsbrightly.com, 1 itsburning.nl, 1 itscalculator.com, 1 itscc.kr, 1 itsch-itsche.com, 1 itsdcdn.com, 1 -itsdho.com, 1 -itsdho.org, 1 itse.com, 1 itsec.link, 1 itsecblog.de, 1 @@ -76132,8 +76227,8 @@ itservis.org, 1 itsevann.com, 1 itsevident.com, 1 +itsfluxo.com, 1 itsforu.de, 1 -itsgreener.com, 1 itsgroup.co.nz, 1 itshamradio.com, 1 itshka.rv.ua, 1 @@ -76199,7 +76294,7 @@ itwolfcl.tk, 1 itworks.nyc, 1 itworksme.com, 1 -itwozi.com, 1 +itwozi.com, 0 itx.no, 1 itxartu.tk, 1 itxn.cn, 0 @@ -76207,6 +76302,7 @@ itxuc.com, 1 ity.moe, 0 ityco.com, 1 +itylos.com, 1 ityrecare.com, 1 ityug247.com, 1 itzahammer.tk, 1 @@ -76303,6 +76399,7 @@ ivoryandgrace.com, 1 ivoryhomes.com, 1 ivotemahdi.com, 1 +ivovrba.cz, 1 ivpark.fr, 1 ivpbot.tk, 1 ivpn.net, 1 @@ -76315,7 +76412,6 @@ ivtherapyclinic.ru, 1 ivy-league-colleges.com, 1 ivyandrose.co, 1 -ivyar.org, 1 ivybaby.bg, 1 ivygarden.az, 1 ivyhelpers.com, 1 @@ -76398,7 +76494,6 @@ iyouewo.com, 1 iyoumu.top, 1 iyspanel.com, 1 -iz4wnp.it, 1 iz8mbw.net, 1 izabava.tk, 1 izabel.tk, 1 @@ -76566,6 +76661,7 @@ jachtbouw.eu, 1 jachtypruszynski.pl, 1 jacik.cz, 1 +jacintas.site, 1 jack-daw.com, 1 jack-p2.tech, 1 jack.fr.eu.org, 1 @@ -76636,7 +76732,6 @@ jacktor.com, 1 jackvaley.com, 1 jackwarren.info, 1 -jackwell.com.au, 0 jackwu.net, 1 jackylawless.net, 1 jackyliao.me, 1 @@ -76675,6 +76770,7 @@ jadeglobal.com, 1 jadelsbach.de, 1 jademathre.com, 1 +jaderoller.com, 1 jadesong.cn, 0 jadesong.net, 1 jadid-alwadifa.com, 1 @@ -76702,8 +76798,8 @@ jags.tk, 1 jagspecialisters.ga, 1 jagspecialistest.ga, 1 -jagsttalschule.de, 1 jaguar-network.com, 1 +jaguar-print.ru, 1 jaguarkuda.com, 1 jaguarlandrover-asse.be, 1 jaguarlandrover-occasions.be, 1 @@ -76793,16 +76889,13 @@ jamaicabeachtx.gov, 1 jamally.co.za, 1 jambapp.org, 1 -jamberry.com.mx, 1 jambihackerlink.tk, 1 -jambox.ca, 1 jambox.pl, 1 jamcyberinc.com, 1 jamdro.id, 1 jame-game.duckdns.org, 1 jamelhammoud.com, 1 james-bell.co.uk, 1 -james-parker.com, 0 james.cyou, 1 james.je, 1 james.pub, 1 @@ -76842,7 +76935,7 @@ jamessmith.me.uk, 1 jamestabor.com, 1 jamestgh.com, 1 -jamestilburg.nl, 1 +jamestilburg.nl, 0 jamestmart.in, 1 jamestown.de, 0 jamestowncando-nc.gov, 1 @@ -76869,7 +76962,6 @@ jamiemagee.co.uk, 1 jamiemagee.dk, 1 jamiematthews.ml, 1 -jamiepleasants.com, 1 jamiesarner.com, 1 jamiesnape.io, 1 jamieweb.net, 1 @@ -76900,7 +76992,7 @@ jan-hill.com, 1 jan-melcher.de, 1 jan-reiss.de, 1 -jan-rieger.de, 1 +jan-rieger.de, 0 jan-roenspies.de, 1 jan-von.de, 1 jan.so, 1 @@ -76926,10 +77018,10 @@ janelle-jamer.tk, 1 janellequintana.tk, 1 janenwouter.tk, 1 -janescottceramics.com, 1 janetandjohns.tk, 1 janetedkins.com, 1 janetevansyoga.co.uk, 1 +janetweissman.com, 1 janeweeber.com, 1 janey.cf, 1 janeymac.com, 1 @@ -77050,6 +77142,7 @@ jaredstevenson.com, 1 jarett-lee.com, 1 jarigvandaag.nl, 1 +jariiivanainen.net, 1 jaris.blog, 1 jaris.com, 1 jaris.fi, 1 @@ -77157,7 +77250,6 @@ javacakegames.com, 1 javachinna.com, 1 javaexpert.tk, 1 -javafactory.io, 1 javafiles.tk, 1 javafluers.ga, 1 javafluest.ga, 1 @@ -77207,6 +77299,7 @@ jayjardine.ml, 1 jaylewis.us, 1 jaylineko.com, 1 +jaymlebois.fr, 1 jaypandit.me, 1 jaypark.gq, 1 jaypeeonline.tk, 1 @@ -77253,8 +77346,8 @@ jberlife.marketing, 1 jbeta.is, 1 jbfung.net, 1 +jbhe.com, 1 jbidigital.co.uk, 1 -jblan.ca, 1 jbmechanics.com, 1 jbmincorporated.com, 1 jboats.com, 1 @@ -77378,6 +77471,7 @@ jdscastlehire.co.uk, 1 jdsecurity.co.nz, 1 jdsecurity.com.au, 1 +jdsfarm.mt, 1 jdsoft.eu, 1 jdt.de, 1 jdtangney.com, 1 @@ -77401,7 +77495,6 @@ jeancarlos.tk, 1 jeanclaudegolvin.com, 1 jeandanielfaessler.ch, 1 -jeanettegy.com, 1 jeanettevanrookhuizen.nl, 1 jeangalea.com, 1 jeangarcia.tk, 1 @@ -77474,6 +77567,7 @@ jeffbuswell.com, 1 jeffcasavant.com, 0 jeffcom911co.gov, 1 +jeffcullenartistry.com, 1 jeffdaviscountyga.gov, 1 jeffersoncitytn.gov, 1 jeffersoncountyks.gov, 1 @@ -77505,9 +77599,11 @@ jeffsanders.com, 1 jefftron.net, 0 jeffweb.net, 1 +jeffycheco.wedding, 1 jeflix.stream, 1 jefrydco.id, 1 jefsweden.eu, 1 +jegadat.com, 1 jegkorongszovetseg.hu, 1 jegle.de, 1 jegos.tk, 1 @@ -77595,7 +77691,6 @@ jennifersauer.nl, 1 jenniferschmidt.com.au, 1 jennifertilly.tk, 1 -jenniwiltz.com, 1 jennyjones.tk, 1 jennymovies.com, 1 jennysarl.ch, 0 @@ -77621,7 +77716,6 @@ jeremiahbenes.com, 1 jeremiahlee.com, 1 jeremiebt.com, 1 -jeremy-chen.org, 1 jeremy-gautier.com, 1 jeremy.hu, 1 jeremybentham.com, 1 @@ -77644,6 +77738,8 @@ jericoacoara.com, 1 jerisandoval.tk, 1 jeriss.be, 1 +jerkmotion.com, 1 +jeroenbosch.nl, 1 jeroendeneef.com, 1 jeroened.be, 1 jeroenensanne.wedding, 1 @@ -77660,7 +77756,6 @@ jerrycanspirits.co.uk, 1 jerrygwilliams.com, 1 jerryweb.org, 1 -jerryyu.ca, 1 jersec.com, 1 jerseybikehire.co.uk, 1 jerseycounty-il.gov, 1 @@ -77728,6 +77823,7 @@ jesus-rock.tk, 1 jesuscalls.com, 1 jesuscapitan.tk, 1 +jesuschat.com, 1 jesuscnasistente.com, 1 jesusda.tk, 1 jesusdenazaret.com, 1 @@ -77751,7 +77847,6 @@ jetmusic.tk, 1 jetpack.com, 1 jetpack.com.ar, 1 -jetsadabetchoke77.com, 0 jetsetretiree.com, 1 jetsieswerda.nl, 1 jetskerijneveld.nl, 1 @@ -77763,7 +77858,6 @@ jetular.com, 1 jetular.net, 1 jetvac.cz, 1 -jetwashaustralia.com.au, 1 jetwhiz.com, 1 jetzhang.com, 1 jetzt-elektromobil.de, 1 @@ -77790,6 +77884,7 @@ jewelleryoutlook.com, 1 jewelry-directories.tk, 1 jewelrycoverers.ga, 1 +jewelryodm.com, 1 jewelryshowcasedepot.com, 1 jewishboston.com, 1 jewishjourneys.org, 1 @@ -77802,7 +77897,6 @@ jezebelsromance.com, 1 jezero.tk, 1 jezura.cz, 1 -jezykoteka.pl, 1 jezzicat.org, 1 jf-igrejanovadosobral.pt, 1 jf-madalena.tk, 1 @@ -77863,7 +77957,6 @@ jhbgroup.nl, 1 jhburton.co.uk, 1 jhcommunitysports.co.uk, 1 -jhdindustrialsolution.com, 1 jhe.li, 1 jhellings.nl, 1 jhenwei.com.tw, 1 @@ -77917,6 +78010,7 @@ jiayi.eu.org, 1 jiayi.life, 1 jiazhao.ga, 0 +jiazhao.me, 1 jibe.com, 1 jibeapply.com, 1 jibecdn.com, 1 @@ -77961,6 +78055,7 @@ jikiden.com, 1 jikken.de, 1 jilaninteraktif.tk, 1 +jilbertdairy.com, 1 jilio-ca.com, 1 jilio-ca.net, 1 jilio.com, 1 @@ -78005,6 +78100,7 @@ jimpl.com, 1 jimreedphoto.com, 1 jimslop.nl, 1 +jimthompsonfabrics.com, 1 jimvophotography.tk, 1 jimwalkerphotography.com, 1 jimwhitesell.com, 1 @@ -78068,6 +78164,7 @@ jitsipatapoe.ddns.net, 0 jittruckparts.com, 1 jiuchen.com, 1 +jivara.global, 1 jix.im, 1 jix.net, 1 jixing.one, 1 @@ -78138,6 +78235,7 @@ jlbleakley.com, 1 jld.paris, 1 jldlawyers.com, 1 +jlgsepticllc.com, 1 jlifeoc.com, 1 jliu.xyz, 1 jlmirall.es, 1 @@ -78181,7 +78279,6 @@ jmcleaning.services, 1 jmdekker.it, 1 jmedesign.tk, 1 -jmedved.com, 1 jmeno.eu, 1 jmentertainment.co.uk, 1 jmf-clan.tk, 1 @@ -78265,7 +78362,6 @@ jobapps.ch, 1 jobassadeurs.fr, 1 jobbnorge.no, 1 -jobbois.com, 1 jobbs.se, 1 jobbsafari.no, 0 jobbsafari.se, 0 @@ -78288,13 +78384,13 @@ jobindex.dk, 1 jobintourism.gr, 1 jobit.gr, 1 +jobleader.co.uk, 1 +jobleader.co.za, 1 joblife.co.za, 1 joblover.ml, 1 joblyconnect.com, 1 -jobmacon.com, 1 jobnmadu.com, 1 joboutlook.gov.au, 1 -jobpeintre.com, 1 jobphoning.com, 1 jobrs.edu.iq, 1 jobrus.ga, 1 @@ -78342,7 +78438,6 @@ jocurionline.eu, 1 jodaviesscountyil.gov, 1 joder.li, 1 -jodhpurwindfarms.com, 1 jodlajodla.si, 1 jodyboucher.com, 0 jodymackphotography.com, 1 @@ -78381,7 +78476,6 @@ joembayawaphotography.com, 1 joepitt.co.uk, 0 joerg-wellpott.de, 1 -joerger.ch, 1 joergschneider.com, 1 joerss.at, 1 joesalter.com, 1 @@ -78489,6 +78583,7 @@ johnnyofans.com, 1 johnnyrelease.de, 1 johnnysandaire.com, 1 +johnnysteak.nl, 1 johnocallaghan.tk, 1 johnopdenakker.com, 1 johnrdockendorf.com, 1 @@ -78548,6 +78643,7 @@ jointherlworld.com, 1 jointheunseen.com, 1 jointotem.com, 1 +jointrusio.com, 1 jointsache.com, 1 joinupguard.com, 1 joj.sk, 1 @@ -78618,6 +78714,7 @@ jonathanamoia.co, 0 jonathanbalsiger.com, 1 jonathancarter.org, 1 +jonathancorbin.io, 1 jonathandaleswindle.com, 1 jonathandowning.uk, 0 jonathanisaac.com, 1 @@ -78680,6 +78777,7 @@ jonoalderson.com, 1 jonohewitt.com, 1 jonola.com, 1 +jonpadgett.net, 1 jonpavelich.com, 1 jons.org, 1 jonscaife.com, 1 @@ -78690,12 +78788,13 @@ jonstar.tk, 1 jonvemo.com, 0 jony.tk, 1 +jonyandjerin.com, 1 joo.ru, 1 joodari.fi, 1 joodsmonument.nl, 1 joogle.at, 1 jooli.tk, 1 -joomag.com, 1 +joomag.com, 0 joomanji.fr, 1 joomearaweb.tk, 1 joomla-leipzig.com, 1 @@ -78734,7 +78833,6 @@ jordansmovies.tk, 1 jordansrequests.tk, 1 jordhy.com, 1 -jordi3.com, 1 jordibelgraver.email, 1 jordibelgraver.eu, 1 jordibelgraver.xyz, 1 @@ -78757,6 +78855,8 @@ jornalero.tk, 1 jornaya.com, 1 jorsev.com, 1 +jortt.nl, 1 +jortt.shop, 1 jos-verstappen-fan.tk, 1 josa.ngo, 1 josaa.nic.in, 1 @@ -78771,6 +78871,7 @@ joseetesser.nl, 1 josef-lotz.de, 1 josefernandomorilloardila.tk, 1 +josefhelie.com, 1 josefienbouwmeister.nl, 1 josefinagrau.tk, 1 josefjanosec.com, 1 @@ -78815,12 +78916,14 @@ joshparker.uk, 1 joshs.domains, 1 joshs.guide, 1 +joshs.photos, 1 joshschmelzle.com, 1 joshspage.ltd.uk, 1 +joshspage.uk, 1 joshthewanderer.com, 1 joshu.am, 1 joshua-kuepper.de, 1 -joshua.law, 1 +joshua.law, 0 joshuadiamant.com, 1 joshuagoss.com, 1 joshuamessick.com, 0 @@ -78876,6 +78979,7 @@ journaltimes.com, 1 journeedesfilles.gc.ca, 1 journey.study, 1 +journeybjjacademy.com, 1 journeyfriday.rocks, 1 journeying.ca, 1 journeyofmymothersson.com, 1 @@ -78883,6 +78987,7 @@ journeyrent.com, 1 journeytofi.com, 1 journeytomastery.net, 1 +jourt.com, 1 jousiammuntahalli.fi, 1 joustsec.com, 1 jouw-job.nl, 1 @@ -78907,6 +79012,7 @@ joyblz.com, 1 joybuggy.com, 1 joyce.tk, 1 +joycefeng.com, 1 joycejamiewedding.com, 1 joychetry.com, 1 joydivision.tk, 1 @@ -79079,7 +79185,6 @@ jss6868.cc, 1 jssantos.net, 1 jssresearch.com, 1 -jstarlab.com, 1 jsteward.moe, 1 jstnmcbrd.com, 1 jstore.ch, 1 @@ -79132,7 +79237,6 @@ juanmanuel.tk, 1 juanmapauso.tk, 1 juanmasuarez.tk, 1 -juanmazzetti.com, 1 juanmoreno.tk, 1 juanp.in, 1 juanpena.tk, 1 @@ -79170,6 +79274,7 @@ judidominokiukiu.ga, 1 judidominokiukiu.ml, 1 judithsargentini.nl, 1 +judjas.com, 1 judo2point0.com, 1 judobasicsers.ga, 1 judobasicsest.ga, 1 @@ -79197,7 +79302,6 @@ juflynt.nl, 1 jugaar.llc, 1 jugendhackt.de, 1 -jugendhackt.org, 1 jugendpresse-hessen.de, 1 jugh.de, 1 juhakoho.com, 1 @@ -79219,12 +79323,11 @@ jukebox-manuals.tk, 1 jukebox.plus, 1 jukisewingmachines.co.uk, 1 -jukkakivi.fi, 1 jukkakivimaki.fi, 1 jukovka.tk, 1 juku-wing.jp, 1 julb.de, 1 -julditec.com, 1 +julditec.com, 0 jule-spil.dk, 1 julenetxaniz.eus, 1 julenlanda.com, 0 @@ -79262,6 +79365,7 @@ julianvmodesto.com, 1 julianwallmeroth.de, 1 julianweigle.de, 1 +julianwitusch.de, 1 juliaoantiguidades.com.br, 1 julias.zone, 1 juliasugar.net, 1 @@ -79278,6 +79382,7 @@ julien-demare.com, 0 julien-noyelle.com, 1 julien.expert, 1 +julienlanglois.me, 1 julienmotheron.tk, 1 julienpaterne.com, 0 juliens.tk, 1 @@ -79322,7 +79427,6 @@ jumpandjivechildrensparties.co.uk, 1 jumparoundbouncycastles.co.uk, 1 jumparty.co.uk, 1 -jumpcloud.com, 1 jumpeasy.com.au, 1 jumperke.be, 1 jumperweb.tk, 1 @@ -79338,6 +79442,7 @@ jumpintogreenerpastures.com, 0 jumpman-iphone-design.de, 1 jumpnplay.com.au, 1 +jumponaut.com, 1 jumpseller.cl, 1 jumpseller.com, 1 jumpstartii.com, 1 @@ -79388,11 +79493,9 @@ junjie.pro, 1 junjun-web.net, 0 junkcarbin.com, 1 -junkcarboys.ca, 1 junkcarremovalbrampton.ca, 1 junkdrome.org, 0 junkersparadise.tk, 1 -junkfoodcafe.com, 1 junkguy.tk, 1 junkiedownload.tk, 1 junkotoshimadesign.com, 1 @@ -79402,10 +79505,12 @@ junkyardsl.com, 1 junkyardtuning.tk, 1 junlyu.org, 1 +juno33.com, 1 junobaker.co.uk, 1 junomessenger.cf, 1 junshinkai.ed.jp, 1 junte.tk, 1 +juntoaqui.com.br, 1 juntos.gov, 1 juntosfmc.com.br, 1 junyan.ga, 1 @@ -79432,6 +79537,7 @@ juridiq.it, 1 jurimatic.com, 1 jurisapiens.com, 0 +jurisconsulto.mx, 1 juriscoop.com.co, 1 juriskc.com, 1 jurislex.tk, 1 @@ -79478,7 +79584,6 @@ justarchi.net, 1 justasdelish.com, 1 justbe.scot, 1 -justbid.nl, 1 justbraces.com.sg, 1 justbusinessvalue.com, 1 justbydesign.com, 1 @@ -79520,7 +79625,6 @@ justifinetwork.com, 1 justin-tech.com, 1 justin3d.nl, 1 -justincoffman.com, 1 justindianporn.me, 1 justinellingwood.com, 1 justinfreid.com, 1 @@ -79635,6 +79739,7 @@ jyprj.com, 0 jysecurity.com, 1 jystewart.net, 1 +jytvu.cn, 1 jyvaskylantykkimies.fi, 1 jz.lc, 1 jzbk.org, 0 @@ -79689,7 +79794,6 @@ k507.com, 0 k51365.com, 1 k5197.co, 1 -k55655.com, 1 k583.com, 0 k60d.com, 1 k6729.co, 1 @@ -79793,7 +79897,7 @@ kabulboy.tk, 1 kabulnow.com, 1 kabulpress.org, 1 -kabushiki.jp, 1 +kabushiki.jp, 0 kabyle.com, 1 kacanews.com, 1 kacang-bali.com, 1 @@ -79817,7 +79921,6 @@ kadenlegion.com, 1 kader-platform.nl, 1 kadestate.ru, 1 -kadet.net.ru, 1 kadett-c-club-limburg.tk, 1 kadhal-kirukkan.tk, 1 kadidak.com, 0 @@ -79826,6 +79929,7 @@ kadinhayati.com, 1 kadinsaglikhaber.tk, 1 kadinvesaglik.tk, 1 +kadirari.com.tr, 1 kadizadeinsaat.com.tr, 1 kado-ya.jp, 1 kadolis.com, 1 @@ -79834,10 +79938,12 @@ kadvi.tk, 1 kadykchanskiy.ml, 1 kadymacdonalddenton.ca, 1 +kaeme.com, 1 kaeptns-sechser.de, 1 kaeru-seitai.com, 1 kaesehagen.nl, 1 kafe-cigarko.cz, 1 +kafe.ai, 1 kafecigarko.cz, 1 kafel-ufa.tk, 1 kafeline.com, 1 @@ -79864,7 +79970,6 @@ kagomesashi.tk, 1 kaguramea.fr, 1 kagurayayoi.top, 1 -kagurazaka-mc.com, 1 kaha.co.id, 1 kahane.org, 1 kahmad.in, 1 @@ -79878,6 +79983,7 @@ kaibaunderwear.com.ar, 1 kaibinyang.com, 1 kaibinyang.tk, 1 +kaido-app.com, 1 kaidoblogi.eu, 1 kaigojj.com, 1 kaihipay.jp, 1 @@ -79896,7 +80002,6 @@ kaion.vn, 1 kaipel.de, 1 kaipop.com, 1 -kairainyhappy.com, 1 kairion.de, 1 kairoscope.org, 1 kairoscyprus.com, 1 @@ -79936,7 +80041,7 @@ kak.ao, 1 kaka.farm, 0 kakabo.vn, 1 -kakacon.nz, 1 +kakacon.nz, 0 kakan.ml, 1 kakaravaara.fi, 1 kakdolgonline.cf, 1 @@ -80022,7 +80127,6 @@ kalligo.ga, 1 kalligraf.tk, 1 kallipso.pl, 1 -kallosmedicalaesthetics.com, 1 kalmarantiques.com.au, 1 kalmarbilder.se, 1 kalmbach.com, 1 @@ -80054,7 +80158,6 @@ kalyancity.in.ua, 1 kalyangupta.ml, 1 kalyazin-online.tk, 1 -kalyndachase.com.au, 1 kam-serwis.pl, 1 kamada.com, 1 kamagrajel.org, 1 @@ -80117,6 +80220,7 @@ kamlunglelystad.tk, 1 kamnob.com, 1 kamp-kisten.nl, 1 +kampanyaplus.com, 1 kampanyaradar.com, 1 kampffische.tk, 1 kampfsportschule-einherjar.de, 1 @@ -80157,6 +80261,7 @@ kanbanflowbackup.com, 1 kancelarblanik.cz, 1 kancelaria.torun.pl, 1 +kancelariatyniec.pl, 1 kancelariawlt.pl, 1 kancolle.me, 1 kancriaura.org, 1 @@ -80314,7 +80419,7 @@ karanjthakkar.com, 1 karanlyons.com, 1 karao.ke, 1 -karaodesign.fr, 1 +karaodesign.fr, 0 karaoglanis-info.tk, 1 karaoglanis.tk, 1 karaokeyboards.tk, 1 @@ -80369,7 +80474,7 @@ karin-ewald.de, 1 karinahh.net, 1 karinheinenmaassen.nl, 1 -karinov.co.id, 1 +karinov.co.id, 0 karinwerner.com, 1 kariszoey.com, 1 karit.nz, 1 @@ -80415,6 +80520,7 @@ karol.gay, 1 karolak.fr, 0 karolaschinkel.de, 1 +karollech.com, 1 karopc.pl, 1 karorally.tk, 1 karoverwaltung.de, 1 @@ -80497,7 +80603,6 @@ kaskojs.com, 1 kaskoqa.com, 1 kasowitz.com, 1 -kaspa-store.com, 1 kasparovru.ml, 1 kasparovru.tk, 1 kasper-team.tk, 1 @@ -80518,7 +80623,6 @@ kastankaoffice.cz, 1 kastas.com, 1 kastas.com.tr, 1 -kastechssg.com, 1 kasteelhoensbroek.nl, 1 kastelruth.biz, 1 kastemperaturen.ga, 1 @@ -80531,6 +80635,7 @@ kasvall.com, 1 kasyna-internetowe.com, 1 kasynoanalyzer.com, 1 +kat.ai, 1 kat.cat, 1 kat.tf, 0 kat4at.tk, 1 @@ -80577,6 +80682,7 @@ katex.org, 1 kateysagal.tk, 1 katfitness.co.uk, 1 +katha.lk, 1 kathakkachakkar.com, 1 kathardt.de, 1 katherineandkegan.love, 1 @@ -80607,6 +80713,7 @@ katka.info, 1 katnunn.co.uk, 1 kato-yane.com, 1 +katogen.com, 1 katom.com, 1 katrelleonline.tk, 1 katretter.de, 1 @@ -80623,6 +80730,7 @@ kattelans.eu, 1 kattelus.tk, 1 kattens.tk, 1 +katumms.com.au, 1 katushka.cf, 1 katushka.ga, 1 katyl.info, 0 @@ -80672,6 +80780,7 @@ kawaiicon.org, 1 kawaiiku.de, 1 kawaiilo.li, 1 +kawaitomato.com, 1 kawamipiano.com, 1 kawamura-inc.jp, 1 kawasaki.com, 1 @@ -80684,6 +80793,7 @@ kay.la, 1 kay.moe, 1 kay.nz, 1 +kayabyd.lk, 1 kayakaventura.tk, 1 kayakcastro.tk, 1 kayakpolouniversidades.tk, 1 @@ -80699,6 +80809,7 @@ kaylielaw.com, 1 kayne.com, 1 kayon.cf, 1 +kayphi.com, 1 kayseri.bel.tr, 1 kayserihaberleri.tk, 1 kaysville.gov, 1 @@ -80730,7 +80841,6 @@ kazoohr.com, 0 kaztest.tk, 1 kazu-techlab.com, 1 -kazu.click, 1 kazumi-clinic.com, 1 kazumi.ooo, 1 kazuno-jc.or.jp, 1 @@ -80782,6 +80892,7 @@ kc9.vip, 1 kca2009.com, 1 kcagsolutions.com, 1 +kcalb-ltd.com, 1 kcc8.com, 1 kcchung.com, 1 kcci.com, 1 @@ -80825,6 +80936,7 @@ kdm.pw, 1 kdn-dc.com, 1 kdo-vola.cz, 1 +kdofid.fr, 1 kdonkers.com, 1 kdoslavi.cz, 1 kdproduction.cz, 1 @@ -80904,7 +81016,6 @@ keepersecurity.us, 1 keepiteasy.eu, 1 keepitsecure24.com, 1 -keepitsimplebitcoin.com, 1 keepleft.gr, 1 keepsight.org.au, 1 keepsolid.com, 1 @@ -80921,13 +81032,13 @@ kegan.lol, 1 keganthorrez.com, 1 kegelschiene.net, 0 +kegoc.kz, 1 kehlenbach.net, 1 keian.tk, 1 keibablood.com, 1 keiebijters.nl, 1 keigakusha.co.jp, 1 keigel2001.net, 1 -keiji0501.com, 1 keiju.ee, 1 keiju.fi, 1 keijuriini.fi, 1 @@ -80953,6 +81064,7 @@ keitaro.io, 1 keith.pro, 1 keithazzopardi.tk, 1 +keithblakemorenoble.com, 1 keithmcmillen.com, 1 keiths.ml, 1 keithstaxis.co.uk, 1 @@ -80961,6 +81073,7 @@ keizeror.gov, 1 kejiben.fun, 1 kejpop.pl, 1 +kejtahir.com, 1 kekarimi.com, 1 keke-shop.ch, 1 kekoskee.gov, 1 @@ -81047,6 +81160,7 @@ kempnertx.gov, 1 kemppi.com, 0 kempportraits.com, 1 +kemps.com, 1 kemptechnologies.com, 0 kemptonparkplumbing.co.za, 1 kemptonparksolarsystems.co.za, 1 @@ -81088,6 +81202,7 @@ keniff.gq, 1 kennards.co.nz, 1 kennebec.gov, 1 +kennebunksavings.com, 1 kennedy.cf, 1 kennedy.ie, 1 kenners.org, 0 @@ -81102,7 +81217,6 @@ kennispleinzingeving.nl, 1 kenny-peck.com, 1 kenny.technology, 1 -kennychan.xyz, 1 kennynet.co.uk, 1 keno.im, 1 keno.tk, 1 @@ -81201,6 +81315,7 @@ kerrydavisguitars.tk, 1 kersmexico.com, 1 kerstpagina.tk, 1 +kerstpakkettenplaza.nl, 1 kersvers.agency, 1 kertis.tk, 1 kertweb.hu, 1 @@ -81224,7 +81339,6 @@ keskkonnaamet.ee, 0 kesko.fi, 0 keskraamatukogu.ee, 1 -kessel-runners.com, 1 kesselrun.goip.de, 1 kesslerandsons.com, 1 kesspay.io, 1 @@ -81258,6 +81372,7 @@ ketv.com, 1 ketzer.tk, 1 keukenhof.nl, 1 +keukenkraanwinkel.nl, 1 keukenstudio.tk, 1 keurigbestprice.tk, 1 keuvelaar.nl, 1 @@ -81338,6 +81453,7 @@ keydelay.tk, 1 keydifferencemedia.com, 1 keyesrobot.cn, 1 +keyfortech.com, 1 keyfoundation.xyz, 1 keygen.sh, 1 keyhani.tk, 1 @@ -81464,7 +81580,6 @@ khas.co.uk, 1 khatapana.com, 1 khatnip.net, 1 -khatwa-editions.org, 1 khayal-3d.com, 1 khda.gov.ae, 1 khdestiny.tk, 1 @@ -81506,16 +81621,17 @@ khuyenmaiviettel.vn, 1 khwezifinancialservices.co.za, 1 khwiki.com, 1 +ki-adept.eu, 1 ki-dc.com, 1 ki-management.ch, 1 ki.ki, 1 ki6rbv.com, 1 kiacatherine.sg, 1 -kiadoapartman.hu, 1 kialo-edu.com, 1 kialo-pro.com, 1 kialo.com, 1 kiamehr.tk, 1 +kian.or.jp, 1 kianho.com.sg, 1 kiano.net, 0 kiapartsnow.com, 1 @@ -81561,7 +81677,6 @@ kiddies.tk, 1 kiddieskingdom.tk, 1 kiddocom.org, 1 -kiddoscape.eu, 1 kiddyboom.ua, 1 kiddyland.co.jp, 1 kidfitseries.com.au, 1 @@ -81570,7 +81685,7 @@ kidisov.tk, 1 kidiu.com, 1 kidm4k.com, 0 -kidney.ca, 1 +kidney.ca, 0 kidonng.me, 1 kids-castles.com, 1 kids-concept.de, 1 @@ -81652,8 +81767,8 @@ kigermap.cn, 1 kigermap.com, 1 kighub.cn, 1 +kigmbh.com, 1 kigyounomori.com, 1 -kihi.news, 1 kiinanharjakoirat.tk, 1 kiind.com.au, 1 kiiteyo.net, 1 @@ -81735,7 +81850,6 @@ kimberleythomson.tk, 1 kimberlyal.gov, 1 kimberlycaprice.com, 1 -kimberlydelarosa.com, 1 kimberlytank.com, 1 kimboggusphotography.com, 1 kimbroughelectric.com, 1 @@ -81895,7 +82009,6 @@ kingofthecastlesrhyl.co.uk, 1 kingpin.pro, 1 kingpincages.com, 1 -kingroot.com, 1 kings-potong.com, 1 kings-world.net, 1 kingsaft.net, 1 @@ -81921,10 +82034,10 @@ kingsurfa.com, 0 kingsvetcentre.com, 1 kingsvilletexas.com, 1 -kingswinehaus.com, 1 kingtech8.tk, 1 kingtreasure.com, 1 kingtreasures.com, 1 +kingwaybagger.de, 1 kingyard.com, 1 kingyo-bowl.com, 1 kinherit.co.uk, 1 @@ -81989,6 +82102,7 @@ kinozone.tk, 1 kinschots.eu, 1 kinsei.jp, 1 +kinshipcareers.com, 1 kintanalodge.fr, 1 kintawifi.com, 1 kintell.com, 0 @@ -82167,6 +82281,7 @@ kitpara.shop, 1 kits-graphiques-shop.tk, 1 kits-graphiques.tk, 1 +kits.cx, 1 kitsap.gov, 1 kitscan.co.uk, 1 kitscan.com, 1 @@ -82221,11 +82336,13 @@ kiwipedia.sk, 1 kiwiplace.com, 0 kiwitastic.com, 1 +kiwox.cl, 1 kixby.com, 1 kizetroniko.tk, 1 kizkulesi.tk, 1 kizomba.info, 1 kiztarafi.net, 1 +kizuna.com.py, 1 kizunaai.eu.org, 1 kizzycode.de, 1 kj-cleaning.co.uk, 1 @@ -82390,7 +82507,6 @@ klempin.org, 1 klempin.se, 1 klempin.uk, 1 -klen.ua, 1 klenc.eu, 1 klenty.com, 1 kleor.com, 1 @@ -82471,7 +82587,6 @@ kloop.kg, 1 klop.info, 1 klos-kremperler.at, 1 -klose-besser.com, 1 klose.family, 1 klosetestumgebungnextcloud.de, 1 klosko.net, 1 @@ -82492,6 +82607,7 @@ klubfitness.pl, 1 klubgerlach.sk, 1 klubwsl.tk, 1 +kluchkin-ai.com, 1 kluck.me, 1 kludge.eu, 1 klugemedia.de, 1 @@ -82550,6 +82666,7 @@ knarred.site, 1 knashaug.com, 1 knauf.com, 1 +knauss-family.com, 1 knautiluz.net, 0 knb.nl, 1 knbbw-frnab.tk, 1 @@ -82561,6 +82678,7 @@ kneepainclinic.sg, 1 kneerux.de, 1 kneginec.hr, 1 +kneli.co.il, 1 knep.me, 0 kneppe.me, 1 knetterbak.nl, 1 @@ -82644,6 +82762,7 @@ knowunity.com, 1 knowunity.de, 1 knowyourday.ai, 1 +knowyourrunway.com, 1 knowyourteam.com, 1 knoxcountyil.gov, 1 knoxcountyne.gov, 1 @@ -82722,7 +82841,6 @@ koch-wro.pl, 1 kochadaiyaan.tk, 1 kochamkoszalin.pl, 1 -kochbar.de, 1 kochcommunity.com, 1 kochen-und-design.de, 1 kochereva.com, 1 @@ -82746,6 +82864,7 @@ kode-it.de, 1 kode.ch, 0 kodelabs.com, 1 +koderclub.com, 1 kodes.com.tr, 1 kodexplorer.ml, 1 kodi-tutorials.com, 1 @@ -82754,6 +82873,7 @@ kodineuerleben.eu, 1 kodinkuvalehti.fi, 1 kodioso.com, 1 +kodiqa.com, 1 kodkollen.com, 1 kodkollen.se, 1 kodomocorona.com, 1 @@ -82816,10 +82936,8 @@ koji-tsujitani.net, 1 kojiishikawa.com, 1 kojipkgs.fedoraproject.org, 1 -kokenmetesther.nl, 1 koketteriet.se, 0 kokk.loan, 1 -koko.news, 1 kokoiroworks.com, 1 kokomo.com.au, 1 kokomoislandfiji.com, 1 @@ -83049,7 +83167,6 @@ kontabydigital.com, 1 kontaxis.org, 1 kontent.ai, 1 -kontikifinance.com, 0 kontikiindustries.tk, 1 kontikimedia.com, 1 kontist.com, 1 @@ -83065,6 +83182,7 @@ kontur.tk, 1 konturalco.ru, 1 konus.tk, 1 +konveniat.lu, 1 konventa.net, 1 konwerter-online.pl, 1 konyadireksiyonservisi.com, 1 @@ -83084,7 +83202,6 @@ koodimasin.ee, 1 koodimasin.eu, 1 kooer.org, 1 -koof.win, 1 kooky.org, 1 kooli.ee, 1 koolisw.tk, 1 @@ -83125,7 +83242,6 @@ koplancpa.com, 1 koplax-online.com, 1 koppbilling.com, 1 -koppelvlak.net, 1 koppenexecutive.com, 1 koppenhouse.com, 1 koppop.nl, 1 @@ -83150,6 +83266,7 @@ korb.de, 1 korbel-loziska.cz, 1 korben.info, 1 +korcula-larus.com, 1 kordamed.ee, 1 kordamentha.com, 1 kordamentha.com.au, 1 @@ -83190,6 +83307,7 @@ korotonomedya.net, 1 korrekttech.hu, 1 korrelzout.nl, 1 +korsordsvar.com, 1 korst.tk, 1 korstanjebouw.nl, 1 korstanjetimmerwerken.nl, 1 @@ -83266,7 +83384,6 @@ kotisivukone.fi, 0 kotitehdas.fi, 1 kotka.ml, 1 -kotlinfactory.io, 1 kotly-marten.com.ua, 1 kotmale.com, 1 kotobox.net, 1 @@ -83335,7 +83452,6 @@ kozgi.com, 1 kozhzamenitely.tk, 1 koziknet.com, 1 -kozinetspurewal.com, 1 kozitsyn.name, 1 kozlov.cf, 1 kozmetikatrend.hu, 1 @@ -83346,12 +83462,19 @@ kp-opt.ru, 1 kp0808.cc, 1 kp0809.com, 1 +kp1111.cc, 1 +kp2222.cc, 1 +kp3333.cc, 1 +kp4444.cc, 1 kp45.ru, 1 +kp6666.cc, 1 +kp7777.cc, 1 +kp9999.cc, 1 kpfanworld.com, 1 -kpinterface.com, 1 kpinvest.eu, 1 kpirx.com, 1 kpit.com, 1 +kpk.io, 1 kpkhub.com, 1 kplante.com, 1 kplastics.in, 1 @@ -83430,6 +83553,7 @@ kramersworld.tk, 1 kramesondemand.com, 1 kramm.com, 1 +kramse.org, 1 kramsj.uk, 1 kran.ga, 1 krang.org.uk, 1 @@ -83505,7 +83629,6 @@ kreditonline.ml, 1 kreditor.gq, 1 kreditovnet.tk, 1 -kreditsystem.net, 1 kreditzirkus.de, 1 krednal.ru, 1 kredytybezprowizji24.pl, 1 @@ -83521,7 +83644,6 @@ kremenchug-news.ru, 1 kremenchugnews.ru, 1 kremer-sonnenschutzsysteme.de, 1 -kremer.shop, 1 kreno.tech, 1 krenstetter.at, 1 kresimir-blazevic.tk, 1 @@ -83545,6 +83667,7 @@ kriis.ee, 0 krik.rs, 1 kriko.io, 1 +krill-ai.com, 1 krillz.se, 1 krilotek.com, 1 krilov.tk, 1 @@ -83559,7 +83682,6 @@ kringloopwinkels.tk, 1 kripa.tk, 1 kriptodede.com, 1 -kriptokoin.com, 1 kriptopod.com, 1 kriptopodgon.tk, 1 krisboeckmans.tk, 1 @@ -83635,7 +83757,6 @@ krometis.com, 1 kromozottrud.hu, 1 krona.ddns.net, 1 -kronanshopping.se, 1 kronofogden.se, 1 kronosproject.tk, 1 kronospsi.es, 1 @@ -83645,6 +83766,7 @@ kroon.email, 1 kroonlocks.com, 1 kropkait.pl, 1 +kroschke.de, 1 krosno24.com, 1 krosovki-nike.tk, 1 kross1308.de, 1 @@ -83653,6 +83775,7 @@ krouzkyliduska.cz, 0 krovatka.tk, 1 krovlya911.ru, 1 +krowdev.com, 1 krozilla.tk, 1 krrt.io, 1 krs.cloud, 1 @@ -83728,11 +83851,11 @@ krystal-framework.ml, 1 krytykawszystkiego.com, 1 krytykawszystkiego.pl, 1 +kryx.de, 1 krzysiamrozinska.pl, 1 krzysztofzaleski.com, 1 krzyzu.ovh, 1 ks-19.com, 1 -ks-39.com, 1 ks-59.com, 1 ks-79.com, 1 ks-89.com, 1 @@ -83742,7 +83865,6 @@ ks015.com, 0 ks017.com, 1 ks058.com, 1 -ks068.com, 0 ks0886.com, 1 ks16.net, 1 ks17.net, 1 @@ -83819,7 +83941,6 @@ kshop.gr, 1 kshub.gov, 1 ksiegarniabk.pl, 1 -ksiegowosc.pro, 1 ksiga.org, 1 ksk-raduga.tk, 1 ksleg.gov, 1 @@ -83841,6 +83962,7 @@ kst-dlvr.tk, 1 kst-service.tk, 1 kstar.eu, 1 +kstatecollegian.com, 1 kstdlvr.by, 1 ksteamship.com, 1 kstech.tech, 1 @@ -83885,7 +84007,6 @@ kuai-ssl.com, 1 kuaishou.cf, 1 kuaitiyu.org, 1 -kuaiyaojing.com, 1 kualitatem.com, 1 kualo.co.uk, 1 kualo.com, 1 @@ -83899,6 +84020,7 @@ kubalok.de, 1 kubanitoscali.com, 1 kubeofficebooth.com, 1 +kubequest.online, 1 kuberkaitseliit.ee, 1 kuberm.com, 1 kubern.at, 1 @@ -83929,6 +84051,7 @@ kucukcekmececilingir.gen.tr, 1 kucukdunya.com, 1 kucukkaymakli.tk, 1 +kuda.ru, 1 kudelskisecurity.com, 1 kudinilam.tk, 1 kuditel.net, 1 @@ -83977,7 +84100,6 @@ kulinaristi.fi, 1 kulinariya.tk, 1 kulinarnykoneser.pl, 1 -kulshe.com, 1 kultham.ml, 1 kulthist.tk, 1 kultmobil.se, 1 @@ -83988,6 +84110,7 @@ kulturbanause.de, 1 kulturbiljetter.se, 1 kulturistika.tk, 1 +kulturlade.ch, 1 kulturmel.ch, 1 kulturstiftung-st.de, 1 kultus-mv.de, 1 @@ -84055,7 +84178,6 @@ kupid.com, 1 kupinska.pl, 1 kupipled.cf, 1 -kupisafe.com, 1 kupislivki.tk, 1 kupitmtz.gq, 1 kupitraktor.gq, 1 @@ -84130,6 +84252,7 @@ kurtisfranklin.com, 1 kurtki-moda.tk, 1 kurtlarvadisi-pusu-1.tk, 1 +kurtneuweiler.com, 1 kurtosys.com, 1 kurtschleinbeck.com, 1 kurungkurawal.id, 1 @@ -84157,7 +84280,6 @@ kustomcorner.com.au, 1 kustomer.com, 1 kustosija.tk, 1 -kustus.com.br, 1 kustvissen.tk, 1 kusunokitomori.com, 1 kutahyaciniyapitasarim.com.tr, 1 @@ -84169,8 +84291,10 @@ kutinsoft.com, 1 kutny.cz, 1 kutsankaplan.com, 1 +kutten.lu, 1 kuttler.eu, 1 kutvonen.net, 1 +kutyabarathelyek.hu, 1 kutyamacskashop.hu, 1 kutzer-consulting.de, 1 kuudere.moe, 1 @@ -84244,6 +84368,7 @@ kwieben.com, 1 kwikmed.eu, 0 kwikmotion.com, 0 +kwin-city.com, 1 kwjx2.ga, 1 kwl.com.au, 1 kwm.group, 1 @@ -84276,6 +84401,7 @@ kyber.club, 1 kyber.consulting, 1 kyber.network, 1 +kyberguard.de, 1 kyberhub.com, 1 kyberna.xyz, 1 kybi.sk, 1 @@ -84351,7 +84477,6 @@ kyrainvestments.com, 1 kyranis.net, 1 kyrgizion.tk, 1 -kyriakidisship.gr, 1 kyrjy.com, 1 kyrknatet.se, 1 kyrtopoulos.com, 1 @@ -84372,12 +84497,14 @@ kzwr.com, 1 l-3com.com, 1 l-a-b-a.com, 1 +l-a-b-a.pl, 1 l-a-b-a.ru, 1 l-atelier-c.com, 1 l-i-r.tk, 1 l-ink.eu.org, 1 l-lab.org, 1 l-os.com, 1 +l-plate.ie, 1 l-u-c-a.de, 1 l.nf, 1 l.td, 1 @@ -84415,7 +84542,6 @@ l9i.net, 1 la-baldosa.fr, 0 la-bonne-cuisine.fr, 1 -la-boutique-langlois.fr, 1 la-casa.tk, 1 la-dameblanche.fr, 1 la-grande-jaugue.fr, 1 @@ -84429,6 +84555,7 @@ la-tourmaline.ch, 1 la-verite.tk, 1 la-ville-aux-dames-auto-ecole.com, 1 +la.gy, 1 laa.gov.ly, 1 laac.io, 1 laakevahinko.fi, 1 @@ -84516,17 +84643,18 @@ labourparty.nz, 1 labourparty.org.nz, 1 labourpolicies.org.nz, 1 +laboutiquedeluminia.fr, 1 laboutiquemarocaineduconvoyeur.com, 1 laboutiquemarocaineduconvoyeur.ma, 1 labpartnering.org, 1 labradoodle.net, 1 labrat.mobi, 1 +labreadai.com, 1 labroma.tk, 1 labs-is.com, 1 labs.directory, 1 labs.ro, 1 labsbibliotecarios.es, 1 -labscon.io, 1 labsector.com, 1 labsitserviss.lv, 1 labtalleraudiovisual.tk, 1 @@ -84543,6 +84671,7 @@ lacahsa.gov, 1 lacalderera.tk, 1 lacallas.tk, 1 +lacanastasevilla.es, 1 lacantinadoors.com, 1 lacantine.xyz, 1 lacapsule.org, 1 @@ -84554,7 +84683,6 @@ lacasseroy.com, 1 lacavedesergio.fr, 1 lacaveducinquantenaire.com, 1 -lacaverna.net, 1 lacazadora.tk, 1 laceleste.it, 1 lacentral.com, 0 @@ -84582,7 +84710,6 @@ lacnesidlo.sk, 1 lacoast.gov, 1 lacoccinelle.net, 1 -lacochinacounselor.com, 0 lacoe.edu, 1 laconcepcion.tk, 1 laconciergeriedusoleil.fr, 1 @@ -84603,7 +84730,6 @@ lacrossetribune.com, 1 lacrossewi.gov, 1 lacroy.com.br, 1 -lactatiekundigemanouk.nl, 1 lacuartaorden.tk, 1 lacuisine.tk, 1 lacyc3.eu, 1 @@ -84654,6 +84780,7 @@ ladyboyfiles.com, 1 ladyboytube.tv, 1 ladybugjam.com, 1 +ladyescorts.com, 1 ladyestelle.org, 1 ladyisabell666.com, 1 ladykarame.org, 1 @@ -84730,7 +84857,7 @@ lafraia.com.br, 1 lafraise.pro, 1 lafrenchtech.com, 1 -lafsc.co.uk, 1 +lafsc.co.uk, 0 lafuriadelguardiancelta.tk, 1 lag-fan.tk, 1 lag-gbr.gq, 1 @@ -84756,7 +84883,6 @@ lagloriadehuampani.com, 1 lagodny.eu, 1 lagom.org.pl, 1 -lagos-car-hire.com, 1 lagoscooperativecollege.com, 1 lagotto.tk, 1 lagovistatexas.gov, 1 @@ -84809,7 +84935,6 @@ lajme-shqip.gq, 1 lajna-serial.cz, 1 lajnaserial.cz, 1 -lajornadafilipina.com, 1 lajusta.tk, 1 lakabina.tk, 1 lakashirdetes.com, 1 @@ -84822,6 +84947,7 @@ lakeandriverrestoration.com, 1 lakearthurnm.gov, 1 lakecity-obgyn.com, 1 +lakecitybank.com, 1 lakecitydepositionreporter.com, 1 lakeclerkfl.gov, 1 lakecookexteriors.com, 1 @@ -84855,6 +84981,7 @@ lakesiderealty.info, 1 lakesitetn.gov, 1 lakespropertymgt.com, 1 +lakesregionseptic.com, 1 lakestreetministorage.com, 1 lakesviewrobina.com.au, 1 laketanglewoodtx.gov, 1 @@ -84904,6 +85031,7 @@ lalucioledigitale.com, 0 lalumiere.org, 1 lalunedangkor.com, 0 +lama-corp.space, 1 lamac.ae, 1 lamafioso.com, 1 lamai-crochets.fr, 1 @@ -84962,7 +85090,6 @@ lammertbies.com, 1 lammertbies.nl, 1 lamnea.se, 1 -lamocheattitude.fr, 1 lamonasafetynotice.co.uk, 1 lamontre.ru, 1 lamorera.tk, 1 @@ -84981,6 +85108,7 @@ lamsa.tk, 1 lamscommunity.org, 1 lamudi.ga, 1 +lamuebleriavirtual.co, 1 lamuixeranga.tk, 1 lamula.com, 1 lan-der.de, 1 @@ -85009,6 +85137,7 @@ lance.com.br, 1 lance.top, 1 lancea.pl, 1 +lancefourstar.com, 1 lancejames.com, 1 lancelafontaine.com, 1 lancelucido.tk, 1 @@ -85017,6 +85146,7 @@ lancertactical.eu, 1 lanceyip.com, 1 lanchong.tk, 1 +lanconstruct.be, 1 lancyvbc.ch, 0 land.nrw, 0 landart.tk, 1 @@ -85070,6 +85200,7 @@ landscaping-montreal.com, 1 landscaping.ga, 1 landscaping.gq, 1 +landscapingdesignpro.com, 1 landscapingipswich.com, 1 landscapingrepairers.ga, 1 landsearch.com, 1 @@ -85100,7 +85231,6 @@ langenberg.tk, 1 langenburg.de, 1 langenu.tk, 1 -langenwolschendorf.de, 1 langerwehe.de, 1 langgasse-baar.ch, 1 langhun.me, 1 @@ -85134,7 +85264,6 @@ lannatefl.com, 1 lannoy-delattre.net, 1 lanny.ga, 1 -lannywolfetrio.com, 1 lanodan.eu, 1 lanomina.net, 1 lanourotteguiry.fr, 1 @@ -85150,7 +85279,6 @@ lansoftware.eu, 1 lansweeper.com, 1 lanternalauth.com, 1 -lanterndigital.com.cn, 1 lanternhealth.org, 1 lanthorn.com, 1 lantian.pub, 1 @@ -85183,7 +85311,6 @@ lap3.nl, 1 lapageamelkor.org, 1 lapaginadejuanjo.tk, 1 -lapakmaboy.com, 1 lapaksulawesi.tk, 1 lapakus.com, 1 laparcela.tk, 1 @@ -85197,7 +85324,6 @@ lapecshizuoka.com, 1 lapeercountymi.gov, 1 laperfumista.es, 1 -laperla-chemnitz.de, 1 laperlaabaya.com, 1 laperladelduero.tk, 1 laperreraflamenca.tk, 1 @@ -85394,7 +85520,6 @@ laspirale.tk, 1 lasrecetasdeguada.com, 1 lasse-boberg.tk, 1 -lasse-it.dk, 1 lasseaktiv.art, 1 lasseaktiv.com, 1 lasseaktiv.es, 1 @@ -85416,6 +85541,7 @@ lastbooks.gq, 1 lastcast.bg, 1 lastencore.org, 1 +lastenwekker.nl, 1 lastfriends.site, 1 lastingcar.com, 1 lastingmarksers.ga, 1 @@ -85430,7 +85556,7 @@ lastoriadellecose.tk, 1 lastpass.com, 0 lastpetal.ca, 1 -lastpictures.de, 1 +lastpictures.de, 0 lastrada.tk, 1 lastrik.ch, 1 lastsunset.tk, 1 @@ -85452,6 +85578,7 @@ latardeurbana.ml, 1 latardeurbana.tk, 1 latas-dev.lv, 1 +latavernageislautern.de, 1 latchplus.com, 1 late.am, 0 lateams.ml, 1 @@ -85469,12 +85596,13 @@ laten.tk, 1 latenitefilms.com, 0 latentlens.co, 1 +latentlexicon.org, 1 latentview.com, 1 +latentviewanalytics.com, 1 lateral.dog, 1 lateralsecurity.com, 0 laterna.cz, 1 laterremotodealcorcon.tk, 1 -latestbitcoinnews.io, 1 latestcoin.tk, 1 latestimmigrationnews.today, 1 latestmobiles.tk, 1 @@ -85619,6 +85747,7 @@ lavamobiles.com, 1 lavanderia.it, 1 lavanderia.roma.it, 1 +lavaquitacheese.com, 1 lavarex.co.jp, 1 lavasing.eu.org, 1 lavavetri.it, 1 @@ -85737,7 +85866,6 @@ lawyerscreenerers.ga, 1 lawyerscreenerest.ga, 1 lawyersnew.com, 1 -lawyersofmissouri.com, 1 lawzakon.tk, 1 lawzana.com, 1 lawzava.com, 1 @@ -85758,6 +85886,7 @@ layxw.com, 1 lazada.pk, 1 lazarev.agency, 1 +lazarou.gr, 1 lazarusalliance.com, 1 lazell.de, 1 lazell.uk, 1 @@ -85778,7 +85907,6 @@ lazowik.pl, 1 lazownik.pl, 1 lazuardy.tech, 0 -lazudi.com, 1 lazyempire.site, 1 lazyhelp.com, 1 lazyhomer.pl, 1 @@ -85803,6 +85931,7 @@ lbio.nl, 0 lbj.tw, 1 lbjlibrary.gov, 1 +lblaw.co.uk, 1 lblok.pl, 1 lbls.me, 0 lbo.management, 1 @@ -85832,7 +85961,7 @@ lc6656.com, 1 lc6665.com, 1 lc6686.com, 1 -lc7.fun, 1 +lc7.fun, 0 lc8005.com, 1 lc80802.com, 1 lc80805.com, 1 @@ -85896,9 +86025,7 @@ lcti.biz, 1 lcv-psi.com, 1 lcv-psi.com.br, 1 -lcv.cool, 1 lcv.email, 1 -lcv.expert, 1 lcv.lgbt, 1 lcv.net.br, 1 lcv.pro.br, 1 @@ -85920,7 +86047,6 @@ lcx.cc, 1 lcy.cat, 1 lcy.moe, 1 -lda-design.co.uk, 1 ldcraft.pw, 1 lddr.io, 1 ldfebui.org, 1 @@ -85974,8 +86100,8 @@ leadbook.ru, 1 leadbox.cz, 1 leadcalyx.com, 1 +leadcubs.com, 1 leader.co.jp, 1 -leader.net, 1 leaderbg.net, 1 leadercreative.ga, 1 leaderfox.cz, 1 @@ -86048,7 +86174,6 @@ leantinebastiaans.nl, 1 leantis.be, 1 leaodarodesia.com.br, 1 -leapandjump.co.uk, 1 leapday.us, 1 leapevent.tech, 1 leapiqacademy.com, 1 @@ -86293,7 +86418,6 @@ leetcode.net, 1 leetizia.net, 1 leetsuliangkkproduction.tk, 1 -leeuwarden.nl, 1 leevealdc.com, 1 leeyoungaeph.tk, 1 lefaivre-ferry.ca, 1 @@ -86341,7 +86465,6 @@ legal-eye.com, 1 legalagenda.ga, 1 legalanchor.ga, 1 -legalatlanta.com, 1 legalatlantic.ga, 1 legalbeagles.info, 1 legalbeast.ga, 1 @@ -86402,7 +86525,6 @@ legalphase.ga, 1 legalpicker.ga, 1 legalpickup.ga, 1 -legalplace.fr, 1 legalplatinum.ga, 1 legalpremier.ga, 1 legalprestige.ga, 1 @@ -86465,7 +86587,6 @@ legions.tk, 1 legionwood.tk, 1 legiscontabilidade.com.br, 1 -legislationupdateservice.co.uk, 1 legislativedistricts.com, 0 legit.nz, 1 legitcorp.com, 1 @@ -86495,6 +86616,7 @@ leher-gz.de, 1 lehifibernetwork.gov, 1 lehighcountypa.gov, 1 +lehighvalleydairy.com, 1 lehmanns.de, 1 lehmitz-weinstuben.de, 1 lehnc.ddns.net, 1 @@ -86571,6 +86693,7 @@ leleimports.store, 1 leleviagens.com.br, 1 leliekerk.nl, 1 +lelika.se, 1 leliveld.nl, 1 leliveld.org, 1 lellek.at, 1 @@ -86642,7 +86765,7 @@ lendinvest.com, 1 lendme.au, 1 lendme.com.au, 1 -lendme.dk, 1 +lendme.dk, 0 lendme.net.au, 1 lenemes.tk, 1 lenergietoutcompris.fr, 1 @@ -86690,6 +86813,7 @@ lenseshop.tk, 1 lensfiyat.com, 1 lensflair.studio, 1 +lensonline.in, 1 lenstore.co.uk, 1 lensual.space, 0 lenta-ru.tk, 1 @@ -86708,6 +86832,7 @@ leo-deville.fr, 1 leo-music.tk, 1 leo.gov, 1 +leoai.cloud, 1 leoandpeto.com, 1 leob.in, 0 leocollo.com, 1 @@ -86813,6 +86938,7 @@ lerku.com, 1 lerm.nl, 1 lermer.nl, 1 +lermf.org, 1 lernenamsee.ch, 1 lernerspersonalinjury.ca, 0 lernorteuropa.com, 1 @@ -86858,6 +86984,7 @@ lescommunes.com, 1 lescomptoirsdepierrot.com, 1 lesconcours.tk, 1 +lescoquetteriesdenais.fr, 1 lescrapdesfilles.fr, 1 lescrieursduweb.com, 1 lesdelicesdeloris.fr, 1 @@ -86941,10 +87068,8 @@ leticia.com.tw, 1 leticia.ml, 1 letiloulous.fr, 1 -letinsys.cz, 1 letipweb.tk, 1 letitfleet.io, 1 -letitq.com, 1 letmepost.com, 1 letnik.tk, 1 leto12.xyz, 0 @@ -86970,6 +87095,7 @@ letscahoot.net, 1 letscleanlaundry.in, 1 letsclimact.com, 1 +letscom.it, 1 letscrackit.ml, 1 letsdebug.net, 1 letsdevelop.com.br, 1 @@ -87015,7 +87141,6 @@ letturaveloce.tk, 1 letustravel.tk, 1 letvikar.dk, 1 -letweedoo.com, 1 letwithpuffin.co.uk, 1 letwork.be, 1 letwork.de, 1 @@ -87040,7 +87165,7 @@ levanscatering.com, 1 levantage.tk, 1 levaquin750.ga, 1 -levati.name, 0 +levati.name, 1 leveeroadstudio.com, 1 level-assist.com, 1 level-assist.de, 1 @@ -87049,6 +87174,7 @@ level4.parts, 1 level6.me, 1 levelaccordingly.com, 1 +levelfit.ai, 1 levelninehvac.com, 1 leveloneproject.org, 1 levelrankings.com, 1 @@ -87125,6 +87251,7 @@ lexdigital.pl, 1 lexe.club, 1 lexeri.com, 1 +lexgeneris.com, 1 lexgo.be, 1 lexgo.lu, 1 lexico.pt, 1 @@ -87132,7 +87259,6 @@ lexicore.ga, 1 lexifax.ga, 1 lexikon24.tk, 1 -lexilala.org, 1 lexington-credit-repair.com, 1 lexingtonil.gov, 1 lexingtonok.gov, 1 @@ -87144,6 +87270,7 @@ lexita.lt, 1 lexitthemovie.tk, 1 lexjunkie.xyz, 1 +lexlens.io, 1 lexmedia.ro, 1 lexmondcommunications.com, 1 lexopen.dk, 1 @@ -87168,6 +87295,7 @@ lexway.pk, 1 leyaonline.com, 1 leybelsgarden.cf, 1 +leyden.pl, 1 leyendaluzrenacer.com, 1 leyeslaboralesdecolorado.gov, 1 leyfutmex.com, 1 @@ -87185,7 +87313,6 @@ lfcnsv.de, 1 lff.club, 1 lffweb.ga, 1 -lfg.com.ph, 1 lfgss.com, 1 lfi-mv.de, 0 lfmosqueira.com.br, 1 @@ -87199,8 +87326,8 @@ lg.gz.cn, 1 lg0.site, 1 lg2.com, 1 +lgads.tv, 1 lgbt-colleges.com, 1 -lgbt.io, 1 lgbt.ventures, 1 lgbtqcolorado.org, 1 lgbtqtherapyspace.com, 1 @@ -87263,6 +87390,7 @@ liam-is-a-nig.ga, 1 liam-le-may.fr, 1 liam-w.io, 1 +liamatch.se, 1 liambaron.com, 1 liamelliott.me, 1 liamlin.me, 1 @@ -87320,13 +87448,11 @@ liberation2020.com, 1 liberationgroup.com, 1 liberationtek.com, 0 -liberatospizza.com, 1 liberatupotencial.site, 1 liberda.nl, 1 liberdademg.com.br, 1 liberecstehovani.cz, 1 libermoto.fr, 1 -liberr.com, 1 liberta-me.org, 1 libertacao.tk, 1 libertadgreen.tk, 1 @@ -87354,7 +87480,6 @@ libertyland.tk, 1 libertylondon.com, 1 libertymedia.com, 1 -libertyreversemortgage.com, 1 libertyrxpharmacy.com, 1 libertystation.com, 1 libertytereconoce.com, 1 @@ -87397,7 +87522,6 @@ librarytapes.tk, 1 librarytools.com, 1 libravatar.org, 1 -librazy.org, 1 libre-innovation.org, 1 libre.cr, 1 libre.net.au, 1 @@ -87413,7 +87537,6 @@ libreho.st, 1 librelamp.com, 1 libremail.nl, 1 -librematrix.com, 1 librends.org, 1 libreofficefromcollabora.com, 1 libreplanet.org, 1 @@ -87487,13 +87610,13 @@ lidarwindtechnolog.ga, 1 lidaumba.com, 1 lidavidm.me, 1 +lide.cz, 1 lide.eu, 1 lidel.org, 1 lidepla.com, 1 lidernaturascarlettbados.com, 1 liderok.tk, 1 liderzyprawa.pl, 1 -lidhedredovisning.se, 1 lidkoping.se, 1 lidl-gewinnspiel.de, 1 lidl-holidays.com, 1 @@ -87555,9 +87678,8 @@ lifeaz.co, 1 lifeball.org, 1 lifebymargot.co.uk, 1 -lifecare.org, 1 lifecelebrated.org, 1 -lifecheq.co.za, 1 +lifecheq.co.za, 0 lifecism.com, 1 lifecoach.tw, 1 lifecoachroel.nl, 1 @@ -87565,6 +87687,7 @@ lifecoresystems.com, 1 lifecraft.cf, 1 lifecreator.cn, 1 +lifecycle-gmbh.com, 1 lifedrops.com.au, 1 lifegoesonsojustsmile.tk, 1 lifehacker.com, 1 @@ -87602,6 +87725,7 @@ lifeofpromotion.com, 1 lifepathdoc.com, 1 lifepathpsychiatry.com, 1 +lifeproject.org, 1 liferay.com, 1 lifesaverhindi.tk, 1 lifesciencedynamics.com, 1 @@ -87636,6 +87760,7 @@ lifewithdyna.com, 1 lifexpert.tk, 1 lifexue.com, 1 +liffin.com, 1 lift-world.info, 1 lift.hr, 1 liftagacademy.com, 1 @@ -87645,12 +87770,12 @@ liftie.info, 1 liftmind.ai, 1 lig.ink, 0 -liga.am, 1 liga.ng, 1 liga99.tk, 1 ligacontrachetos.tk, 1 ligadegamers.com, 1 ligadosgames.com, 1 +ligalt.ru, 1 ligand-research.com, 1 ligare-fp.com, 1 ligaro.nl, 1 @@ -87665,10 +87790,6 @@ lighthouseglobal.com, 1 lighthouseguild.org, 0 lighthousepointfl.gov, 1 -lightingagoura.com, 1 -lightingcalabasas.com, 1 -lightinghiddenhills.com, 1 -lightingnewburypark.com, 1 lightingpacificpalisades.com, 1 lightman.cz, 1 lightme.us, 1 @@ -87795,7 +87916,6 @@ lilstarry.com, 1 lilth.moe, 1 liltv.media, 1 -lilula-web.jp, 1 liluna.nl, 0 lily-bearing.com, 1 lily-inn.com, 1 @@ -87902,7 +88022,6 @@ lincolncountysheriffok.gov, 1 lincolncountytn.gov, 1 lincolncountywy.gov, 1 -lincolnfinewines.com, 1 lincolnil.gov, 1 lincolnimps.tk, 1 lincolnmoneyman.com, 1 @@ -87915,7 +88034,6 @@ lincolnzoo.org, 1 lind-bohanon.org, 1 lindadetmayer.com, 1 -lindajahn.de, 1 lindakloenreizen.nl, 0 lindalap.fi, 1 lindalush.net, 1 @@ -87978,7 +88096,6 @@ lineto.com, 1 linext.cn, 0 linfamilygc.com, 1 -linge-ma.ro, 1 lingerie-coquine.fr, 1 lingerie.com.br, 1 lingeriebym.nl, 1 @@ -88038,6 +88155,7 @@ linkbooks.ga, 1 linkborn.com, 1 linkcat.tk, 1 +linkcodegenerator.com, 1 linkdesign.tk, 1 linkdolar.tk, 1 linkdr.uk, 1 @@ -88143,7 +88261,7 @@ linpx.com, 0 linqapp.com, 1 linqhost.nl, 1 -linserto.it, 0 +linserto.it, 1 linss.com, 1 linss.com.cn, 1 linss.name, 1 @@ -88285,7 +88403,6 @@ liqwid.finance, 1 lirelesgens.com, 1 liress.gq, 1 -liri.ie, 1 lirico.ca, 1 lirion.de, 1 lirlandais.ch, 0 @@ -88348,6 +88465,7 @@ listapp.uz, 1 listclue.com, 1 listcraft.top, 1 +liste-mtm.de, 1 listekdo.fr, 1 listelist.com, 1 listen.dk, 1 @@ -88403,7 +88521,6 @@ litebooks.gq, 1 litecache.de, 1 litecloud.ml, 1 -litecoinnews.club, 1 litehost24.tk, 1 litemind.com, 0 liteminer.cf, 1 @@ -88461,7 +88578,6 @@ littlecash.com, 1 littlecompton.gov, 1 littlecourtcottages.com, 1 -littlecreekhosting.com, 1 littledev.nl, 0 littleduck.xyz, 1 littlefairy.no, 1 @@ -88503,6 +88619,7 @@ littlesteve.es, 1 littletigerchinese.com, 1 littlewatcher.com, 1 +littlewoodcreations.com, 1 littleyokohamakennel.tk, 1 liturgical.net, 1 liturkey.tk, 1 @@ -88522,7 +88639,6 @@ liuliuya.com.tw, 1 liulo.cf, 1 liups.net, 1 -liuq.org, 1 liuqiao.best, 1 liuqiao.cf, 1 liuqiao.eu.org, 1 @@ -88597,11 +88713,13 @@ livelifewithintent.com, 1 livelifewithstyle.com, 1 livelink.tk, 1 +livelog.dk, 1 livelong.tk, 1 livelonglife.tk, 1 livelovelaughlg.com, 1 liveman.dk, 1 livemomentum.ml, 1 +livemusikband.de, 1 livenewsrussia.tk, 1 liventocoin.com, 1 livenutriwell.com, 1 @@ -88626,10 +88744,12 @@ livesimply.me, 1 liveskype.com, 1 livesportts.ml, 1 +livespot.se, 1 livestep.ai, 1 livestep.one, 1 livestone.tk, 1 livestrana.tk, 1 +livetagus.pt, 1 liveteachers.in, 1 livetec.show, 1 livetilesglobal.com, 1 @@ -88729,6 +88849,7 @@ ljskatt.no, 1 ljubescica.hr, 1 ljungabolet.se, 1 +ljusdalsnaprapatklinik.se, 1 ljusnarsberg.se, 1 ljw.me, 1 lk-hardware.cz, 0 @@ -88740,7 +88861,6 @@ lklyrics.com, 1 lkmt.us, 1 lknw.de, 1 -lkobiz.in, 1 lkp111138.me, 1 lksoft.cz, 1 lkw-faehren-buchen.de, 1 @@ -88796,7 +88916,12 @@ lmrcouncil.gov, 1 lmsal.com, 1 lmsaura.com.br, 1 +lmsvisao.com.br, 1 +lmsvisaocontabilidade.com.br, 1 lmsvisaoimoveis.com.br, 1 +lmsvisaomotos.com.br, 1 +lmsvisaoseguros.com.br, 1 +lmsvisaotecnologia.com.br, 1 lmtls.me, 1 lmtravis.com, 1 lmvsci.gov, 1 @@ -88837,7 +88962,6 @@ loadninja.com, 1 loador.com, 1 loadover.me, 1 -loadui.org, 1 loadwallet.com, 1 loafhead.me, 1 loan-lenders.co.za, 1 @@ -88893,6 +89017,7 @@ localhandyman.work, 1 localhero.biz, 1 localhorst.duckdns.org, 0 +localisedseo.uk, 1 localiza.io, 1 localized.tk, 1 localizejs.com, 1 @@ -88988,7 +89113,6 @@ locksmithforcarshoustontx.com, 1 locksmithgarland-tx.com, 1 locksmithglenvista.co.za, 1 -locksmithgrapevinetx.com, 1 locksmithhillcrest.co.za, 1 locksmithlivoniami.com, 1 locksmithmadisonheights.com, 1 @@ -89047,7 +89171,6 @@ lofimusicradio.com, 1 lofirmo.com, 1 lofisimplify.com.au, 1 -loforo.com, 1 loft.com.br, 1 lofttravel.com, 1 loftyideas.ml, 1 @@ -89076,7 +89199,6 @@ logansfuneralhome.com, 1 logart.tk, 1 logate.com, 1 -logay.com.br, 1 logbook.ch, 1 logcat.info, 0 logdoc.tk, 1 @@ -89087,6 +89209,7 @@ logfile.ch, 1 logfro.de, 1 logfurnitureplace.com, 1 +logic-puzzles.co.uk, 1 logic8.ml, 1 logical-invest.com, 1 logicalis.com, 1 @@ -89151,6 +89274,7 @@ logoenvue.fr, 1 logoesun.com, 1 logofiyati.com, 1 +logoglo.com, 1 logolabben.cf, 1 logolando.tk, 1 logomarket.jp, 1 @@ -89184,7 +89308,6 @@ loheprobado.com, 1 lohkoketju.fi, 1 lohmeyer.cc, 1 -lohnsteuerhilfe-essen.de, 1 lohnsteuerhilfe.net, 1 lohocla.org, 1 lohr.me, 1 @@ -89318,6 +89441,7 @@ lolnews.ga, 1 lolnews.tk, 1 lolo17.com, 1 +lolroms.com, 1 lols.gg, 1 lolware.net, 1 lolyoureallyscannedthisqrcodegeniusthatssketchy.de, 1 @@ -89363,7 +89487,6 @@ londonnorthwesternrailway.co.uk, 1 londonpropertymatch.com, 1 londonschool.mx, 1 -londonseedcentre.co.uk, 1 londonsoccer.tk, 1 londontrivia.gq, 1 londontwpmi.gov, 1 @@ -89384,13 +89507,7 @@ lonewolftech.ga, 1 long-journey.com, 1 long-stories-short.org, 1 -long0311.com, 1 -long0317.com, 1 long0318.com, 1 -long0355.com, 1 -long0398.com, 1 -long0536.com, 1 -long0538.com, 1 long0555.com, 1 long0556.com, 1 long0728.com, 1 @@ -89401,7 +89518,6 @@ long0898.com, 1 long0976.com, 1 long0999.com, 1 -long100.vip, 1 long266.com, 1 long68.net, 0 long688.com, 0 @@ -89444,7 +89560,6 @@ longmontnetworking.com, 1 longmontwaterheaters.com, 1 longpaddock.qld.gov.au, 1 -longportpd.org, 1 longstride.net, 1 longtermcare.gov, 1 longtermrentalsportugal.com, 1 @@ -89488,6 +89603,7 @@ loop.com, 0 loop.us, 1 loopback.kr, 1 +loopclubapp.com, 1 loopcore.de, 1 loopgolf.co, 0 loophq.com, 1 @@ -89495,13 +89611,13 @@ loopingz.com, 1 loopkey.com.br, 0 loopool.tk, 1 -loopseque.com, 1 looseleafsecurity.com, 1 lootboy.com, 1 lootboy.de, 1 lootdog.io, 1 loothole.com, 1 lootlemon.com, 1 +lootrix.live, 1 loots.eu, 1 lootstudios.com, 0 loottitan.com, 1 @@ -89527,6 +89643,7 @@ loquo.com, 1 loqyu.co, 1 lor.kharkov.ua, 1 +lora.bot, 1 loracheadle.com, 1 loraincountyohio.gov, 1 loraincountyrecorder.gov, 1 @@ -89568,6 +89685,7 @@ lorenzocampagna.myqnapcloud.com, 1 lorenzodallaga.com, 1 lorenzodeangelis.tk, 1 +lorenzomassenz.com, 1 lorenzoprinci.com, 1 loreofthenorth.com, 1 loreofthenorth.net, 1 @@ -89651,7 +89769,6 @@ lost-perdidos-hiatus.tk, 1 lost.tf, 1 lostandfound.mu, 1 -lostandfoundmember.com, 1 lostandfoundsoftware.com, 1 lostarkstats.com, 1 lostarq.com, 1 @@ -89707,13 +89824,13 @@ lotoperu.com, 1 lotos-ag.ch, 1 lotrarts.com, 1 -lotro-wiki.com, 1 lotrsketch.com, 1 lotsynergy.com, 1 lottcarey.org, 1 lotteo.com, 1 lotterycodex.com, 1 lotteryking.net, 1 +lottie.rs, 1 lotto.com, 1 lotto.gt, 1 lotto.ht, 1 @@ -89775,7 +89892,6 @@ louisvilleohio.gov, 1 louiza.tk, 1 loujaxx.net, 1 -loukas-stoltz.fr, 1 loukkos.ma, 1 loune.net, 1 loungeballin.org, 1 @@ -89966,6 +90082,7 @@ lptami.gov, 1 lpva.com.au, 1 lqa.org.uk, 1 +lqaa.co.uk, 1 lqd.plus, 1 lqd.pp.ua, 1 lqhi.cn, 1 @@ -89976,7 +90093,6 @@ lra-cloud.de, 1 lra.mt, 1 lrbm.com, 1 -lrc.cn, 1 lrcr.ch, 0 lriese.ch, 1 lrn.com, 1 @@ -90207,6 +90323,7 @@ ludum.pl, 1 ludunwayoo.com, 1 ludwig.im, 1 +ludwiggrill.de, 1 ludwigjohnson.se, 1 ludwigpro.net, 1 luedeke-bremen.eu, 1 @@ -90234,7 +90351,6 @@ luhkultour.de, 1 lui.vn, 1 luigipinedo.com, 1 -luinonotizie.it, 1 luis-portfolio.es, 1 luisa-birkner.de, 1 luisafernandapenuela.com, 1 @@ -90244,6 +90360,7 @@ luisfreire.ml, 1 luisillo.tk, 1 luisjosesaldana.com, 1 +luismandiola.com, 1 luismiguelcolombia.tk, 1 luisnavarrosl.tk, 1 luisnet.tk, 1 @@ -90324,7 +90441,6 @@ luluwoldtravel.com, 1 lumaesthetic.co.uk, 1 lumafestival.com, 1 -lumaistore.com.br, 1 lumalux.it, 1 lumapartners.com, 1 lumapr.com, 1 @@ -90351,6 +90467,7 @@ lumineled.se, 1 lumingze.eu.org, 0 luminia-informatique.fr, 1 +lumintia.fr, 1 lumitop.com, 1 lumixtar.com, 1 lummi-nsn.gov, 1 @@ -90373,6 +90490,8 @@ lunaazulestudio.com, 1 lunaburner.ml, 1 lunaclan.tk, 1 +lunaclo.eu, 1 +lunaclo.nl, 1 lunacraft.ga, 1 lunadea.tk, 1 lunagrill.com, 1 @@ -90470,7 +90589,6 @@ lupusla.org, 1 luqmanacademy.com, 1 luripump.se, 1 -lurishop.com.br, 1 lurkmirror.ml, 1 lusakatimes.com, 1 lusc.ch, 1 @@ -90536,7 +90654,6 @@ luxegram.co, 1 luxehomecompany.com, 1 luxehotels.com, 1 -luxekranen.nl, 1 luxelyhome.com, 1 luxemburgsite.tk, 1 luxereside.com, 1 @@ -90602,7 +90719,6 @@ lv.lk, 1 lv.search.yahoo.com, 0 lv0.it, 0 -lv5.top, 1 lvcservicesplus.com.au, 0 lvcshu.com, 1 lvdgroup-innov8.com, 1 @@ -90697,6 +90813,7 @@ lynwoodca.gov, 1 lynx-webservice.com, 0 lynx.com.au, 1 +lynx.swiss, 1 lynxriskmanager.com, 1 lyodiet.it, 1 lyon-explorateurs.fr, 1 @@ -90752,6 +90869,7 @@ lzzr.me, 1 m-16.ml, 1 m-22.com, 1 +m-a-m.photo, 1 m-ast.de, 1 m-bank.mn, 1 m-beshr.tk, 1 @@ -90818,6 +90936,7 @@ m42-gmbh.de, 1 m426.ch, 1 m4g.ru, 1 +m4ma.com, 1 m4rcus.de, 1 m4rkos.de, 1 m5197.co, 1 @@ -90863,6 +90982,7 @@ maarivpn.com, 1 maarja.edu.ee, 1 maartenderaedemaeker.be, 1 +maasdonk.nl, 1 maaspoortsportsenevents.nl, 1 maasstaddinerexpres.nl, 1 maat.pt, 1 @@ -90877,6 +90997,7 @@ maba.tk, 1 mabankonline.com, 1 mabasketdesecurite.fr, 1 +mabeaufort.com, 1 mabelmartinez.es, 1 mabex-cybercore.de, 1 mabexcybercore.de, 1 @@ -90885,6 +91006,7 @@ mabnn.org, 1 mabnn.ru, 1 mabnn.spb.ru, 1 +mabookhay.com, 1 mabra.com, 1 mabrav.ro, 1 mabusalah.tk, 1 @@ -90950,7 +91072,6 @@ macil.tech, 1 macinyasha.net, 1 macioszektv.eu, 1 -mack.im, 1 mack.space, 1 mackanz.tk, 1 mackenziedatastream.ca, 1 @@ -90978,6 +91099,7 @@ maconnerie-dcs.ch, 1 maconqc.com, 0 macontec.com, 1 +macosdb.com, 1 macosx86.ml, 1 macoupincountypdil.gov, 1 macoupinvotes.gov, 1 @@ -91005,9 +91127,7 @@ macsonuclari.com.tr, 1 macsonuclari.mobi, 1 macssupersonicwash.com, 1 -macstore-shop.fr, 1 macvcure.com, 1 -macvidcards.eu, 1 mad-eye.com, 0 mad.es, 1 mad4marketing.com, 1 @@ -91097,7 +91217,6 @@ madmaxstore.it, 1 madmbrasil.com.br, 1 madmoizelle.com, 1 -madnetwork.org, 1 madobe.tk, 1 madokami.net, 1 madokami.pw, 1 @@ -91217,7 +91336,6 @@ magazinedabeleza.net, 1 magazinedotreino.com.br, 1 magazinefeminina.com.br, 1 -magazinhaberajansi.com, 1 magazinhaberi.tk, 1 magazone.cf, 1 magazone.gq, 1 @@ -91249,7 +91367,7 @@ mager.org, 1 magesaigon.com, 1 magescobd.com, 1 -magesy.blog, 0 +magesy.blog, 1 magesypro.com, 1 magewell.nl, 1 maggianos.com, 1 @@ -91277,6 +91395,7 @@ magicball.ga, 1 magicbar.tk, 1 magicbeanschool.com, 1 +magicbox-cleaning.co.uk, 1 magicboxint.com, 1 magicbroccoli.de, 0 magiccardbuyer.eu, 1 @@ -91300,6 +91419,7 @@ magicpet.com, 1 magicpill.com.au, 1 magicpin.in, 1 +magicport.ai, 1 magicsms.pl, 1 magicspaceninjapirates.de, 1 magictable.com, 1 @@ -91352,6 +91472,7 @@ magnetvpn.com, 1 magniezetassocies.fr, 1 magnific.tk, 1 +magnifiscent.com, 1 magniflood.com, 1 magnisgroup.eu, 1 magnit-akciya.tk, 1 @@ -91364,12 +91485,12 @@ magnoliaglobal.com, 1 magnoliaicecream.com.sg, 1 magnoliaicecreamth.com, 1 +magnoliamilk.com.sg, 1 magnoliawi.gov, 1 magnoric.com, 1 magnosautos.ng, 1 magnumsol.ru, 1 magnunbaterias.com.br, 1 -magnusdemant.ch, 1 magnusfulton.com, 1 magnusj.net, 1 magnuspro.cz, 1 @@ -91436,7 +91557,6 @@ mahorka.tk, 1 mahou-sanmiguel.com, 1 mahtabichat.ml, 1 -mahurivaishya.co.in, 1 mahurivaishya.com, 1 mai.ru, 1 maiaimobiliare.ro, 1 @@ -91485,7 +91605,6 @@ mail4you.in, 1 mailbase.cf, 1 mailbot.sh, 1 -mailbox.mg, 1 mailbox.org, 1 mailboy.ml, 1 mailboy.tk, 1 @@ -91573,9 +91692,8 @@ mainstreetauto.com, 1 maintainyourwebsite.help, 1 maintenance-traceur-hp.fr, 1 -maintenancebtp.com, 1 mainzbiomed.com, 1 -mainzelmaennchen.net, 1 +mainzelmaennchen.net, 0 mainzer-allerlei.de, 1 maioresemelhores.com, 1 mair.best, 1 @@ -91605,6 +91723,7 @@ maison-coutin.com, 1 maison-du-mineur.com, 1 maison-eureka.fr, 1 +maison2com-event.fr, 1 maisondelafigue.com, 1 maisondepax.com, 1 maisondidon.com, 1 @@ -91615,6 +91734,7 @@ maisonstpaul.fr, 1 maisonwow.fr, 1 maisproduzida.com.br, 1 +maisterwerk.ai, 1 maitemerino.net, 1 maitheme.com, 1 maiti.info, 1 @@ -91631,7 +91751,6 @@ majahesjedal.no, 1 majahoidja.ee, 1 majalahka.com, 1 -majalahponsel.org, 1 majalmirasol.com, 1 majameer.com, 1 majavucic.com, 1 @@ -91675,7 +91794,6 @@ makeacrowd.eu, 1 makeagif.com, 1 makeaoffice.nl, 1 -makecar.com.ua, 1 makechanges.com.au, 1 makecheez.com, 1 makecity.cz, 1 @@ -91690,7 +91808,9 @@ makeitsimple.pt, 1 makejustice.work, 1 makejusticework.org.uk, 1 +makeleap.io, 1 makelindazi.com, 1 +makellos-kosmetik.de, 1 makelpunt.nl, 1 makemejob.com, 1 makemillion.tk, 1 @@ -91715,7 +91835,6 @@ makertown.jp, 1 makesenseofdata.co.uk, 1 maketheconnection.net, 1 -maketodiet.com, 1 makeupevelinua.cf, 1 makeupevelinua.ga, 1 makeupillusion.com, 1 @@ -91769,7 +91888,6 @@ malachiteauth.com, 1 maladie-autoimmune.fr, 1 malafidezoeker.nl, 1 -malagabaterias.com, 1 malagarental.com, 1 malahov.tk, 1 malakye.com, 1 @@ -91876,6 +91994,7 @@ mallgastronomico.com.ar, 1 mallhabana.com, 1 mallonline.com.br, 1 +mallorca-csc.com, 1 mallorca.tk, 1 mallorca2024.com, 1 mallpass.ga, 1 @@ -91891,6 +92010,7 @@ malsignature.com, 1 malta-firma.com, 1 maltarugs.com, 1 +maltasgarage.com, 1 maltasite.tk, 1 maltaultrastifo.tk, 1 malte.gg, 1 @@ -91925,7 +92045,6 @@ mamasday.org, 1 mamasguiderecipes.com, 1 mamasorganizedchaos.com, 1 -mamastyle.store, 0 mamaxi.org, 1 mamaznaet.ml, 1 mamazzoop.com, 1 @@ -91944,6 +92063,7 @@ mammaklader.tk, 1 mammal-taxonomy.tk, 1 mammals.net, 1 +mammam.vn, 1 mammooc.org, 1 mammothimaging.com, 1 mammothlakesmls.net, 1 @@ -91969,7 +92089,6 @@ manaenergija.lv, 1 manage.cm, 1 manage.com, 0 -managed-it.africa, 1 managed-it.co.za, 1 managed-service-provider.co.uk, 1 managededv.ch, 1 @@ -92086,7 +92205,6 @@ maniacoland.com, 1 maniadicane.com.br, 0 maniainc.com, 1 -maniaiti.nz, 1 manial4d2.ml, 1 maniazul.tk, 1 manicbouncycastles.co.uk, 1 @@ -92105,7 +92223,6 @@ manimatter.ch, 1 maniorpedi.com, 1 maniosglass.gr, 1 -manipil.ch, 0 manisahaberleri.tk, 1 manitasavila.com, 1 manitbd.com, 0 @@ -92120,13 +92237,11 @@ manitoulinglobalforwarding.com, 1 manitoulinglobalforwarding.mx, 1 manitoulingolf.com, 1 -manitoulingroup.com, 1 manitoulinheavyhaul.ca, 1 manitoulinheavyhaul.com, 1 manitoulinlogistics.ca, 1 manitoulintransport.ca, 1 manitoulintransport.co, 1 -manitoulintransport.com, 1 manitoulintransport.info, 1 manitoulintransport.net, 1 manitoulinusedequipment.ca, 1 @@ -92137,7 +92252,6 @@ manitowocwi.gov, 1 manja-und-martin.de, 1 manjalcouture.com, 1 -manju.org.uk, 1 mankato-mn.gov, 1 mankatomn.gov, 1 mankier.com, 1 @@ -92155,6 +92269,7 @@ manningtreetilesandflooring.co.uk, 1 mannnen.nl, 1 mannservrice.cf, 1 +manny.lk, 1 mano.tours, 1 manoa.ar, 1 manobankas.lt, 1 @@ -92170,10 +92285,10 @@ manorhousecapital.com, 1 manoro.de, 1 manortx.gov, 1 -manova.cz, 1 manowarus.com, 1 manporn.xxx, 1 manpro.systems, 1 +manprojects.co.uk, 1 mansage.com, 1 mansarda-life.net, 1 mansdell.net, 1 @@ -92198,7 +92313,6 @@ mantenimientodeinstalacioneselectricas.es, 1 mantenimientoimpresoras.com, 1 mantenimientosenjardineriaypiscinasveracruz.com, 1 -mantenimientoweb.io, 1 mantex.ml, 1 manti.by, 1 manticore-projects.com, 1 @@ -92303,7 +92417,7 @@ mapchange.org, 1 mapduce.com, 1 mapdump.com, 1 -mapgear.nl, 1 +mapgear.nl, 0 mapillary.com, 1 maplebgm.cc, 1 maplegrove.cf, 1 @@ -92335,9 +92449,7 @@ maqcampo.com.br, 1 maqnelson.com.br, 1 maqnelsonagricola.com.br, 1 -maqnelsondrones.com.br, 1 maqnelsonempreendimentos.com.br, 1 -maqnelsonirrigacao.com.br, 1 maqnelsonseguros.com.br, 1 maqs.tk, 1 maquena.org, 1 @@ -92445,7 +92557,6 @@ marco-hegenberg.net, 1 marco-reitmeier.de, 1 marco-s.net, 1 -marco-stankowitz.de, 1 marco-ziesing.de, 1 marcoaurelio.tk, 1 marcocerulliconsulting.com, 1 @@ -92681,6 +92792,7 @@ markant-online.de, 1 markantalyamasajsalonu-bayanmasoz-cim.cf, 1 markaps.com, 1 +markayorumlari.com, 1 markco.fi, 1 markdain.net, 1 markdixon.name, 1 @@ -92691,7 +92803,6 @@ markenzapatent.com, 1 markermatic.com, 1 market-garden.tk, 1 -market-money.ru, 1 market.android.com, 1 market.us, 1 marketbar.ie, 1 @@ -92708,6 +92819,7 @@ marketing-2.de, 1 marketing-advertising.eu, 1 marketing-boerse.de, 1 +marketing-extender.com, 1 marketing1-0-1.com, 1 marketing4trends.com, 1 marketinganalytics.africa, 1 @@ -92738,11 +92850,9 @@ marketone.com, 1 marketplace.tf, 1 marketplacetue.nl, 1 -marketresearch.biz, 1 marketsearch.ga, 1 marketsnerd.com, 1 marketsosyali.tk, 1 -markettailor.io, 0 marketvalue.gq, 1 marketvolume.com, 1 marketyourcup.com, 1 @@ -92779,6 +92889,7 @@ markoheijnen.com, 1 markopool.ru, 1 markov.com.ru, 1 +markov.money, 1 markovonline.ru, 1 markovowest.bg, 1 markpostmanrenovations.ca, 1 @@ -92806,7 +92917,6 @@ marktguru.at, 1 marktguru.de, 1 markthisforme.com, 1 -marktindex.ch, 1 markturner.net, 1 markup-ua.com, 1 markus-blog.de, 1 @@ -92876,7 +92986,6 @@ marpa-wohnen.de, 1 marqlet.com, 1 marqperso.ch, 1 -marquardtgames.com, 1 marquee.tv, 1 marquepersonnelle.ch, 1 marqueswines.co.uk, 1 @@ -92885,6 +92994,7 @@ marquisepools.com, 1 marrakechairporttransfer.com, 1 marrakechauxiliaire.com, 1 +marrakechtourexpert.com, 1 marredesefairebaladersurlenet.com, 1 marretada.org, 1 marriage-shrine.jp, 1 @@ -92937,7 +93047,6 @@ martacooks.com, 1 martagoraca.pl, 1 martcms.com, 1 -martdev.com, 1 martelange.ovh, 1 martelliyaqub.co.nz, 1 martellosecurity.com, 1 @@ -92975,7 +93084,6 @@ martinboerhof.nl, 1 martinbrandt.de, 1 martinbrower.us, 1 -martinbuildingservices.co.uk, 1 martinbykov.eu, 1 martincernac.cz, 1 martincornelissen.tk, 1 @@ -93027,6 +93135,7 @@ martinvillalba.net, 1 martinvillalba.org, 1 martinvotes.gov, 1 +martnlab.com, 1 martonvaro.com, 1 martonveronika.tk, 1 martosaranda.com, 1 @@ -93047,10 +93156,12 @@ marvelcargiveaways.co.uk, 1 marveld.nl, 1 marvellbenefits.cloudaccess.host, 1 +marvelmilk.com, 1 marvelmoviemarathon.com, 1 marvelo.cf, 1 marvelouspainting.com, 1 marvelweed.ru, 1 +marvilastudios.com, 1 marvin-elsen.com, 1 marvin.com, 0 marvin.is, 1 @@ -93114,11 +93225,11 @@ masaki1684.net, 1 masakigarden.com, 1 masalaband.tk, 1 -masaloku.com.tr, 1 masanke-travel.com, 1 masanteadelavenir.fr, 1 masanunciosimpresos.com, 1 masarik.sh, 1 +masaz-aromaspa.pl, 1 masaze-hanka.cz, 1 masazomiestas.lt, 1 mascarablond.tk, 1 @@ -93133,7 +93244,6 @@ masdr.sa, 1 masduta.co, 1 masdzub.com, 1 -masefieldvets.co.uk, 1 maservant.com, 1 maservant.net, 1 masfloss.net, 1 @@ -93157,6 +93267,7 @@ masiniunelte.store.ro, 1 masinky.tk, 1 masiorama.it, 1 +masjidalbayyinah.org, 1 masjidalnoorwairarapa.co.nz, 1 mask-skin.tk, 1 maskamuse.com, 1 @@ -93173,6 +93284,7 @@ maslow.tk, 1 masmusica.tk, 1 masmusicaradio.tk, 1 +masno3.com, 1 maso-corto.com, 1 masob.site, 1 masoftware.ddns.net, 1 @@ -93219,7 +93331,7 @@ massarbsettlement.com, 1 massauditor.gov, 1 massazh.cf, 1 -massbank.eu, 1 +massbank.eu, 0 massconsultores.com, 1 masse.org, 1 masshelpline.com, 1 @@ -93298,6 +93410,8 @@ mastersofscale.com, 1 mastersplace.tk, 1 masterstation.net, 1 +mastersteps.com, 1 +mastersthesiswriting.com, 1 masterstouch.co.za, 1 masterstruckingacademy.com, 1 mastertent.com, 1 @@ -93310,7 +93424,7 @@ mastips.cl, 1 mastodon-poradnik.pl, 1 mastodon.au, 1 -mastodon.blue, 0 +mastodon.blue, 1 mastodon.com.pl, 1 mastodon.cr, 1 mastodon.ee, 1 @@ -93320,6 +93434,7 @@ mastodon.uno, 1 mastodont.tk, 1 mastpartners.com, 1 +masturflix.com, 1 masuclub.jp, 1 masuclub.net, 1 masumitsu.jp, 1 @@ -93355,7 +93470,6 @@ matchmove.com, 0 matchmycourse.com, 1 matchory.com, 1 -matchpointusa.com, 1 matconnolley.com, 1 mate.academy, 1 mate.software, 1 @@ -93417,7 +93531,6 @@ matheo-schefczyk.de, 1 mathers.ovh, 1 mathes.berlin, 1 -mathesongas.com, 0 mathesonsteplock.ca, 1 matheusmacedo.ddns.net, 1 mathewlane.com, 1 @@ -93499,7 +93612,6 @@ matrixeditora.com.br, 1 matrixengineered.com, 1 matrixfm.tk, 1 -matrixhealthcare.ca, 1 matrixinternet.ie, 1 matrixmedia.ro, 1 matrixmold.com, 1 @@ -93550,7 +93662,6 @@ mattersource.com, 1 mattessons.co.uk, 1 mattferderer.com, 1 -mattfin.ch, 1 mattg.ca, 1 mattga.ca, 1 mattgemmell.com, 1 @@ -93642,7 +93753,6 @@ matts.systems, 1 matts.world, 1 mattshi.com, 1 -mattslack.me, 1 mattsmissionblog.com, 1 mattstanbrell.com, 1 mattsvensson.com, 1 @@ -93703,7 +93813,6 @@ mauriciosilva.tk, 1 mauriciotoussaint.tk, 1 mauriciotoussaintarte.tk, 1 -maurinet.com, 1 mauritius-luxuryestate.com, 1 mauritsverelst.com, 1 mauriziofaldi.com, 1 @@ -93771,6 +93880,7 @@ maxb.fm, 1 maxbeton.fr, 1 maxbike.tk, 1 +maxboehme.net, 1 maxboobs.com, 1 maxbruckner.de, 1 maxbruckner.org, 1 @@ -93862,6 +93972,7 @@ maxrickettsuy.com, 1 maxrider.tk, 1 maxroganov.tk, 1 +maxs.com, 1 maxschleiffer.com, 1 maxthoene.de, 1 maxtire.com, 1 @@ -93939,6 +94050,7 @@ maze.com.br, 1 maze.fr, 0 mazepa.ml, 1 +mazer.world, 1 mazet-machines-a-coudre.fr, 1 mazhab.tk, 1 mazik.tk, 1 @@ -94046,7 +94158,7 @@ mccn.pp.ua, 1 mccom.at, 1 mccommando.tk, 1 -mcconciergerie.com, 1 +mcconciergerie.com, 0 mcconecountymt.gov, 1 mccordscvs.com, 1 mccreadylaw.com, 1 @@ -94303,6 +94415,7 @@ meacsports.com, 1 meadowfen.farm, 1 meadowfenfarm.com, 1 +meadowgolddairy.com, 1 meadowmere.com, 1 meadowviewfarms.org, 1 meadvillems.gov, 1 @@ -94399,7 +94512,6 @@ mec0758.com, 1 mec0763.com, 1 mec0772.com, 1 -mec0773.com, 0 mec0774.com, 1 mec0776.com, 1 mec0778.com, 1 @@ -94500,12 +94612,14 @@ mectilde.info, 1 mecu.com, 1 med-colleges.com, 1 +med-fine.com, 1 med-flex.com, 1 med-line.cf, 1 med-metrix.com, 0 med-nagoya-neurosurgery.jp, 1 med-spravca.ml, 1 med.aid.pl, 1 +med.de, 1 meda.bg, 1 medaboutme.ru, 1 medadacademy.com, 1 @@ -94538,7 +94652,7 @@ medec.ec, 1 medecinesalternatives-developpementspirituelcreatif.com, 1 medeem.gov.ae, 1 -medefield.com, 1 +medefield.com, 0 medeinos.lt, 0 medelement.com, 1 medellinencanciones.tk, 1 @@ -94546,6 +94660,7 @@ medfind.link, 1 medfordoregon.gov, 1 medfordwi.gov, 1 +medgenome.com, 1 medgetech.com, 1 medguide-bg.com, 1 medgyd.lt, 0 @@ -94631,6 +94746,7 @@ mediastroke.com, 1 mediataput.ga, 1 mediathekview.de, 0 +mediation-mv.de, 1 mediationculturelleclp.ch, 0 mediationwithmeg.com, 1 mediatrust.org, 1 @@ -94702,14 +94818,13 @@ medicm.jp, 1 medicompany.tk, 1 medictools.de, 1 -medicus.ai, 1 +medicus.ai, 0 medidata.co.nz, 1 medidordehumedad.online, 1 mediengestalter-website.de, 1 medienhelden.de, 1 medienkern.de, 1 medienweite.de, 1 -medievalexpert.com, 1 medifit.si, 1 medifoto.tk, 1 medify.id, 1 @@ -94723,9 +94838,9 @@ medinacountyohio.gov, 1 medinaelst.nl, 1 medinc.tk, 1 +mediniti.com, 0 medino.com, 1 medinorte.es, 1 -medipaw.com, 0 mediro-ict.co.za, 1 medirota.com, 1 medisca.com, 1 @@ -94833,7 +94948,7 @@ meerdialog.de, 1 meereskunst.de, 1 meerman.nl, 0 -meerpadel.nl, 1 +meerpadel.nl, 0 meesteresmisty.nl, 1 meestgesteldevragen.com, 1 meet, 1 @@ -94847,6 +94962,8 @@ meetfriends.tk, 1 meetgeek.ai, 0 meeting-server.ml, 1 +meetingsurvivors.org, 1 +meetingvotes.com, 1 meetjeslandsetriathlon.tk, 1 meetmaps.com, 1 meetmarlo.com, 1 @@ -94896,7 +95013,6 @@ megagifs.de, 1 megaherz.tk, 1 megahobby.jp, 1 -megahost.xyz, 1 megahostingbr.tk, 1 megahouse.co.jp, 1 megahouseinvest.ru, 1 @@ -95194,7 +95310,6 @@ melinacurves.com, 1 melinamay.net, 1 melini.hu, 1 -melini.rs, 1 melino.com.ua, 1 meliowebweer.nl, 1 melisica.tk, 1 @@ -95246,7 +95361,6 @@ melsungenonline.com, 1 meltdownresearch.com, 1 melted.me, 1 -meltina-hotel.com, 1 melusine.eu, 1 melvillecity.com.au, 1 melvinsfrance.tk, 1 @@ -95274,6 +95388,7 @@ memememememememe.me, 1 memento-mori.cf, 1 memepool.space, 1 +memerushradar.xyz, 1 memes.nz, 1 memetrash.co.uk, 1 memetria.com, 1 @@ -95327,6 +95442,7 @@ menden.com, 1 mendipbouncycastles.co.uk, 1 mendix-apps.com, 1 +mendmemassage.com, 1 mendmybackprogram.com, 0 mendocinocounty.gov, 1 mendonvt.gov, 1 @@ -95404,7 +95520,6 @@ mentalhealthtimes.tk, 1 mentaliya.online, 1 mentalizes.tk, 1 -mentalpage.com, 1 mentalproblems.tk, 1 mentecuriosa.net, 1 menteofficial.com, 1 @@ -95416,10 +95531,12 @@ mentimeter.com, 1 mentionlink.com, 1 mentiq.az, 1 +mentisapp.com.br, 1 mentolo.tk, 1 mentonein.gov, 1 mentor-fit.com, 1 mentor.gov, 1 +mentorcliq.com, 1 mentoringauchan.es, 1 mentorsinchief.com, 1 mentorzografos.gr, 1 @@ -95512,9 +95629,9 @@ mercadopago.com.uy, 1 mercadopago.com.ve, 1 mercadoshops.com, 1 -mercadoshops.com.ar, 1 mercadoshops.com.ve, 1 mercanix.co.uk, 1 +mercanpos.com, 1 mercans.co, 1 mercans.com, 1 mercatino-olomouc.cz, 1 @@ -95522,8 +95639,8 @@ mercatoday.com, 1 mercatoitticosbt.it, 1 mercatotime.com, 1 +mercatus.ro, 1 mercazaragoza.es, 1 -mercdev.com, 1 merceariacentral.com, 1 mercedelectionsca.gov, 1 mercedes-anciennes.fr, 1 @@ -95540,7 +95657,6 @@ merchant-portal.co.kr, 1 merchantaccountsolutions.com, 1 merchstudio.ru, 1 -merck-animal-health.ca, 1 merco.com.au, 1 mercode.eu.org, 1 mercosuleditora.com.br, 1 @@ -95553,6 +95669,7 @@ mercurycards.com, 1 mercuryfinancial.com, 1 mercuryproject.ch, 0 +mercurysecurities.com.my, 1 mercurysquad.tk, 1 mercyseverity.tk, 1 meredithnh.gov, 1 @@ -95607,8 +95724,10 @@ merpay.com, 1 merrettsurvey.com, 1 merrickcountyne.gov, 1 +merricot.co.uk, 1 merrillanwi.gov, 1 merrimacwi.gov, 1 +merry-christmas.co.in, 1 merrychristmas.ml, 1 merryxmas2015.tk, 1 merson.tv, 1 @@ -95666,7 +95785,6 @@ mesotheliomalawfirm-worldwide.tk, 1 mespt.org, 1 mesquitegcd.gov, 1 -mesquitelandscapeservices.com, 1 message-tool.com, 1 messageclient.gq, 1 messagely.com, 1 @@ -95854,10 +95972,8 @@ meticae.com, 1 metiers.ma, 1 metin2.community, 1 -metisengineering.com, 1 metitlesearch.com, 1 metiz.site, 1 -metizsoft.com, 1 metkos.pl, 1 metkov.com.ua, 1 metkovic-news.com, 1 @@ -95868,7 +95984,7 @@ metoperashop.org, 1 metprint.hu, 1 metrahometheater.com, 1 -metreurjob.com, 1 +metriclan.com, 1 metricmutt.com, 1 metrika.ml, 1 metriks.ru, 1 @@ -95937,11 +96053,11 @@ metver.tk, 1 metyweb.ga, 0 metzlerweb.org, 1 +meu-amor.com, 1 meu.re, 0 meubairro360.com.br, 1 meubanco7.com.br, 1 meubebepa.com.br, 1 -meublesrosa.be, 1 meuemby.com, 1 meugamer.com, 1 meugibi.com, 1 @@ -95993,6 +96109,7 @@ meyner.com, 1 meyrawinkel.nl, 0 meys.io, 1 +meyster-vertrieb.de, 1 mezcal.amsterdam, 1 mezedokamomata.tk, 1 meziblog.cz, 1 @@ -96004,6 +96121,7 @@ mezzehuis.be, 1 mf-fischer.de, 1 mf.me, 1 +mfa-in-berlin.de, 1 mfa-inc.com, 1 mfactory.ca, 1 mfamonitor.com, 1 @@ -96025,6 +96143,7 @@ mfldirect.co.uk, 1 mflodin.se, 1 mfmarquesantos.pt, 1 +mfmd.pt, 1 mfoda-eg.com, 1 mforum.com.au, 1 mfrepair.com, 1 @@ -96048,7 +96167,7 @@ mgfgroup.com, 1 mgfgroup.mx, 1 mgfgroup.us, 1 -mgfpatrimoine.com, 1 +mggs.org, 1 mghiorzi.com.ar, 0 mgi.gov, 1 mgi.sh, 1 @@ -96072,6 +96191,7 @@ mgrcred.online, 1 mgriff.id.au, 1 mgroupweb.com, 1 +mgs406.com, 1 mgsdb.com, 1 mgsisk.com, 1 mgtbaas.eu, 1 @@ -96087,7 +96207,7 @@ mhastey.com, 1 mhatlaw.com, 1 mhc.ab.ca, 1 -mhcdesignstudio.com, 1 +mhcdesignstudio.com, 0 mhdit.de, 1 mhealthspot.com, 1 mheistermann.de, 1 @@ -96104,7 +96224,6 @@ mhiler.com, 1 mhilger.de, 1 mhjuma.com, 1 -mhmarket.fr, 1 mhmchauffeurs.co.uk, 1 mhmfoundationrepair.com, 1 mhonline.fr, 1 @@ -96129,6 +96248,7 @@ mi-beratung.de, 1 mi-magia.com, 1 mi-ras.ru, 1 +mi-soul.com, 1 mi.ras.ru, 1 mi1k.cn, 1 mia-manager.dk, 1 @@ -96251,6 +96371,7 @@ michaelloveys.com, 1 michaeln.net, 1 michaelolson.blog, 1 +michaelolson.io, 1 michaelpelletterie.it, 1 michaelpfrommer.de, 1 michaelpfrommer.pub, 1 @@ -96351,7 +96472,6 @@ micra.org.uk, 1 micraftspirits.com, 1 micralite.com, 1 -micrm.vn, 1 micro-credit.tk, 1 microbiologist.tk, 1 microbiologyinfo.com, 1 @@ -96363,7 +96483,6 @@ microcert.cn, 1 microcomploja.com.br, 1 microcosm.com, 1 -microdesic.com, 1 microdesk.com, 1 microdon.org, 1 microdot.fr, 1 @@ -96512,7 +96631,7 @@ migherworld.com, 1 mighit.ml, 1 mightyfive.tk, 1 -mightygadget.com, 1 +mightygadget.com, 0 mightyoakmarketing.ca, 1 mightytext-ios.tk, 1 mightytips.biz, 0 @@ -96546,7 +96665,6 @@ miguelpallardo.tk, 1 miguelquijano.com.co, 1 miguelstreeservices.com, 1 -miguia.tv, 1 mihaelacozma.ro, 0 mihaijoe.fr, 1 mihaiordean.com, 1 @@ -96563,7 +96681,6 @@ mihsislander.org, 1 mihu233.com.cn, 1 miih-kiosk.com, 1 -miikun95.net, 1 miimhort.com, 1 miisy.com, 1 miisy.eu, 1 @@ -96687,7 +96804,6 @@ mikebolynnbuilders.com, 1 mikeburns.tk, 1 mikecapson.com, 0 -mikecb.org, 1 mikechasejr.tk, 1 mikedundas.com, 1 mikefrank.ca, 1 @@ -96731,7 +96847,6 @@ mikino.ml, 1 mikizol.ru, 1 mikkei.space, 1 -mikkel.cc, 1 mikkelscheike.com, 1 mikkipastel.com, 1 mikkohuupponen.com, 0 @@ -96741,6 +96856,7 @@ miklima.pl, 1 miklus.pl, 1 mikodojo.tk, 1 +mikolajpawelsapek.eu, 1 mikonmaa.fi, 1 mikori.sk, 1 mikorrhiza-gomba.hu, 1 @@ -96854,6 +96970,7 @@ militer.id, 1 miliumnet.tk, 1 milivcounty.gov, 1 +milk.com.sg, 1 milk.games, 1 milk.xyz, 1 milk3soft.ai, 1 @@ -96865,6 +96982,7 @@ milkeclair.com, 1 milkenroar.com, 1 milkingmachine.tk, 1 +milkmakesitmerrier.com, 1 milkmoovement.io, 1 milkteacant.com, 1 milkypond.org, 1 @@ -96879,6 +96997,7 @@ millcreekut.gov, 1 millcreekwa.gov, 1 millefleurs.eu, 1 +millenn.photos, 1 millennialbella.net, 1 millennium-thisiswhoweare.net, 1 millenniumfalcon.org, 1 @@ -96980,7 +97099,7 @@ minacssas.com, 1 minademonic.org, 1 minaio.tk, 1 -minakov.pro, 1 +minakov.pro, 0 minamassimo.org, 1 minamo.io, 1 minantavla.se, 0 @@ -97020,12 +97139,13 @@ mindempowerment.org, 1 mindenitt.ga, 1 mindequityinternational.com, 1 -mindera.com, 0 +mindera.com, 1 minderrestdatkanbest.nl, 1 mindfab.de, 1 mindfactory.de, 1 mindflowmarketing.com, 0 mindfront.ai, 1 +mindfront.engineering, 1 mindfully.com, 0 mindfulnessjourney.ca, 1 mindfulslumber.com, 1 @@ -97033,6 +97153,7 @@ mindgard.co.uk, 1 mindgtc.com, 1 mindingourway.com, 1 +mindjack.xyz, 1 mindjee.tk, 1 mindmatters.social, 1 mindmax.fi, 1 @@ -97076,7 +97197,6 @@ minecraftbestroyale.gq, 1 minecraftdolarcube.gq, 1 minecrafteasy.gq, 1 -minecraften.net, 0 minecraftforever.tk, 1 minecraftforum.de, 1 minecraftforum.ovh, 1 @@ -97247,6 +97367,7 @@ minnesotalakemn.gov, 1 minnesotatitlesearch.com, 1 minng.cc, 1 +minnippi.com.au, 1 minnisites.com, 1 minnit.chat, 1 minnowmountain.com, 1 @@ -97288,7 +97409,6 @@ mintlayer.org, 1 minto.cc, 1 minton.systems, 1 -mintosherbs.com, 1 mintosoft.net, 1 mintplayer.com, 1 mintse.com, 0 @@ -97457,7 +97577,6 @@ mishrahome.com, 1 mishraweb.com, 1 misiepluszowe.com, 1 -misinforpedia.com, 1 misinstrumentos.com, 1 misite.ddns.net, 1 misiunas.eu, 1 @@ -97613,7 +97732,7 @@ mito-huutou.shop, 1 mito-meishi.shop, 1 mitokashi.ml, 1 -mitometals.lv, 1 +mitometals.lv, 0 mitotalplay.com.mx, 1 mitragacor.org, 1 mitranlogistik.com, 1 @@ -97705,6 +97824,7 @@ mixnix.tk, 1 mixnmojo.com, 1 mixon.tk, 1 +mixora.com.tr, 1 mixov.net, 1 mixpanel.com, 0 mixposure.com, 1 @@ -97720,7 +97840,6 @@ miyanaga.tech, 1 miyasyou.com, 1 miyatadc-ike.com, 1 -miyatadc-mita.com, 1 miyatakaikei.com, 1 miyavru.com, 1 miyazakian.com, 1 @@ -97749,6 +97868,7 @@ mjcstsul2022.tk, 1 mjf.cz, 1 mjhs.org, 1 +mjhsfoundation.org, 1 mjjshow.eu.org, 1 mjlwebdev.pl, 1 mjmoccasions.com, 1 @@ -97838,7 +97958,6 @@ mksdarchitects.com, 1 mkse.com, 1 mkt.com, 1 -mkt.cx, 1 mkt7.de, 1 mktcoral.com, 1 mktest.com, 1 @@ -97860,7 +97979,7 @@ mlcnfriends.com, 1 mlcrosoftonlline.cz, 1 mlcrosoftonlline.ml, 1 -mlelieveld.com, 1 +mlelieveld.com, 0 mlemay.com, 1 mlesniak.pl, 1 mleydier.fr, 1 @@ -98008,6 +98127,7 @@ mnotrioesdp.ml, 1 mnpl.ir, 1 mnprairie.gov, 1 +mnready.org, 1 mnrloroli.tk, 1 mnrtechsolutions.com, 1 mns.co.jp, 1 @@ -98056,6 +98176,7 @@ mobil11.net, 1 mobila-chisinau.md, 1 mobilab-ooe.at, 1 +mobilboyut.com, 1 mobilci.net, 1 mobildeal.id, 1 mobildingser.com, 1 @@ -98074,7 +98195,6 @@ mobilebooster.tk, 1 mobileciti.com.au, 1 mobilecraftingco.com, 1 -mobilefactory.io, 1 mobilefidelity-magazin.de, 1 mobilegameslist.com, 1 mobilegoldcoastelectrical.ga, 1 @@ -98082,10 +98202,10 @@ mobilelaby.com, 1 mobilelobbyers.ga, 1 mobilemechanicdenver.org, 1 +mobilemedicaldiagnostics.ie, 1 mobileminds.se, 1 mobileone.com.my, 1 mobilepartner.tk, 1 -mobilepricepk.com, 1 mobiler-handel.de, 1 mobileread.com, 1 mobileritelushi.com, 1 @@ -98154,7 +98274,6 @@ mocanu.pro, 1 mocap.co.th, 1 mocaro.de, 1 -mocasa.com, 1 mocdltraining.com, 1 mocent.de, 1 mochi.lol, 1 @@ -98231,6 +98350,7 @@ models-resource.com, 1 modelspoor-projecten.nl, 1 modelverse.online, 1 +modelworks.ai, 1 modem.cf, 1 modemchild.net, 1 modenatoday.it, 1 @@ -98240,8 +98360,10 @@ modern-metal-solutions.com, 1 modern-networks.co.uk, 1 modernapprenticeships.org, 1 +modernastro.com, 1 modernautorepairs.com, 1 modernbank.com, 1 +modernbuildremodel.com, 1 moderncat.com, 1 moderncommercialrealestate.com, 0 moderndayprepping.com, 1 @@ -98269,6 +98391,8 @@ modgamer.gq, 1 modgnews.com, 1 modicollege.com, 1 +modicum.studio, 1 +modified.games, 1 modineaviation.com, 1 modint.nl, 0 modintelechy.com, 1 @@ -98303,7 +98427,6 @@ modzcenter.es, 1 moe.best, 0 moe.blog, 0 -moe.ci, 1 moe.tools, 1 moe4sale.in, 1 moebeltaxi-berlin.com, 1 @@ -98358,6 +98481,7 @@ mogwailabs.de, 1 mogyuchi.com, 1 moha-swiss.com, 0 +moha.gov.gy, 1 mohaabobclan.tk, 1 mohaanation.tk, 1 mohabatein1.tk, 1 @@ -98404,7 +98528,6 @@ mojaapteka.pl, 1 mojaczarnastrona.pl, 1 mojadm.sk, 1 -mojaknjiznica.com, 0 mojakursumlija.tk, 1 mojama3dz.com, 1 mojapeticia.sk, 1 @@ -98473,12 +98596,13 @@ molenaagtekerke.tk, 1 molenaar-ricardo.tk, 1 moleremovalsandiego.com, 1 -molexces.com, 1 +molexces.com, 0 molezzo.com, 1 molinillo.tk, 1 molkerei-ammerland.com, 1 molleron.net, 1 molletjesveer.tk, 1 +mollie.com, 1 mollybears.org, 1 mollyblooms.tk, 1 mollyjayne.com, 1 @@ -98557,7 +98681,6 @@ mon-partage.fr, 1 mon-sac-italien.fr, 1 mon-trafic.com, 0 -mon.school, 1 mon22.ch, 0 mon47.com, 1 monacannation.gov, 1 @@ -98607,7 +98730,6 @@ monetag.com, 0 monetenfuchs.de, 1 monetize.ml, 1 -monetizehelper.com, 0 monetizer.co, 1 monetizer.com, 1 monetizzando.it, 1 @@ -98620,7 +98742,6 @@ money-finder.ml, 1 money-okey.tk, 1 money-quick.cf, 1 -money-spell.com, 1 money-tapuz.co.il, 1 money-transfers.tk, 1 money-trust.ru, 1 @@ -98712,7 +98833,6 @@ monjardin.tk, 1 monjo.io, 1 monjob.tk, 1 -monkaru.com, 1 monkel.lu, 1 monkey-donkey.es, 1 monkey47.com, 1 @@ -98736,6 +98856,7 @@ monodrama.tk, 1 monohost.ml, 1 monokli.tk, 1 +monolith.plus, 1 monolithapps.com, 1 monolithic.tk, 1 monolithon.net, 1 @@ -98747,7 +98868,6 @@ monorail.ga, 1 monorail.gq, 1 monorthopedagogue.ca, 1 -monosecurity.se, 1 monoseis-monotica.gr, 1 monosis.net, 1 monoskop.org, 1 @@ -98759,6 +98879,7 @@ monplay.host, 1 monrabais.fr, 1 monrasp.ddns.net, 1 +monreadshoppingcentre.ie, 1 monroecountycancersupporters.org, 1 monroecountymo.gov, 1 monroecountyny-opi.gov, 1 @@ -98773,7 +98894,6 @@ monsbah.com, 1 monscierge.com, 1 monshoppingcestcalais.fr, 1 -monsieurbureau.com, 1 monsieursavon.ch, 0 monsitemoncommerce.com, 1 monsitetest.ca, 1 @@ -98782,7 +98902,7 @@ monsterarmsest.ga, 1 monstercurves.com, 1 monstergovt.com, 1 -monsterlinkmarketing.com, 1 +monsterlinkmarketing.com, 0 monstermashentertainments.co.uk, 1 monsterminigames.de, 1 monsterminus.tk, 1 @@ -98790,7 +98910,6 @@ monsternet.pl, 1 monstersuniversity.ga, 1 monstertalesgame.com, 1 -monstertraxstudio.com, 1 monsterx.cn, 1 monstl.com, 1 monstresdesfetes.com, 1 @@ -98807,7 +98926,7 @@ montanabiack.de, 1 montanacreativitymovement.tk, 1 montanaguard.gov, 1 -montanaitservices.com, 1 +montanaitservices.com, 0 montanaonlinedivorce.com, 1 montanarenewables.org, 1 montanatitlesearch.com, 1 @@ -98887,6 +99006,7 @@ monzo.tk, 1 moo.software, 1 moocat.me, 1 +moodboardmadeit.com, 1 mooddie.pt, 1 moodfoods.com, 1 moodgym.com.au, 1 @@ -98920,7 +99040,6 @@ moondoor.tk, 1 moondrop.org, 1 moondsee.de, 1 -moonfist.eu, 1 moonflux.com, 1 moonfreak.tk, 1 moonglancecareer.com, 1 @@ -98968,9 +99087,7 @@ moorheadmn.gov, 1 mooring.social, 1 moormiles.com, 1 -moorparkelectrical.com, 1 moorparkexteriorlighting.com, 1 -moorparklighting.com, 1 moorstay.com, 1 moort.be, 1 moosic.co, 1 @@ -99028,10 +99145,8 @@ mordovia.gq, 1 mordovia.tk, 1 mordoviya.tk, 1 -more-hikkoshi.com, 1 more-terrain.de, 1 moreal.co, 1 -moreapp.co.uk, 1 morebus.co.uk, 1 morechance.de, 1 morecigarettes.tk, 1 @@ -99043,7 +99158,6 @@ moremindsbetter.com, 1 morenadacentral.tk, 1 morenci.ch, 1 -moreoptimal.com, 1 moreoptimal.world, 1 morepablo.com, 1 moreshop.pl, 1 @@ -99056,15 +99170,15 @@ moretti.camp, 1 morevesi.cf, 1 morewithcore.com, 1 +morfide.com, 1 morgan-insurance.com, 1 -morganappliancerepair.com, 1 morgancounty-al.gov, 1 morgancounty-il.gov, 1 morgancountymo.gov, 1 morgancountysheriffal.gov, 1 morgancountyutah.gov, 1 morgandesort.com, 1 -morganeb.be, 1 +morganeb.be, 0 morganlaroche.com, 1 morganton.com, 1 morganwilder.com, 1 @@ -99160,7 +99274,6 @@ mortonpoolsolutions.com, 1 morus.tk, 1 morvo.mx, 1 -mos-camin.ru, 1 mos-kanal.ru, 1 mosa.guru, 1 mosa.tk, 1 @@ -99194,7 +99307,6 @@ moshcore.tk, 1 moshegropper.com, 1 moshwire.com, 1 -mosin.org, 1 mosio.com, 1 moskas.tk, 1 moskeedieren.nl, 1 @@ -99208,7 +99320,6 @@ mosobl.tk, 1 mosostore.nl, 1 mosquito-code.com, 1 -mosquito-sklep.pl, 1 mosquitojoe.com, 1 mosr.sk, 1 mossad.gov.il, 1 @@ -99234,7 +99345,9 @@ mostlyharmless.at, 1 mostlyoverhead.com, 1 mostmost.tk, 1 +moststudios.com, 1 mosurist.tk, 1 +mota-engil.com, 1 motability.co.uk, 1 motabilitychargeshare.co.uk, 1 motabilitydealer.co.uk, 1 @@ -99255,6 +99368,7 @@ motekmedical.nl, 1 moteksystems.com, 1 moteksystems.net, 1 +motera.ie, 1 motezazer.fr, 1 moth.monster, 1 motherboard.services, 1 @@ -99312,9 +99426,9 @@ motohell.com, 1 motojato.com.br, 1 motokados.tk, 1 +motokenstudio.com, 1 motoland.ml, 1 motolife.tk, 1 -motolinesupply.com, 1 motomorgen.com, 1 motonovinky.cz, 1 motor-agro.com, 1 @@ -99337,7 +99451,6 @@ motorline.ru, 1 motorlubilgiler.com, 1 motorparts-images.nl, 1 -motorparts-online.com, 1 motorrijschool-pitbox8.nl, 1 motorring.ru, 1 motorslopers.tk, 1 @@ -99352,7 +99465,6 @@ motoselfservices.fr, 1 motospaya.com, 0 motostorie.blog, 1 -motostyle.ua, 1 mototax.ch, 0 mototeam.tk, 1 mototsi.com, 1 @@ -99487,7 +99599,6 @@ movieeveningest.ga, 1 moviefreeze.com, 1 movieglot.ml, 1 -moviego.st, 1 movieguys.org, 1 moviejack.org, 0 moviemadness.uk, 1 @@ -99547,6 +99658,7 @@ moyos.net, 1 moyu.host, 0 moyufangge.com, 1 +moyuhi.jp, 1 moyure.com, 1 moz.idv.tw, 1 mozaic.io, 1 @@ -99564,7 +99676,6 @@ mozzez.de, 1 mozzi.online, 1 mozzilla.cz, 1 -mp-bank.ru, 1 mp-bln.de, 1 mp.gov.in, 1 mp.org, 1 @@ -99639,6 +99750,7 @@ mqbeauty.com.tw, 1 mqbx.nl, 1 mqroofing.com, 1 +mqtlabs.com, 1 mr-7.ru, 1 mr-a.de, 1 mr-anderson.org, 0 @@ -99731,7 +99843,6 @@ mrjunior.ml, 1 mrkapowski.com, 0 mrknee.gr, 1 -mrkzalamana.com, 1 mrlc.gov, 1 mrliu.me, 1 mrlove.tk, 1 @@ -99818,7 +99929,6 @@ msbmb.com, 1 msc-fivem.shop, 1 mscc.mu, 1 -msd-tiergesundheit.de, 1 msda23.gov, 1 msdprojectclearmo.gov, 1 msebera.cz, 1 @@ -99909,7 +100019,6 @@ mstdn.in.th, 1 mstdn.io, 1 mstdn.party, 1 -mstechexpo.com, 1 mstever.com, 1 mstr-f-dstrctn.de, 1 mstridde.de, 1 @@ -99992,7 +100101,6 @@ mtm.tj, 1 mtmedia.org, 1 mtn-media.de, 1 -mtnc.nl, 1 mtncoi-coe.com, 1 mtnmanager.com, 1 mtnmedia.group, 1 @@ -100039,6 +100147,7 @@ muafakatmalaysia.gq, 1 muafakatmalaysia.ml, 1 muarstabyggmarknad.tk, 1 +mubarak-card.com, 1 mubase.dk, 1 muble.tk, 1 muc.space, 1 @@ -100052,6 +100161,7 @@ muchtv.com, 1 muckingabout.eu, 1 muckleshoot.gov, 1 +muckrack.com, 1 mucktopia.com, 1 muclan.tk, 1 mucmail.de, 1 @@ -100086,6 +100196,7 @@ muenchberger.com, 0 muenchen-personal.training, 1 muennich-coll.de, 1 +muenster-yarn.com, 1 muenzen.tk, 1 muenzenforum.tk, 1 mufg.ru, 1 @@ -100152,6 +100263,7 @@ mulder.social, 1 mulderfamilie.tk, 1 mulej.net, 1 +mulgravelaw.co.uk, 1 mulheres18.com, 1 muling.lu, 1 mulk.hopto.org, 1 @@ -100225,7 +100337,6 @@ multitraf.ga, 1 multiusaha.my.id, 1 multivideo.tk, 1 -multivpn.cn.com, 1 multivpn.com.de, 1 multivpn.com.ua, 1 multivpn.fr, 1 @@ -100242,7 +100353,6 @@ mumbairoleplay.tk, 1 mumble.be, 1 muminkoykiran.com, 1 -mumiytroll.com, 1 mummatters.com.au, 1 mummyandmephotography.com, 1 mumolabs.com, 1 @@ -100282,6 +100392,7 @@ mundoscrapbooking.online, 1 mundoseth.tk, 1 mundosteampunk.club, 1 +mundosuiri.info, 1 mundosuiri.ml, 1 mundowanderlust.com, 1 mundschenk.at, 1 @@ -100328,6 +100439,7 @@ muratcileli.tk, 1 muratoff.pp.ua, 1 muratore-roma.it, 1 +muratyurtoglu.com, 1 murciacobras.tk, 1 murciaprocuradores.tk, 1 murderbysound.servebeer.com, 1 @@ -100368,6 +100480,7 @@ mursu.directory, 1 murtazamustafahirani.tk, 1 murz.tv, 1 +murzallawfirm.com, 1 murzik.space, 1 mus-tech.info, 1 musacomo.com, 1 @@ -100410,6 +100523,7 @@ museum.nl, 1 museumcenter.az, 1 museumhammarlind.se, 1 +museumhetkruithuis.nl, 1 museumplantinmoretus.be, 1 museumwaalsdorp.nl, 1 mush-room.co.jp, 1 @@ -100448,7 +100562,6 @@ musicforreading.com, 1 musicfreakz.cf, 1 musicfromgod.com, 1 -musicgamegalaxy.de, 1 musicgeek.ga, 1 musicgivesmelife.com, 0 musicgivesmelife.gay, 1 @@ -100519,7 +100632,6 @@ muslimsoul.ml, 1 muslitocomics.tk, 1 musmann.io, 1 -musopen.org, 1 muspla.com.br, 1 mussalains.com, 1 musselsblog.com, 1 @@ -100528,7 +100640,6 @@ mussonstrading.com, 1 mustangapparel.ca, 1 mustangmessenger.net, 1 -mustasj.no, 1 mustdonewzealand.co.nz, 1 muster-folien.de, 1 muster-schablonen.de, 1 @@ -100581,6 +100692,7 @@ muusikoiden.net, 1 muv.ac, 1 muv.co.uk, 1 +muvy.tube, 1 muwi.tk, 1 muxidream.cn, 1 muxup.com, 1 @@ -100614,7 +100726,6 @@ mv-wohnen.de, 1 mvandek.nl, 1 mvarsamis.com, 1 -mvbstyling.nl, 1 mvbug.com, 1 mvc-sports.com, 1 mvccp.co.za, 1 @@ -100685,7 +100796,6 @@ mx-solutions.net, 1 mx.org.ua, 1 mx.search.yahoo.com, 0 -mx310.jp, 1 mx86.eu, 1 mxawei.cn, 1 mxdanggui.org, 1 @@ -100698,7 +100808,6 @@ mxlog.com.br, 1 mxradar.com, 1 mxtm.de, 1 -mxtsoluciones.com.mx, 1 my-aftershave-store.co.uk, 1 my-azov.tk, 1 my-bratsk.tk, 1 @@ -100729,10 +100838,12 @@ my-lightning.com, 1 my-meal.nl, 1 my-mediahome.ru, 1 +my-message.co, 1 my-meteo.net, 1 my-monobank-card.com.ua, 1 my-montenegro.tk, 1 my-msg.ai, 1 +my-msg.co, 1 my-nextcloud.at, 1 my-pawnshop.com.ua, 0 my-pharmacie.com, 1 @@ -100759,6 +100870,7 @@ my-web.xyz, 1 my-webcloud.at, 1 my-website.top, 1 +my-wishes.co, 1 my-woodcraft.com, 1 my.cat, 1 my.com.my, 1 @@ -100815,7 +100927,7 @@ mybamoza.com, 1 mybaran.tk, 1 mybarcelona.tk, 1 -mybasepay.com, 1 +mybasepay.com, 0 mybathroom.tk, 1 mybaticloud.com, 1 mybb.com, 1 @@ -100853,7 +100965,6 @@ mybrokenheart.tk, 1 mybsms.gr, 1 mybts.fr, 0 -mybubbleteashop.com, 1 mybuddytheplumberparkcity.com, 1 mybudgetapp.com, 1 mybuildingcertifier.com.au, 1 @@ -100869,6 +100980,7 @@ mycandylove.com, 1 mycardplace.com, 1 mycarecorner.net, 1 +mycarecost.net, 1 mycarwashers.com, 1 mycase.com, 0 mycase.com.ua, 1 @@ -100878,7 +100990,6 @@ mycats.tk, 1 mycbils.uk, 1 mycena.co, 1 -mychains.pl, 1 mychamberlain.co.nz, 0 mychamberlain.com.au, 0 mychamberlain.eu, 0 @@ -100941,8 +101052,8 @@ mycrowdstack.com, 1 mycrypnet.io, 1 mycts.org, 1 +mycuba.holiday, 1 mycues.gov, 1 -mycumortgage.com, 1 mycyberspace.tech, 1 mydarkness.cf, 1 mydarksite.tk, 1 @@ -100973,7 +101084,6 @@ mydisabilitymatters.org.au, 1 mydisco.tk, 1 mydistance.tk, 1 -mydlonline.be, 1 mydnshost.co.uk, 1 mydoc.fr, 1 mydogispolite.tk, 1 @@ -101061,7 +101171,6 @@ myfitnesscare.com, 1 myfitsociety.com, 1 myfleetistics.com, 1 -myflexina.com, 1 myflightrefund.com, 1 myfloridacfo.gov, 1 myfloridadeferredcomp.com, 1 @@ -101072,7 +101181,6 @@ myforum.community, 1 myforwardsavings.com, 1 myfpvstore.com, 1 -myfreespiritpointscard.com, 1 myfrenchtattoo.fr, 1 myfreshfamilydental.com, 1 myfruition.com, 1 @@ -101085,7 +101193,6 @@ myfuturewebsite.co.uk, 1 myfxbook.com, 1 myfxcm.com, 1 -myfyntra.com, 1 myg21.com, 1 mygadgetguardian.lookout.com, 0 mygallery.homelinux.net, 1 @@ -101171,8 +101278,6 @@ myinsitu.com, 1 myinstapy.ru, 0 myinsurancesource.com, 1 -myinternetreputation.com, 1 -myinternetreputation.org, 1 myinternist.com, 1 myinterrail.co.uk, 1 myinvestinglife.com, 1 @@ -101312,6 +101417,7 @@ myndseye.com, 1 myneighborhoodperks.com, 1 mynetblog.com, 1 +mynetiz.com, 1 mynetpay.be, 1 mynetworkingbuddy.com, 1 mynewhorizons.shop, 1 @@ -101321,6 +101427,7 @@ mynic.my, 1 mynimo.com, 1 mynissan.ml, 1 +mynixsudoservices.com, 1 mynjhelps.gov, 1 mynlight.com, 1 mynn.io, 0 @@ -101404,6 +101511,7 @@ mypskov.tk, 1 mypsychicreadings.tk, 1 mypvhc.com, 1 +myqronix.com, 1 myqrreview.com, 1 myraboats.tk, 1 myramadanmoon.com, 1 @@ -101491,6 +101599,7 @@ mysanta.co, 1 mysantanderpension.co.uk, 1 mysarnoff.com, 1 +mysatcoach.com, 1 mysavvastraining.com, 1 mysavvywallet.com, 1 mysaymk.tk, 1 @@ -101523,6 +101632,7 @@ mysignal.com, 1 mysill.gr, 1 mysimsem.com, 1 +mysinergy.eu, 1 mysisterandi.co.za, 1 myslc.gov, 1 mysmallbusinesssidekick.com, 1 @@ -101555,6 +101665,7 @@ mysteryshow.site, 1 mysterytag.com, 1 mystgames.tk, 1 +mystia.org, 1 mystic-falls.tk, 1 mystic-welten.de, 1 mysticalroseschoolofcaloocan.com, 1 @@ -101574,8 +101685,8 @@ mystream.com, 0 mystreambox.fr, 1 mystreet.ga, 1 -mystrength.com, 1 mystudentrecord.net, 1 +mystudiolook.com, 1 mystudy.me, 1 mystudycart.com, 1 mystudymap.tk, 1 @@ -101588,8 +101699,10 @@ myswabi.tk, 1 myswitchelectric.com, 1 myswooop.de, 1 +mysympleloan.com, 1 mytana.com, 1 mytaratata.com, 1 +mytaxbridge.co.uk, 1 mytaxindia.com, 1 mytc.fr, 1 mytea.life, 1 @@ -101601,6 +101714,7 @@ mythen-fonds.ch, 1 mythenfonds.ch, 1 mytherapist.com, 1 +mythic.software, 1 mythicca.org, 1 mythicdelirium.com, 1 mythreesonshvac.com, 1 @@ -101618,7 +101732,6 @@ mytreasury.gov, 1 mytrewithen.co.uk, 1 mytrialist.org, 1 -mytribus.com, 1 mytrinity.com.ua, 1 mytroc.pro, 1 mytruecare.org, 1 @@ -101675,7 +101788,6 @@ mywebserver.ml, 1 myweightlosstips.tk, 1 mywellness360.in, 1 -mywestondental.com, 0 mywikis.net, 1 mywish.co.il, 1 mywonderkitchen.com, 1 @@ -101696,11 +101808,11 @@ myzarabot.tk, 1 myzina.cz, 0 myzoetrope.com, 1 +myzr.io, 1 mz-mz.net, 1 mz.al, 1 mz2023.cc, 1 mz2024.cc, 1 -mz2025.cc, 1 mz2026.cc, 1 mz2027.cc, 1 mz2028.cc, 1 @@ -101711,6 +101823,7 @@ mz2033.cc, 1 mza.com, 1 mzademiryolu.com, 1 +mzadqatar.com, 1 mzak.pro, 1 mzakariya.com, 1 mzback.cc, 1 @@ -101751,6 +101864,7 @@ n0.be, 1 n03.top, 1 n0t404.com, 1 +n0v1.com, 1 n1.homes, 1 n15.org, 1 n1co68.freeboxos.fr, 1 @@ -101813,6 +101927,7 @@ nabibus.com, 1 nabiev.tk, 1 nabitrix.tk, 1 +nabiusa.com, 1 nablacloud.com, 1 nabokov.tk, 1 naboplastic.com, 1 @@ -101929,6 +102044,8 @@ naheulcraft.be, 1 nahfe.xyz, 1 nahman.tk, 1 +nahmii.dj, 1 +nahmii.dog, 1 nahouw.net, 1 nahrag.tk, 1 nahs-classof1972.com, 1 @@ -101938,6 +102055,7 @@ nahue.ar, 1 nahue.com.ar, 1 naidoc.org.au, 1 +naijabased.fun, 1 naijapickup.com, 1 naijaxnet.com.ng, 1 naijjobs.com, 1 @@ -102018,6 +102136,7 @@ nakukata.com, 1 nakupnabytku.sk, 1 nala.baby, 1 +nalanyinyun.work, 1 nalapadglobal.com, 1 nalapadtransport.com, 1 nalchik-news.net, 1 @@ -102040,7 +102159,7 @@ namastenaturo.fr, 1 namazon.org, 1 namazvakitleri.com.tr, 0 -namdu.uz, 0 +namdu.uz, 1 name.ax, 1 nameabusiness.com, 1 nameabusiness.pro, 1 @@ -102078,7 +102197,7 @@ namplan.pl, 1 namsbaekur.is, 1 namskra.is, 1 -namspi.uz, 0 +namspi.uz, 1 namu.la, 1 namu.live, 1 namu.moe, 1 @@ -102119,9 +102238,7 @@ nannatextiles.com, 1 nannatextiles.de, 1 nannostomus.com, 1 -nannyandhousekeeper.uk, 1 nannydream.com, 1 -nano.gov, 1 nano.voting, 1 nanobattle.com, 1 nanocard.co, 1 @@ -102180,6 +102297,7 @@ napkins-wholesale.uk, 1 naplata.mk, 1 naples.tk, 1 +naplestotalgarage.com, 1 napo.tk, 1 napoleonoutlawed.tk, 1 napolict.com, 1 @@ -102200,6 +102318,7 @@ naql.om, 1 naquebec.tk, 1 nar.cards, 1 +nar0.com, 1 nara.gov, 1 naraboty.ga, 1 narada.com.ua, 1 @@ -102270,6 +102389,7 @@ narutowicza47.pl, 1 narvizit.com, 1 nary-software.com, 1 +narzedziait.pl, 1 narzedziownia.top, 1 nas-tech.de, 1 nas.gov.ua, 1 @@ -102321,6 +102441,7 @@ nasosvdom.com.ua, 1 nasr.mobi, 1 nasrabady.tk, 1 +nasrmaswood.com, 1 nasrullaganjnews.tk, 1 nassaucountyfl.gov, 1 nassautrafficny.gov, 1 @@ -102460,7 +102581,6 @@ nationaltransvisibilitymarch.org, 1 nationalvideoproductions.com, 1 nationalvideoproductions.net, 1 -nationalwellness.org, 1 nationandfreedom.tk, 1 nationdivergente.com, 1 nationofleaders.org, 1 @@ -102529,7 +102649,6 @@ naturaprint.fr, 1 naturart.pt, 1 naturavelit.ch, 1 -naturaventyr.se, 1 nature-avenue.com, 1 nature-basedsolutions.com, 1 nature.cz, 1 @@ -102588,6 +102707,7 @@ nautadutilh.com, 1 nautholl.is, 1 nautiboat.it, 1 +nauticonline.it, 1 nautigo.org, 1 nautika.tk, 1 nautiljon.com, 1 @@ -102622,8 +102742,10 @@ navigay.me, 1 navigo-inc.com, 1 navigo.cc, 1 +navigo.global, 1 navigyurci.hu, 1 navinmolecular.com, 1 +navita.com.br, 1 naviteq.eu, 1 navkor.tk, 1 navlnachekg.cz, 1 @@ -102648,6 +102770,7 @@ naxcivan.tk, 1 nayakaaerial.com, 1 nayanaas.com, 1 +nayaone.com, 1 nayapakistan.tk, 1 naydenovlaw.com, 1 nayefalebrahim.com, 1 @@ -102737,6 +102860,7 @@ nbri.ru, 1 nbriresearch.com, 1 nbrown.us, 1 +nbwp.uk, 1 nbx.com, 1 nc-beautypro.fr, 1 nc-formation.fr, 1 @@ -102814,11 +102938,13 @@ ncrypt.at, 1 ncs-cleaning.dk, 1 ncsa.gov.qa, 1 +ncsa.md, 1 ncsbadvisors.gov, 1 ncsbe-apps.gov, 1 ncsccs.com, 1 ncshp.gov, 1 ncsis.gov, 1 +ncsl.or.kr, 1 ncsparta.gov, 1 ncswboard.gov, 1 nctm.org, 1 @@ -102875,7 +103001,6 @@ ndx.ee, 1 ndxinfo.eti.br, 1 ndy.sex, 1 -ne-games.com, 1 ne.ax, 1 nea.gov, 1 nealemorison.com, 1 @@ -102901,6 +103026,7 @@ neatous.net, 1 neauviachannel.com, 1 neave.tv, 1 +neaverdock.com, 1 neaz.tk, 1 neb.li, 1 neba.io, 1 @@ -102984,7 +103110,6 @@ neelen-gym.nl, 1 neemo.nz, 1 neenahwi.gov, 1 -neenan.com, 1 neepscambaiting.com, 1 neera.ro, 1 neero.fr, 1 @@ -103025,7 +103150,6 @@ negocios-imatore.com, 1 negociosparaoptimistas.com, 1 negociosurbanos.net, 1 -negoya-shokai.info, 1 negozimoda.it, 1 negoziointimo.com, 1 negr.gay, 1 @@ -103078,6 +103202,7 @@ neko.foundation, 1 nekoame.network, 1 nekoame.uk, 1 +nekobt.to, 1 nekochan.blog, 1 nekofoundation.com, 1 nekofoundation.org, 1 @@ -103087,10 +103212,9 @@ nekomagic.com, 1 nekomanten.de, 1 nekomata.tk, 1 -nekomimi.cafe, 1 +nekomimi.cafe, 0 nekomimi.pl, 1 nekomimirouter.com, 1 -nekomimix.net, 1 nekomiya-sama.top, 1 nekomoe.moe, 1 nekondiciya.cf, 1 @@ -103189,7 +103313,6 @@ neo4j.com, 1 neo4j.design, 1 neobits.nl, 1 -neoblindados.com.br, 1 neoblog.tk, 1 neocannbio.com, 1 neochan.net, 1 @@ -103203,6 +103326,7 @@ neoedresources.org, 1 neoeliteconsulting.com, 1 neofinancial.com, 1 +neogames.com.co, 1 neohu.com, 0 neojo.org, 1 neoko.fr, 1 @@ -103237,6 +103361,7 @@ neosdesignstudio.co.uk, 1 neosecurityteam.tk, 1 neoshomo.gov, 1 +neoskosmos.info, 1 neosnetworks.com, 1 neosoft.hu, 1 neostralis.com, 1 @@ -103259,7 +103384,6 @@ neoximo.com, 1 neoz.com.br, 1 neozeon.io, 0 -nepal-evolution.org, 0 nepal.ga, 1 nepalboxoffice.tk, 1 nepalese.tk, 1 @@ -103364,10 +103488,8 @@ nessimworks.com, 1 nesstormented.tk, 1 nest-property.com, 1 -nesta.ie, 1 nestbynature.com, 1 nestdesigndeco.com, 1 -nesterov.pw, 1 nestetic.com, 1 nestforms.com, 1 nestinarka-park.com, 1 @@ -103420,6 +103542,7 @@ netco-system.de, 1 netconnect.at, 0 netcoresmartech.com, 1 +netcosa.com, 1 netcourtreporter.com, 1 netcourtreporter.net, 1 netcracker.com, 1 @@ -103493,7 +103616,6 @@ netig.net, 0 netigen.pl, 1 netim.pl, 1 -netinsight.net, 1 netipbox.com, 1 netjet.io, 1 netjobz.tk, 1 @@ -103528,7 +103650,6 @@ netope.de, 1 netor.ga, 1 netpass.pt, 1 -netpatient.dk, 1 netpay.mx, 1 netpenge.tk, 1 netpreneur.co.za, 1 @@ -103539,10 +103660,9 @@ netradyne.com, 1 netraising.com, 1 netrecruituk.co.uk, 1 -netreputation.com, 0 netresec.com, 1 netreviews.tk, 1 -netriders.academy, 1 +netriders.academy, 0 netrift.uk, 1 netrino.be, 1 netrino.info, 1 @@ -103554,6 +103674,7 @@ nets-cloud.com, 1 nets.com.sg, 1 netschool.tk, 1 +netscribes.com, 1 netse.net.tr, 1 netsearch.ga, 1 netsec.cloud, 1 @@ -103561,7 +103682,6 @@ netsends.com, 1 netsensai.pl, 1 netsensor.com.br, 1 -netservice.co.uk, 0 netshopgarden.com.br, 1 netsite.dk, 1 netslum.tk, 1 @@ -103661,7 +103781,6 @@ networthpal.com, 0 networx-online.de, 1 netz-blog.de, 1 -netz-noe.at, 1 netz0.com, 1 netzabfragen.de, 1 netzen.tk, 1 @@ -103740,13 +103859,13 @@ neuroticosanonimos.tk, 1 neurotransconcept.com, 0 neurotransmitter.net, 1 -neurovicellc.com, 1 +neurovicellc.com, 0 neurozentrum-barsinghausen.de, 1 neurozentrum-zentralschweiz.ch, 1 neuschwanstein.de, 1 neuschwansteintickets.nl, 1 neustadt-keller.de, 1 -neustadtguides.de, 1 +neustadtguides.de, 0 neuteleers.tk, 1 neuton.ai, 1 neutra-vdl.org, 1 @@ -103787,7 +103906,6 @@ neveu.tech, 1 nevim-co-varit.cz, 1 nevivur.net, 1 -nevntech.com, 1 nevocloud.com, 1 nevolution.me, 1 nevoxo.com, 0 @@ -103809,7 +103927,6 @@ new-vip1.com, 1 new-vvip.com, 1 new-way.ml, 1 -new-web-studio.com, 1 new-zone.tk, 1 new10.com, 1 newag.org.au, 1 @@ -103845,7 +103962,6 @@ newbownerton.xyz, 1 newbraunfels.gov, 1 newbrest.tk, 1 -newbrightonresidents.org.nz, 1 newbronze.com.br, 1 newbrunswicknj.gov, 1 newbrunswickonlinedivorce.com, 1 @@ -103853,7 +103969,6 @@ newbss.co.uk, 1 newbuilding.tk, 1 newburybouncycastles.co.uk, 1 -newburyparkelectric.com, 1 newburyportma.gov, 1 newcab.de, 1 newcapitaldev.com, 1 @@ -103875,6 +103990,7 @@ newcityinfo.ch, 0 newcityinfo.info, 1 newcitystudio.ch, 0 +newcoders.org, 1 newcold.com, 1 newcoldhelsingborg.se, 1 newcombny.gov, 1 @@ -103886,7 +104002,6 @@ newday.host, 1 newdaychristian.com, 1 newdayproperties.com, 1 -newdayrecordlabel.com, 1 newdenversurvivors.tk, 1 newdietandexercises.tk, 1 newdirectionsolar.com.au, 1 @@ -103928,13 +104043,13 @@ newgrowbook.com, 0 newgrowthpress.com, 1 newguidance.ch, 0 +newhade.ddns.net, 1 newhampshiretitlesearch.com, 1 newhamyoungbloods.co.uk, 1 newharmony-in.gov, 1 newhavenshiami.gov, 1 newholland.tk, 1 newhomedesign.tk, 1 -newhomeinturkey.com, 1 newhopeplacement.com, 1 newhoperailroad.com, 1 newillusion.tk, 1 @@ -103971,7 +104086,6 @@ newmilfordnj.gov, 1 newmill.com, 1 newmusic.org, 0 -newmusicjackson.org, 1 newmuslims.tk, 1 newmuz.tk, 1 newnaturalists.com, 1 @@ -104065,6 +104179,7 @@ newschannel5.com, 1 newscheck.tk, 1 newschool.ie, 1 +newscroll.ru, 1 newscultural.tk, 1 newsdiff.eu, 1 newsdiff.nl, 1 @@ -104086,7 +104201,6 @@ newsignature.com, 1 newsinformer.ga, 1 newsinkansas.ml, 1 -newsinnovationmarket.com, 1 newsinpenn.ml, 1 newsinpolitics.ga, 1 newsireland.tk, 1 @@ -104263,6 +104377,7 @@ nextme.se, 1 nextmed.ro, 1 nextmuseum.io, 1 +nextofkinplan.com, 1 nextos.com, 1 nextpower-kepco.jp, 1 nextrasp.it, 1 @@ -104276,6 +104391,7 @@ nextstep-labs.gr, 1 nextstepstudios.ga, 1 nexttv.co.il, 1 +nextunitpro.com, 1 nextus.me, 1 nextvibration.com, 1 nextvision.pt, 1 @@ -104433,6 +104549,7 @@ nhg.nl, 1 nhheaf.org, 1 nhjvillalmanzo.tk, 1 +nhlanhlazondo.co.za, 1 nhlocalgrocer.com, 1 nhnature.org, 1 nhnieuws.nl, 1 @@ -104522,6 +104639,7 @@ nice-germany.tk, 1 nice-links.tk, 1 nice-school.com.ua, 1 +nice-sound.com, 1 niceb5y.net, 0 niceceo.com, 0 nicecockb.ro, 1 @@ -104740,6 +104858,7 @@ nigdeescort.tk, 1 nigel-aves-photography.com, 1 nigelfreake.eu, 1 +nigellasativa.info, 1 nigelpentland.co.uk, 1 nigelpentland.net, 1 nigelsnotebook.com, 1 @@ -104801,6 +104920,7 @@ nihilocomunidad.tk, 1 nihon-finance.com, 1 nihon-rosoku.com, 1 +nihonnomirai.org, 1 nihor2.com, 1 nihseniorhealth.gov, 0 nihulkav.shop, 1 @@ -104844,11 +104964,11 @@ nikhilramakrishnan.tk, 1 nikhilsd.com, 1 nikiel.fr, 1 -nikimix.com, 1 nikitacartes.xyz, 0 nikitagukov.ru, 1 nikitenko.tk, 1 nikitina.ml, 1 +nikitovka.com, 1 nikka.systems, 0 nikkasystems.com, 1 nikkasystems.se, 1 @@ -104879,6 +104999,7 @@ nikoniko-dental-nakamozu.jp, 1 nikoniko-dental-premium.jp, 1 nikoniko-dental-support.jp, 1 +nikonimgsupport.com, 1 nikonlibrary.co.uk, 1 nikonnps.co.uk, 1 nikonschool.co.uk, 1 @@ -104894,6 +105015,7 @@ niksys.net, 1 nikws.ru, 1 nikz.in, 1 +nil.as, 1 nil.com, 1 nil.mx, 1 niledevelopmentseg.com, 1 @@ -105210,6 +105332,7 @@ nmitaylor.com, 1 nmjusticedata.gov, 1 nmleatherleague.com, 1 +nmmd.co.uk, 1 nmmlp.org, 1 nmn.hu, 1 nmontag.com, 1 @@ -105218,6 +105341,7 @@ nms-thoracic-surgery.com, 1 nmshippingshield.com, 1 nmslo.gov, 1 +nmstore.com.tr, 1 nmsuroundup.com, 1 nmugroup.com, 1 nmx.de, 1 @@ -105254,6 +105378,7 @@ no-andishan.ir, 1 no-b.kiev.ua, 1 no-bet.ru, 1 +no-bull.sh, 1 no-data.tk, 1 no-dev.de, 1 no-eye-deer.tk, 1 @@ -105332,7 +105457,6 @@ nocloud.website, 1 noco.nl, 1 nocoastpunx.tk, 1 -nocodefactory.io, 1 nocoffee.tech, 1 nocoffeetech.de, 1 nocommentsallowed.com, 1 @@ -105395,6 +105519,7 @@ nogluten.com, 1 nogradhont.hu, 1 nogyogyaszat.eu, 0 +nohangouts.se, 1 nohatenj.gov, 1 nohats.ca, 1 nohttps.org, 1 @@ -105471,6 +105596,7 @@ nomadix.com, 1 nomadlist.com, 1 nomadproject.io, 0 +nomadtalk.mn, 1 nomadtech.servehttp.com, 1 nomadtechnologies.uk, 1 nomadwallets.com, 1 @@ -105510,10 +105636,10 @@ nonprofitdrupal.org, 1 nonqmloans.com, 1 nonsa.pl, 1 -nonsensebrand.es, 1 nonstopairductcleaning.com, 1 nonstopairductcleaninghoustontx.com, 1 nonstopjob.ga, 1 +nonstopkino.at, 1 nontonfilem.ml, 1 nonwww.org, 1 nonx.pro, 1 @@ -105614,7 +105740,7 @@ nordicportalen.tk, 1 nordicsemi.com, 1 nordicsrit.tk, 1 -nordictaxirvk.is, 1 +nordictaxirvk.is, 0 nordicway.dk, 1 nordinfo.fi, 1 nordisglobal.com, 1 @@ -105622,6 +105748,7 @@ nordiskhissvarmland.se, 1 nordkampen.com, 1 nordkampen.de, 1 +nordklar-reinigung.de, 1 nordlandsbanken.no, 1 nordlandverliebt.de, 1 nordlayer.com, 1 @@ -105801,7 +105928,6 @@ northwoodstudios.org, 1 northzone.ml, 1 nortvi.com, 1 -norveg.ru, 1 norvelltwp-mi.gov, 1 norwalkct.gov, 1 norwalkps.org, 0 @@ -105904,6 +106030,7 @@ notebleue.com, 1 noteboat.net, 1 notebook-alkatresz.hu, 1 +notebooklm.in, 1 notebooksbilliger.de, 1 notebooksteurer.shop, 1 notebrew.com, 1 @@ -105914,6 +106041,7 @@ notenarchiv.eu, 1 notengosuelto.com, 1 noteonline.org, 1 +notesdumontroyal.com, 1 notesforpebble.com, 1 noteshare.net, 1 noteskeeper.ru, 1 @@ -105926,7 +106054,10 @@ nothing.pink, 1 nothingbundtcakes.com, 1 noti.tg, 1 +noticeregistry.com, 1 +noticiacristiana.com, 1 noticiaelmundo.com, 1 +noticiasdearnedo.es, 1 noticiasdeautos.site, 1 noticiasdebrasiliaonline.com, 1 noticiasdeminasgerais.com, 1 @@ -106034,9 +106165,9 @@ novanta.pl, 1 novantaphotonics.com, 1 novaofcalifornia.com, 0 -novaprac.com, 1 novaquantum.com, 1 novaquark.com, 1 +novaquest.com.br, 1 novaratoday.it, 1 novarock.tk, 1 novasentinel.pt, 1 @@ -106075,7 +106206,6 @@ novema.jp, 1 novenopiso.tk, 1 noventiq.co.uk, 1 -novento.bg, 1 novezamky.tk, 1 novgorod-news.net, 1 novgorod24.tk, 1 @@ -106115,6 +106245,7 @@ novonordiskfonden.dk, 1 novoodesabibl.tk, 1 novoopus.com, 1 +novora.at, 1 novoresume.com, 1 novorossiysk.tk, 1 novorussiya.tk, 1 @@ -106226,7 +106357,6 @@ nptfisheries.org, 1 nptn.tk, 1 npws.net, 1 -nqesh.blog, 1 nqesh.ph, 1 nqhomeinsurance.gov.au, 1 nrac.or.jp, 1 @@ -106251,7 +106381,6 @@ nrsmart.com, 1 nrthcdn.me, 1 nrttv.com, 1 -nrvc.net, 1 nrvn.cc, 1 nrvweb.net, 1 nrw-stiftung-magazin.de, 1 @@ -106271,6 +106400,7 @@ nsbih.ba, 1 nsboston.org, 1 nsbufl.gov, 1 +nsc365.co.jp, 1 nscai.gov, 1 nscdegreeverify.com, 1 nscdegreeverify.org, 1 @@ -106283,10 +106413,12 @@ nscverifications.net, 1 nscverifications.org, 1 nsdcprayerforce.com, 1 +nse-ebp.com, 1 nsec.dk, 1 nsecure.nl, 1 nseicc.com, 1 nseindia.com, 1 +nsenmf.com, 1 nsep.gov, 1 nsf-journal.hr, 1 nsfw.dk, 1 @@ -106295,7 +106427,6 @@ nsfwph.org, 1 nsglamm.com, 1 nshipster.co.kr, 1 -nsic.mil, 1 nsics.co.jp, 1 nsikakimoh.com, 1 nsimobilewatersolutions.com, 1 @@ -106311,7 +106442,6 @@ nslone.com, 1 nsm.ee, 1 nsmail.cn, 1 -nsmail.com, 1 nsms.com, 1 nsncatalog.com, 1 nso.ie, 1 @@ -106332,6 +106462,7 @@ nssfchile.tk, 1 nssquad.tk, 1 nstatic.xyz, 1 +nstd.net, 1 nstnet.org, 1 nsu.pw, 1 nsv.ee, 1 @@ -106347,6 +106478,7 @@ ntcoss.org.au, 1 ntcp.ph, 1 ntcrmezon.ru, 1 +ntdf.co.uk, 1 ntdse.org, 1 nte.email, 1 nte.no, 0 @@ -106491,7 +106623,6 @@ nullxsec.net, 1 nully.xyz, 1 nulsc.biz, 1 -nulsc.net, 1 numancia.tk, 1 numarasorgulama.tel, 1 numaxion.fr, 1 @@ -106531,7 +106662,6 @@ nunesgh.com, 1 nunesgh.org, 1 nunnenmacher.net, 0 -nunnun.jp, 1 nunoarruda.com, 1 nunoefabia.tk, 1 nunogand.com, 1 @@ -106552,8 +106682,10 @@ nupaybusiness.com.br, 1 nuquery.com, 1 nur-test.de, 1 +nura.gay, 1 nuraling.com, 1 nuranagi.rocks, 1 +nurani.io, 1 nureg.club, 1 nureg.net, 1 nuria-fergo.tk, 1 @@ -106562,6 +106694,7 @@ nurkamol.com, 1 nurmio.fi, 1 nurnabi.ml, 1 +nurolyn.store, 1 nurrobin.de, 1 nurseactioners.ga, 1 nurseactionest.ga, 1 @@ -106597,7 +106730,6 @@ nutralivbio.com, 1 nutrashop.fr, 1 nutriciametabolics-shop.de, 1 -nutriflex.co.za, 1 nutrifyyourself.com, 1 nutrijets.com, 1 nutrineyfelipe.com, 1 @@ -106749,6 +106881,7 @@ nyaone-object-storage.com, 1 nyap.org, 0 nyatane.com, 1 +nyau.me, 1 nyawau.ch, 1 nyawork.com, 1 nyb.agency, 1 @@ -106790,7 +106923,6 @@ nymanelectric.com, 1 nymbus.com, 1 nymtc.org, 1 -nynadynasir.my.id, 1 nyoka-nodejs.com, 1 nyoka-react.com, 1 nyoka.io, 1 @@ -106844,7 +106976,6 @@ nzbnoob.com, 1 nzbr.de, 1 nzbs.moe, 1 -nzbstars.com, 1 nzcorp.dk, 1 nzdata.org, 1 nzelaweb.com, 1 @@ -106941,16 +107072,17 @@ oakesfam.net, 1 oakey.uk, 1 oakface.com.au, 1 +oakfarmsdairy.com, 1 oakharbor.gov, 1 oakhill.com, 0 oakhillfl.gov, 1 oakhillseniors.com, 1 oakislandnc.gov, 1 +oaklab.hu, 1 oaklandenrolls.org, 1 oaklandfire6.com, 1 oaklandnewsonline.com, 1 oaklawn.com, 1 -oakparkelectrical.com, 1 oakrealty.ca, 1 oakridgeclinic.ca, 1 oakshield.nl, 1 @@ -106987,6 +107119,7 @@ obarax.com, 1 obatjantungrematik.tk, 1 obbr.tk, 1 +obcanskeshromazdeni.cz, 1 obcfl.com, 1 obcina.com, 1 obclub.tk, 1 @@ -107022,7 +107155,6 @@ obfc.me, 1 obg-global.com, 1 obg.ceo, 1 -obgalslancaster.com, 1 obgynecologistnyc.com, 1 obgynqueensnyc.com, 1 obhg.com, 1 @@ -107037,6 +107169,7 @@ obj.moe, 1 object.earth, 1 objectcache.pro, 1 +objectif-bastille.com, 1 objectif-securite.ch, 1 objectif-vancouver-2010.fr, 1 objectifs-fitness.com, 1 @@ -107044,6 +107177,7 @@ objectivefoodie.com, 1 objectiveone.com, 1 objectivity.co.uk, 1 +objectoneworld.com, 1 objetodestaque.com.br, 1 obl.ong, 1 oblak.host, 1 @@ -107051,6 +107185,7 @@ oblat.lv, 1 oblique.security, 1 oblitsov.ru, 1 +oblivionsearch.com, 1 oblivious.ml, 1 oblojka.tk, 1 obmen-viz.tk, 1 @@ -107094,7 +107229,6 @@ obss.tech, 1 obstgarten.berlin, 1 obsuzhday.com, 1 -obsyk.ai, 1 obtainhigh.com, 1 obtima.org, 1 obuchowicz.pl, 1 @@ -107114,9 +107248,9 @@ obzor-znakomstv.tk, 1 obzory-evgeny.tk, 1 oc-minecraft.com, 1 -ocab.se, 1 ocabj.net, 1 ocacnews.net, 1 +ocadefusion.fr, 1 ocaladepositionreporter.com, 1 ocalafl.gov, 1 ocalapd.gov, 1 @@ -107235,7 +107369,6 @@ oconnoradv.com, 1 ocontocountywi.gov, 1 ocotg.com, 1 -ocpatentlawyer.com, 1 ocponj.gov, 1 ocprintgraphics.gov, 1 ocqueoctwpmi.gov, 1 @@ -107353,7 +107486,6 @@ odico.dk, 1 odifi.com, 1 odigitalmarketing.com.br, 1 -odigo.com, 0 odijmond.nl, 1 odinpl.com, 1 odinraz.ga, 1 @@ -107385,7 +107517,7 @@ oduncum.net, 1 odunpazari.bel.tr, 1 odvdigital.com, 1 -odyso.org, 1 +odxin.com, 1 odyssee-animation.tk, 1 odyssey44.com, 1 odyssy.tech, 1 @@ -107415,7 +107547,6 @@ oelsner.net, 1 oemdealsers.ga, 1 oemdrink.com, 1 -oemparcacim.com, 1 oemspace.net, 1 oen.tw, 1 oeno.link, 1 @@ -107437,7 +107568,6 @@ ofallonil.gov, 1 ofallonmo.gov, 1 ofasoft.com, 1 -ofb.uz, 1 ofbdc.org.au, 1 ofcampuslausanne.ch, 0 ofcr.co.jp, 1 @@ -107470,9 +107600,7 @@ offers.jp, 1 offgamers.com, 1 offgrid.hr, 1 -offgridauto.com, 1 office, 1 -office-addins.com, 1 office-aslabo.com, 1 office-basilique.notaires.fr, 1 office-de-tourisme.net, 0 @@ -107528,6 +107656,7 @@ offpages.gq, 1 offpages.ml, 1 offpageseopro.tk, 1 +offrex.eu, 1 offshoot.rentals, 0 offshore-technology.com, 1 offshore.hosting, 1 @@ -107572,6 +107701,7 @@ oftn.org, 1 ofuquemalitaestoy.tk, 1 oga.fit, 0 +ogamedb.com, 1 ogamerezine.tk, 1 ogar.ga, 1 ogarkovo.ml, 1 @@ -107601,7 +107731,6 @@ ogorod-money.tk, 1 ogot.org, 1 ogradylake.ca, 1 -ogrencimerkezi.org, 1 ogrenciyurtlari.tk, 1 ogretmenimsanat.com, 0 ogrod.krakow.pl, 1 @@ -107612,6 +107741,7 @@ ogyaa.jp, 0 oh14.de, 1 oh64.moe, 1 +ohackermascarado.org, 1 ohai.is, 1 ohai.social, 1 ohai.su, 1 @@ -107664,7 +107794,6 @@ ohvoice.com, 1 ohwatch.co.za, 1 ohwowlash.com, 1 -ohydne.pl, 1 ohyooo.com, 1 ohype.ga, 1 ohype.gq, 1 @@ -107688,7 +107817,6 @@ oirnoir.gq, 1 oirnoir.ml, 1 ois.dk, 1 -oisabre.com, 1 oisd.nl, 1 oiseaux-mania.com, 1 oiseauxdesjardins.tk, 1 @@ -107709,6 +107837,7 @@ ojp.gov, 1 ok-ise.com, 1 ok-travel.tk, 1 +ok.med, 1 ok.ru, 1 ok2a.org, 1 ok3on.cz, 1 @@ -107745,9 +107874,9 @@ okemahok.gov, 1 okgun.co, 1 okhanvatansever.tk, 1 +okhelp.org, 1 okib.ca, 1 okiefrog.org, 1 -okinawa-mag.net, 1 okinawa-seaside.com, 1 okinext.com, 1 okiram.net, 1 @@ -107790,7 +107919,6 @@ oksafe-t.org, 1 oksanakazakova.tk, 1 oksentiuk.pp.ua, 1 -oksichemk.com, 0 okskoleni.cz, 1 oksystem.cz, 1 oktava.tk, 1 @@ -108043,7 +108171,6 @@ olxdir.tk, 1 oly.st, 1 olyfed.com, 1 -olymp-arts.world, 1 olympe-transport.fr, 1 olympia-blerick.tk, 1 olympia-londerzeel.tk, 1 @@ -108100,6 +108227,7 @@ omb.gov.ph, 1 ombrazur.fr, 1 ombregialle.it, 1 +ombudscommissies-hertogenbosch.nl, 1 omc-copiers.com, 1 omcg.de, 1 omd.com, 1 @@ -108142,10 +108270,8 @@ omkarpathak.in, 1 omlpar.gov, 1 omm.com, 1 -ommam.com.br, 1 omn.cc, 1 omnel.ml, 1 -omnepresent.com, 1 omnergy.au, 1 omnergy.com.au, 1 omnergy.net, 1 @@ -108163,7 +108289,6 @@ omnical.ru, 1 omnicommediagroup.com, 1 omniconvert.com, 1 -omnicourt.jp, 1 omnidiecasting.com, 1 omniflex.au, 1 omniflex.cn, 1 @@ -108178,6 +108303,7 @@ omnifotoside.tk, 1 omniga.de, 1 omnilert.net, 1 +omnirealm.tech, 1 omnirecherche.nl, 1 omniscimus.net, 0 omnisiens.se, 1 @@ -108245,7 +108371,6 @@ onawaymi.com, 1 onbettertech.com, 1 onbley.com.br, 1 -onboardittech.com, 1 onboardti.com.br, 1 onboat-seminars.com, 1 onbrand.me, 1 @@ -108256,7 +108381,6 @@ oncentive.io, 1 onceuagain.tk, 1 onceuponabow.org, 1 -onceuponarainbow.co.uk, 1 onchclub.tk, 1 onclouds.tech, 1 onco-grandest.fr, 1 @@ -108271,7 +108395,9 @@ ondeck.com.au, 1 ondemandassociate.com, 1 onderka.com, 1 +onderneembaar.nl, 1 ondernemenindenbosch.nl, 1 +ondernemeninshertogenbosch.nl, 1 onderzoeksraad.nl, 1 ondevamosjantar.com, 1 ondiet.biz, 1 @@ -108296,7 +108422,6 @@ one3oneapartments.com, 1 oneaftac.gov, 1 oneandfree.org.au, 1 -oneanime.cn, 1 oneartyminute.com, 1 onebanc.ai, 1 onebelo.tk, 1 @@ -108307,6 +108432,7 @@ onebreadcrumb.com, 1 onebreadcrumb.com.au, 1 onecarsource.com, 1 +onecashye.com, 1 onecauseuk.org, 1 onecellatatime.org, 1 onecharge.biz, 1 @@ -108352,7 +108478,6 @@ onegeology.org, 1 oneggiri.com, 1 onegift.bg, 1 -onehealthbehaviors.org, 1 oneheartbali.church, 0 onehost.kz, 0 oneidacityny.gov, 1 @@ -108429,7 +108554,6 @@ onetouchreveal.it, 1 onetouchtour.com, 1 onetown.gq, 1 -onetranslations.com.br, 0 onetrust.com, 1 onetwentyseven001.com, 1 onetwo-vermietung.de, 1 @@ -108523,6 +108647,7 @@ online-lernprogramme.de, 1 online-mobile-phone-shop.tk, 1 online-news-usa.tk, 1 +online-personaltrainer.com.au, 1 online-pochta.ml, 1 online-pr.at, 1 online-shop-equipment.tk, 1 @@ -108530,7 +108655,9 @@ online-store-phones.tk, 1 online-taxes.tk, 1 online-tesis.com, 1 +online-textil.com, 1 online-textil.cz, 1 +online-textil.sk, 1 online-umwandeln.de, 1 online-video-cutter.com, 1 online-voice-recorder.com, 1 @@ -108544,7 +108671,6 @@ online365.ga, 1 onlineaccess.io, 1 onlinebathrooms.ie, 1 -onlinebettingacademy.com, 1 onlinebiller.com, 1 onlinebillingform.com, 1 onlinebookmarks.tk, 1 @@ -108615,6 +108741,7 @@ onlinepaydayloans365.tk, 1 onlineplay.ml, 1 onlinepokieau.net, 1 +onlinepokies.me, 1 onlineprojects.in, 1 onlineradio.com.pl, 1 onlineradio.pp.ua, 1 @@ -108630,7 +108757,6 @@ onlineseminar.nl, 1 onlineservisprogrami.com, 1 onlineshopsatkhira.tk, 1 -onlinesim.com, 1 onlinesitereviews.com, 1 onlinesloten.nl, 1 onlinesorusor.cf, 1 @@ -108743,23 +108869,22 @@ ontariopropertybuyers.com, 1 ontarioreporting.com, 1 ontariostorage.com, 1 -ontdekhetzelf.nu, 1 +ontdekhetzelf.nu, 0 ontestpad.com, 1 onthe.network, 1 ontheballbuilding.com.au, 1 -onthegosystems.com, 1 onthemend.com, 1 onthesocials.com.au, 1 onthisday.com, 1 ontimeemergencyroadsideandbatteryservice.com, 1 ontogenese.net, 1 ontopoflove.nl, 1 +ontora.ee, 1 ontourmarketing.at, 1 ontreams.com, 1 ontrio.cz, 1 ontrip.dk, 1 ontrip.kr, 1 -ontruck.org, 1 ontscore.com, 1 ontsnappingskamer.nl, 1 onttt.com, 1 @@ -108809,7 +108934,6 @@ ooo.xxx, 1 oooaltera.ru, 1 oooh.events, 1 -oooir.ru, 1 ooonja.de, 1 oooo.loan, 1 ooooo.cz, 1 @@ -108851,7 +108975,6 @@ opdi.aero, 1 ope.ee, 1 opeixinho.com.br, 1 -opel-focken.de, 0 opelim.net, 1 open-banking-access.uk, 1 open-bs.com, 1 @@ -108897,7 +109020,6 @@ openbeecloud.com, 1 openbible.com.au, 1 openbiblebookstore.com.au, 1 -openbleam.com, 1 openblink.biz, 1 openblink.org, 1 openblox.org, 1 @@ -108944,7 +109066,7 @@ openhandhelds.org, 1 openhisto.com, 1 openhistory.de, 1 -openhome.com.co, 1 +openhome.com.co, 0 openhousemelbourne.org, 1 openhwgroup.cn, 1 openhwgroup.org, 1 @@ -108968,7 +109090,6 @@ openmdm.eu, 1 openmdm.org, 1 openmind.ga, 1 -openmindonline.it, 1 openmindsec.com, 1 openmirrors.cf, 1 openmirrors.ml, 1 @@ -108994,7 +109115,6 @@ openreplay.com, 1 openresa.com, 1 openresearch.amsterdam, 1 -openreview.net, 1 openroademail.com, 1 openrtm.org, 1 openscience.ml, 1 @@ -109188,7 +109308,7 @@ optik-sehstern.de, 0 optik-tamara.de, 1 optik-trosdorff.de, 1 -optikabane.com, 1 +optikabane.com, 0 optikflow.com, 1 optikoscolombia.com, 1 optilan.tk, 1 @@ -109208,6 +109328,7 @@ optimisedlabs.uk, 1 optimization-online.org, 1 optimizationanalyticsest.ga, 1 +optimizatunomina.es, 1 optimize-jpg.com, 1 optimizedlabs.co.uk, 1 optimizedlabs.info, 1 @@ -109358,6 +109479,7 @@ orbit.church, 1 orbita.zp.ua, 1 orbitaclub.cf, 1 +orbital8.com.au, 1 orbitalcommerce.com.br, 0 orbitdefence.co.uk, 1 orbitfab.com, 1 @@ -109378,6 +109500,7 @@ orcas.tk, 1 orcasecurity.io, 1 orchardnh.org, 1 +orchardpure.com, 1 orchestra.tk, 1 orchestremetropolitain.com, 1 orchidee-mariage.com, 1 @@ -109425,7 +109548,6 @@ ordner.tk, 1 ordoptimisten.se, 1 ordoro.com, 1 -ordr.net, 1 ordr.no, 1 ordremk.fr, 1 orduhaberleri.tk, 1 @@ -109449,7 +109571,6 @@ orel-news.net, 1 orel-sait.tk, 1 orel.ga, 1 -orel.se, 1 orelblog.tk, 1 orelnet.tk, 1 orem.gov, 1 @@ -109486,15 +109607,17 @@ organicossuliani.com.br, 1 organicpoint.in, 1 organicrootsfestival.tk, 1 -organicsearcher.com, 1 organictanningest.ga, 1 organisatieteam.nl, 1 +organisemyday.in, 1 organist.de, 1 organizacasa.com.br, 0 organizalpha.com, 1 +organizar360.com.br, 1 organizasyon.tk, 1 organizasyonbul.com, 1 organization-of-holidays.tk, 1 +organized.cooking, 1 organizedrhyme.tk, 1 organizewithmarie.com, 1 organo.pk, 1 @@ -109572,7 +109695,6 @@ oris.edu.ee, 1 orisline.com, 1 oritain.com, 1 -orito-hifuka.com, 1 oriveda.com, 1 orix.com.au, 1 oriya-hrs.com, 0 @@ -109584,6 +109706,7 @@ orkestron.com, 1 orkiv.com, 0 orkkikerho.tk, 1 +orkomedia.com, 1 orland.tk, 1 orlandgo.com, 1 orlandhillspdil.gov, 1 @@ -109594,6 +109717,7 @@ orleika.ml, 1 orlowisko.pl, 1 ormondcatclinic.com, 1 +ormsson.is, 1 ornc.org, 1 ornikar.com, 1 ornithopter.tk, 1 @@ -109606,7 +109730,6 @@ orocojuco.com, 1 oroconews.com.br, 1 orodelsalento.com, 1 -oroeditions.com, 1 orologeria.roma.it, 1 orologi.roma.it, 1 oronomn.gov, 1 @@ -109652,6 +109775,7 @@ ortiatuttogas.it, 1 ortigasmalls.com, 1 ortigueira.ga, 1 +ortizbotellaabogados.es, 1 ortizmario.com, 1 ortocity.com.br, 1 ortocraft.tk, 1 @@ -109700,6 +109824,7 @@ osamatoon.ml, 1 osandp.com, 1 osankj.tk, 1 +osano.ai, 1 osano.com, 1 osano.id, 1 osarahealth.com, 1 @@ -109797,6 +109922,7 @@ oslinux.net, 1 oslo-kammerorkester.no, 1 oslofjorden.org, 1 +oslogreenbelt.no, 1 osm.is, 1 osmaniyehaber.tk, 1 osmanlitakilari.tk, 1 @@ -109842,7 +109968,6 @@ ostankino.tk, 1 ostechnix.com, 1 ostek.tk, 1 -ostendorf.com, 1 osteolaclusaz.com, 0 osteopathe-voisine.com, 1 osteopatiaymasaje.com, 1 @@ -109865,7 +109990,6 @@ ostrovseocitra.ga, 1 ostrovseocitra.gq, 1 ostrovseocitra.ml, 1 -ostrovsky-web.de, 1 ostseebad-sellin.de, 1 osttopst.online, 1 osuarez3.com, 1 @@ -109884,13 +110008,11 @@ oswestrysff.co.uk, 1 oswmlab.com, 1 osworx.net, 1 -oszteralexandra.hu, 1 ot-honfleur.fr, 1 ot-vinta.tk, 1 ot.id, 1 otaikajang.org, 1 otako.pl, 0 -otaku-treasure.com, 1 otakubox.de, 1 otakucloud.net, 0 otakuie.tk, 1 @@ -109997,6 +110119,7 @@ ouipharma.fr, 1 oujj.link, 1 ouldlamara.tk, 1 +oulmes.ma, 1 oulunjujutsu.com, 1 ouminews.net, 1 oumlaut.net, 1 @@ -110031,6 +110154,7 @@ ourladyqop.org, 0 ourladyqueenofmartyrs.org, 1 ourlink.tk, 1 +ourlittlejoys.com, 1 ourlocality.org, 1 ourmarket.live, 1 ourmuktsarsaheb.in, 1 @@ -110044,7 +110168,6 @@ ourplanetary.com, 1 oursibparksplan.com, 1 oursmartcity.au, 1 -oursportscentral.com, 1 ourstory.rip, 1 oursweb.com, 1 oursweb.net, 1 @@ -110131,7 +110254,6 @@ outworking.com, 1 ouverture-coffre-fort.fr, 1 ouvindo.com.br, 1 -ouvrierbtp.com, 1 ouwerling.tk, 1 ovabastecedoraindustrial.com, 1 ovalle.tk, 1 @@ -110266,6 +110388,7 @@ owlbee.it, 1 owlbee.nl, 1 owlbee.uk, 1 +owlchess.com, 1 owldevelopers.tk, 1 owlhollowbakery.com, 1 owllee.com, 1 @@ -110350,7 +110473,6 @@ oxydac.com, 1 oxydrate.com, 1 oxygames.tk, 1 -oxygen.com, 1 oxygenated.cf, 1 oxygenforchennai.com, 1 oxygenupdater.com, 1 @@ -110374,7 +110496,6 @@ oyaptcdsb.com, 1 oyaquelegal.com.br, 1 oyemobile.ca, 1 -oyemobile.com, 1 oyk13tyuj8ljpete31edj2tes-9if7bi.com, 0 oyo.moe, 1 oyoshi.com.my, 1 @@ -110416,6 +110537,7 @@ ozgesezen.com, 1 ozgoz.com, 1 ozgpp.de, 1 +ozgurbilge.com, 1 ozgurbozkurt.com, 1 ozgurgokmen.net, 1 ozgurkazancci.com, 1 @@ -110477,6 +110599,7 @@ p333b.net, 1 p333e.net, 1 p333j.net, 0 +p35consulting.com, 1 p36533.com, 1 p4.pm, 1 p4c-admin.azurewebsites.net, 1 @@ -110540,7 +110663,6 @@ pabloarteaga.xyz, 1 pablocamino.tk, 1 pablocelorio.com, 1 -pablodominio.sbs, 1 pablofain.com, 0 pablofonta.es, 1 pablogracia.es, 1 @@ -110578,6 +110700,7 @@ pachamamita.eu, 1 pachetomat.ro, 1 pachinstyle.com, 1 +pachuta.pl, 1 paciella.com, 1 pacificaent.net, 1 pacificbags.com.au, 1 @@ -110596,7 +110719,7 @@ pacificpalisadeslandscapelighting.com, 1 pacificprivatebank.com, 1 pacificpuke.com, 1 -pacificscience.com, 1 +pacificscience.com, 0 pacificstates.net, 1 pacifictechnologie.com, 1 pacifique-web.nc, 1 @@ -110647,7 +110770,7 @@ pacteo.com, 1 pactf-flag-4boxdpa21ogonzkcrs9p.com, 1 pactf.com, 1 -pactnetwork.com.au, 0 +pactnetwork.com.au, 1 pactum.com, 1 pactumdr.com.au, 1 pacxodka.ru, 1 @@ -110699,7 +110822,6 @@ padutip.cz, 1 padutip.eu, 1 paduwitze.de, 1 -padzilla.com, 1 pae.com, 1 paegae.gr, 1 paerbikes.com, 1 @@ -110745,7 +110867,6 @@ pageuppeople.com, 1 pagevitals.com, 1 pagewizz.com, 1 -pagexl.com, 1 pagiamtzis.com, 1 pagina394.com.br, 1 paginamaravillosa.tk, 1 @@ -110809,6 +110930,7 @@ paisa-dev.azurewebsites.net, 1 paisagia.com, 1 paisagia.com.br, 1 +paisano-online.com, 1 paisley.is, 1 paisleyandsparrow.com, 1 paistation.ch, 1 @@ -110827,6 +110949,7 @@ paketwisataliburan.com, 1 pakeystonesaves.gov, 1 pakeystonescholars.gov, 1 +pakfactory.com, 1 pakforces.tk, 1 pakho.xyz, 1 pakingas.lt, 1 @@ -110854,6 +110977,7 @@ paksui-ne.tk, 1 pakun.org, 1 palabr.as, 1 +palabrapp.com, 1 palaceitalia.tk, 1 palacezamkidwory.com, 1 paladin.wtf, 1 @@ -110981,7 +111105,6 @@ pana4ucloud.ddns.net, 1 panaceainfosec.com, 1 panaceallc.net, 1 -panama-listings.com, 1 panamacity.gov, 1 panamacitypolice.gov, 1 panamatravel.tk, 1 @@ -111019,6 +111142,7 @@ pancake-world.com, 1 pancake.gg, 1 panchajanyafashions.com, 1 +panchaminteriors.com, 1 panda-bg.com, 1 panda-community.com, 1 panda-craft.tk, 1 @@ -111038,6 +111162,7 @@ pandamoto.fr, 1 pandaplanes.com, 1 pandapsy.com, 1 +pandascrow.io, 1 pandasilk.com, 1 pandavpn.pro, 1 pandavpnpro.com, 1 @@ -111074,6 +111199,7 @@ panele-fotowoltaiczne.pl, 1 paneljobsers.ga, 1 panelsandwich.com, 1 +panerusan.desa.id, 1 paneu.de, 1 panezai.tk, 1 pang.ga, 1 @@ -111206,6 +111332,7 @@ papel.az, 1 papelcraft.co.uk, 1 papeleo.digital, 1 +papeleria-tecnica.net, 1 papeleriayasesorias.com.co, 1 papelisimo.es, 1 paper.aero, 1 @@ -111232,7 +111359,6 @@ papierowyrycerz.pl, 1 papillomatest.com, 1 papillon-events.be, 1 -papkinadochka.ru, 1 paplajsoftware.com, 1 papotage.net, 1 papouille.ml, 1 @@ -111242,7 +111368,7 @@ pappys.kitchen, 1 papuaone.com, 0 papuzkija.pl, 1 -papygeorges.fr, 1 +papygeorges.fr, 0 paqtam.com, 1 par-allel.ru, 1 parabellum-barakaldo.tk, 1 @@ -111274,6 +111400,7 @@ paradiselost.com, 0 paradisemassagenj.com, 1 paradisend.tk, 1 +paradisepdf.com, 1 paradisetownshipmi.gov, 1 paradisim.tk, 1 paradisu.fr, 1 @@ -111312,8 +111439,8 @@ paranoid.is, 1 paranoidandroid.co, 1 paranoidandroid.tk, 1 +paranoidhome.net, 1 paranoidpengu.in, 1 -paranoidpenguin.net, 1 paranormales.tk, 1 paranoxer.hu, 1 paranoxido.tk, 1 @@ -111342,7 +111469,6 @@ parc.com, 1 parcare.at, 1 parcbotanique.com, 1 -parcdumbravaminunata.ro, 1 parceirofinanceiro.pt, 1 parcelauditpartners.com, 1 parceltrackr.com, 1 @@ -111365,6 +111491,7 @@ parenthaven.com, 1 parentingplaydough.tk, 1 parentinterview.com, 1 +parentpay.com, 1 parentpayments.com.au, 1 parents-as-allies.com, 1 parentsandzebrasunited.com, 1 @@ -111374,6 +111501,7 @@ pareto.space, 1 paretoit.com, 1 paretorule.cf, 1 +paretox.com, 1 parfin.io, 1 parfum-best.ml, 1 parfumer.tk, 1 @@ -111384,7 +111512,6 @@ pari-vinci.org, 1 pari.cafe, 1 pari.cz, 1 -paribus.io, 1 parichadrelax.se, 1 parideal.com, 1 parideal.de, 1 @@ -111392,12 +111519,10 @@ paridurable.com, 1 parikmag-pm.ru, 1 parikmaxeru.tk, 1 -parimatch-best.com, 1 parimatch-chance.com, 1 parimatch-email.com, 1 parimatch-sport.com, 1 parimatch-sports.com, 1 -parimatch-world.com, 1 parimatch.co.tz, 1 parimatch.com, 1 parimatch.in, 1 @@ -111409,7 +111534,6 @@ paripesa.com, 1 paripesa.ng, 1 paris-avenues.com, 1 -paris-elysees.com, 0 paris-luttes.info, 1 paris.edu, 1 parisa-panahi.com, 1 @@ -111424,6 +111548,7 @@ parisdimitriou.com, 1 parisdomino.tk, 1 parisereporters.com, 1 +parishofcove.org.uk, 1 parishoftheholycross.org, 1 parishome.jp, 1 parismalleg.com, 1 @@ -111453,6 +111578,7 @@ parked.com.br, 1 parkeer.nl, 1 parkeergaragesintjan.nl, 1 +parkeergaragest-jan.nl, 1 parkeergaragestjan.nl, 1 parkeerserviceboxtel.nl, 1 parkefficient.de, 0 @@ -111592,7 +111718,6 @@ partin.nl, 0 partiono.com, 1 partir-en-livre.fr, 1 -partisaani.com, 1 partisan-berlin.tk, 1 partituras.tk, 1 partner-finden.tk, 1 @@ -111650,6 +111775,7 @@ partykanal.cz, 1 partymat.de, 1 partymusikband.de, 1 +partyonbici.com, 1 partypearl.de, 1 partypeeps.tk, 1 partyphoto.tk, 1 @@ -111724,6 +111850,7 @@ passfoto-deinfoto.ch, 1 passgator.com, 1 passieposse.nl, 1 +passings.io, 1 passion-billard.fr, 1 passion-net.fr, 1 passionatefoodie.co.uk, 1 @@ -111760,7 +111887,7 @@ passware.com, 1 passwd.one, 1 password-checker.de, 1 -password.codes, 1 +password.codes, 0 password.consulting, 1 password.town, 1 passwordass.org, 1 @@ -111794,6 +111921,7 @@ pasternak.net, 1 pasternok.org, 1 pasteros.io, 1 +pasters.wtf, 1 pasteworks.com, 1 pasticceria.milano.it, 1 pasticcerialorenzetti.com, 1 @@ -111803,7 +111931,6 @@ pastor.icu, 1 pastorbelgagroenendael.com.br, 1 pastorcanadense.com.br, 1 -pastordin.us, 1 pastordocaucaso.com.br, 1 pastorello.cf, 1 pastorello.ga, 1 @@ -111831,7 +111958,7 @@ patchassociates.com, 1 patchli.fr, 1 patchofabsence.com, 1 -patchstack.com, 0 +patchstack.com, 1 patchyvideo.com, 1 patdorf.com, 1 patechmasters.com, 1 @@ -111854,6 +111981,7 @@ pathofexile2.com, 0 pathogen.nl, 1 pathologie-dna.nl, 1 +pathos.gg, 1 pathpartnertech.com, 1 pathsaversers.ga, 1 pathsaversest.ga, 1 @@ -111865,7 +111993,6 @@ patientdesk.ai, 1 patientenverfuegung.digital, 1 patientjourneyapp.com, 0 -patientspaid.com, 1 patientup.com, 1 patientys.com, 1 patiga.ga, 1 @@ -111920,7 +112047,6 @@ patrikjohan.gq, 1 patrikjohan.tk, 1 patriksima.cz, 1 -patrikx3.com, 1 patrimoine-neuwiller.fr, 0 patrimoniumtouraine.com, 1 patriotbearingsupply.com, 1 @@ -111999,7 +112125,6 @@ paulmilligan.co.uk, 1 paulmolloy.guitars, 1 paulmolloydesign.com, 1 -paulmurraycleaningservices.ie, 1 paulo.nom.za, 1 pauloalcalde.co, 1 pauloalcobianeves.pt, 1 @@ -112063,6 +112188,7 @@ pavelstriz.cz, 1 pavementpr.com, 1 paven.io, 0 +paverlaunch.com, 1 pavernosmatao.tk, 1 pavestone.co.uk, 1 pavilion-bukitjalil.com, 1 @@ -112215,6 +112341,7 @@ paymentaccuracy.gov, 1 paymentap.co.uk, 1 paymentjs.com, 1 +paymentportaldev.io, 1 paymentportaldevopslocal.io, 1 payments.google.com, 1 paymeservice.com, 1 @@ -112226,6 +112353,7 @@ paynode.com, 1 payonline-api.xyz, 1 payop.com, 1 +payorth.com, 1 paypac.biz, 1 paypac.co.nz, 1 paypac.co.uk, 1 @@ -112250,6 +112378,7 @@ payroll.ch, 0 payroll.myftp.org, 1 payrollaustralia.au, 1 +payrollbridge.co.uk, 1 payrollconstructionservices.com, 1 payrollhr.be, 1 payrolloutsourcing.com.au, 1 @@ -112292,17 +112421,18 @@ pb.ax, 0 pbaby.com, 1 pback.se, 1 -pband.ch, 1 pbbm.com.ph, 1 pbc.gov, 1 pbcables.tk, 1 pbcknd.ml, 1 pbcpao.gov, 1 pbcu.com, 1 +pbebank.com, 1 pbern.xyz, 1 pbest.tk, 1 pbforestry.net, 1 pbgfl.gov, 1 +pbgroup.hu, 1 pbhs.co.uk, 1 pbiexplorer.com, 1 pbla.biz, 1 @@ -112324,7 +112454,6 @@ pbz.im, 1 pc-center.tk, 1 pc-construction.fr, 1 -pc-mac.de, 1 pc-master.pl, 1 pc-pharma.com, 1 pc-reanimator.ru, 1 @@ -112395,6 +112524,7 @@ pcnaid.com, 1 pcnewsoft.tk, 1 pcnotdienst-oldenburg-rastede.de, 1 +pcosworkoutplan.com, 1 pcpao.gov, 1 pcpartspicker.in, 1 pcpasokh.ir, 1 @@ -112408,6 +112538,7 @@ pcrab.ml, 1 pcrecovery.ga, 1 pcrla.com, 1 +pcrobot.cz, 1 pcrypt.org, 1 pcsafe.cf, 1 pcsbrasil.ml, 1 @@ -112445,6 +112576,7 @@ pdau.edu.ua, 1 pdavislawgroup.com, 1 pdax.ph, 0 +pdb-group.co.uk, 1 pdcs.nl, 1 pderas.com, 1 pdesinc.org, 1 @@ -112482,6 +112614,7 @@ pdtppfl.gov, 1 pdvault.co, 1 pdxcoinclub.org, 1 +pdxretro.com, 1 pdxroofingandsiding.com, 1 pdz.net, 1 pe-bank.jp, 1 @@ -112529,7 +112662,6 @@ pearle.nl, 1 pearlharbordrydockeisopenhouse.org, 0 pearljamargentina.tk, 1 -pearloc.com, 1 pearlsonly.ca, 1 pearlsonly.com, 1 pearlsonly.com.au, 1 @@ -112555,6 +112687,7 @@ pec.net, 1 pecadis.de, 1 pecan.ai, 1 +pecanplantationland.com, 0 pecasse.be, 0 pecetowicz.pl, 1 pecheneg.tk, 1 @@ -112563,7 +112696,6 @@ pecker-johnson.com, 1 pecmd.net, 1 pecs.com, 1 -pecsusa.com, 1 pect.com.pk, 1 pectusbar.com, 1 ped-bike.de, 1 @@ -112602,7 +112734,6 @@ pedrosaurus.com, 1 pedrosillo-delosaires.tk, 1 pedrotimoteo.com, 1 -peduse.com, 1 peekabooboudoir.com, 1 peekier.com, 1 peekit.ai, 1 @@ -112613,7 +112744,9 @@ peene.be, 1 peenee.in.th, 1 peenor.xyz, 1 +peep.gq, 1 peeptalk.dk, 1 +peeqback.com, 1 peer.travel, 1 peerbearing.com, 1 peerberry.com, 1 @@ -112676,7 +112809,7 @@ peihouston.com, 1 peippo.at, 1 peirong.me, 1 -pejetroperformance.com.br, 1 +pejetroperformance.com.br, 0 pejupiel.com, 1 pekarnasazava.cz, 1 pekarskis.com, 1 @@ -112723,6 +112856,7 @@ pelmeni.cf, 1 pelmeniuralskie.tk, 1 pelo.tk, 1 +peloduro.cl, 1 pelopoplot.com, 0 pelosanimais.org, 1 peloton-technologies.com, 1 @@ -112772,7 +112906,6 @@ pengisatelier.net, 1 pengu.us.kg, 1 pengui.uk, 1 -penguin-stats.cn, 1 penguin-stats.io, 1 penguinclientsystem.com, 1 penguindominatrix.com, 1 @@ -112977,7 +113110,6 @@ peredovaya.tk, 1 peredoz.tk, 1 pereezd.ml, 1 -peregorodka77.ru, 1 peregrinefund.org, 1 peregrinus.es, 1 pereiravillela.com.br, 1 @@ -113049,6 +113181,7 @@ performing-art-schools.com, 1 performingdreams.tk, 1 performive.com, 1 +performx.me, 1 perfumerie.tk, 1 perfumes.com.br, 1 perfumesweb.com.br, 1 @@ -113123,6 +113256,7 @@ permis-apoints.fr, 1 permis.online, 1 permiscoderoute.fr, 1 +permisecole.com, 1 permistheorique.be, 1 permistheoriqueenligne.be, 1 permitting.gov, 1 @@ -113163,8 +113297,8 @@ persianasmodernasluxury.com, 1 persiandating.tk, 1 persianmassagetherapy.com, 1 -persianpool.ir, 1 persianrom.com, 1 +persianwithel.com, 1 persiart.shop, 1 persiennexperten.se, 1 persistence.one, 1 @@ -113172,7 +113306,7 @@ persjrp.ca, 1 perso.pl, 1 persoform.ch, 1 -personacommunications.com.au, 0 +personacommunications.com.au, 1 personal-genome.com, 1 personal-scrum.de, 1 personal-scrum.eu, 1 @@ -113195,6 +113329,10 @@ personalpages.us, 1 personalstructures.com, 1 personaltrainer-senti.de, 1 +personaltrainerdarwin.com.au, 1 +personaltraineressendon.com.au, 1 +personaltrainergeelong.com.au, 1 +personaltrainerportmelbourne.com.au, 1 personaltransporter.es, 1 personalwebsite.services, 1 personcar.com.br, 1 @@ -113214,6 +113352,7 @@ persuasionmatters.com, 1 perthdayhospital.com.au, 1 perthhillsarmadale.com.au, 1 +perthpainspecialists.com.au, 1 perthunicyclists.tk, 1 perthweekend.com.au, 1 pertwarp.tk, 1 @@ -113314,6 +113453,7 @@ petcolor.ga, 1 petcounty.ga, 1 petcrawler.ga, 1 +petdairy.com, 1 petdesign.tk, 1 petdesigning.ga, 1 petdir.ga, 1 @@ -113401,7 +113541,6 @@ petit-bebe.fr, 1 petitbleu.fr, 1 petite-annonce.tk, 1 -petite-maison.ch, 0 petitenote.ch, 1 petitions.by, 1 petitions.pro, 1 @@ -113454,8 +113593,8 @@ petrobench.com, 1 petrochemprojects.ga, 1 petrol-power.tk, 1 -petrol.com.ua, 1 petroleum-schools.com, 1 +petroleumacronyms.com, 1 petroleumservicecompany.com, 1 petroll.ga, 1 petropoulos.ng, 1 @@ -113538,7 +113677,6 @@ pfannkuchenbratze.de, 1 pfarchimedes-pensioen123.nl, 1 pfarr-rad.de, 1 -pfarreiengemeinschaft-neuerburg.de, 1 pfarrhaus-mon.ch, 1 pfashionmart.com, 1 pfaswatersettlement.com, 1 @@ -113649,6 +113787,7 @@ phantomware.tk, 1 pharma-insights.nl, 0 pharma-management.net, 1 +pharma-synergy.hu, 1 pharmaabsoluta.com.br, 1 pharmabach.com, 1 pharmaboard.de, 1 @@ -113664,6 +113803,7 @@ pharmacy.org.pk, 1 pharmacycouncil.org.nz, 1 pharmacyevalar.ru, 1 +pharmacyregulation.org, 1 pharmadrugtest.com, 1 pharmakeia.com, 1 pharmalab.eu, 1 @@ -113725,7 +113865,6 @@ phialo.de, 1 phibureza.com, 1 phigrupopolideportivo.es, 0 -phihq.com, 0 phil-dirt.com, 1 phil-phillies.com, 1 phil.red, 1 @@ -113796,6 +113935,7 @@ phillyhometech.com, 1 phillyinjurylawyer.com, 1 philmontphotography.com, 1 +philna.sh, 1 philographie.com, 1 philology.tk, 1 philomathiclife.com, 1 @@ -113804,6 +113944,7 @@ philosophers.tk, 1 philosopherswool.com, 1 philosophy-colleges.com, 1 +philosophy.moe, 1 philosophyguides.org, 1 philosophyofatheism.com, 1 philphonic.de, 1 @@ -113851,6 +113992,7 @@ phoenixville.online, 1 phol.io, 1 pholder.com, 1 +pholio.ai, 1 pholio.com, 1 phone-service-center.de, 1 phone-spy.ml, 1 @@ -113968,7 +114110,6 @@ photosafari.com.my, 1 photosafaribg.com, 1 photosbyadeline.com, 1 -photosbybstuartseniors.com, 1 photosbyzachary.tk, 1 photoscheduleers.ga, 1 photoscheduleest.ga, 1 @@ -113992,7 +114133,6 @@ phpcraft.de, 1 phpdevlabs.tk, 1 phpdorset.co.uk, 1 -phpfactory.io, 1 phpfashion.com, 1 phpinfo.in.th, 1 phpkari.cz, 1 @@ -114014,6 +114154,7 @@ phr.org, 1 phr34kz.pw, 0 phra.gs, 1 +phraselock.com, 1 phreakaus.tk, 1 phreaker.ml, 1 phreaknet.org, 1 @@ -114084,6 +114225,7 @@ physiomeproject.org, 1 physionova-badenstedt.de, 1 physiopraxisteam.de, 1 +physiosense.net, 1 physioteam-franz.de, 1 physiotherapie-buk.de, 1 physiotherapie-concept.de, 1 @@ -114141,7 +114283,6 @@ piavonpadberg.com, 1 pib.gd, 1 pibgd.fr, 1 -piboston.org, 1 piboubes.me, 1 pic-sl.com, 1 pic.gov, 1 @@ -114162,7 +114303,6 @@ piccolitrasporti.it, 1 piccolopark.co.nz, 1 piccolosgombero.it, 1 -piccolospace.com, 1 piccolotrasloco.it, 1 picdefacer.com, 1 pichainlabs.com, 1 @@ -114217,6 +114357,7 @@ picsalesers.ga, 1 picsastock.com, 1 picshare.nz, 1 +picsquish.com, 1 picstar.tk, 1 picsto.re, 0 pictominoes.com, 1 @@ -114262,7 +114403,6 @@ piening.ddns.net, 1 piensa-escribe.tk, 1 piepermail.nl, 1 -piepet.net, 1 pieq.eu, 1 pieq.eu.org, 1 pier1url.com, 1 @@ -114314,12 +114454,12 @@ pigeonracinginformation.com, 1 pigeons-rings.com, 1 pigfox.com, 1 -piggingcleaning.com, 1 pigment.com, 1 pigmentcollective.com, 1 pigop.com, 1 pigsbytebooks.org, 0 pigslv.com, 1 +pigtracker.com.ar, 1 piguet.com, 0 pigzilla.co, 1 pihaar.de, 1 @@ -114361,7 +114501,6 @@ pilatespt.nl, 1 pilbaraports.com.au, 1 pilchuck.org, 1 -pile.systems, 1 pileawayremovals.com, 1 pilgermaske.org, 1 pili-serv.ovh, 1 @@ -114385,10 +114524,10 @@ pilotknobmo.gov, 1 pilotodianws.azurewebsites.net, 1 pilotorg.ru, 1 -pilotpen.us, 1 pilotproject.tk, 1 pilotshop.com, 1 pilsen.fun, 1 +pilsencr.com, 1 pilseta24.lv, 1 pilsook.com, 1 pilvi.space, 1 @@ -114397,6 +114536,7 @@ pimhaarsma.nl, 1 pimhaarsmamedia.nl, 1 pimmel.stream, 1 +pimo.id, 1 pimoid.fr, 1 pimplelotionest.ga, 1 pimpmymac.ru, 1 @@ -114508,6 +114648,7 @@ pinmeto.com, 1 pinnacle-tex.com, 1 pinnaclecommunityservices.com.au, 1 +pinnaclefoundationrepair.com, 1 pinnacleholdings.com, 1 pinnaclelife.nz, 1 pinnacletrailers.com, 1 @@ -114525,6 +114666,7 @@ pinoytambayan.tk, 1 pinoytimes.tk, 1 pinpaituiguang.com.cn, 1 +pinpals.com.au, 1 pinpayments.com, 1 pinpointengineer.co.uk, 1 pinse.club, 1 @@ -114578,6 +114720,7 @@ pioneer.eu, 0 pioneerbible.org, 1 pioneercredit.com.au, 1 +pioneerks.com, 1 pioneerscar.com, 1 pionierboat.cf, 1 pionierboat.ga, 1 @@ -114605,6 +114748,7 @@ piquaoh.gov, 1 piquark6046.blog, 1 piqueteway.tk, 1 +piraino.fr, 1 piraja.io, 1 piramalglassusa.com, 1 piramide.nl, 1 @@ -114668,7 +114812,6 @@ pita.ninja, 1 pitakashop.hu, 1 pitang.com, 1 -pitaya.ai, 1 pitbooks.ga, 1 pitbox8.nl, 1 pitbullclub.tk, 1 @@ -114766,7 +114909,6 @@ pixelorastudio.com, 1 pixelpaper.org, 1 pixelplex.io, 1 -pixelprint.la, 1 pixelrain.info, 1 pixelsbanking.com, 1 pixelsearch.eu, 1 @@ -114774,7 +114916,7 @@ pixelsketch.co.uk, 1 pixelsquared.us, 1 pixelstamp.net, 1 -pixelstechfest.in, 1 +pixelstechfest.in, 0 pixeltech.com.bd, 1 pixeltranslating.com, 1 pixelturkey.art, 1 @@ -114802,7 +114944,6 @@ pixouno.com, 1 pixshop.fr, 1 pixstudio.ai, 1 -pixsystem.com, 1 pixxxels.cc, 1 pixyship.com, 1 pixzilla.de, 1 @@ -114868,7 +115009,6 @@ pko.ch, 0 pkov.cz, 1 pkservice.tk, 1 -pkshs.my, 1 pkspskov.tk, 1 pkwebsolutions.cf, 1 pkz.ch, 1 @@ -114886,7 +115026,6 @@ placedsupport.com, 1 placeforgames.tk, 1 placehold.co, 1 -placements.io, 0 placenet.fr, 1 placeofindia.com, 1 placepay.com, 1 @@ -114970,6 +115109,7 @@ planetaprogramas.tk, 1 planetarapluso.tk, 1 planetarian.moe, 1 +planetarica.org, 1 planetasilius.tk, 1 planetasuboficial.com.br, 1 planetau2.com, 1 @@ -114987,6 +115127,7 @@ planetgolf.de, 1 planetgrehen.tk, 1 planethowl.com, 1 +planeticke.com, 1 planetickettravel.com, 1 planetknauer.net, 1 planetmath.org, 1 @@ -115011,9 +115152,7 @@ planify.io, 0 planisanin.tk, 1 planiserin.tk, 1 -planisware.academy, 1 planisware.cn, 1 -planisware.io, 1 planisware.live, 1 planisys.net, 1 planit-inc.com, 1 @@ -115085,6 +115224,7 @@ plassmann.ws, 1 plast.bg, 1 plast.design, 1 +plastacier.fr, 1 plastdesign.com.ua, 1 plastex.tk, 1 plastic2print.com, 0 @@ -115102,7 +115242,6 @@ plasticsurgerypartyest.ga, 1 plasticwindows.tk, 1 plastikkirurgiskane.se, 1 -plastischechirurgie-linz.at, 1 plastokna.tk, 1 plastovelehatko.cz, 1 plastrequest.com, 1 @@ -115219,7 +115358,6 @@ playit.rs, 1 playkids.com, 0 playmei.com, 0 -playmyinbox.com, 1 playnow.com, 1 playnuganug.com, 1 playocean.net, 1 @@ -115257,7 +115395,6 @@ plcgurus.net, 1 plchardware.com, 1 pldeyewear.com.ua, 1 -pldx.org, 1 ple.jp, 1 ple.llc, 1 pleasantonca.gov, 1 @@ -115338,7 +115475,6 @@ ploi.io, 1 plokko.com, 0 plomberie-rivesud.ca, 1 -plombierjob.com, 1 plomeros.cl, 1 plomin.tk, 1 plongee-phuket.fr, 1 @@ -115366,6 +115502,7 @@ pluginuri-wordpress.ro, 1 plugmeubelen.nl, 1 plugnroll.com, 1 +plugra.com, 1 plugshare.com, 1 pluimveeplanner.nl, 1 plumair-ve.com, 1 @@ -115402,7 +115539,7 @@ plurilock.com, 1 pluriumint.com, 1 plus-project.co.uk, 1 -plus.ai, 1 +plus.ai, 0 plus.google.com, 1 plus.sandbox.google.com, 1 plus15.ml, 1 @@ -115415,7 +115552,6 @@ plusfitness.com.au, 1 plusgrandevilledefrance.com, 1 plushev.tk, 1 -pluslink.co.jp, 1 pluspass.com, 1 plusport-api.com, 1 plusport.com, 1 @@ -115481,6 +115617,7 @@ pmg.ua, 1 pmgroup-global.com, 0 pmh.codes, 1 +pmh.so, 1 pmhh.com.br, 1 pmi-install.com, 1 pmi.edu, 1 @@ -115508,7 +115645,6 @@ pn.id.lv, 1 pnakosoft.com.au, 1 pnbholdings.com, 1 -pnch.fi, 1 pneu01.fr, 1 pneu74.fr, 1 pneuhaus-lemp.ch, 1 @@ -115663,6 +115799,7 @@ pocketmags.com, 1 pocketnow.com, 1 pocketoption.com, 1 +pocketoption.cz, 1 pocketoption.ru, 1 pocketsquare.jp, 1 pockettradesman.com, 1 @@ -115673,6 +115810,7 @@ pocopizza.co.uk, 1 pocopt.com, 1 pocopt.ru, 1 +pocsai.hu, 1 pocsaismartsystem.hu, 1 pocze.ch, 1 pocztowski.it, 1 @@ -115700,7 +115838,7 @@ podcastname.space, 1 podcastpulse.net, 1 podcastsaver.com, 1 -podcaststudio.com, 1 +podcaststudio.com, 0 podcasty.cz, 1 podcastz.cz, 1 podcreative.ca, 1 @@ -115708,6 +115846,7 @@ podcrypters.ga, 1 podcryptest.ga, 1 podd.xyz, 1 +poderdafelicidade.com.br, 1 podersul.com, 1 podia.com.gr, 0 podia.gq, 1 @@ -115843,7 +115982,6 @@ pokemondb.net, 1 pokemonforums.tk, 1 pokemongoclub.tk, 1 -pokemongodata.com, 1 pokemonguide.tk, 1 pokemonlab.com, 1 pokemonsimulator.com, 1 @@ -115936,6 +116074,7 @@ polemik.tk, 1 polenautohuur.nl, 1 polerka.tk, 1 +polerush.com, 1 polestar.com.tw, 1 poletaem.tk, 1 polezno-v-internete.ml, 1 @@ -115973,9 +116112,9 @@ polina-gagarina.gq, 1 polioptics.com, 1 polis.or.at, 1 -polis812.ru, 1 polisanaraka.pl, 1 polisanarciarska.pl, 1 +polisave.co.il, 1 polish-dictionary.com, 1 polish-flag.com, 1 polish-translations.com, 1 @@ -116003,6 +116142,7 @@ politeka.net, 1 politex.tk, 1 politic.org.ua, 1 +politica.ai, 1 political-science-schools.com, 1 politicalasylum.tk, 1 politicaprivacidade.com, 1 @@ -116076,6 +116216,7 @@ poltek-petrokimia.ac.id, 1 poltsamaa.edu.ee, 1 poltsamaalasteaed.edu.ee, 1 +poly-glot.ai, 1 polyatomic.ai, 1 polycoise.com, 1 polycraftual.co.uk, 0 @@ -116085,13 +116226,14 @@ polygonote.com, 1 polygonthemes.com, 1 polygraphi.ae, 1 +polylineworks.com, 1 polymaint-services.com, 1 polymake.org, 1 polymarketwatch.info, 1 polymath.pm, 1 polymerexpert.biz, 1 polymerix.de, 1 -polymesh.network, 0 +polymesh.network, 1 polymics.com, 0 polyna.eu, 1 polynesia.tech, 1 @@ -116131,13 +116273,13 @@ pompes-funebres-girard.com, 1 pomphreyslaw.com, 1 pon.com, 1 +ponabana.com, 1 ponavia-rezidence.cz, 1 ponca-nsn.gov, 1 poncagedemarbre.fr, 1 poncatribe-ne.gov, 1 poncho-bedrucken.de, 0 pondacademy.com, 1 -pondband.net, 1 pondof.fish, 1 pondot.it, 1 pondsama.com, 1 @@ -116148,7 +116290,6 @@ ponio.xyz, 1 ponpokorin.tk, 1 ponpon.tk, 1 -ponsanliving.com, 1 ponte-camp.de, 1 ponteggi.it, 1 ponteggi.roma.it, 1 @@ -116156,6 +116297,7 @@ pontiwerx.com.au, 1 pontodogame.com.br, 1 pontosdevista.pt, 1 +pontosnews.gr, 1 pontotoccountyms.gov, 1 pontupagina.com, 1 ponvelab.com, 1 @@ -116174,7 +116316,6 @@ poodlefan.net, 1 poohcottage.co.uk, 1 pooi.me, 1 -poojanews.com, 1 pookhaarden.nl, 1 pookl.com, 1 pool-selber-bauen.de, 1 @@ -116186,7 +116327,6 @@ poolsonline.tk, 1 poolspa.es, 1 pooltools.net, 1 -poolvilla-margarita.net, 1 poon.io, 1 poonawallafincorp.com, 1 poopa.loan, 1 @@ -116389,6 +116529,7 @@ port5060.net, 1 port67.org, 1 portable-games.tk, 1 +portableconveniences.com, 1 portablespeakers.tk, 1 portablespeakersfinder.com, 1 portagecounty-oh.gov, 1 @@ -116528,6 +116669,7 @@ poshasaudi.com, 1 poshcastles.co.uk, 1 poshe.tk, 1 +poshmark.ca, 1 poshmark.com, 1 poshsecurity.com, 1 posicionament.tk, 1 @@ -116599,7 +116741,6 @@ postern.uk, 1 posters.win, 1 posterspy.com, 1 -postfactum.info, 1 postfalls-naturopathic.com, 1 postfalls.gov, 1 postfallspolice.gov, 1 @@ -116747,6 +116888,7 @@ power-of-interest.com, 0 power-plugins.com, 1 power-recovery.com, 1 +power-sunshine.jp, 1 power-technology.com, 1 power-tools24.com, 1 power100.co.uk, 1 @@ -116772,7 +116914,6 @@ poweredbyiris.nl, 1 powerembedded.com.br, 1 powerentertainment.tv, 1 -powerfifty.com, 1 powerforpeople.tk, 1 powerfortunes.com, 1 powerfulcom.net, 1 @@ -116781,13 +116922,13 @@ powerhouse.pro, 1 powerhousediscovery.com, 1 powerhouseforensics.com, 1 -powerhousegym.co, 1 powerinboxperformance.com, 1 powerlifting.tk, 1 powerling.com, 1 powerlp.com, 1 powerman.name, 1 powerman.top, 1 +powerofmilk.com, 1 powerpc.pt, 1 powerpilot.co.za, 1 powerplay.xyz, 0 @@ -116846,6 +116987,7 @@ poxiao.net, 1 poylabo.com, 1 poynter.net, 1 +poyntr.ai, 1 pozarevac.tk, 1 pozd.tk, 1 pozdravlyalka.gq, 1 @@ -116913,7 +117055,6 @@ ppy.sh, 1 pqcrypta.com, 1 pqforce.com, 1 -pqg.capital, 1 pqgruber.com, 1 pqscript.com, 1 pr-news.spb.ru, 1 @@ -116942,7 +117083,6 @@ practicalcontracting.ca, 1 practicalgrowth.life, 1 practicalhomes.com.au, 1 -practicallyedible.com, 1 practicallyunhackable.com, 1 practicalmamawellness.com, 1 practicalneurology.com, 0 @@ -117035,6 +117175,7 @@ prathambooks.org, 1 pratic.it, 1 praticienmedecinechinoise.be, 1 +praticijenu.com, 1 praticonnect.com, 1 pratopronto.org, 1 pratorotoli.it, 1 @@ -117192,8 +117333,7 @@ prematureacceleration.club, 1 premazon.com, 1 preme.name, 1 -premiachef.com, 1 -premier-dream.co, 1 +premier-dream.co, 0 premier-mt.uk, 1 premier-pallets.com, 1 premier-stores.co.uk, 1 @@ -117204,6 +117344,7 @@ premieresloges.ca, 1 premierevents.ie, 1 premierevr.com, 1 +premierfwrestoration.com, 1 premierlacewigs.com, 1 premierleague.gq, 1 premierloto.cm, 1 @@ -117228,6 +117369,7 @@ premium.web.id, 1 premiumcredit.am, 1 premiumdesign.hr, 1 +premiumhealth.be, 1 premiumkeystore.com, 1 premiumlegalsupport.ga, 1 premiumpeaches.com, 1 @@ -117265,7 +117407,6 @@ preparetheword.com, 1 prepfba.com, 1 preply.com, 1 -prepping.com, 1 prepr.io, 1 preprodfan.gov, 1 prepscouts.tk, 1 @@ -117280,7 +117421,6 @@ presencefactory.nl, 1 presenciainternet.com, 1 presengage.com, 1 -presensita.com, 1 present-m.com, 1 presentaline.ch, 1 presentationmedia.com, 0 @@ -117334,7 +117474,6 @@ presson.shop, 1 pressreleasecentral.tk, 1 pressreleasepedia.tk, 1 -pressreleasespower.com, 1 pressride.jp, 1 pressrush.com, 1 pressup.it, 1 @@ -117367,7 +117506,6 @@ prestigelegalgroup.com.au, 1 prestigesigns.net, 1 prestigesoundandlight.co.uk, 1 -prestigia.com, 1 prestoinventario.com, 1 prestonadamscountywi.gov, 1 prestonmn.gov, 1 @@ -117446,6 +117584,7 @@ pricelooper.com, 0 pricepropharmacy.com, 1 priceri.com, 1 +pricesdairy.com, 1 priceshop.com, 1 pricesmax.com.mx, 0 pricesniffer.co, 1 @@ -117562,6 +117701,7 @@ primorsk.com, 1 primorus.lt, 1 primos-tech.com, 1 +primotim.hr, 1 primrosehillvets.ie, 1 primrosenyagwaya.online, 1 princebazawule.com, 1 @@ -117656,6 +117796,7 @@ priorityelectric.net, 1 priorityessays.com, 1 priorityfakes.com, 1 +prioritymeds.health, 1 prioritynissannewportnewsparts.com, 1 prioritysignsandgraphics.com, 1 priorlakemn.gov, 1 @@ -117713,7 +117854,6 @@ privacysecuritybrainiacs.com, 1 privacystatement.tk, 1 privacysvcs.net, 1 -privacytrust.sg, 1 privacyweek.at, 1 privacyweek.de, 1 privacyweek.eu, 1 @@ -117762,6 +117902,7 @@ privatetrainingonline.se, 1 privateuploader.com, 1 privatevpn.com, 1 +privatmegleren-match.no, 1 privatstunden.express, 1 privc.io, 1 privcloud.org, 1 @@ -117845,9 +117986,11 @@ proacousticsusa.com, 1 proact-it.co.uk, 1 proactivenews.ml, 1 +proactivsports.com, 1 proactivsports.net, 1 proadvanced.com, 1 proadvisorcoach.com, 0 +proaktiv.io, 1 proalist.com, 1 proalter.ch, 1 proambt.nl, 0 @@ -117863,7 +118006,6 @@ probationforms.com, 1 probationnotes.com, 1 probely.com, 1 -probiancanarias.com, 1 probiller.com, 1 probinarin.ga, 1 probioticnacistila.si, 1 @@ -117894,6 +118036,7 @@ procert.ch, 0 procesadorafenix.com.mx, 1 procesio.com, 1 +process.st, 1 processesinmotion.com, 1 processevolution.com.au, 1 processtec.com.br, 1 @@ -117913,12 +118056,12 @@ procountorsolo.com, 1 procrastinatingengineer.uk, 1 procrastinationland.com, 1 -procreditbank.com.al, 1 proctor.ml, 1 proctorauth.com, 1 proctorial.cf, 1 proctorio.com, 1 proctorio.net, 1 +proculair.com, 1 proculair.nl, 1 proculaircontent.com, 1 proculairworkers.com, 1 @@ -117929,6 +118072,7 @@ prod-bp-geotab-api.azurewebsites.net, 1 prod-vigl-www-master.azurewebsites.net, 1 prodapt.com, 1 +prodato.cl, 1 prodemos.nl, 1 prodentim101-us.com, 1 prodesigntools.com, 1 @@ -117945,7 +118089,6 @@ produc.ro, 1 producent-sanek.pl, 1 producentbalustrad.pl, 1 -producentparapetow.pl, 1 producersnational.com, 1 producertools.io, 1 producerwereld.nl, 1 @@ -117975,7 +118118,6 @@ proefexamensvhsocialehygiene.nl, 1 proeflokaalbakker.nl, 1 proefteksten.nl, 0 -proekt.moscow, 1 proekt.tk, 1 proelectro.pro, 1 proemployeeprotection.com, 1 @@ -118035,7 +118177,6 @@ profiles.google.com, 1 profiletree.com, 1 profilewatcher.ga, 1 -profilfueller.eu, 1 profilib.com, 1 profilib.net, 1 profilib.top, 1 @@ -118081,6 +118222,7 @@ progas-diva.de, 1 progas.de, 1 progaudio.be, 1 +progenaisolutions.com, 1 progenda.be, 1 proger.ga, 1 proger.ml, 1 @@ -118166,6 +118308,7 @@ project1service.com, 1 project25.org, 1 project86fashion.com, 1 +projectai-r.tech, 1 projectalias.com, 1 projectborealisgitlab.site, 1 projectbuild.tk, 1 @@ -118213,11 +118356,13 @@ projectweb.gr, 1 projectxyz.eu, 1 projectzet.tk, 1 +projegez.com, 1 projehocam.com, 1 projekt-allianz.de, 1 projekt-manufaktur.de, 1 projekt-office.ch, 1 projekt-umbriel.de, 1 +projekt-weltherrschaft.de, 1 projekt-wild.tk, 1 projektarbeit-projektplanung.de, 1 projektentwicklung-westfalen.de, 1 @@ -118280,6 +118425,7 @@ promocion2007.tk, 1 promocionesperrigo.com, 1 promocjedladzieci.pl, 1 +promocode.co.il, 1 promocodes777.com, 1 promocodius.com, 1 promocoesbrastemp.com.br, 1 @@ -118289,7 +118435,7 @@ promods.net, 1 promods.store, 1 promofirstmedia.co.id, 1 -promohulp.nl, 0 +promohulp.nl, 1 promohunt.ru, 0 promokodi.tk, 1 promolife.be, 1 @@ -118345,6 +118491,7 @@ propaganda.love, 1 propagandablog.de, 0 propagationtools.com, 1 +propagroup.es, 1 propanesale.cf, 1 propbot.com, 1 propcashflow.my, 1 @@ -118393,6 +118540,7 @@ properwills.com, 1 propfirmdiscount.com, 1 prophetdesign.ch, 1 +proplandrealtor.com, 1 propmark.com.br, 1 propolisturkiye.tk, 1 proporcer.tk, 1 @@ -118587,7 +118735,6 @@ prowebservices.ca, 1 prowechsel.de, 1 prowi.se, 1 -prowindow.sk, 1 prowise.com, 1 prowise.me, 1 prowoodthai.com, 1 @@ -118595,6 +118742,7 @@ prowrestlingevents.tk, 1 prowrestlingsheet.com, 1 proxaccess.com, 1 +proxaiqc.com, 1 proxar.co.uk, 1 proxidize.com, 1 proxiel.com, 1 @@ -118618,6 +118766,7 @@ proxylink.pro, 1 proxymonitor.org, 1 proxytool.cf, 1 +proxytracer.com, 1 proyectodia.com.mx, 1 proyectomca.es, 1 proyectosaludecuador.org, 1 @@ -118634,6 +118783,7 @@ prpr.icu, 1 prpr.rip, 1 prpr.win, 1 +prpzy.com, 1 prrams.com, 1 prrefrigeration.com.au, 1 prsg.tk, 1 @@ -118714,7 +118864,6 @@ psdpt-tpfd.gc.ca, 1 psdreams.com, 1 psdsuc.com, 1 -pseek.com, 1 psemc.com, 1 pseta.ru, 1 psevdonim.ga, 1 @@ -118726,7 +118875,6 @@ pshul.com, 1 pshweb.tk, 1 psi-tv.tk, 1 -psi.doctor, 1 psicanalista.milano.it, 1 psicoblog.tk, 1 psicoeduca.com.br, 1 @@ -118884,10 +119032,10 @@ psychotherapie-ahlmeyer.de, 1 psychotherapie-hensiek.de, 1 psychotherapie-leipzig.eu, 1 -psychotherapie-lichterfelde.berlin, 1 psychotherapie1220wien.at, 0 psychotiq.tk, 1 psychotropical.com, 1 +psychpedia.com, 1 psychpsyo.com, 1 psychservice.com.au, 1 psychvarsity.com, 1 @@ -118898,7 +119046,6 @@ psyh.tk, 1 psyhelp.ro, 1 psyk-patienten.tk, 1 -psykologmonica.dk, 1 psykologtidningen.cf, 1 psykologtidningen.ga, 1 psykologtidningen.gq, 1 @@ -119058,6 +119205,7 @@ puertodramaturgia.tk, 1 puertomalaga.com, 1 puestifiestas.mx, 1 +puffball.io, 1 puffinvapes.co, 1 puffverse.pro, 1 puffyan.us, 1 @@ -119077,7 +119225,6 @@ pujd3.gq, 1 puka.cc, 1 puka.edu.ee, 1 -pukfalkenberg.dk, 1 pul-ingenieure.de, 1 pula-site.tk, 1 pulci.it, 1 @@ -119135,7 +119282,6 @@ punchlinetheatre.co.uk, 1 punchlinetheatre.com, 1 punchlist.com, 1 -punchlistprosdfw.com, 1 punctually.gq, 1 pundak.games, 1 puneindia.tk, 1 @@ -119230,13 +119376,13 @@ purefoot.jp, 1 pureholisticwellness.com, 1 purekrea.com, 1 -pureleverage.com, 1 purelife.photography, 1 pureliferx.com, 1 purelovecoaching.fi, 1 purelymail.com, 1 purelypestcontrol.com, 1 puremosquito.com, 1 +purenote.live, 1 purepestandlawn.com, 0 pureromance.com, 1 puresanitization.com, 1 @@ -119245,17 +119391,18 @@ puretermite.com, 1 puretone.pro, 1 pureunpay.com, 1 +pureuspeptide.com, 1 purevicky.com, 1 purewaterguide.net, 1 purewealth.cloud, 1 purfaction.nl, 1 purga.news, 1 -purikore.com, 1 purinaexpress.com, 0 puritanas.tk, 1 puritas.lk, 1 purits.de, 1 purityclothing.co.uk, 1 +puritydairy.com, 1 purkupalvelut.fi, 1 puroprazer.pt, 1 purovive.tk, 1 @@ -119344,7 +119491,6 @@ putman-it.nl, 1 putnam-fl.gov, 1 putnam-ga.gov, 1 -putnamcollision.com, 1 putnamcountywv.gov, 1 putnamil.gov, 1 putnamvalley.gov, 1 @@ -119382,6 +119528,7 @@ pvao.gov.ph, 0 pvawa.com.au, 1 pvda.nl, 1 +pvdesignusa.com, 1 pvdplanet.tk, 1 pvebuilds.xyz, 1 pver.nl, 1 @@ -119392,7 +119539,6 @@ pvp-factions.fr, 1 pvp.edu.ee, 1 pvpagario.tk, 1 -pvpcheck.com, 1 pvpcraft.ca, 1 pvpctutorials.de, 1 pvpheroes.gg, 1 @@ -119503,7 +119649,6 @@ pythonatrix.com, 1 pythonblog.tk, 1 pythondiscord.com, 1 -pythonfactory.io, 1 pythonhosted.org, 1 pythonmorsels.com, 1 pytodon.com, 1 @@ -119518,6 +119663,7 @@ pzc.nl, 1 pzmk.org.pl, 1 pzsearch.nl, 1 +pztools.com, 1 pzu-masa.pl, 1 pzz.by, 1 q-and-a.tk, 1 @@ -119580,6 +119726,7 @@ qarto.com, 1 qashio.com, 1 qask.ml, 1 +qasmaintarget.pt, 1 qasphere.com, 1 qassay.com, 1 qataridiareg.com, 1 @@ -119598,7 +119745,6 @@ qbrix.dk, 1 qbstores.com, 1 qbug.cf, 1 -qburst.com, 1 qc-ikonwork.com, 1 qc.search.yahoo.com, 0 qcash.tw, 1 @@ -119612,6 +119758,7 @@ qcnet.com, 1 qconline.com, 1 qconnan-photos.fr, 1 +qcoresecure.com, 1 qcstudentcenter.com, 0 qcstyleacademy.com, 0 qctimes.com, 1 @@ -119703,6 +119850,7 @@ qisda.com.vn, 1 qisheiosxz.com, 1 qitano.com, 1 +qitmeir.com, 1 qiu.moe, 0 qiuwenbaike.cn, 1 qivonline.pt, 1 @@ -119723,6 +119871,7 @@ qlc.co.th, 1 qlcvea.com, 1 qlcvea.it, 1 +qld.kr, 1 qldducati.club, 1 qldformulaford.org, 1 qldnetwork.com.au, 1 @@ -119751,7 +119900,6 @@ qnap.de, 1 qnap.hk, 1 qnap.tw, 1 -qnected.nl, 1 qnixon.com, 1 qnotafm.com.co, 1 qnq.moe, 1 @@ -119808,7 +119956,6 @@ qr1.at, 1 qraa.qld.gov.au, 1 qrara.net, 1 -qrbird.com, 1 qrcoba.org, 1 qrcodedynamic.com, 1 qrcodes.tools, 1 @@ -119843,7 +119990,6 @@ qtakehd.com, 1 qtdrop.com, 1 qthotels.com, 1 -qtn.net, 1 qto.com, 1 qto.com.hk, 1 qto.net, 1 @@ -119852,6 +119998,7 @@ qtpass.org, 1 qtpower.co.uk, 1 qtpower.org, 1 +qtr5.com, 1 qtspace.cn, 1 qttransformation.com, 1 qtv.ge, 1 @@ -120001,7 +120148,7 @@ quarus.net, 1 quasar.gr, 1 quasarcr.com, 1 -quasarelectronics.co.uk, 0 +quasarelectronics.co.uk, 1 quasarhomes.com, 1 quasarnet.gr, 1 quasartech.gr, 1 @@ -120027,7 +120174,7 @@ qubotondo.it, 1 qubyte.codes, 1 quchronicle.com, 1 -qudini.com, 1 +qudini.com, 0 quebeccat.com, 1 quebeccats.com, 1 quebecdogs.com, 1 @@ -120103,6 +120250,7 @@ quernon.fr, 0 querocalcular.com.br, 1 query-massage.com, 0 +queryguard.net, 1 quesecelebra.info, 1 quessinternational.com, 1 quest-crusaders.de, 1 @@ -120126,9 +120274,7 @@ question.cf, 1 questionandanswer.ml, 1 questionyu.com, 0 -questlawoffice.com, 1 questofaidance.tk, 1 -questofprogress.com, 1 questoj.cn, 1 questsocial.it, 1 questsys.com, 1 @@ -120154,9 +120300,11 @@ quick-seo.tk, 1 quickbooksguru.com.au, 1 quickboysvrouwen2.nl, 1 +quickcart-pro.com, 1 quickcashcarremovals.com.au, 1 quickcel.tk, 1 quickcrypt.org, 1 +quickcuttreeservice.com, 1 quickdiamond.com, 1 quickelectricity.com, 1 quickerticker.tk, 1 @@ -120175,8 +120323,8 @@ quicksell.co, 1 quicksell.store, 1 quickshops.ga, 1 +quicksit.io, 1 quickstart.co.za, 1 -quicksupplies.us, 0 quicksupply.com, 1 quicksus.com, 1 quicktapstudios.com, 1 @@ -120186,6 +120334,7 @@ quickvideo.tk, 1 quickyshare.com, 1 quicomo.it, 1 +quics.io, 1 quidax.com, 1 quidlo.com, 1 quieoltre.it, 1 @@ -120224,7 +120373,6 @@ quinnlawcenters.com, 1 quinnstech.ga, 1 quinpro.nl, 1 -quinta.news, 1 quintadesanamaro.com, 1 quintanadelmonte.tk, 1 quintanilla.tk, 1 @@ -120234,7 +120382,6 @@ quintobarrio.tk, 1 quintonic.fr, 0 quipcheck.com, 1 -quiq-cdn.com, 1 quiq-frp.com, 1 quiq-in.com, 1 quiq-io.com, 1 @@ -120396,7 +120543,6 @@ r00tsandwings.com, 1 r0t.co, 1 r102.ch, 1 -r15cookie.com, 1 r17.co.id, 1 r1a.eu, 1 r1ch.net, 1 @@ -120482,7 +120628,6 @@ rabynska.eu, 1 racaliz.tk, 1 racasdecachorro.org, 1 -racco.com.br, 1 raccoltadifferenziata.it, 1 raccoltarifiuti.milano.it, 1 raceandecology.ca, 1 @@ -120495,8 +120640,8 @@ rachaelholtphotography.com, 1 rachaelsmaids.com, 1 rachaeltaylor.tk, 1 +rachel-gentit.com, 1 rachelandadamarethebest.com, 1 -rachelcarsoncouncil.org, 1 rachelchen.me, 1 racheldiensthuette.de, 1 rachelmoorelaw.com, 1 @@ -120528,6 +120673,9 @@ ract.info, 1 ract.net, 1 ract.net.au, 1 +ractergroup.com, 1 +racterlabs.com, 1 +ractermx.com, 1 racti.com.au, 1 racunalo.com, 1 racunovodstvo-prina.si, 1 @@ -120553,6 +120701,7 @@ radarcupon.ro, 1 radarerp.net, 1 radarfirst.com, 1 +radarimoveisdeleilao.com.br, 1 radarstationery.com, 0 radartatska.se, 0 radartek.com, 1 @@ -120666,7 +120815,6 @@ radiodoblen.tk, 1 radiodxguatemala.tk, 1 radioeldoradofm.com.br, 1 -radioelectrodance.fr, 1 radioelectronic.tk, 1 radioenam.tk, 1 radioenergia.tk, 1 @@ -120850,7 +120998,6 @@ raftingbali.net, 1 rafvorsselmans.com, 1 rafy.com.br, 1 -rafy.site, 1 rag-deutsche-steinkohle.de, 1 rag.de, 1 ragazzi-music.de, 1 @@ -120929,7 +121076,7 @@ railpassie.nl, 1 railroadhistory.net, 1 railsafetysystems.com.au, 1 -railserve.com, 1 +railserve.com, 0 railsideworks.com, 1 railsperformance.com.br, 1 railto.cm, 1 @@ -120994,11 +121141,13 @@ rainuk.com, 1 raipet.no-ip.biz, 1 raipet.spdns.eu, 1 +rais-on.com, 1 raise-educationandwellbeing.co.uk, 1 raisecalculator.com, 1 raisects.co.uk, 1 raisedandrooted.com, 1 raiseeducationtrust.org, 1 +raiseproof.ai, 1 raisetheyouth.co.uk, 1 raiseyoursales.co.uk, 1 raiseyoursales.de, 1 @@ -121074,6 +121223,7 @@ rally-vysledky.cz, 1 rallybase.cz, 1 rallybase.eu, 1 +rallybro.com, 1 rallycycling.com, 0 rallyekrumlov.cz, 1 rallyfotosaswin.tk, 1 @@ -121122,7 +121272,6 @@ rampestyuma.com, 1 rampgov.com, 1 ramplaysugente.tk, 1 -ramsay.xyz, 1 ramsayshorsetransport.com, 1 ramsayshorsetransport.com.au, 1 ramsdensplc.com, 1 @@ -121153,6 +121302,7 @@ randallwilk.com, 1 randburgplumber-247.co.za, 1 randburgplumbing.co.za, 1 +randdtaxcreditspecialists.com, 1 randmevape.net, 1 randoequipement.com, 1 randolf.ca, 1 @@ -121228,7 +121378,6 @@ ranking-deli.jp, 1 ranking-mensesthe.jp, 1 ranking10hits.tk, 1 -rankingbyseo.com, 1 rankingide.tk, 1 rankingofe.com.pl, 1 rankingubezpieczeniowy.pl, 1 @@ -121241,21 +121390,21 @@ ranksite.tk, 1 ranktis.com, 1 rankya.com, 1 -rannamoisaaiasalong.ee, 1 +ranquel.com, 1 +ranquel.es, 1 ransomleak.com, 1 -ransomspares.co.uk, 1 ranson.com.au, 1 ransonwv.gov, 1 rantalaholcomb.tk, 1 rantamplan.tk, 1 rantanda.com, 1 ranters.nl, 1 -rany.eu.org, 1 ranyeh.co, 1 ranyeh.com, 1 ranzbak.nl, 1 raoliveoil.ga, 1 raomed.com.ar, 1 +raonpick.com, 1 raovatsaigon.tk, 1 rap4ever.org, 1 rapala.com, 1 @@ -121337,6 +121486,7 @@ raserbajs.tk, 1 rashbogota.tk, 1 rasheed-nuss.tk, 1 +rashidi.nl, 1 rashmipandit.com, 1 rashodkin.tk, 1 rasing.me, 1 @@ -121359,6 +121509,7 @@ rassro.sk, 1 rastabooks.ga, 1 rasteniem.ru, 1 +rastimbilingva.ru, 1 rastko-jevtovic.tk, 1 rasty.cz, 1 rat.pw, 1 @@ -121379,6 +121530,7 @@ rates.ca, 1 ratespy.com, 1 ratexindex.com, 1 +rateyourcyber.com, 1 ratgeber-alltag.de, 1 ratgeber-beauty.com, 1 ratgeber-massagen.com, 1 @@ -121457,7 +121609,6 @@ ravenstonejeweler.com, 1 raventechnology.es, 1 ravenx.me, 1 -ravescout.club, 1 ravesteijn.nl, 1 ravhaaglanden.org, 1 ravihotel.com, 0 @@ -121556,7 +121707,6 @@ rbcardiacsavers.com, 1 rbcdn.cz, 1 rbclub.cz, 1 -rbcosmetici.it, 1 rbd.events, 1 rbensch.com, 0 rbet.tk, 1 @@ -121585,10 +121735,8 @@ rburchell.com, 0 rburz.com, 1 rbx.com, 1 -rbx.gg, 1 rc-offi.net, 1 rc-shop.ch, 1 -rc.cruises, 1 rc21x.com, 1 rc2edit.nl, 1 rc3n.com, 1 @@ -121603,7 +121751,6 @@ rccrush.com, 1 rcdeescolasantcugat.com, 1 rcdevs.com, 1 -rcdmh.org, 1 rcdocuments.com, 1 rcdrone.tk, 1 rce.delivery, 1 @@ -121729,8 +121876,8 @@ reachwithed.com, 1 reaconverter.com, 1 reacteev.com, 1 -reactfactory.io, 1 reactionindex.com, 1 +reactive-load.ai, 1 reactive-load.com, 1 reactive-press.com, 1 reactive.com.ru, 1 @@ -121754,11 +121901,13 @@ readingrats.de, 1 readless.cf, 1 readmynews.cf, 1 +readnovelis.com, 1 readpages.gq, 1 readsportsonly.com, 0 readup.tk, 1 +ready-leaf.com, 1 ready4bf.tk, 1 -ready5g.net, 1 +ready5g.net, 0 readycentbid.com, 0 readycentral.com, 1 readychurchsites.com, 1 @@ -121787,7 +121936,6 @@ reaksi.id, 1 real-it.nl, 1 real-linux.tk, 1 -real-milk.ru, 1 real-site.tk, 1 real-srebrenica-genocide.cf, 1 real-srebrenica-genocide.ga, 1 @@ -121804,6 +121952,7 @@ realclearlife.com, 1 realcom.hu, 1 realdomdom.cf, 1 +realeco.ai, 1 realestagency.com, 1 realestate-in-uruguay.com, 1 realestate-lidl.lu, 1 @@ -121827,7 +121976,6 @@ realgiulianova.it, 1 realhelpcompany.ga, 1 realhorsegirls.net, 1 -realhost.name, 1 realhypnosistraining.com.au, 1 realidad.tk, 1 realincest.tv, 1 @@ -121878,6 +122026,7 @@ realrapfans.tk, 1 realschule-rain.de, 1 realtechreviews.com, 1 +realtime-chart.info, 1 realtimenetworks.com, 1 realtimeregister.com, 1 realtorjohnfincher.com, 1 @@ -121893,7 +122042,6 @@ realum.net, 1 realvapamarde.cf, 1 realvestors.com, 1 -realvnc.com, 1 realvnc.help, 1 realware.com, 1 realwebsite.ga, 1 @@ -121934,12 +122082,12 @@ rebeldeway-al.tk, 1 rebeldeway-ks.tk, 1 rebellecare.com, 1 -rebelliouskitten.art, 1 rebello.trade, 1 rebellyon.info, 1 rebelonline.nl, 1 rebelsi.pl, 1 rebelstudio.ml, 1 +rebelz.se, 1 rebirthlongboard.co.th, 1 rebizzield.com, 1 rebo.ai, 1 @@ -121966,6 +122114,7 @@ recambiofacil.com, 1 recaptcha-demo.appspot.com, 1 recaptime.eu.org, 1 +recargafaciloficial.com, 1 recat-project.eu, 1 receipts-app.com, 1 receitas.tk, 1 @@ -121977,7 +122126,7 @@ receptenwebsite.com, 1 reception247.com, 0 receptionsbook.com, 1 -receptveka.ru, 1 +receptveka.ru, 0 recessmonkeyz.tk, 1 recetasdemape.com, 1 recetips.com, 1 @@ -122033,8 +122182,6 @@ recoilbox.com, 1 recolic.cc, 1 recolic.net, 1 -recollect.co.nz, 1 -recollect.net.au, 1 recollection.fr, 1 recollective.com, 1 recolor.ml, 1 @@ -122063,7 +122210,6 @@ recriereciclagem.com.br, 1 recroommasters.com, 1 recruit.net, 1 -recruitcrm.io, 0 recruiterbox.com, 1 recruiting.ai, 1 recruitpediacorp.com, 1 @@ -122073,7 +122219,6 @@ recruitskill.ga, 1 recruitskill.gq, 1 recruitwithclutch.com, 1 -rectale.com, 1 rectale.xyz, 1 rectecforum.com, 1 rectoraudiparts.com, 1 @@ -122119,6 +122264,7 @@ redable.nl, 1 redactibio.com, 1 redactieco.nl, 1 +redactionscientifique.com, 1 redaktcms.com, 1 redaktorii.com.ua, 1 redartgames.com, 1 @@ -122131,7 +122277,6 @@ redcandycane.tk, 1 redcapital.cl, 1 redcardinal.tk, 1 -redcarnationhotels.com, 1 redcarpetmonday.com, 1 redcatrampageforum.com, 1 redcedar.gov, 1 @@ -122162,7 +122307,6 @@ rede-reim.de, 1 rede-t.com, 1 redearsliderturtles.com, 1 -redecsirt.pt, 1 rededca.com, 1 rededecuidadores.pt, 1 redeemerlutheranschoolkokomo.org, 1 @@ -122219,6 +122363,7 @@ redington-bizboard.com, 1 redingtonconnect.com, 1 redingtongroup.com, 1 +redingtononline.com, 1 redion.me, 1 redir.me, 1 redireci.one, 1 @@ -122232,7 +122377,7 @@ redite.co, 1 redivis.com, 1 redjuice.co.uk, 1 -redkite.se, 1 +redkite.se, 0 redknothomes.com, 1 redlands.gov, 1 redlandspd.gov, 1 @@ -122263,7 +122408,6 @@ redneragenturen.org, 1 rednex.tk, 1 rednsx.org, 0 -rednumberone.com, 1 redoikos.org, 1 redondo.gov, 1 redoracle.com, 1 @@ -122314,7 +122458,6 @@ redte.com, 1 redteagame.com, 1 redteam-pentesting.de, 1 -redteam.coach, 1 redteamabseiling.co.uk, 1 redtomato.ga, 1 redtsar2000papers.tk, 1 @@ -122366,7 +122509,6 @@ reentry.gov, 1 reerguer.pt, 1 rees-carter.net, 1 -reesefortraviscounty.org, 1 reesmichael1.com, 1 reeson.at, 1 reeson.de, 1 @@ -122383,6 +122525,7 @@ refb.org, 1 refbanners.com, 1 refbanners.website, 1 +refcc.co.uk, 1 refer.codes, 1 refer.nhs.uk, 1 referat.club, 1 @@ -122432,7 +122575,6 @@ reformasflores.com, 1 reformatreality.com, 1 reformayobra.com, 1 -reformedermatology.com, 1 refpa.top, 1 refpa170071.top, 1 refpa4496162.top, 1 @@ -122456,7 +122598,6 @@ refpatqltx.top, 1 refpavikwm.top, 1 refpavnpad.top, 1 -refpaydc.top, 1 refpayio.top, 1 refpazkjixes.top, 1 reframeituk.org.uk, 1 @@ -122478,7 +122619,6 @@ refugeephrasebook.de, 1 refundo.cz, 1 refundo.sk, 1 -refundthem.com, 1 refurb-tracker.com, 1 refusedcarfinance.com, 1 refx.com, 1 @@ -122491,6 +122631,7 @@ regalador.com, 1 regalautosport.com, 1 regalcapitalwi.com, 1 +regalify.com, 1 regalosuhlala.com, 1 regalpaintingfdl.com, 1 regalradio.net, 1 @@ -122529,6 +122670,7 @@ reggea.tk, 1 reggiodigital.com, 1 reggiotoday.it, 1 +regiaodeleiria.pt, 1 regie-sc.ch, 1 regiftable.com, 1 regime-anticellulite.com, 1 @@ -122613,6 +122755,7 @@ rehasport-informationen.de, 1 rehasportwelt.de, 1 rehazonaliftservice.nl, 0 +rehberimgo.com.tr, 1 reher.pro, 1 rehive.com, 1 rehoboth-hollandscheveld.nl, 1 @@ -122652,7 +122795,7 @@ reimgr.com, 1 reims-digital.fr, 1 reimsmediaslibres.info, 1 -rein.ca, 1 +rein.ca, 0 reinaertvandecruys.com, 1 reinaertvandecruys.me, 1 reinaldudrasfamily.ee, 1 @@ -122696,6 +122839,7 @@ reissnehme.com, 1 reisspecialistdevalk.nl, 1 reitbeteiligungen.ch, 1 +reiterdairy.com, 1 reitmeier.me, 1 reitstall-goettingen.de, 1 reittherapie-tschoepke.de, 1 @@ -122804,6 +122948,7 @@ relishify.com, 1 relisten.nl, 1 reliware.co.uk, 1 +relixcheats.com, 1 rellek.org, 1 reloading.ml, 1 relocatefeds.gov, 1 @@ -122853,6 +122998,7 @@ remi-saurel.com, 1 remi-theriault.com, 1 remiafon.com, 1 +remiandre.fr, 1 remicade.com, 1 remifajardo.cf, 1 remilner.co.uk, 1 @@ -122898,7 +123044,6 @@ remontypodkarpackie.pl, 1 remora.tk, 1 remorse.ga, 1 -remoteassistants.io, 1 remotedesktop.corp.google.com, 1 remotedxb.com, 1 remoteoffice.ga, 1 @@ -122912,7 +123057,6 @@ removalsandstoragex.com, 1 removalsmanandvan.org, 1 removedrepo.com, 1 -remploy.co.uk, 1 remptmotors.com, 0 remsenny.gov, 1 remservices.ky, 1 @@ -122955,6 +123099,7 @@ renderzone.tk, 1 rendez-vous.gq, 1 rendezvous-cafe.co.uk, 1 +rendify.fr, 1 rendre-service.ch, 0 rendutowers.org.au, 1 rene-cafe.nl, 1 @@ -123065,7 +123210,7 @@ rentberry.com, 1 rentbrowser.com, 1 rentcafe.co.uk, 1 -rentex.com, 1 +rentex.com, 0 rentfaster.ca, 1 renthelper.us, 1 renticar.com, 1 @@ -123172,9 +123317,11 @@ reportexhq.com, 1 reporting.gov, 1 reportingonthetimes.com, 1 +reportmytaxes.com, 1 reportoid.tk, 1 reportoverdose.com, 1 reportquest.com, 1 +reportsrad.org, 1 reposaarenkuva.fi, 1 reposeed.dev, 1 reposeed.org, 1 @@ -123379,6 +123526,7 @@ ressupply.com, 1 rest-in-moscow.tk, 1 resta.ga, 1 +restacity.com, 1 restad.org, 1 restars-logistics.com, 1 restart-brno.cz, 1 @@ -123459,6 +123607,7 @@ resumic.io, 1 resumic.net, 1 resumic.org, 1 +resumocast.com.br, 1 resurfacehub.com, 1 resurgent.network, 1 resurspartner.tk, 1 @@ -123485,8 +123634,8 @@ retetop95.it, 0 retfe.com, 1 reth.ch, 1 +rethinkcommuting.org, 1 rethinkingchurch.net, 1 -rethinkproductivity.co.uk, 1 rethymnorooms.tk, 1 retia.cloud, 1 reticle.cf, 1 @@ -123585,7 +123734,7 @@ revconnect.tk, 1 revcovi.com, 1 revda.su, 1 -reveal-sound.com, 1 +revdashpro.com, 1 revealcellcamtracker.com, 1 revealdata.com, 1 revealmarket.xyz, 1 @@ -123608,7 +123757,6 @@ reversedns.tk, 1 reverseengineer.net, 1 reversemortgageguides.com, 1 -reversemortgageguides.org, 1 reversesouthafrica.com, 1 reversetransfer.org, 1 revgen.life, 1 @@ -123725,7 +123873,6 @@ rexel.fr, 1 rexeldvf.nl, 1 rexenergy.fi, 1 -rexeroofing.com, 1 rexo.ch, 1 rexograph.com, 1 rexskz.info, 1 @@ -123738,6 +123885,7 @@ rey.id, 1 reyesfernando.com, 1 reyesholdings.com, 1 +reyeswraps.com, 1 reykjaviktips.com, 1 reykjaviktips.nl, 1 reynders.xyz, 1 @@ -123794,6 +123942,7 @@ rggraphics.mx, 1 rgmdtri.ru, 1 rgnext.com, 1 +rgoods.com, 1 rgpd-elearning.com, 1 rgservice.ml, 1 rgshealthcare.com, 1 @@ -123816,7 +123965,6 @@ rhein-erft-kreis.de, 1 rhein-liebe.de, 1 rhein-main-rna.de, 1 -rheincargo.com, 1 rheine.schule, 1 rheineschulen.de, 1 rheinland-pilgern.de, 1 @@ -123927,7 +124075,6 @@ riceforafrica.net, 1 ricelasvegas.com, 1 ricettedellanonna.net, 1 -ricettesemplicieveloci.altervista.org, 1 rich-good.com, 0 richadams.me, 1 richandsteph.co.uk, 1 @@ -123943,7 +124090,6 @@ richardharpur.com, 1 richardhouts.tk, 1 richardinesrolltop.com, 1 -richardkorom.hu, 1 richardlangham.plumbing, 1 richardleereporting.com, 1 richardlewisjewelry.com, 1 @@ -123961,7 +124107,6 @@ richardson.tw, 1 richardsonceballo.com, 1 richardsoncountyne.gov, 1 -richardsongomes.com, 1 richardsreporting.com, 1 richardstengel.com, 1 richardstonerealestate.com, 0 @@ -124011,7 +124156,6 @@ rickelrath.de, 1 rickengineering.com, 1 ricki-z.com, 0 -rickmakes.com, 1 rickmanlegal.com, 1 rickmartensen.nl, 0 ricknewman.pro, 1 @@ -124060,7 +124204,6 @@ ridgelineit.com.au, 1 ridgelysradar.com, 1 ridgespringsc.gov, 1 -ridgewaterlodge.com, 1 ridgewaywi.gov, 1 ridgidgear.eu, 1 ridho.id, 1 @@ -124132,7 +124275,6 @@ rigonidiasiago.de, 1 rigonidiasiago.es, 1 rigonidiasiago.fr, 1 -rigonidiasiago.international, 1 rigonidiasiago.it, 1 rigonidiasiago.nl, 1 rigonidiasiago.pl, 1 @@ -124164,7 +124306,6 @@ rikuwe.eu, 1 rikuwe.work, 1 rileyevans.co.uk, 1 -rileypaige.com, 1 rileys.club, 0 rileyskains.com, 0 rileystar.com, 1 @@ -124177,6 +124318,10 @@ rime.red, 1 rimessaggio.it, 1 rimetsu.com, 1 +rimi.ee, 1 +rimi.lt, 1 +rimi.lv, 1 +rimibaltic.com, 1 rimin.moe, 1 riminghuts.com, 1 riministreet.com, 0 @@ -124186,7 +124331,6 @@ rimorrecherche.nl, 1 rimpianto.com, 1 rimzim.tk, 1 -rinabhabra.com, 1 rincat.ch, 1 rincon-nsn.gov, 1 rinconanimalista.com, 1 @@ -124194,6 +124338,7 @@ rinconga.gov, 1 rinconplacas.com, 1 rinconwaterca.gov, 1 +rindepo.com, 1 rineke.art, 1 ring.com, 1 ring2.de, 1 @@ -124230,7 +124375,6 @@ riomi.org, 1 riosoil.co.uk, 1 riosoil.com, 1 -riosoils.co.uk, 1 riosoils.com, 1 riotplus.com, 1 ripadores.tk, 1 @@ -124261,7 +124405,6 @@ riptidetech.io, 1 ripvip.ie, 1 riri-tendedasole.it, 1 -riri.my, 1 ririro.com, 1 ris.fi, 1 ris2048.pt, 1 @@ -124324,6 +124467,7 @@ risquefetish.net, 1 risquefetish.org, 1 risquefetishtoys.com, 1 +risson.space, 1 ristioja.ee, 1 ristisanat.fi, 0 ristorante-orchidea.be, 1 @@ -124359,7 +124503,6 @@ rittau.org, 1 ritterspach.me, 1 ritual-gratek.ru, 1 -ritual.com, 1 ritual.ml, 0 rituelamour.com, 1 ritus.md, 1 @@ -124371,6 +124514,7 @@ rivals.space, 1 rivalsa.cn, 1 rivalsa.net, 1 +rivalyse.fr, 1 rivastation.de, 1 riveal.fr, 1 rivenmains.com, 1 @@ -124385,6 +124529,7 @@ rivercityroofs.com, 1 riverford.co.uk, 1 riverlea.com.au, 1 +riveros.tv, 1 riverotravel.cl, 1 riverpark.casa, 1 riverrun.tk, 1 @@ -124400,6 +124545,7 @@ riversmeet.co.uk, 1 riverspromo.com, 1 riversroses.de, 1 +riversseasoceans.org, 1 riverton.se, 1 rivertv.ca, 1 riverviewcamp.com, 1 @@ -124411,6 +124557,7 @@ rivethealthlaw.com, 1 rivian.com, 1 riviantrackr.com, 1 +rivierainvest.hu, 1 rivingtongreenwich.co.uk, 1 rivirliving.com, 1 rivistadipsichiatria.it, 1 @@ -124464,7 +124611,6 @@ rlan.eu.org, 1 rland.ph, 1 rleeden.servehttp.com, 1 -rleh.de, 1 rllinsure.com, 0 rlmud.tk, 1 rlove.org, 1 @@ -124511,7 +124657,7 @@ rmsupply.nl, 1 rmt-construction.co.za, 1 rmtconstruction.co.za, 1 -rmurai.com, 0 +rmurai.com, 1 rmvalues.com, 1 rmw-energy.de, 1 rn29.me, 1 @@ -124619,6 +124765,7 @@ robin-novotny.com, 1 robin.co.kr, 1 robin.info, 1 +robinapersonaltrainers.com, 1 robinb0s.nl, 1 robinbos.nl, 1 robinbrook.co.uk, 1 @@ -124720,9 +124867,9 @@ rock4life.be, 1 rocka.me, 1 rockabilly-sinners.tk, 1 +rockalendar.es, 1 rockandroll.tk, 1 rockats.org, 1 -rockbandparty.com, 1 rockbankland.com.au, 1 rockbridge.tk, 1 rockcelebrities.net, 1 @@ -124749,30 +124896,6 @@ rocketpin.com, 1 rocketr.net, 1 rocketrubber.com, 1 -rocketsales.al, 1 -rocketsales.at, 1 -rocketsales.be, 1 -rocketsales.bg, 1 -rocketsales.by, 1 -rocketsales.cz, 1 -rocketsales.dk, 1 -rocketsales.es, 1 -rocketsales.eu, 1 -rocketsales.fi, 1 -rocketsales.fr, 1 -rocketsales.gr, 1 -rocketsales.io, 1 -rocketsales.it, 1 -rocketsales.lt, 1 -rocketsales.lu, 1 -rocketsales.md, 1 -rocketsales.me, 1 -rocketsales.mk, 1 -rocketsales.pt, 1 -rocketsales.ro, 1 -rocketsales.se, 1 -rocketsales.si, 1 -rocketsales.sk, 1 rocketsciencerealty.com, 1 rocketsworld.tk, 1 rockettube.com, 0 @@ -124806,7 +124929,6 @@ rockportusa.com, 1 rockpov.com.br, 1 rockptx.com, 1 -rockraiders.rocks, 1 rockrider.tk, 1 rockriver.tk, 1 rockrivertrail.com, 1 @@ -124821,6 +124943,7 @@ rockworldteam.tk, 1 rockyford-co.gov, 1 rockymountaininsurancecenter.com, 1 +rockymountainrolloffandwaste.com, 1 rockymountainspice.com, 1 rockymountva.gov, 1 rockymtnexpress.com, 1 @@ -124923,7 +125046,6 @@ roguenexus.io, 1 roguerocket.com, 1 roguetech.ca, 1 -roguevalleywinecountry.com, 1 rohal.tk, 1 rohansingh.cf, 1 rohde.de, 0 @@ -124944,6 +125066,7 @@ roishopper.com, 1 roisu.org, 0 rojandaru.com, 1 +rojgarmandi.com, 1 rojiblancos.tk, 1 rojotv.tk, 1 rok-pro-dobro.cz, 1 @@ -125210,7 +125333,6 @@ roots.io, 1 rootsandrain.com, 1 rootsbar.fr, 0 -rootsindia.com, 1 rootsinmadrid.tk, 1 rootsland.de, 1 rootsland.net, 1 @@ -125225,7 +125347,6 @@ roozbeh.tk, 1 rop.cx, 1 ropd.info, 1 -ropesmart.com, 1 ropo.uk, 1 roquebrunesurargens-tourisme.fr, 1 roques.tk, 1 @@ -125287,7 +125408,6 @@ rosewebdesignstudio.co.uk, 1 rosewebdesignstudio.uk, 1 rosfan.by, 1 -rosgenea.ru, 1 roshanrsivakumar.com, 0 roshiya.co.in, 1 roshmed.com, 1 @@ -125313,11 +125433,11 @@ rosscountyohiocourts.gov, 1 rosscountyohiotaxlist.gov, 1 rossen.be, 1 +rosser.no, 1 rosset.me, 1 rosset.net, 1 rossi-aero.com, 1 rossia.ga, 1 -rossignoli.it, 1 rossiyskaja.cf, 1 rosskingbooks.com, 1 rosslug.org.uk, 1 @@ -125342,9 +125462,7 @@ rostzaschita.ru, 1 roswellcity.tk, 1 rosystemsint.com, 1 -rot256.io, 1 rot47.net, 1 -rot8nutrition.com, 1 rota.te.it, 1 rotamap.net, 1 rotanaval.tk, 1 @@ -125394,6 +125512,7 @@ rottnestexpress.com.au, 1 rottweil-hilft.de, 1 rottweilerdogcare.com, 1 +rotulo.fit, 1 rotunneling.net, 1 rouair.com, 1 rouamatfashion.gr, 1 @@ -125406,6 +125525,7 @@ roughnotes.com, 1 roughtime.se, 1 rouken.bio, 1 +roukencells.com, 1 roulettelive.ml, 1 roulettestar.com, 1 roulinfo.ch, 0 @@ -125431,6 +125551,7 @@ routemates.tk, 1 router24.info, 1 routerclub.ru, 1 +routeto.com, 1 routevanverzoening.nl, 1 rouwcentrumterheide.be, 1 rouxb.in, 1 @@ -125472,7 +125593,6 @@ roxswinery.com, 1 roxville.tk, 1 roy-buehring.de, 1 -roy-space.com, 1 roy.wang, 1 royacshop.com, 1 royal-coatings.com, 1 @@ -125493,7 +125613,6 @@ royal84.com, 0 royal851.com, 0 royal852.com, 0 -royal869.com, 0 royal876.com, 0 royal877.com, 0 royal88.com, 1 @@ -125571,8 +125690,6 @@ royzez.com, 1 rozalisbengal.ro, 1 rozalynne-dawn.ga, 1 -rozar.eu, 1 -rozar.sk, 1 rozataki.com.tr, 1 rozemaandag.tk, 1 rozemuller.com, 0 @@ -125581,6 +125698,7 @@ rozprodat.cz, 1 rozsvitsvet.cz, 1 roztilefona.net, 1 +rozwazania.pl, 1 rozwod.bydgoszcz.pl, 1 rozwod.gdansk.pl, 1 rozwod.gdynia.pl, 1 @@ -125761,7 +125879,9 @@ rtestore.eu, 1 rtgame.co.uk, 1 rtgnews.cf, 1 +rtholf.nu, 1 rths.tk, 0 +rtidhonbe.com, 1 rtjobsite.com, 1 rtkbe.com, 1 rtlnitro.de, 1 @@ -125808,6 +125928,7 @@ rubberband.com, 1 rubberduckers.co.uk, 1 rubbermaidoutlet.com, 0 +rubbermetrics.com, 1 rubbleedenvale.co.za, 1 rubblekempton.co.za, 1 rubblemidrand.co.za, 1 @@ -125826,7 +125947,6 @@ rubens.cloud, 0 rubensalgado.com, 1 rubenschulz.nl, 1 -rubenshotel.com, 1 rubenshuis.be, 1 rubenslikkarchive.com, 1 rubensteinphotography.com, 1 @@ -125853,7 +125973,6 @@ rubooks.gq, 1 rubreklama.tk, 1 ruby-auf-schienen.de, 1 -rubyfactory.io, 1 rubyhornet.com, 1 rubykon.com, 1 rubymaybetranslations.com, 1 @@ -125861,6 +125980,7 @@ rubyonline.tk, 1 rubyonremote.com, 1 rubyquincunx.org, 1 +rubyrelay.com, 1 rubystore.ga, 1 rucheentreprise.fr, 1 ruchka-mashinka.gq, 1 @@ -125952,6 +126072,8 @@ ruiruigeblog.com, 1 ruisai.org, 1 ruitersportbak.nl, 1 +ruitio.com, 1 +ruixin.org, 1 ruja-pass.ddnss.de, 1 rujbin.ddns.net, 1 rukhaiyar.com, 1 @@ -126025,11 +126147,12 @@ rungutan.com, 1 runharbor.com, 1 runicspells.com, 1 +runique.io, 1 runjak.codes, 1 runklesecurity.com, 1 runlet.gq, 1 runlevel3.de, 1 -runmyprocess.com, 1 +runmyprocess.com, 0 runmyqubit.com, 1 runmyqubit.de, 1 runmyvillage.com, 1 @@ -126073,6 +126196,7 @@ ruralaventura.com, 1 ruralenergy.com, 1 ruralratings.us, 1 +ruralseptictn.com, 1 ruralsuppliesdirect.co.uk, 1 rurange-les-thionville.fr, 1 rurian-gyohen.com, 1 @@ -126166,8 +126290,8 @@ rustamkhanko.gq, 1 rustarg.com, 1 rustargentina.com, 1 +rustbanned.net, 1 rustdesk.com, 1 -rustfactory.io, 1 rustfu.rs, 1 rusticus-consulting.de, 0 rustls.com, 1 @@ -126251,18 +126375,18 @@ rw19.de, 1 rw2.de, 1 rwalch.at, 1 -rwandalicious.com, 1 +rwandalicious.com, 0 rway.pro, 1 rwb.charity, 1 rwbstuff.com, 1 rwgamernl.ml, 1 rwglaw.com, 1 rwhapdentalservicesreport.net, 1 -rwlib.net, 1 rwnpropertyservices.com, 1 rwp7.com, 1 rws-cc.com, 1 rws-vertriebsportal.de, 1 +rwu.edu.pk, 1 rwuhawksherald.com, 1 rwx.ovh, 1 rwx.work, 1 @@ -126275,10 +126399,8 @@ rxcarbon.com, 1 rxcom.net, 1 rxhill.com, 1 -rxkids.org, 1 rxperiusdata.com, 1 -rxphoto.com, 1 -rxsecurestores.com, 1 +rxphoto.com, 0 rxxx.ml, 1 rya.nc, 1 ryabinushka.tk, 1 @@ -126456,7 +126578,9 @@ s5g8.com, 1 s64.cz, 1 s6729.co, 1 +s69.no, 1 s6957.co, 1 +s6967.de, 1 s6jl.com, 1 s6n.jp, 0 s6o.de, 1 @@ -126468,7 +126592,7 @@ s9297.co, 1 s95.de, 1 s9728.co, 1 -s9h.cn, 0 +s9h.cn, 1 sa-blog.net, 1 sa-mp.me, 1 sa-mp.ro, 1 @@ -126512,7 +126636,6 @@ sabe.cc, 1 sabedinovski.tk, 1 saber-nyan.com, 1 -sabesprev.com.br, 1 sabghijewelers.com, 1 sabharwallawfirm.ca, 1 sabians.tk, 1 @@ -126548,6 +126671,7 @@ sabworldtricks.tk, 1 sac-cu2.org, 1 sac-shoes.fr, 1 +sac.gov, 1 sacademica.tk, 1 sacaentradas.com, 1 saccani.net, 1 @@ -126558,6 +126682,7 @@ sacektirme.tk, 1 sacfreightlines.com, 1 sacha-botz.com, 0 +sachagoldberg.com, 1 sacharidovejednotky.eu, 1 sachasmets.be, 1 sachi.lk, 1 @@ -126663,6 +126788,7 @@ safecargotraining.com.br, 1 safechoicestas.org.au, 1 safecircuitelectric.com, 1 +safecleansanitation.com, 1 safeclima.com, 1 safecode1.com, 1 safecoin.tech, 1 @@ -126671,6 +126797,7 @@ safedatabasesystems.com, 1 safedrivepod.com, 1 safeers.tk, 1 +safefilestore.com, 1 safefreehost.gq, 1 safefreepornsites.com, 1 safegold.ca, 1 @@ -126696,6 +126823,7 @@ safeo.fr, 1 safeocs.gov, 1 safepassvpn.com, 0 +safeplayground.net, 0 safer-software.tk, 1 safera.com, 1 safercar.gov, 1 @@ -126706,6 +126834,7 @@ saferproducts.gov, 1 safersurfing.eu, 0 safertruck.gov, 1 +saferutar.com, 1 safes24.com, 1 safesail.pt, 1 safescif.com, 1 @@ -126757,7 +126886,6 @@ safkgroup.com, 1 safleo.org, 1 safor-sante-formation.com, 1 -safquh.com, 1 safranarea.com, 1 safranarea.eu, 1 sag-consultores.com, 1 @@ -126784,7 +126912,6 @@ sagicorgeneral.com, 1 sagicorlife.com, 1 sagicorlifeusa.com, 1 -sagilityhealth.com, 1 saginawtx.org, 1 sagitta.hr, 1 saglik-haberleri.tk, 1 @@ -126795,7 +126922,7 @@ sagogangen.se, 1 sagomedia.tk, 1 sagradamadre.hu, 1 -sagradobyme.cl, 1 +sagradobyme.cl, 0 sagsaga.org, 1 saguarocc.com, 1 sahabatnesia.com, 1 @@ -126807,7 +126934,6 @@ sahar.io, 1 saharacloud.com, 1 sahararun.tk, 1 -saharax.io, 1 saharazik.tk, 1 saharmassachi.com, 1 sahatchaiy.ddns.net, 1 @@ -126893,7 +127019,6 @@ sainthedwig-saintmary.org, 1 sainthelena-centersquare.net, 1 sainthelenaparish.net, 1 -sainthelenas.org, 1 saintisidorecyo.com, 1 saintjamestheapostle.org, 1 saintjohn-bocaraton.com, 1 @@ -126932,7 +127057,6 @@ saisecure.net, 1 saiserver.online, 1 saisons-fruits-legumes.fr, 1 -saisyuusyou-ikebukuro.com, 1 sait.health, 1 saitapovan.com, 1 saitas.net, 1 @@ -126947,7 +127071,7 @@ sajetekengineering.com, 1 sajter.ga, 1 sak.pt, 1 -sakac.cz, 1 +sakac.cz, 0 sakainvest.com, 1 sakaki.anime.my, 0 sakamichi.moe, 1 @@ -126991,6 +127115,7 @@ salamence.tk, 1 salamkisan.com, 1 salamon-it.de, 1 +salampolyclinic.om, 1 salamzibaei.com, 1 salariominimo.com.co, 1 salaryfinance.com, 1 @@ -127065,7 +127190,6 @@ salfraedingarnir.is, 1 salge.rocks, 1 salgueirocarlos.com, 1 -salianmod.ir, 1 salibandy.tk, 1 salidaswap.com, 1 salient-dialers.com, 1 @@ -127136,7 +127260,6 @@ salonmarjon.nl, 1 salonni.tk, 1 salonpaikku.fi, 1 -salonsantebienetre.ch, 0 salontaidemuseo.fi, 1 salsa-disaster.net, 1 salsa-straubing.de, 1 @@ -127199,6 +127322,7 @@ salzburg-erfahren.at, 1 salzburg-verkehr.at, 1 salzburgsfinest.tk, 1 +salzerdigital.de, 1 salzerperu.com, 1 salzmann.solutions, 1 sam-football.fr, 1 @@ -127238,7 +127362,6 @@ samclarke.uk, 1 samcollin.be, 1 samdev.io, 1 -same.lol, 1 samedamci.com, 1 samedayglendoracleantruckcheck.com, 1 samedis.care, 1 @@ -127261,7 +127384,6 @@ sametcanaz.tk, 1 sameteem.com, 1 sametimetomorrow.tk, 1 -samhall.se, 1 samhsa.gov, 1 samhuri.net, 1 sami.photo, 1 @@ -127310,6 +127432,7 @@ samozdraw.ga, 1 sampaguide.com, 1 sampath.lk, 1 +sampati.com.br, 1 sampatjewelers.com, 1 samplechapterpodcast.com, 1 samplefashion.nl, 1 @@ -127318,7 +127441,6 @@ sampsoncountync.gov, 1 sampsonplumbing.com, 0 samquick.me.uk, 1 -samroelants.com, 1 samsara.nl, 1 samscollection.in, 1 samsebe.ml, 1 @@ -127374,6 +127496,7 @@ sanagustin.com, 1 sanalaile.tk, 1 sanalikaforum.tk, 1 +sanalsehrim.com, 1 sanandreasstories.com, 1 sanantoniolocksmithtx.com, 1 sanaorganizasyon.com, 1 @@ -127417,7 +127540,6 @@ sandbox.mydigipass.com, 0 sandcastle.eu.org, 1 sanddev.com, 1 -sanddollarsstudio.com, 1 sandelduggal.com, 1 sanderdesign.tk, 1 sanderdorigo.nl, 1 @@ -127496,6 +127618,7 @@ sandybigboobs.com, 1 sandybigboobs.net, 1 sandycreekrvpark.com, 1 +sandykeymedical.com, 1 sandyvazquez.com, 1 sanemind.de, 1 sanetschka.tk, 1 @@ -127585,11 +127708,11 @@ sanpatigroup-recruit.jp, 1 sanpatriciocountytx.gov, 1 sanpham-balea.org, 1 +sanpure.in, 1 sanqinyinshi.com.cn, 1 sanrafaelvigo.org, 1 sanraizu.top, 1 sanroque.es, 1 -sans-hotel.com, 1 sans-papiers.ch, 1 sansairyu-kuyoukai.com, 1 sansdb.io, 0 @@ -127601,7 +127724,6 @@ sanskritiyoga.com, 1 sansonehowell.com, 1 sansukien.com, 1 -sansumclinic.org, 1 santa-ana.gov, 1 santa-fell-from.space, 1 santabarbaraca.gov, 1 @@ -127656,7 +127778,6 @@ santiagogarza.co, 1 santiagomeli.ar, 1 santiagomeli.com.ar, 1 -santiagoslandscapingservicesinc.com, 1 santibanezdetera.tk, 1 santibz.es, 1 santigl.es, 1 @@ -127774,7 +127895,6 @@ sarahweinman.com, 1 sarahwellington.com, 1 sarahwikeley.co.uk, 1 -saraleedesserts.com, 1 saranamayyappa.tk, 1 sarand.ch, 0 saransk-news.net, 1 @@ -127883,7 +128003,6 @@ sashascollections.com, 1 sashleighaust.com, 1 sashok724.net, 1 -sashroy.shop, 1 sashroyee.com, 1 sasioglu.co.uk, 1 sasken.com, 1 @@ -127970,6 +128089,7 @@ saubooks.tk, 1 saucelabs.com, 1 saucesmaster.com, 1 +sauco.io, 1 saudecoluna.com, 1 saudedigitalnews.com.br, 1 saudenoclique.com.br, 1 @@ -128205,12 +128325,14 @@ sboh.nl, 1 sborka.ml, 1 sbpk.fr, 1 +sbplatform.pages.dev, 1 sbpropman.co.uk, 1 sbrc.gov, 1 sbristolme.gov, 1 sbrouwer.org, 1 sbrownbourne.com, 0 sbs-studies.gr, 1 +sbsc.se, 1 sbscyber.com, 1 sbspectr.ru, 1 sbspp.ru, 1 @@ -128227,6 +128349,7 @@ sc019.com, 1 sc2labs.com, 1 sc2pte.eu, 1 +sc88.trade, 1 sca-webdesign.be, 1 scadalliance.org, 1 scadanews.net, 1 @@ -128234,13 +128357,11 @@ scaffoldhiremidrand.co.za, 1 scaffoldhirerandburg.co.za, 1 scaffoldhiresandton.co.za, 1 -scaffoldinghiresandton.co.za, 1 scaffoldingmidrand.co.za, 1 scaffoldingsandton.co.za, 1 scag9.com, 1 scalable.capital, 1 scalableb2b.com, 1 -scalafactory.io, 1 scalaire.com, 1 scalaire.fr, 1 scale.at, 1 @@ -128323,11 +128444,11 @@ scatteredcode.net, 1 scatterscasino.com, 1 scatterwin.net, 1 +scattopro.it, 1 scavalentenx.duckdns.org, 1 scavenged.ga, 1 scayle.com, 1 scbdh.org, 1 -scbfireworks.com, 1 scbodner.com, 1 scc-aircompressors.com, 1 sccan.scot, 1 @@ -128406,7 +128527,10 @@ scheduleareporter.com, 1 scheduledepo.com, 1 schedulehero.io, 1 +schedulure.com, 1 scheervergelijker.nl, 1 +schefczyk-privat.de, 1 +schefczyk.ch, 1 schefczyk.com, 1 schefczyk.de, 1 schefczyk.eu, 1 @@ -128520,6 +128644,7 @@ schmucker.it, 1 schmunzelgeist.de, 1 schnalstal.info, 1 +schnalz.net, 1 schnapke.name, 1 schnapsverein.ddns.net, 1 schnaube.de, 1 @@ -128543,7 +128668,6 @@ schody-rozycki.pl, 1 schoenheitsop.com, 1 schoenstatt-fathers.link, 1 -schoenstatt-fathers.us, 1 schoenstatt.link, 1 schoental.de, 1 schoepski.de, 1 @@ -128575,6 +128699,7 @@ scholledev.com, 1 scholohost.tk, 1 scholtensupport.nl, 1 +scholven.marketing, 1 scholz-kallies.de, 1 schonstedt.com, 1 school-22.tk, 1 @@ -128595,6 +128720,7 @@ schoolbag.gq, 1 schoolbag.ml, 1 schoolbag.tk, 1 +schoolbreach.org, 1 schoolbytes.com.au, 1 schoolbytes.education, 1 schoolcafe.com, 1 @@ -128609,6 +128735,7 @@ schooleducationharyana.gov.in, 1 schoolheads.ph, 1 schoolhouse.world, 1 +schoolofrussianballetsingapore.com, 1 schoolroom.ga, 1 schoolrumble.tk, 1 schoolsafety.gov, 1 @@ -128618,6 +128745,7 @@ schoolstreaks.com, 1 schoolsystemonthego.com, 1 schooltransport.com.au, 1 +schoolwork.bot, 1 schoolyogainstitute.com, 1 schoonheidssalon-annelies-santpoort.nl, 1 schoonheidssalon-annelies-velserbroek.nl, 0 @@ -128761,6 +128889,10 @@ scienceofpeople.com, 0 sciencequality.tk, 1 scienceschool.ml, 1 +sciencesoft.co, 1 +sciencesoft.io, 1 +sciencesoft.org, 1 +sciencesoft.tech, 1 sciencesolutions.eu, 1 sciencetechworld.tk, 1 sciencetoymaker.org, 1 @@ -128817,6 +128949,11 @@ scnow.com, 1 scnsoft.com, 1 scnsoft.de, 1 +scnsoft.lt, 1 +scnsoft.lv, 1 +scnsoft.om, 1 +scnsoft.pl, 1 +scnvision.com, 1 scodeno.vn, 1 scoebg.org, 1 scoffable.com, 1 @@ -128943,7 +129080,6 @@ scpslgame.wiki, 1 scqpw.com, 1 scra.gov, 1 -scrabble-solver.com, 1 scrabblecheat.com, 1 scrabbleonline.nl, 1 scrambled.online, 1 @@ -128981,14 +129117,12 @@ screenwalker.de, 1 screenwatermarksoftware.com, 1 screenwriter.tk, 1 -screenzy.io, 1 screfer.com, 1 screvencosheriffga.gov, 1 screvencountyga.gov, 1 scribbler.monster, 1 scribbler.tk, 1 scribd.com, 1 -scribesecurity.com, 1 scripo-bay.com, 1 scrippsnews.com, 1 script-sign.com, 1 @@ -129007,6 +129141,7 @@ scroar.net, 1 scrod.me, 1 scroll-to-top-button.com, 1 +scroll.pt, 1 scrollbots.com, 1 scroollocker.tk, 1 scrot.de, 1 @@ -129021,7 +129156,6 @@ scryfall.com, 1 scrylytics.com, 1 scrypro.com, 1 -scs-technik.de, 1 scsd.si, 1 scservis.cz, 1 scsp.ai, 1 @@ -129042,6 +129176,7 @@ sculpteo.com, 1 sculptor.com, 1 sculpturesworldwide.tk, 1 +scum.fr, 1 scunna.com, 1 scunthorpemoneyman.com, 1 scuolabandistica.ch, 1 @@ -129069,6 +129204,7 @@ sd2017.com, 1 sd44.ca, 1 sdaniel55.com, 1 +sdap.io, 1 sdarcc.gov, 1 sdarot.tw, 1 sdayman.com, 1 @@ -129079,6 +129215,7 @@ sdc-uae.ae, 1 sdcardrecovery.de, 1 sdcargo.net, 1 +sdcitytimes.com, 1 sdeb.org, 1 sdebitati.it, 1 sdeu.fr, 1 @@ -129121,6 +129258,7 @@ sdsmanagement.me, 0 sdsmt.engineering, 1 sdstack.com, 1 +sdsucollegian.com, 1 sduconnect.nl, 0 sdut.gq, 1 sdvv.nl, 1 @@ -129158,7 +129296,7 @@ sealink.co.nz, 1 sealofbiliteracy.org, 1 sealoffantasy.de, 1 -sealtitebasement.com, 1 +sealtitebasement.com, 0 sealvault.org, 1 seamac.info, 1 seamester.com, 1 @@ -129274,11 +129412,13 @@ sebar-iklan.gq, 1 sebariklanmassal.gq, 1 sebarin.tk, 1 +sebastiaandenboer.eu, 1 sebastiaandouma.co.uk, 1 sebastiaanwijnimport.nl, 1 sebastian-bergmann.de, 1 sebastian-bravo.com, 1 sebastian-elisa-pfeifer.eu, 1 +sebastian-goetz.com, 1 sebastian-haeutle.de, 1 sebastian-janich.de, 1 sebastian-kraus.me, 1 @@ -129352,6 +129492,7 @@ secondmeasure.com, 1 secondnature.bio, 1 secondperson.net, 1 +secondround.ch, 1 secondsightmgt.com, 1 secondthought.ai, 1 secondtreasuresmv.com, 1 @@ -129419,6 +129560,7 @@ sectv.com, 1 secudoc.nl, 1 secularweb.org, 1 +seculynx.com, 1 secumailer.com, 0 secumailer.nl, 0 secundity.com, 1 @@ -129563,7 +129705,9 @@ sedro-woolley.gov, 1 seduxury.com, 1 seduzironline.com.br, 1 +see-me.co, 1 see-now.co, 1 +see-you.co, 1 see.you, 1 seearmenia.tk, 1 seeaway.com.br, 1 @@ -129576,6 +129720,7 @@ seedandleisure.co.uk, 1 seedbox.fr, 1 seedbox.hosting, 1 +seedcraftdigital.com, 1 seedersinstruments.com, 1 seedhammer.com, 1 seedisclaimers.com, 1 @@ -129618,6 +129763,7 @@ seetheprogress.eu, 1 seetheprogress.net, 1 seetheprogress.org, 1 +seethis.place, 1 seetow.sg, 1 seetv.ga, 1 seeusercontent.com, 1 @@ -129626,6 +129772,7 @@ seewines.com, 1 seexw.com, 1 sef.co.za, 1 +sefan.ru, 1 sefaratvisa.com, 1 sefareshpardeh.com, 0 seferleri.net, 1 @@ -129641,7 +129788,6 @@ sega-play.online, 1 sega73.hu, 1 segamastersystem.tk, 1 -segaretro.org, 1 segaskets.com.au, 1 segdo.de, 1 segdo.media, 1 @@ -129732,6 +129878,7 @@ sejutaproperti.com, 1 sek.ai, 0 seka-ru.com, 1 +sekai-kabuka.com, 1 sekainokokki.jp, 1 sekfung.me, 1 sekiei-lifeservice.net, 1 @@ -129756,7 +129903,6 @@ sel4.systems, 1 selang.cf, 1 selang.ml, 1 -selatv.com, 1 selayar.vacations, 1 selber-coden.de, 1 selbst-schmiede.de, 1 @@ -129779,7 +129925,6 @@ selen.com.br, 1 selena-armavir.ml, 1 selenapelletier.tk, 1 -selenegames.com, 1 seleondar.ru, 1 selesnafes.com, 0 selezionebarbrboguaccero.cf, 1 @@ -129806,6 +129951,7 @@ selfiestick.bg, 1 selfimprovementdaily.com, 1 selfishness.com, 1 +selfiys.com, 1 selfloath.in, 1 selfmade.id, 1 selfmade4u.de, 0 @@ -129828,7 +129974,6 @@ selldorado.com, 1 seller.diamonds, 1 sellerengine.com, 1 -sellerrunning.com, 0 sellers.market, 1 sellersfunding.com, 1 sellersmart1.com, 1 @@ -129939,7 +130084,8 @@ semrush.com, 1 sems-cnm.net, 1 semsec.net, 1 -semtinde.com, 1 +semtinde.com, 0 +semuasekolah.com, 1 semver.ca, 1 semyonov.su, 1 sen-uni-lu.ch, 1 @@ -129973,7 +130119,6 @@ sendai-sisters.com, 1 sendai-sougou.com, 1 sendai-works.com, 1 -sendaimori.com, 1 sendaiouji.com, 1 sendbird.com, 1 sendcredit.com, 1 @@ -130080,6 +130225,7 @@ senterada.tk, 1 sentez-cro.com, 1 sentia.com, 1 +sentientforge.ai, 1 sentiment.rest, 1 sentiments.io, 1 sentinel.com, 1 @@ -130088,6 +130234,7 @@ sentinelone.com, 1 sentinelproject.io, 1 sentinels.tk, 1 +sentinexrisk.com, 1 sentirmebien.org, 1 sentitvia.email, 1 sentmail.ga, 1 @@ -130095,8 +130242,8 @@ sentorsecurity.com, 1 sentrafield.com, 1 sentral.com, 1 -sentralegal.com, 1 sentry.io, 1 +sentrygateopener.com, 1 sentrysoftware.com, 1 sentworks.com, 0 senvion.in, 1 @@ -130108,6 +130255,7 @@ seo-dr-it.com, 1 seo-dvizh.ru, 1 seo-forum.nu, 1 +seo-inc.ru, 0 seo-linz.at, 1 seo-obmen.tk, 1 seo-phpbb.cf, 1 @@ -130214,6 +130362,7 @@ seosprint.gq, 1 seostrit.cf, 1 seostrit.tk, 1 +seosuccor.com, 1 seoteam.tk, 1 seotec.com.br, 1 seotesty.cz, 1 @@ -130228,6 +130377,7 @@ seoviziti50.tk, 1 seowerkz.com, 0 seowhizone.com, 1 +seowordpress.pl, 1 seowork.tk, 1 seozel.tk, 1 seozen.top, 1 @@ -130238,7 +130388,6 @@ sepadental.com.my, 0 separacioniglesiaestado.tk, 1 separate.ly, 1 -sepehrmahan.com, 1 sepenggal.info, 1 sepio.systems, 1 sepiocyber.com, 1 @@ -130292,6 +130441,7 @@ serecoponsillo.it, 1 sereema.com, 1 serele.fr, 1 +seren.link, 1 seren.tk, 1 serenahotels.com, 1 serenaparadise.com, 1 @@ -130370,6 +130520,7 @@ serp.technology, 1 serpensin.com, 1 serpenteq.com, 0 +serpentsway.com, 1 serpes.nz, 1 serphost.ml, 1 serpinco.com, 1 @@ -130415,7 +130566,6 @@ server-daten.de, 1 server-essentials.com, 1 server-kiste.de, 1 -server-zugang.eu, 1 server.fm, 1 server.pro, 1 server.vote, 1 @@ -130431,7 +130581,6 @@ serverco.com, 1 serverd.de, 1 serverdechile.tk, 1 -serverdensity.io, 1 serverdozen.nl, 1 serverdragon.site, 1 serveretail.com, 1 @@ -130448,7 +130597,7 @@ serverninja.tk, 1 serveroffline.net, 1 serverpedia.de, 1 -serverscan.com, 1 +serverscan.com, 0 serversify.host, 1 serversify.net, 0 serverstatus.tk, 1 @@ -130529,7 +130678,6 @@ servingupsouthern.com, 1 servipizza.com, 1 servis-azd.cz, 1 -servis.in.net, 1 servis4u.top, 1 servisebi.ge, 1 servisibursa.net, 1 @@ -130648,6 +130796,9 @@ sevastopol-news.com, 1 sevastopol-news.ru, 1 sevastopol.tk, 1 +sevecn.cc, 1 +sevecn.cn, 1 +sevecn.com, 1 seven-seas.ml, 1 sevenangelsmassage.com, 1 sevenartzpublicidad.com, 1 @@ -130691,14 +130842,13 @@ sewtracker.com, 1 sex-test.com, 1 sex-vergleich.com, 1 -sex5.com, 1 sexandthecitty.tk, 1 sexastr.club, 1 sexastr.com, 1 sexawynet.cam, 1 sexblag.club, 1 sexcamexpert.com, 1 -sexcamsbay.com, 1 +sexcamsbay.com, 0 sexdocka.nu, 1 sexdollg.com, 1 sexedquickies.com, 1 @@ -130718,7 +130868,7 @@ sexoclicker.com, 1 sexoclicker.net, 1 sexoclicker.org, 1 -sexocomgravidas.com, 1 +sexocomgravidas.com, 0 sexogsamfunn.no, 1 sexogsamfunn.online, 1 sexohab.guru, 1 @@ -130731,7 +130881,6 @@ sexolviv.com, 1 sexonsight.com, 1 sexonwax.com, 0 -sexopolis.gr, 1 sexorzn.red, 1 sexorzn.xyz, 1 sexosintabues30.com, 1 @@ -130860,8 +131009,6 @@ sfg-net.org, 1 sfg-nordholz.de, 1 sfhp.org, 1 -sfi.org.pl, 1 -sfi.pl, 1 sfile.eu, 1 sfilm.cz, 1 sfinance.cz, 1 @@ -130932,7 +131079,6 @@ sgrossi.it, 1 sgrowe.de, 0 sgrs.be, 1 -sgrub.xyz, 1 sgs-systems.de, 1 sgs.camera, 1 sgs.systems, 1 @@ -130947,7 +131093,6 @@ sgtrains.com, 1 sgtsnookums.net, 1 sgtt.ch, 0 -sgutranscripts.org, 1 sh-heppelmann.de, 1 sh-network.de, 1 sh0rt.zone, 1 @@ -131146,7 +131291,6 @@ sharedgoals.co, 1 sharedhealthmb.ca, 1 sharedhost.de, 0 -sharedreview.com, 1 shareforcelegal.com, 1 sharefox.eu, 0 sharefunfacts.com, 1 @@ -131198,20 +131342,25 @@ sharkpaint.tk, 1 sharks.football, 1 sharky.ro, 1 +sharky009.de, 1 sharmafamily.tk, 1 +sharneylaura.co.uk, 1 sharnoffphotos.com, 1 sharona.cloud, 1 sharonnh.gov, 1 sharonpope.com, 1 sharpapi.com, 1 +sharpapi.io, 1 sharpcranehire.com.au, 1 sharpe-practice.co.uk, 1 sharpe.systems, 1 sharpiesscrubs.tk, 1 sharpletters.net, 0 +sharplines.io, 1 sharpmetals.com, 1 sharpsburg-ga.gov, 1 sharptudhope.co.nz, 1 +sharqsouq.com, 1 sharren.org, 1 sharstonbooks.co.uk, 1 sharvey.ca, 1 @@ -131290,7 +131439,6 @@ sheet.host, 1 sheetengine.net, 1 sheetflowpro.com, 1 -sheetseeker1486.it, 1 sheezy.art, 1 sheezy.blog, 1 sheezy.games, 1 @@ -131334,7 +131482,9 @@ shelly-forum.com, 1 shelma.tk, 1 shelt.com, 1 +shelter.money, 1 shelterislandtown.gov, 1 +shelterofflint.org, 1 sheltieplanet.com, 1 sheltonvirtual.com, 1 shelvacu.com, 1 @@ -131348,7 +131498,6 @@ shemsconseils.ma, 1 shemy.eu, 1 shenandoahrealestate.org, 1 -shenandoahwoodwork.com, 1 shenannigans.tk, 1 shenderman.ml, 1 sheng-wai.com, 1 @@ -131384,7 +131533,6 @@ shermanshebcowi.gov, 1 shermantwphuronmi.gov, 1 sherpa.blog, 1 -sherpany.com, 1 sherpnortheast.com, 1 sherrikelley.com, 0 sherston.com, 1 @@ -131505,8 +131653,6 @@ shinta.ro, 1 shintoism.com, 1 shiny.gg, 1 -shinyhappydoggy.com, 0 -shinyoko-saisyuusyou.com, 1 shinyokumiai.or.jp, 1 shinypebble.uk, 1 shinyupai.com, 1 @@ -131716,7 +131862,6 @@ shopific.co, 1 shopific.com, 1 shopifycloud.com, 1 -shopifyfactory.io, 1 shopikal.com, 1 shopingbiz.tk, 1 shopintra.net, 1 @@ -131909,8 +132054,10 @@ shopunderwear.tk, 1 shopunilever.com, 1 shopupnorth.com, 1 +shopwice.com, 1 shopwinedirect.com, 1 shopx.co.il, 1 +shopyub.com, 1 shopzona.biz, 1 shore.co.il, 1 shorebreaksecurity.com, 1 @@ -131918,6 +132065,7 @@ shorehamfort.co.uk, 1 shorehillgolf.com, 1 shorelinelaserdesigns.com, 1 +shorelinewebdesigns.com, 1 shoresofshawneebend.com, 1 shorewoodil.gov, 1 shorewoodmn.gov, 1 @@ -131960,7 +132108,6 @@ shota.pictures, 1 shotbow.net, 1 shotcounter.nl, 1 -shotdeck.com, 1 shotoniphone.ga, 1 shotsbyferry.nl, 1 shotsleeve.com, 1 @@ -131990,6 +132137,7 @@ showerdoorco.com, 1 showersnet.com, 1 showf.om, 1 +showfom.com, 1 showfom.sb, 1 showgirls.ga, 1 showkase.com.br, 1 @@ -131997,6 +132145,7 @@ showme.co.za, 1 showme.hu, 1 showmeengland.co.uk, 1 +showmemorocco.com, 1 showmethescore.cf, 1 showmoviz.com, 1 showmyip.com, 1 @@ -132080,6 +132229,7 @@ shuiyu.com, 1 shuizilan.com, 1 shukatsu-ichiba.com, 1 +shukr.ch, 1 shulan.moe, 1 shuletime.ml, 1 shulman.tk, 1 @@ -132106,7 +132256,6 @@ shura.eu.org, 1 shurita.org, 1 shurporno.com, 1 -shushuwoa.com, 1 shutdowntimer.com, 1 shuttelportal.nl, 1 shutter-shower.com, 1 @@ -132209,6 +132358,7 @@ sidatbacklink.tk, 1 sidaways.co.uk, 1 siddhamehta.tk, 1 +siddhkar.com, 1 siddigsami.com, 1 sidechannel.blog, 1 sidechannel.media, 1 @@ -132245,7 +132395,6 @@ siduga.com, 1 sie.at, 1 siebenhirten7.at, 1 -siebeve.be, 1 siecon-it.com, 1 siega.pl, 1 siegemund-frankfurt.de, 1 @@ -132399,6 +132548,7 @@ signupgenius.com, 1 signuponline.events, 1 signwell.com, 1 +sigoo.co.jp, 1 sigparser.com, 0 sigpas.fr, 1 sigptr.me, 1 @@ -132464,6 +132614,7 @@ siliconlightworks.com, 1 siliconlowcode.com, 1 siliconvalley.center, 1 +silicosis.org.au, 1 silina.tk, 1 silk, 1 silk.com, 1 @@ -132487,6 +132638,7 @@ silqueskineyeserum.com, 1 silsha.me, 1 silta.tk, 1 +silueta21.com, 1 silv.tk, 1 silvalli.com, 0 silver-fenrir.cn, 1 @@ -132612,7 +132764,7 @@ sim-minaoshi.jp, 1 sim-mobile.ml, 1 sim4seed.org, 1 -simabonnement.nl, 1 +simabonnement.nl, 0 simac.fr, 1 simacek.cz, 1 simaogv.net, 1 @@ -132790,7 +132942,6 @@ simplixos.org, 1 simplrflex.com, 1 simplus.id, 1 -simplusbr.com, 1 simply-bob.de, 1 simply-pattinson.tk, 1 simply-pdf.de, 1 @@ -132803,6 +132954,7 @@ simplychocolate.com, 1 simplycloud.de, 1 simplycodes.com, 0 +simplydogtalk.com, 1 simplydonelegal.com, 1 simplydonot.com, 1 simplydonut.com, 1 @@ -132833,7 +132985,6 @@ simpsonizeme.co, 1 simpul.nl, 1 simpvp.net, 1 -simrail.cn, 1 simrail.nl, 1 simranmehta.ga, 1 sims4hub.ga, 1 @@ -132922,6 +133073,7 @@ sindromebenjamin.tk, 1 sinefili.com, 1 sinemakurd.tk, 1 +sinemetrik.com, 1 sinergify.com, 1 sinetron.ga, 1 sinews.tk, 1 @@ -133000,7 +133152,6 @@ sinpermiso.info, 1 sinquin.eu, 1 sinsalida.tk, 1 -sinsandscents.com, 1 sinsin.io, 1 sinsitio.tk, 1 sinsolucion.tk, 1 @@ -133143,6 +133294,7 @@ sistemapronto.ml, 1 sistemaseinformacao.com.br, 1 sistemasespecializados.com, 1 +sistemaslogitron.com, 1 sistemaspleno.com, 1 sistemika.cl, 1 sistemista.it, 1 @@ -133180,12 +133332,12 @@ sitebuilderreport.com, 0 sitechange.dedyn.io, 1 sitechecker.pro, 1 +sitecherish.co.uk, 1 siteclick.co.uk, 1 sitecore.com, 1 sitecreation.tk, 1 sitecreator.tk, 1 sitecrew.cf, 1 -sitedebelezaemoda.com.br, 1 sitedynamix.co.uk, 1 siteforce.com, 1 sitehizlandir.com, 1 @@ -133221,12 +133373,11 @@ sitetuners.com, 1 siteu.nl, 1 siteviseagency.com, 1 -siteweb-seo.fr, 1 -sitgesbeachhouse.com, 1 sitgesfilmfestival.com, 1 sithijaya.tk, 1 sithmanifest.com, 1 sitinjau.com, 1 +sitisnab.kz, 1 sitiwebferrara.it, 1 sitnik.ru, 1 sitnikov.ga, 1 @@ -133339,6 +133490,7 @@ skaiman.ga, 1 skaitliukas.tk, 1 skakun.io, 1 +skaldhotel.is, 1 skalec.org, 1 skalniak.pl, 1 skamper.tk, 1 @@ -133705,6 +133857,7 @@ skylander.cf, 1 skylandsoft.com, 1 skylarker.org, 1 +skylerknauss.com, 1 skylightcreative.com.au, 0 skylightipv.com, 1 skyline.tw, 1 @@ -133777,7 +133930,6 @@ skyscanner2024.com, 1 skyscheduler.work, 1 skyscnr.com, 1 -skyscrapers.eu, 1 skyseo.cf, 1 skysoftbg.com, 1 skysplash.gq, 1 @@ -133852,6 +134004,7 @@ slashrepeat.com, 1 slate.fr, 1 slate.to, 1 +slatemc.com, 1 slatemc.fun, 1 slateteams.com, 0 slathering.cf, 1 @@ -133861,6 +134014,7 @@ slatteryauctions.com.au, 1 slaughter.com, 1 slaughterhouse.fr, 1 +slaughters.club, 1 slava.ml, 1 slavasoloviev.com, 1 slavasveta.info, 1 @@ -133873,7 +134027,7 @@ slavnineznami.cz, 1 slavyansk-news.ru, 1 slaws.io, 1 -slayden.com, 1 +slayden.com, 0 slayersonline.net, 1 slbbiromaru.sch.id, 1 slbetx.com, 1 @@ -134044,7 +134198,6 @@ slovenskycestovatel.sk, 1 slow.social, 1 slow.zone, 0 -slowakei.international, 1 slowandsimple.co, 1 slowapi.com, 1 slowblinkmainecoons.com, 1 @@ -134096,6 +134249,7 @@ sm-supplements.gr, 1 sm.ms, 1 sm161.cn, 1 +sm17p.me, 1 sm2016.ch, 1 sm2ct.cn, 1 sma-dev.de, 1 @@ -134185,21 +134339,19 @@ smart-vilp.com, 1 smart-wind.ru, 1 smart-zona.tk, 1 +smart11.ai, 1 smartacademy.ge, 1 smartagilesolution.com, 1 smartandcom.ch, 1 smartapplianceservices.com, 1 smartar.com, 1 -smartart.gr, 1 smartart.tk, 1 smartass.space, 0 smartass0027.com, 1 smartassembly.tk, 1 smartasset.com, 1 -smartbear.com, 1 smartbetaler.no, 1 smartbis.com, 1 -smartbiz.vn, 1 smartblock.cloud, 1 smartboardesl.com, 1 smartbooqing.com, 1 @@ -134252,7 +134404,6 @@ smartiflix.com, 1 smartius.it, 1 smartjoin.style, 1 -smartkraftcircuits.com, 1 smartland.com, 1 smartlandapartments.com, 1 smartlandconstruction.com, 1 @@ -134270,7 +134421,6 @@ smartlogstock.com, 1 smartlogtower.com, 1 smartlooks.es, 1 -smartmail.io, 1 smartmail24.de, 1 smartme.pl, 1 smartmeal.ru, 1 @@ -134284,7 +134434,6 @@ smartnews-smri.com, 1 smartnoob.de, 1 smartnotify.ca, 1 -smartoctopus.art, 1 smartology.net, 1 smartoneclub.com, 1 smartools.pro, 1 @@ -134332,6 +134481,7 @@ smartview.cloud, 1 smartviewhub.com, 1 smartvisionoptometry.com.au, 1 +smartvoting.cl, 1 smartwatchsolutions.com, 1 smartwealthmanagement.org, 1 smartweb.ge, 1 @@ -134390,7 +134540,6 @@ smeweb.com, 1 smeys.be, 1 smfdmn.gov, 1 -smgbs.com, 1 smgl.cm, 1 smh.me, 1 smi-a.me, 1 @@ -134455,6 +134604,7 @@ smithteresa.tk, 1 smithvillehomehardware.ca, 1 smithwealth.com.au, 1 +smits.com, 1 smits.frl, 1 smitsdesigncenter.nl, 1 smitsmail.net, 1 @@ -134548,6 +134698,7 @@ sms1.ro, 1 sms72.tk, 1 smsaero.ru, 1 +smsalert.mobi, 1 smsalvand.tk, 1 smsappointment.com, 0 smsben.com, 0 @@ -134605,7 +134756,6 @@ snacky.nl, 1 snafu.cz, 1 snagator.com, 1 -snail.observer, 1 snaildos.tk, 1 snajdr.online, 1 snajdrova.eu, 1 @@ -134692,6 +134842,7 @@ sniderman.xyz, 1 sniep.net, 1 sniffcat.com, 1 +sniffies.com, 1 sniffing.gq, 1 sniffle.eu, 1 snikket.de, 1 @@ -134699,6 +134850,7 @@ snipdrive.com, 1 snipettemag.com, 1 snipl.io, 1 +snipp.gg, 1 snipp.lol, 1 snippet.host, 1 snippet.ml, 1 @@ -134770,7 +134922,6 @@ snrd.eu, 1 snrlaw.in, 1 snroth.de, 1 -snrub.co, 1 sns-beta.com, 1 sns-dev.com, 1 sns-tg.pl, 1 @@ -134809,6 +134960,7 @@ sobaki.tk, 1 sobakoh-nyc.com, 1 sobatkaos.biz.id, 1 +sobaudon.f5.si, 1 sobchak.ga, 1 sobieray.dyndns.org, 1 sobkite.com, 1 @@ -134947,6 +135099,7 @@ socradar.io, 1 socratec-pharma.de, 1 socraticsolutions.us, 1 +socript.com, 1 socseti.cf, 1 socseti.ga, 1 socseti.gq, 1 @@ -135025,7 +135178,6 @@ softbit.pt, 1 softblinds.co.uk, 1 softchin.ir, 1 -softcleanr.shop, 0 softcompany.tk, 1 softcomplex.com, 1 softconcept.pt, 1 @@ -135038,7 +135190,7 @@ softfuture.tk, 1 softgamez.net, 1 softhints.com, 1 -softios.com, 1 +softi.co.kr, 1 softizy.com, 1 softloom.com, 1 softmachine.es, 1 @@ -135105,7 +135257,6 @@ sogravatas.com.br, 1 sogravatas.net.br, 1 sogut.bel.tr, 1 -sogutma.com.tr, 1 sohamroy.me, 1 sohanakhan.tk, 1 soherco.cl, 1 @@ -135114,7 +135265,6 @@ soho-art.com, 1 soil-journal.net, 1 soil2.ch, 1 -soilegustafsson.fi, 1 soillessgeek.com, 1 soilscapesolutions.com, 1 sointelcom.com.co, 1 @@ -135182,7 +135332,7 @@ solarpanels.tk, 1 solarpanelscentralcoast.com, 1 solarplan-berlin.de, 1 -solarscan.com, 1 +solarpoolheatingsa.co.za, 1 solarseason.ga, 1 solarstrom.net, 1 solartek.cf, 1 @@ -135217,6 +135367,7 @@ solemare-hotel.it, 1 solencell.com.tr, 1 solentbubblesandbounce.co.uk, 1 +soleur.ai, 1 solfegiator.ch, 0 solfipinformatique.org, 1 solgar.dk, 1 @@ -135235,7 +135386,6 @@ solidhost.cf, 1 solidimage.com.br, 1 solidincome.ga, 1 -solidityfactory.io, 1 solidnet.software, 1 solidnetwork.org, 1 solidpoint.com.my, 1 @@ -135244,8 +135394,9 @@ solidshield.com, 1 solidsteel.tk, 1 solidtuesday.com, 1 +solidus.cards, 1 solifi.com, 1 -solihull.ac.uk, 0 +solihull.ac.uk, 1 solihullinflatables.com, 1 solihullpcrepairs.co.uk, 1 solikreis-stuttgart.tk, 1 @@ -135263,10 +135414,10 @@ solium.com, 1 soliver.de, 1 soliver.eu, 1 -solix.com, 1 sollah.com, 1 sollahlibrary.com, 1 sollea.co, 1 +sollers-digital.ru, 1 sollet.ac, 1 sollishealth.com, 0 solmek.co.uk, 1 @@ -135296,7 +135447,6 @@ solosesso.tk, 1 solostocks.com, 1 solostocks.it, 1 -solostocks.ma, 1 solovault.io, 1 sols.style, 1 solsea.io, 1 @@ -135317,7 +135467,6 @@ solution.ch, 1 solutionalbum.com, 1 solutionbuilders.com, 1 -solutionmotsfleches.com, 1 solutionpieces.com, 1 solutions-ii.com, 1 solutions-it.net, 1 @@ -135391,6 +135540,7 @@ sommerrodelbahn-gutach.de, 1 somnam.tk, 1 somni.one, 1 +somnoterapia.com, 1 somnus.com, 1 somogyivar.hu, 1 somosanna.hu, 1 @@ -135444,6 +135594,7 @@ sonderkomission.ch, 1 sondoro.tk, 1 sondriotoday.it, 1 +soneofficial.com, 1 sonesinafar.tk, 1 sonesisonesi.tk, 1 sonesonesisi.tk, 1 @@ -135456,7 +135607,6 @@ songesdeplumes.fr, 1 songi.net, 1 songlab.ai, 1 -songsigrewupsinging.com, 1 songslaura.tk, 1 songsonline.tk, 1 songsterr.com, 1 @@ -135593,6 +135743,7 @@ sorrentofc.com.au, 1 sorrentoparking.com, 1 sorrowfulunfounded.com, 1 +sorsby.mx, 1 sortandpack.com, 0 sortaweird.net, 0 sorted.org.nz, 1 @@ -135647,6 +135798,7 @@ sosns.com, 1 soso.ga, 1 soso.loan, 1 +soso.stream, 1 sosoft.tk, 1 sosoftplay.co.uk, 1 sosok.tk, 1 @@ -135662,6 +135814,7 @@ sosyalevin.com, 1 sosysadmin.com, 1 sosz.org, 1 +sota-ink.com, 1 sota.sh, 1 sotadb.info, 1 sotaltamer.it, 1 @@ -135685,7 +135838,6 @@ sottomarini.tk, 1 sotypicallydutch.nl, 1 soubriquet.org, 1 -soudebalsa.com.br, 1 souenfermagem.com.br, 1 souenfermagem.org.br, 1 souenfermeira.com, 1 @@ -135717,7 +135869,6 @@ soulwinning.tk, 1 soulyfunerals.co.nz, 1 soulyi.io, 1 -soumafukutora.com, 1 soumen.tk, 1 soumikghosh.com, 1 soumissionalarme.ca, 1 @@ -135783,6 +135934,7 @@ soupleyoga.com, 1 souqfriday.com, 1 sour.is, 1 +souravbhor.com, 1 souravbhor.gq, 1 souravbhor.ml, 1 source-clan.tk, 1 @@ -135801,7 +135953,6 @@ sourcehut.net, 1 sources.tk, 1 sourcesdegarrigue.fr, 1 -sourceweb.com, 1 sourcing4exports.co.uk, 1 sourcitec.com, 1 souria.tk, 1 @@ -135814,6 +135965,7 @@ southadamswaterco.gov, 1 southambouncycastle.co.uk, 1 southamptontownnypolice.gov, 1 +southbankpersonaltrainers.com, 1 southbankregister.com.au, 1 southbaycu.com, 1 southbaylatherapy.com, 1 @@ -135835,8 +135987,6 @@ southcoastlocksmiths.com.au, 0 southdakotahealth.tk, 1 southdakotanet.tk, 1 -southeast-wholesale.com, 1 -southeastasianarchaeology.com, 1 southeastattacksquadron.org, 1 southeastwsf.org, 1 southelginumc.org, 1 @@ -135845,8 +135995,6 @@ southernfashiondecorbd.com, 1 southernfirst.com, 1 southernforge.com, 1 -southerngospelnow.com, 1 -southerngospelprizes.com, 1 southernislands.llc, 1 southernlights.cf, 1 southernlights.club, 1 @@ -135859,6 +136007,7 @@ southernvalve.com, 1 southfieldtownshipmi.gov, 1 southfloridaopenhousesearch.com, 1 +southforkresort.net, 1 southforkresort.us, 1 southgatemi.gov, 1 southjacksonville-il.gov, 1 @@ -135869,6 +136018,7 @@ southmarengo.com, 1 southmarengoal.gov, 1 southmelbourne.apartments, 1 +southmelbournepersonaltrainers.com, 1 southmill.com, 1 southmilwaukee.gov, 1 southmorangtownhouses.com.au, 1 @@ -135876,6 +136026,7 @@ southpeacearchives.org, 1 southphoenixair.tk, 1 southportland.gov, 1 +southportpersonaltrainers.com, 1 southridgeservices.com, 1 southrock.com, 1 southsands.com, 1 @@ -135906,6 +136057,7 @@ sova.cc, 1 sova.st, 1 sova.wiki, 1 +sovana.fr, 1 sovasage.com, 1 sovelia.com, 1 sovendus-benefits.com, 1 @@ -135917,6 +136069,7 @@ sovereign.bounceme.net, 1 sovereigngroup.com, 1 sovereignpcs.com, 0 +sovereigntyacademy.net, 1 soverin.net, 1 sovest.ml, 1 sovetiogorodniku.info, 1 @@ -135932,7 +136085,6 @@ sovryn.com, 1 sovtech.tk, 1 sovxoz.gq, 1 -sowero.com, 1 sowero.de, 1 sowget.com, 1 sowhat.dk, 0 @@ -135997,7 +136149,6 @@ space-time-elements.com, 1 space-y.cf, 1 space.com.pt, 1 -space.gov.ae, 1 spaceanimalnutrition.com, 1 spaceapi.io, 1 spacebabies.nl, 1 @@ -136005,6 +136156,7 @@ spacebear.ee, 1 spacebestnews.tk, 1 spacebooster.pl, 1 +spacecarcelia.com, 1 spacecityweather.com, 1 spacecoastdumpsterrental.com, 1 spacedance.tk, 1 @@ -136152,7 +136304,6 @@ sparkresearch.net, 1 sparkresto.com, 1 sparkseo.com.br, 1 -sparksfoundation.net, 1 sparksga.gov, 1 sparkweld.biz, 1 sparmedo.de, 1 @@ -136165,6 +136316,7 @@ sparta.ee, 1 spartacuslife.com, 1 spartaermelo.nl, 1 +spartakexchange.com, 1 spartamet.tk, 1 spartan300.tk, 1 spartan300charity.org, 1 @@ -136185,7 +136337,6 @@ spatter.tk, 1 spatzenwerkstatt.de, 1 spawn.cz, 1 -spaworldhouston.com, 1 spaziobenedetti.com.br, 1 spaziotennis.com, 1 spaziowrestling.it, 1 @@ -136194,11 +136345,13 @@ spb-apple-helpgroup.com, 1 spb-clean.ru, 1 spb-electric.ru, 1 +spb-svarka.ru, 1 spbatelec.fr, 1 spbcodes.online, 1 spbelect.info, 1 spbelect.org, 1 spbet99.com, 1 +spbevso.com, 1 spbot.ml, 1 spc-ag.ch, 1 spcconnect.com, 0 @@ -136224,6 +136377,7 @@ speakersbusiness.com, 1 speakersden.tk, 1 speakertwpmi.gov, 1 +speakfrench.cn, 1 speaklanguages.com, 1 speakol.com, 1 spear.ga, 1 @@ -136243,7 +136397,7 @@ specialist.srv.br, 1 specialistskin.com.sg, 1 specialized-hosting.eu, 1 -specialmomentvideo.com, 0 +specialneedsadventurefamily.com, 1 specialnoise.tk, 1 specialofficesupplies.tk, 1 specialphotos.ca, 1 @@ -136349,7 +136503,6 @@ spencernc.gov, 1 spencerpauly.com, 0 spend.cloud, 1 -spendable.money, 1 spendd.co, 1 spendebt.com, 1 spendedge.com, 1 @@ -136425,6 +136578,7 @@ spiderworking.com, 1 spidometr.ml, 1 spie-wirliebenkabel.de, 1 +spiegel-deutschland.de, 1 spiegelglass-gc.com, 1 spiegelingenblog.nl, 1 spiegels-op-maat.nl, 1 @@ -136440,7 +136594,9 @@ spieltexte.de, 1 spieringsdakbedekking.nl, 1 spiet.nl, 1 +spiff.ie, 1 spiga.ch, 0 +spiielherz.li, 1 spikar.gr, 1 spike.sh, 1 spikejeon.tk, 1 @@ -136475,7 +136631,6 @@ spinscity.info, 1 spinscity.net, 1 spinscity777.info, 1 -spintools.pro, 1 spintracer.de, 1 spion.su, 1 spireat.it, 1 @@ -136484,13 +136639,12 @@ spirerecoverysolutions.com, 1 spirio.cz, 1 spirion.com, 1 -spirit-hunters-germany.de, 0 +spirit-hunters-germany.de, 1 spirit-url.com, 1 spirit55555.dk, 1 spiritbionic.ro, 1 spiritdesigns.tk, 1 spiritedengineers.tk, 1 -spiritgruppen.no, 1 spiritindia.com, 1 spiritlakehealthcenter.com, 1 spiritous.cf, 1 @@ -136537,7 +136691,6 @@ sploitus.com, 1 splorge.cloud, 0 splorge.website, 1 -splosh.nl, 1 splotchify.com, 1 splytech.io, 1 spm-servis.tk, 1 @@ -136550,7 +136703,6 @@ spocasi.cz, 1 spocool.com, 1 spodelime.com, 1 -spoelbakzaak.nl, 1 spofia.nu, 1 spokane.gov, 1 spokanecounty.gov, 1 @@ -136597,7 +136749,6 @@ sportadictos.com, 1 sportal.se, 1 sportalliance.com, 1 -sportanaliz.com, 1 sportausbildung.com, 1 sportbikeadventures.com, 1 sportboot.mobi, 1 @@ -136666,17 +136817,18 @@ sportsdestinations.com, 1 sportsenvivotv.com, 1 sportservice.bz, 1 +sportshake.com, 1 sportskibat.tk, 1 sportsmagy.com, 1 sportsmania.tk, 1 sportsmansblog.com, 1 sportsmashup.com, 1 sportsnacklove.com, 1 -sportspainmanagementnyc.com, 1 sportspassbremen.de, 1 sportspeople.com.au, 1 sportssurfaces.com.au, 0 sportstips.tk, 1 +sportstraveler.net, 1 sportstreetstyle.com, 1 sportsupports-hertogenbosch.nl, 1 sportsxplay.com, 1 @@ -136745,6 +136897,7 @@ sprawnymarketing.pl, 1 sprayontv.com, 0 spraypolyurethane.org, 1 +spreadfinds.com, 1 spreadgreatideas.com, 1 spreadgreatideas.org, 1 spreadsheets.google.com, 1 @@ -136803,7 +136956,7 @@ springsoffthegrid.com, 1 springspeedshop.com, 1 springtxcarpetcleaning.com, 1 -springwellclinic.co.uk, 1 +springwellclinic.co.uk, 0 sprintgrad.com, 1 sprintkitchen.com, 1 sprintlee.com, 1 @@ -136851,7 +137004,6 @@ spurghi.roma.it, 1 spurstark.de, 1 sputnikvaccine.com, 1 -spweb.cz, 1 spx.com, 1 spy-net.tk, 1 spychala-it.de, 1 @@ -136919,6 +137071,7 @@ square.ly, 1 square.mx, 1 square.site, 1 +square1.de, 1 squarecdn.com, 1 squaredancedance.tk, 1 squaredaway.co.nz, 1 @@ -136966,7 +137119,6 @@ squirtingpussygirl.com, 1 squirtqueen.org, 1 sqxb0.ga, 1 -sr-33.com, 1 sr-f.tk, 1 sr.ht, 1 sr3cybersecurity.com, 1 @@ -136993,6 +137145,7 @@ sreality.cz, 1 sreb.loan, 1 srebro.cc, 1 +sree.build, 1 sreedhareeyam.tk, 1 sreeharis.tk, 1 sreemetaliks.com, 1 @@ -137036,6 +137189,7 @@ srkb.net, 1 srlconsult.ro, 1 srle.tk, 1 +srmdn.com, 1 srmi.biz, 1 srmllc.net, 1 srmstatic.com, 1 @@ -137141,6 +137295,7 @@ ssl247.de, 1 ssl247.dk, 1 ssl4all.gq, 1 +sslboard.com, 1 sslc.gov, 1 sslcertificaten.nl, 1 sslcheck.nl, 1 @@ -137183,7 +137338,6 @@ ssrvpn.tech, 1 sss.red, 1 ssslelectricfencing.co.za, 1 -ssslgaragedoors.co.za, 1 sssppp.gq, 1 sssss.click, 1 ssstructures.net, 1 @@ -137229,6 +137383,7 @@ stacabinetdepot.com, 1 staceygillinphotography.com, 1 stacisezeptat.cz, 1 +stackanchor.net, 1 stacker.news, 1 stackery.io, 1 stackhub.cc, 1 @@ -137266,49 +137421,6 @@ stadtwerke-sw.de, 1 staer.ro, 1 staff.direct, 1 -staffaugmentation.ae, 1 -staffaugmentation.al, 1 -staffaugmentation.at, 1 -staffaugmentation.ba, 1 -staffaugmentation.be, 1 -staffaugmentation.bg, 1 -staffaugmentation.ch, 1 -staffaugmentation.co.il, 1 -staffaugmentation.co.uk, 1 -staffaugmentation.com.ar, 1 -staffaugmentation.com.ua, 1 -staffaugmentation.cz, 1 -staffaugmentation.de, 1 -staffaugmentation.dk, 1 -staffaugmentation.ee, 1 -staffaugmentation.es, 1 -staffaugmentation.eu, 1 -staffaugmentation.fi, 1 -staffaugmentation.fr, 1 -staffaugmentation.ge, 1 -staffaugmentation.gr, 1 -staffaugmentation.hr, 1 -staffaugmentation.hu, 1 -staffaugmentation.it, 1 -staffaugmentation.jp, 1 -staffaugmentation.li, 1 -staffaugmentation.lt, 1 -staffaugmentation.lu, 1 -staffaugmentation.lv, 1 -staffaugmentation.md, 1 -staffaugmentation.me, 1 -staffaugmentation.mk, 1 -staffaugmentation.mx, 1 -staffaugmentation.nl, 1 -staffaugmentation.no, 1 -staffaugmentation.pe, 1 -staffaugmentation.ph, 1 -staffaugmentation.pl, 1 -staffaugmentation.pt, 1 -staffaugmentation.ro, 1 -staffaugmentation.rs, 1 -staffaugmentation.si, 1 -staffaugmentation.us, 1 staffaugmentation.vn, 1 staffi.tk, 1 staffingnation.com, 1 @@ -137322,7 +137434,6 @@ stage-props-blank-guns.com, 1 stage.wepay.com, 1 stageandtraining.com, 1 -stagebtp.com, 1 stageirites.com, 1 stageirites.fr, 1 stageirites.org, 1 @@ -137421,6 +137532,7 @@ standard-wohnungsbaukredit.info, 1 standard-wohnungsbaukredit.net, 1 standard-wohnungsbaukredit.org, 1 +standard.co.me, 1 standardlifters.com, 1 standardmetrics.io, 1 standardnotes.com, 1 @@ -137445,7 +137557,6 @@ standoffarena.com, 1 standrewsbookshop.co.uk, 1 standsearch.cf, 1 -standup2cancer.ca, 1 standup2cancer.org, 1 standupcomedy.cf, 1 standupcomedy.ga, 1 @@ -137482,6 +137593,7 @@ star-clean.it, 1 star-life.tk, 1 star-one.co.uk, 1 +star.watch, 1 starase.com, 0 starazagora.bg, 1 starb.in, 1 @@ -137585,13 +137697,13 @@ starsoft.io, 1 starspie.com, 1 starsplay.com, 1 -start-dropshipping.com, 1 start-knighki.gq, 1 start-nadlan.co.il, 1 start-school.by, 1 start.stockholm, 1 start2dance.tk, 1 startablog.tv, 1 +startag.xyz, 1 startandstop.fr, 1 startaninflatablebusiness.com, 1 startaxi.com.ua, 1 @@ -137654,6 +137766,7 @@ starvizyon.com, 1 starwarschronology.com, 1 starwarshunters.com, 1 +starwarsmilk.com, 1 starwatches.eu, 1 starworksglobal.com, 1 starx.ink, 1 @@ -137695,6 +137808,7 @@ statesville.com, 1 statewideoutdoorblinds.com, 1 statfluence.com, 1 +stathamquotes.ru, 1 static-assets.io, 1 static-myfxee-808795.c.cdn77.org, 1 static-myfxoau-808795.c.cdn77.org, 1 @@ -137723,7 +137837,6 @@ stats-co.eu, 1 stats-mailtracker.com, 1 stats.g.doubleclick.net, 1 -statscrew.com, 1 statsit.ga, 1 statsme-app.com, 1 statsndata.org, 1 @@ -137771,6 +137884,7 @@ staywelladjusted.com, 1 stazi.tk, 1 stb-buegel.de, 1 +stb-schefczyk.ch, 1 stb-schefczyk.com, 1 stb-schefczyk.de, 1 stb-schefczyk.info, 1 @@ -137780,7 +137894,6 @@ stb.gov, 1 stbarnabashealthsystem.com, 1 stbartholomewmanchester.org, 1 -stbcg.com, 1 stbernardnk.org, 1 stbk.link, 1 stbl.org, 1 @@ -137822,7 +137935,7 @@ steakovercooked.com, 1 stealingheather.com, 1 stealsaga.net, 1 -stealth.design, 1 +stealth.design, 0 stealth.net, 1 stealthbinders.tk, 1 stealthmodel.fi, 1 @@ -137945,6 +138058,7 @@ stek-usa-shop.com, 1 stek-usa.com, 1 stekelenburg.me, 1 +steklein.de, 1 stelcomp.com, 1 stelcron.com, 1 steldingreporters.com, 1 @@ -137998,7 +138112,6 @@ stemgirls.co.za, 1 stemklank.tk, 1 stemlabadvanced.pt, 1 -stemmayhem.com, 1 stemoplinks.nl, 1 stempelfarben.de, 1 stemps.pl, 1 @@ -138021,6 +138134,7 @@ stepanyansurgical.com, 1 steparovi.cz, 1 stepbrobd.com, 1 +stepgf.com, 1 steph.ninja, 1 steph3n.me, 1 stephan-matthiesen.de, 1 @@ -138037,6 +138151,7 @@ stephanielantry.com, 1 stephanieleonidasfan.tk, 1 stephanieschreiber.com, 1 +stephanisutherland.com, 1 stephanoptiek.nl, 1 stephen-oliver-art.co.uk, 1 stephenbakalian.com, 1 @@ -138067,6 +138182,7 @@ steppesisters.org, 1 steppicrew.de, 1 steppingoutinstyleonline.com, 1 +steppingstonessb.com, 1 steppinout.tk, 1 stepplanning.com, 1 steppowerplant.com, 1 @@ -138085,6 +138201,7 @@ stereob.it, 1 stereochro.me, 0 stereoembersmagazine.com, 1 +stereologic.com, 1 stereostudio.cf, 1 stereotyped.de, 1 sterilium.tk, 1 @@ -138096,6 +138213,7 @@ sterlingcustomsheetmetal.com, 0 sterlingheights.gov, 1 sterlinginsurance.com.au, 0 +sterlingpestcontrol.com, 1 sterlingpropertiesmi.com, 1 sterlinx.de, 1 stern-freunde.de, 1 @@ -138114,8 +138232,6 @@ steroidswiki.com, 1 sterr.in, 1 sterretranen.tk, 1 -stersoftware.com, 1 -stersoftware.nl, 1 sterva.mobi, 0 sterydki.pl, 1 sterz.io, 1 @@ -138123,7 +138239,6 @@ stesti.cz, 1 stetson.edu, 1 stetsonrealestate.com, 1 -stetten-akm.de, 1 steuer-voss.de, 1 steuerberater-bayreuth.com, 1 steuerberater-essen-steele.com, 1 @@ -138169,6 +138284,7 @@ stevenski.com, 0 stevensonal.gov, 1 stevensontaxservices.com, 1 +stevensonvillager.com, 1 stevenspoint.gov, 1 steventress.com, 1 stevenz.blog, 1 @@ -138251,8 +138367,6 @@ stickypassword.com, 1 stickypigbbq.com, 1 stidmobile-id.com, 1 -stiebel.co.nz, 1 -stiebel.com.au, 1 stiebelrewards.com.au, 1 stiebelservice.com.au, 1 stiehler-leipzig.tk, 1 @@ -138341,7 +138455,6 @@ stjscatholicchurch.org, 1 stjude-ettekkar.tk, 1 stjustin.org, 1 -stkeverneparishcouncil.org.uk, 1 stkevin-stbenedict.org, 1 stkildaosteopathy.com.au, 1 stlautoenhancements.com, 1 @@ -138380,7 +138493,7 @@ stmaryskutztown.com, 1 stmarysmdsao.gov, 1 stmarysprestwich.org, 0 -stmarystfd.org, 1 +stmarystfd.org, 0 stmaryswv.gov, 1 stmatthewri.org, 1 stmattsparish.com, 1 @@ -138419,6 +138532,7 @@ stockportny.gov, 1 stockportspiritualistchurch.co.uk, 1 stockpricetrends.com, 1 +stockpulse247.com, 1 stocks-adviser.com, 1 stockslam.ga, 1 stocksnews.tk, 1 @@ -138482,7 +138596,6 @@ stomatologia-narkoza.pl, 1 stomatologiya.gq, 1 stomatologiya.ml, 1 -stompai.com, 1 stomproced.ro, 1 stomt.com, 1 stone-guru.co.uk, 1 @@ -138490,9 +138603,11 @@ stone-support.de, 1 stoneandtile.design, 1 stonebriarpropertyinspections.com, 1 +stonebridge-systems.org, 1 stonechat.de, 1 stonecountyar.gov, 1 stonecutgods.com, 1 +stonedepot.com.au, 1 stonedwarf5.net, 1 stonedworms.de, 0 stoneedgeconcrete.com, 1 @@ -138563,6 +138678,7 @@ stopransomware.gov, 1 stoprat.fr, 1 stopsafeguardingnow.org.uk, 1 +stopscams.com, 1 stopshopnyeremeny.hu, 1 stopsmoke.gq, 1 stopssherdenking.tk, 1 @@ -138570,10 +138686,8 @@ stopthemoss.com, 1 stoptheperio.com, 1 stopthethyroidmadness.com, 1 -stopthinkconnect.jp, 1 stopves.tk, 1 stor-guard.com, 1 -storables.com, 1 storage-base.de, 1 storage-books.gq, 1 storageideas.uk, 1 @@ -138582,7 +138696,6 @@ storck.com, 1 stordbatlag.no, 1 store-en-stock.com, 1 -store10.de, 0 store71.it, 1 storeandforward.email, 1 storeandforward.eu, 1 @@ -138609,7 +138722,6 @@ storeplus.ml, 1 storesonline.fr, 1 storestdigital.com, 1 -storewebshop.com, 1 storex.storage, 1 storgaarddieu.com, 1 storiadellarte.com, 1 @@ -138705,6 +138817,7 @@ stpaulcatholicchurcheastnorriton.net, 1 stpaulsbullville.org, 1 stpaulschambers.com, 1 +stpaulsfeedback.com, 1 stpe.co, 1 stperseo.tk, 1 stpeterparishva.org, 1 @@ -138782,7 +138895,7 @@ strasserhaustechnik.de, 1 strasweb.fr, 1 stratagemlabs.tech, 1 -stratahealth.com, 1 +stratahealth.com, 0 stratcat.com, 1 stratebi.com, 1 strategery.io, 1 @@ -138803,13 +138916,11 @@ strategysystems.com, 1 stratekispiel.at, 1 stratexonline.com, 1 -stratford.ac.uk, 0 stratfordct.gov, 1 stratfordnh.gov, 1 stratfordwi.gov, 1 stratforge.com, 1 strathspeycrown.com, 1 -stratiacyber.com, 1 stratible.com, 1 stratik.com.co, 1 stratinator.com, 1 @@ -138880,12 +138991,14 @@ streamgifter.com, 1 streamgoalandres.ml, 1 streamion.city, 1 +streamiptv8k.com, 1 streamkino.cz, 1 streamline.enterprises, 1 streamlinedprocesses.com, 1 streamliner.fr, 1 streamlineverify.com, 1 streammasterpro.com, 1 +streammaxx.net, 1 streammusic.cz, 1 streamnetlibrary.org, 1 streamnetwork.cz, 1 @@ -138901,6 +139014,7 @@ streamusic.cz, 1 streamvi.com, 1 streamvideo.cz, 1 +streamwizard.de, 1 streamz.be, 1 streamzilla.com, 1 streathamfoodfestival.com, 1 @@ -138957,6 +139071,7 @@ stressfreeprobate.com, 1 stressfrei-marceva.de, 1 streszczenia.pl, 1 +strettch.com, 1 strettonreserve.com.au, 1 strettoweb.com, 1 strgco.com, 1 @@ -139121,7 +139236,6 @@ stubbmail.de, 1 stubentiga.de, 1 stuc-groep.nl, 1 -stuccorepairrenonv.com, 1 stuckateur-weber.de, 1 stucki-bagger.ch, 1 stucki-sanitaer.ch, 1 @@ -139156,6 +139270,7 @@ studentquickpay.com, 1 studentrobotics.org, 1 students4sports.org, 1 +studentsamfunnet.no, 1 studentscodecamp.com, 1 studentse.fr, 1 studentsfirstnb.com, 1 @@ -139238,10 +139353,12 @@ studiopirrate.com, 1 studiopoen.com.br, 1 studiorachunkowe.pl, 1 +studiosaulnier.synology.me, 1 studioshiftup.net, 1 studiosql.ml, 1 studiostawki.com, 1 studiostudio.net, 1 +studiosubtelnosci.pl, 1 studiosuracidenunzio.it, 1 studiotmb.com, 1 studiovaud.com, 0 @@ -139422,6 +139539,7 @@ subdivider.tk, 1 subestan.tk, 1 subgirl.ga, 1 +subgoal.gg, 1 subhamchettinadtx.com, 1 subiblia.com, 1 subic.ga, 1 @@ -139455,7 +139573,6 @@ subscriptionplus.uk, 1 subserv.tk, 1 subsidioalempleo.cl, 1 -subsistence.wiki, 1 subsistencematters.net, 1 subsitude.tk, 1 subsoft.tk, 1 @@ -139496,7 +139613,6 @@ successminds.com, 1 successrice.com, 1 successwizard.com, 1 -succmy.wang, 1 succorfish.net, 1 succubus.me, 1 succubus.network, 1 @@ -139528,11 +139644,11 @@ sudaraka.org, 0 suddenlysavvy.com, 1 sudeleycastle.co.uk, 1 -sudetytour.cz, 1 sudoash.com, 1 sudocat.me, 1 sudoku-insight.tk, 1 sudoku.org.ua, 1 +sudokuaday.com, 1 sudokuenlinea.com, 1 sudosaveclimate.com, 1 sudoschool.com, 1 @@ -139661,7 +139777,6 @@ sullivancontractingct.com, 1 sullivancountypa.gov, 1 sulman4paf.tk, 1 -sulminastv.com.br, 1 sulphurspringsar.gov, 1 sultanrecords.com, 1 sultans.tk, 1 @@ -139733,9 +139848,8 @@ summerschoolcybersecurity.org, 1 summersummit.eu, 1 summing.ga, 1 -summit-group.com, 1 summit-research.org, 1 -summit-smile.com, 1 +summit-smile.com, 0 summit7.media, 1 summitcountyboe.gov, 1 summitcustomsbrokers.com, 1 @@ -139810,7 +139924,6 @@ sundeskole.no, 0 sundhedsdatastyrelsen.dk, 1 sundhedsvejen.dk, 1 -sundialpowdercoating.com, 1 sundiel.tk, 1 sundown.fr, 1 sundylinks.com, 1 @@ -139828,7 +139941,6 @@ sungem.nl, 1 sunglassstyle.co.nz, 1 sungoldsolar.com, 1 -sungreen.info, 1 sunhaoxiang.net, 1 sunho.net.tw, 1 sunioso.com, 1 @@ -139926,7 +140038,6 @@ suomiheraa.com, 1 suomika.pl, 1 suonet.org, 1 -suourl.com, 0 sup-net.de, 1 supa.sexy, 1 supabase.com, 1 @@ -140054,7 +140165,6 @@ superiorseamlessinc.com, 1 superiorvision.com, 1 superiorwi.gov, 1 -superiptv.pro, 1 superis.eu, 1 superit.com.br, 1 superjuf.com, 1 @@ -140165,6 +140275,7 @@ supportivecare.org, 1 supportlafd.org, 1 supportme123.com, 0 +supportmydream.net, 1 supportrelatecare.org, 1 supportsave.com, 1 supportyourapp.com, 1 @@ -140182,6 +140293,7 @@ supreme.com.br, 1 supremecarnage.de, 1 suprememale.tk, 1 +suprfi.com, 1 suprintbot.xyz, 0 supriville.com.br, 1 supropionegocio.tk, 1 @@ -140216,6 +140328,7 @@ surfduck.xyz, 1 surfenergy.tk, 1 surfersconnect.net, 1 +surfersparadisepersonaltrainers.com, 1 surfingshare.com, 0 surfkath.de, 1 surflessonslisbon.com, 1 @@ -140231,7 +140344,6 @@ surgicalassociates.sg, 1 surgicalassociateswny.com, 0 surgicalresourcesgroup.com, 1 -surgispa.net, 1 surgoinsvilletn.gov, 1 surialternat.tk, 1 surik.de, 1 @@ -140255,7 +140367,6 @@ surprisepubliclibrary.gov, 1 surpriz-net.tk, 1 surrattlegal.com, 1 -surrealdb.com, 1 surrealistas.tk, 1 surreyandsussex.nhs.uk, 1 surreycyclingclub.co.uk, 1 @@ -140370,6 +140481,7 @@ suwanya.cn, 1 suwcountyfl.gov, 1 suwebcreativa.com, 1 +suyool.com, 1 suzanne.soy, 1 suzannejauchius.com, 1 suzansalem.nl, 1 @@ -140446,6 +140558,7 @@ svenmuller.com, 1 svenmuller.nl, 1 svenska.events, 1 +svenskafederationer.se, 1 svenskakyrkansunga.tk, 1 svenskamassan.se, 1 svenskapsalmer.se, 1 @@ -140518,6 +140631,7 @@ svsewerut.gov, 1 svsg.co, 1 svswebmarketing.com, 1 +svtemplemn.org, 1 svtl.ch, 1 svtr.de, 1 svtv.org, 1 @@ -140624,6 +140738,7 @@ sweeteleven.tk, 1 sweetgood.de, 1 sweetgracemarket.com, 1 +sweethawk.com, 1 sweethearts.tk, 1 sweetheartvideo.com, 1 sweethomesnohomishrenovations.com, 1 @@ -140632,6 +140747,7 @@ sweetlegs.jp, 1 sweetloaded.com, 1 sweetlycakes.com, 1 +sweetmecreamery.com, 1 sweetnest.com, 1 sweetparis.cf, 1 sweetpinkpussy.org, 1 @@ -140660,7 +140776,7 @@ swhw.io, 1 swi.sytes.net, 1 swid.co.uk, 1 -swiezastrona.pl, 1 +swiezastrona.pl, 0 swift-cut.com, 1 swift-cut.de, 1 swift-devedge.de, 1 @@ -140676,7 +140792,6 @@ swiftcrypto.com, 1 swifteh.net, 1 swifteq.com, 1 -swiftfactory.io, 1 swiftgram.ml, 1 swiftirc.net, 1 swiftmod.net, 1 @@ -140731,7 +140846,7 @@ swiss404.net, 1 swissaquashop.ch, 1 swissbearfoodservices.com, 0 -swissbit.com, 1 +swissbit.com, 0 swissborg.com, 1 swisscannabis.club, 1 swisschat.tk, 1 @@ -140742,7 +140857,7 @@ swissfreshaircan.ch, 0 swissfreshaircan.com, 0 swissgarden.com, 1 -swissgrid.ch, 0 +swissgrid.ch, 1 swisshex.ch, 1 swisshex.net, 1 swisshub.io, 1 @@ -140752,6 +140867,7 @@ swissmodular.com, 1 swissneutral.net, 1 swissnoso.ch, 1 +swisspremiumdairy.com, 1 swissquawk.ch, 1 swisstechmap.ch, 1 swisstranslate.ch, 0 @@ -140913,7 +141029,6 @@ symbols.gov, 1 symcare.com.au, 0 symend.com, 0 -symeonchen.com, 1 symetri.co.uk, 1 symetri.com, 1 symetri.dk, 1 @@ -140934,12 +141049,12 @@ sympa-by.eu, 1 sympatent.com, 1 symphonyai.com, 1 +symplelending.com, 1 sympletrade.com, 1 symplexia.com.br, 1 symplicit.com.au, 1 symplyos.tk, 1 sympmarc.com, 1 -symposit.com, 0 symptome-erklaert.de, 1 syna.dev, 1 syna.site, 1 @@ -140964,6 +141079,7 @@ syncpdi.com, 1 syncplay.pl, 1 syncresis.com, 1 +syncrolab.es, 1 syncsci.com, 1 syncspace.live, 1 synctera.com, 1 @@ -140984,12 +141100,13 @@ synergytherm.com, 1 synergyzone.tk, 1 synerio.com, 1 +synerionagile.com, 1 +synerionenterprise.com, 1 synetiq.co.uk, 1 synfrait.com, 1 synitsa.tk, 1 synony.me, 1 synonym24.at, 1 -synoptek.com, 1 synotna.eu, 1 synoviasolutions.com, 1 synrelay.com, 1 @@ -141035,6 +141152,7 @@ syrianair.ga, 1 syrianair.ml, 1 syrianet.cf, 1 +syriansharks.com, 1 syrianskaif.com, 1 syrius.tk, 1 syronex.com, 1 @@ -141057,12 +141175,12 @@ syscaponline.co.uk, 1 sysco.biz, 1 syscom.be, 1 +syscomnext.com, 1 sysconautomation.com, 1 syscoon.com, 1 sysctl.se, 1 syscurve.com, 1 sysdb.io, 1 -sysdig.com, 1 syselg.com, 1 sysert.tv, 0 sysfreight.com, 1 @@ -141145,7 +141263,6 @@ szabadpingvin.eu, 1 szablinski.pl, 1 szadeczky.com, 1 -szafadziecka.com.pl, 1 szafkirtv.pl, 1 szakszervezet.work, 1 szalaiterko.hu, 1 @@ -141183,6 +141300,7 @@ szmidtinwest.pl, 1 szotkowski.fun, 1 szotkowski.info, 1 +szotkowski.online, 1 szotkowski.tech, 1 szpalskimd.com, 1 szpet.jp, 1 @@ -141203,6 +141321,8 @@ szw-hessen.de, 1 szwrc.co, 1 szww99.cc, 1 +szybakominkowa.pl, 1 +szybka.pl, 1 szybkaekipa.pl, 1 szybkiebieganie.pl, 1 szymczak.at, 1 @@ -141247,12 +141367,11 @@ t12u.com, 1 t1cloud.com, 1 t1f.ru, 1 +t1movie.com, 1 t2-sit-test.tk, 0 t2000headphones.com, 1 t2000laserpointers.com, 1 t22.uk, 1 -t23a.eu, 1 -t2informatik.de, 1 t33.eu, 1 t36533.com, 1 t3concrete.my, 1 @@ -141269,7 +141388,6 @@ t5118.com, 1 t51365.com, 1 t5197.co, 1 -t630.nl, 1 t666.com, 1 t6729.co, 1 t6957.co, 1 @@ -141337,6 +141455,7 @@ tabegamisama.com, 1 tabelaci.tk, 1 tabelaofert.pl, 1 +tabelazdrowia.pl, 1 tabelekaloryczne.waw.pl, 1 tabella.fi, 1 taberna.tk, 1 @@ -141369,11 +141488,13 @@ tablethype.de, 1 tabletkinamase.ga, 1 tabletkinatradzik.ga, 1 +tabletoplocal.com, 1 tabletopmachine.com, 1 tabletopmachines.com, 1 tabletopwealth.reviews, 0 tabletopworkshop.com, 1 tablettes-tactiles.tk, 1 +tablouricartoon.ro, 1 taboomale.com, 1 tabordaadvogados.ga, 1 taborsky.cz, 1 @@ -141389,7 +141510,6 @@ tac-performance.net, 1 tac-sys.net, 1 tacay.co, 1 -tachikawa-saisyuusyou.com, 1 tachonetbg.com, 1 tachoplus.pl, 1 tachoplusweb.com, 1 @@ -141411,7 +141531,6 @@ taconic.com, 1 tacoroumen.nl, 1 tacotown.tk, 1 -tacti.cc, 1 tacticalavocado.com, 1 tacticalsquare.com, 1 tacticalvote.co.uk, 1 @@ -141424,6 +141543,7 @@ tadalafilindia.gq, 1 tadashiku.jp, 1 tadaweb.com, 1 +tadawulstocks.com, 1 tadj-mahalat.com, 1 tadjiki.tk, 1 tadjikistan.tk, 1 @@ -141463,6 +141583,7 @@ tagg.is, 1 taggeru.com, 1 taggigkaktus.tk, 1 +taggley.com, 1 taghit.tk, 1 tagid.ga, 1 tagid.tk, 1 @@ -141482,6 +141603,7 @@ taguette.fr, 1 tagungsstaette-usedom.de, 0 tagungsstaette-zinnowitz.de, 0 +tahacinkilic.com, 1 tahaluf.ai, 1 tahaonline.tk, 1 tahcardealers.com, 1 @@ -141541,7 +141663,6 @@ taiwaniha.org.tw, 1 taiwanprize.com, 1 taiwantechtrek.tk, 1 -taiwantour.info, 0 taiway.com, 1 taiyo-eg.com, 1 taj-portal.tk, 1 @@ -141556,6 +141677,7 @@ tajniy-smisl.ml, 1 tajniy-smisl.tk, 1 tajnyodtah.sk, 1 +tajra.store, 1 tajrobe.wiki, 1 tajtowereg.com, 1 tak.gov, 1 @@ -141590,7 +141712,7 @@ takememoriesleavefootprints.com, 1 takemetomontpellier.fr, 1 taken.cf, 1 -taken.pl, 1 +taken.pl, 0 takenote.co, 1 takenouchi-dc.com, 1 takenouchi-perio.com, 1 @@ -141612,8 +141734,6 @@ takipcikutusu.com, 1 takipcisihir.com, 1 takiplekazan.ga, 1 -takito.net, 1 -takiwaku.com, 1 takk.pl, 1 takkaaaaa.com, 1 takkguitar.net, 1 @@ -141638,7 +141758,6 @@ talalaok.gov, 1 talarislog.com, 1 talbottimber.co.uk, 1 -talcualdigital.com, 1 taldia.es, 1 taleatherworks.com, 1 talendipank.ee, 1 @@ -141730,9 +141849,9 @@ talos-staging.io, 1 talosquant.com, 1 talpurwadalions.tk, 1 -taltech.ee, 1 +talqo.ai, 1 +taltech.ee, 0 talusan.tk, 1 -talxis.com, 1 tam-moon.com, 1 tam-safe.com, 1 tam7t.com, 0 @@ -141839,7 +141958,6 @@ tangipahoa.gov, 1 tanglepatterns.com, 1 tango-cats.de, 1 -tango-networks.com, 0 tango-querida.tk, 1 tango.berlin, 1 tango.info, 1 @@ -141873,7 +141991,6 @@ tankos.tk, 1 tankpassen-vergelijken.nl, 1 tanks.je, 1 -tankski.co.uk, 0 tanming.com.my, 1 tanned.tk, 1 tanner.sh, 1 @@ -141955,7 +142072,6 @@ tapquad.com, 1 taprix.org, 1 taproot.com, 1 -tapsandtables.net, 1 tapstertastingroom.com, 1 taquilla.com, 1 taqun.club, 1 @@ -142066,7 +142182,6 @@ taskhorizon.audio, 1 taskido.pl, 1 taskin.me, 1 -taskmo.de, 1 taskotron.fedoraproject.org, 1 taskotron.stg.fedoraproject.org, 1 taskrunnr.com, 1 @@ -142160,7 +142275,6 @@ taubenweiss.eu, 1 taubenweiss.net, 1 taubin.cc, 1 -tauedu.org, 1 taufers.info, 1 taufiqzainal.com, 1 tauntonme.org.uk, 1 @@ -142295,7 +142409,6 @@ taylormadesoft.com, 1 taylorruhland.com, 1 taylors-castles.co.uk, 1 -taylorshillsamoan.org, 1 taylorstauss.com, 1 taysiz.ir, 1 taytaytiangge.ph, 1 @@ -142488,7 +142601,7 @@ teachwithouttears.com, 1 teacuppersiancats.com, 1 teacupyorkiespets.com, 1 -teagardenspa.com, 1 +teagardenspa.com, 0 teaguepdtx.gov, 1 teahawaii.ga, 1 teahouse.gq, 1 @@ -142536,6 +142649,7 @@ teambranch.io, 1 teamceleris.com, 1 teamcg.ru, 1 +teamclarity.ai, 1 teamclean.bg, 1 teamcoco.com, 1 teamcode.tk, 1 @@ -142587,40 +142701,7 @@ teams.microsoft.us, 1 teamsakura.net, 1 teamsass.ca, 1 -teamsecure.al, 1 -teamsecure.at, 1 -teamsecure.be, 1 -teamsecure.bg, 1 -teamsecure.ch, 1 -teamsecure.co.il, 1 -teamsecure.co.uk, 1 -teamsecure.com.ua, 1 -teamsecure.cz, 1 -teamsecure.de, 1 -teamsecure.dk, 1 -teamsecure.ee, 1 -teamsecure.es, 1 -teamsecure.fi, 1 -teamsecure.fr, 1 -teamsecure.gr, 1 -teamsecure.hu, 1 -teamsecure.io, 1 teamsecure.is, 1 -teamsecure.it, 1 -teamsecure.li, 1 -teamsecure.lt, 1 -teamsecure.lu, 1 -teamsecure.lv, 1 -teamsecure.md, 1 -teamsecure.me, 1 -teamsecure.mk, 1 -teamsecure.pl, 1 -teamsecure.pt, 1 -teamsecure.ro, 1 -teamsecure.rs, 1 -teamsecure.se, 1 -teamsecure.si, 1 -teamsecure.sk, 1 teamsherry.realtor, 1 teamshirts.at, 1 teamshirts.be, 1 @@ -142660,6 +142741,7 @@ teamwolf.tk, 1 teamwork-bad-wurzach.de, 1 teamworld.blog, 1 +teamx.agency, 1 teaparty.id, 1 teapiraeus.gr, 1 teara.govt.nz, 1 @@ -142733,7 +142815,6 @@ tech4founders.co, 1 tech4greece.gr, 1 tech506.com, 1 -techaachen.de, 1 techangel.tk, 1 techanit.de, 1 techarab.ga, 1 @@ -142776,7 +142857,6 @@ techdocscove.xyz, 1 techdoms.tk, 1 techdracula.com, 1 -techeasyblog.com, 1 teched-creations.com, 1 techexeter.uk, 1 techexpert.tips, 1 @@ -142828,6 +142908,7 @@ techland.net, 1 techlearningcollective.com, 1 techlevel.org, 1 +techli.si, 1 techlit.pk, 1 techlovers.com, 1 techlr.de, 1 @@ -142864,7 +142945,6 @@ technician.academy, 1 technician.cn, 1 technicus.nl, 1 -technicv.com, 1 technikerle.at, 1 technikforum-backnang.de, 1 technikoma.com, 1 @@ -142961,33 +143041,6 @@ techopr.com, 1 techpartes.com.br, 1 techpartneralliance.com, 1 -techpeer.al, 1 -techpeer.at, 1 -techpeer.be, 1 -techpeer.bg, 1 -techpeer.ch, 1 -techpeer.co.uk, 1 -techpeer.cz, 1 -techpeer.de, 1 -techpeer.dk, 1 -techpeer.ee, 1 -techpeer.es, 1 -techpeer.eu, 1 -techpeer.fr, 1 -techpeer.hu, 1 -techpeer.lt, 1 -techpeer.lu, 1 -techpeer.lv, 1 -techpeer.md, 1 -techpeer.me, 1 -techpeer.nl, 1 -techpeer.pl, 1 -techpeer.pt, 1 -techpeer.ro, 1 -techpeer.rs, 1 -techpeer.se, 1 -techpeer.si, 1 -techpeer.sk, 1 techpilipinas.com, 1 techpoint.org, 0 techpp.com, 1 @@ -143010,7 +143063,6 @@ techshift.se, 1 techshout.com, 1 techsite.tk, 1 -techsolus.io, 1 techsolvency.com, 1 techsoup.net.nz, 1 techstation.co.il, 1 @@ -143117,9 +143169,9 @@ teddyss.com, 0 teddywayne.com, 1 teddywp.com, 1 -tedgautsch.com, 1 tedhardy.com, 1 tedirgin.tk, 1 +tedpac.xyz, 1 tedroche.com, 1 tedscoffeecompany.com, 1 tedsdivingsystem.com, 1 @@ -143162,7 +143214,6 @@ teenslesbian.com, 1 teenslikeitbig.com, 1 teenslovehugecocks.com, 1 -teentinytits.com, 1 teenusernames.com, 1 teenviet.ga, 1 teenwebcams.ml, 1 @@ -143224,9 +143275,9 @@ tejasnetworks.com, 1 tejo.tk, 1 tejomaya.net, 1 -tek-el.ru, 1 teka.ro, 1 tekanswer.com, 1 +tekenkaart.nl, 1 tekila.cf, 1 tekila.ga, 1 tekila.tk, 1 @@ -143237,6 +143288,7 @@ tekme.pt, 1 teknashop.com, 1 teknik-sipil.tk, 1 +teknikaldomain.me, 1 teknikhjalpen.ax, 1 tekniksnack.se, 1 tekniksomine.com.tr, 1 @@ -143247,12 +143299,13 @@ teknoharekat.com, 1 teknokanguru.com.tr, 1 teknoleet.com, 1 +teknologipendidikan.biz.id, 1 +teknologipendidikan.id, 1 teknologipendidikan.or.id, 1 teknomarko.com, 0 teknon.tk, 1 teknoparkistanbul.com.tr, 1 teknorix.com, 1 -teknoscienze.com, 1 teknow.tk, 1 teknozilla.com.tr, 1 teko.se, 1 @@ -143309,9 +143362,8 @@ telecharger-winrar.com, 1 telechirkut.xyz, 1 telechnics.com.au, 1 -telecinesound.it, 1 +telecinesound.it, 0 teleclaro.com, 1 -teleclases.com, 1 telecom-sudparis.eu, 1 telecomarmenia.am, 1 telecommande-express.com, 1 @@ -143358,7 +143410,6 @@ telenovelas-france.tk, 1 telent.com, 1 teleogistic.net, 1 -teleoposiciones.es, 1 telepati.info, 1 telephonedirectories.us, 1 telephoni-cdma.tk, 1 @@ -143373,7 +143424,6 @@ teleradio.ga, 1 teleradio.tk, 1 teleroute.com, 0 -telesales.guru, 1 teleshkronja.ml, 1 teleshop.be, 1 teleskell.org, 1 @@ -143453,7 +143503,6 @@ temis.nl, 1 temizim.com, 1 temizlik.ml, 1 -temizmama.com, 1 teml.in, 1 temnacepel.cz, 1 temnikova.tk, 1 @@ -143531,6 +143580,7 @@ tender.run, 1 tendermint.com, 1 tenderned.nl, 1 +tenderradar.nl, 1 tenderwizard.com, 1 tendiris.ga, 1 tendmed.com.br, 1 @@ -143588,6 +143638,7 @@ tenshokudo.com, 1 tenshokufair.jp, 1 tensor.trade, 0 +tensure.io, 1 tent.io, 1 tentacle.monster, 1 tentacle.net, 1 @@ -143600,14 +143651,12 @@ tentinger.co, 1 tentou.com, 1 tentrentals.com, 1 -tentries.com, 1 tentsforsale.com, 1 tenue-traditionnelle.fr, 1 tenyx.de, 1 tenzan.com, 1 tenzer.dk, 1 tenzorpro.com, 0 -teoassessoria.com.br, 1 teoitaly.com, 1 teoletextsq.tk, 1 teolino.eu, 1 @@ -143760,7 +143809,6 @@ terraweb.net, 1 terrax.net, 1 terrelltx.gov, 1 -terremetisagency.com, 1 terremoto.com.br, 1 terrenal.tk, 1 terrenasparadise.com, 1 @@ -143830,6 +143878,7 @@ test-textbooks.com, 1 test-verz.online, 1 test.de, 1 +test.sn, 1 test.support, 1 test1-isrewards.com, 1 test1974.nl, 1 @@ -143939,7 +143988,6 @@ tetramax.eu, 1 tetrapak.com, 1 tetrimus.com, 1 -tetryyn.com, 1 tetsumaki.net, 1 tetweb.ir, 1 teu-fel.com, 1 @@ -144046,6 +144094,7 @@ tezcam.tk, 1 tezfab.com, 1 teztarama.com, 1 +tf-amd.com.my, 1 tf-network.de, 1 tf2b.com, 1 tf2calculator.com, 1 @@ -144084,6 +144133,7 @@ tfx.com.br, 1 tfxstartup.com, 1 tfxstartup.com.br, 1 +tfyou.co, 1 tfyre.co.za, 1 tg-servce-timesheet.azurewebsites.net, 1 tg.pe, 1 @@ -144091,7 +144141,6 @@ tgb.org.uk, 1 tgcfabian.nl, 1 tgcgrain.com, 1 -tgchambers.com, 1 tgexport.eu, 1 tghez.net, 1 tglbbs.com, 0 @@ -144150,7 +144199,6 @@ thais.tk, 1 thaislots.online, 1 thaisurveys.com, 1 -thaitonic.de, 1 thaiunion.com, 1 thaiwatsadu.com, 1 thaiwrestling.tk, 1 @@ -144209,6 +144257,7 @@ the-allmighty-mike.tk, 1 the-archive.io, 1 the-archive.ml, 1 +the-asset.de, 1 the-azad.com, 1 the-big-bang-theory.com, 1 the-brandidentity.com, 1 @@ -144262,6 +144311,7 @@ the7eye.org.il, 1 the8rules.co.uk, 1 thea-team.net, 1 +theacademicpapers.co.uk, 1 theacc.com, 1 theaccountant-online.com, 1 theaccountingcompanyleeds.co.uk, 1 @@ -144285,7 +144335,6 @@ theajwatson.com, 1 thealbionrooms.live, 1 thealchemistatelier.com, 1 -thealeph.com, 1 theallmanteam.com, 0 thealmoners.com, 1 thealonas.cf, 1 @@ -144293,7 +144342,6 @@ thealonas.gq, 1 thealonas.ml, 1 thealonas.tk, 1 -thealtaconferences.com, 1 theamandatappingclub.tk, 1 theamandatappingcontest.tk, 1 theamegroup.com, 1 @@ -144373,10 +144421,12 @@ thebasicstudio.com, 1 thebatesstudent.com, 1 thebathroomexchange.ga, 1 +thebatt.com, 1 thebaytalland.com, 1 thebcm.co.uk, 1 thebeatyard.nl, 0 thebeautifuledge.com, 1 +thebeautyofmilk.com, 1 thebeautyqueen.tk, 1 thebedfordcitizen.org, 1 thebeef.info, 1 @@ -144431,7 +144481,7 @@ theblogstarter.com, 1 theblondeabroad.com, 0 theblue.tk, 1 -theblueprint.global, 1 +thebluebanner.net, 1 thebluered.net, 0 theblueroofcottage.ca, 1 thebluewindowdesigns.com, 1 @@ -144521,12 +144571,12 @@ thecelticfiles.tk, 1 thecentraltrend.com, 1 theceocollective.com, 1 -thecfef.org, 1 thechaikinreport.com, 1 thechallenge.fit, 1 thechannels.org, 1 thechatlinenumbers.com, 1 thechavs.xyz, 1 +thecheapairlinetickets.com, 1 thecheat.tk, 1 thecheese.co.nz, 1 thechels.uk, 1 @@ -144577,6 +144627,7 @@ thecostymusic.tk, 1 thecotsworth.com, 1 thecougarpress.org, 1 +thecouplesroom.com, 1 thecoverlot.com, 1 thecovky.gov, 1 thecowboy.cafe, 1 @@ -144667,11 +144718,13 @@ thedroneely.com, 1 thedronevortex.com, 1 theduchessbudapest.com, 1 +thedumpsterrentaltoday.com, 1 thedysfunctionalangel.cf, 1 thedysfunctionalangel.ga, 1 thedysfunctionalangel.gq, 1 thedysfunctionalangel.ml, 1 theeagle.com, 1 +theeastcoastkitchen.com, 1 theebookkeepers.co.za, 1 theeducatoronline.com, 1 theeffingyogablog.com, 1 @@ -144683,7 +144736,6 @@ theeldritchhounds.gq, 1 theeldritchhounds.ml, 1 theelephant.info, 1 -theeliteneet.com, 1 theemeraldmagazine.com, 1 theemployeeapp.com, 1 theemploymentnetworkcla.com, 1 @@ -144693,7 +144745,6 @@ theepicstorm.com, 1 theescapegame.com, 0 theestatesatstgeorge.com, 1 -theesuhlmann.de, 1 theeuropeanlibrary.org, 1 theevergreen.me, 0 theeverydayprepper.com, 1 @@ -144743,6 +144794,7 @@ thefoodieblogger.com, 1 thefoot.tk, 1 theforbiddenfruitbar.co.uk, 1 +thefordhamram.com, 1 theforkedspoon.com, 1 thefountain.eu, 1 thefox.com.fr, 1 @@ -144845,6 +144897,7 @@ theguerrilla.agency, 0 thegungrabber.ca, 1 thegungrabber.com, 1 +theguttercenter.com, 1 thegvoffice.net, 1 thegymnasium.com, 0 thegypsythread.org, 1 @@ -144881,6 +144934,7 @@ thehinhonline.com.vn, 1 thehivedesign.org, 1 thehoff.ddnss.de, 1 +thehofstrachronicle.com, 1 thehollandfam.com, 0 theholloways.tk, 1 thehomeassignment.com, 1 @@ -144937,6 +144991,7 @@ theislandwellness.com, 1 theissen.io, 1 theisthelpline.com, 1 +theithacan.org, 1 theixiangrand.gr, 1 thejacksoninstitute.com.au, 1 thejakartapost.com, 1 @@ -144970,7 +145025,6 @@ theknowitguy.com, 0 thekochampionship.com, 1 thekodaichronicle.com, 1 -thekolye.com, 1 thekonsulthub.tk, 1 thekuwayama.net, 1 thelakedistrict.tk, 1 @@ -145031,7 +145085,6 @@ thelordofthewing.gq, 1 thelordofthewing.ml, 1 thelordsofthefallen.com, 1 -thelosangelesconservative.com, 1 thelounge.chat, 1 theloveequation.com, 1 theloves.com, 1 @@ -145098,6 +145151,11 @@ themissionman.com, 1 themizellbrothers.tk, 1 themlmsuccessnow.tk, 1 +themo.app, 1 +themo.dev, 1 +themo.group, 1 +themo.host, 1 +themo.studio, 1 themobileinterview.com, 1 themodel.ie, 1 themodernreviewer.ga, 1 @@ -145119,6 +145177,7 @@ themsuspokesman.com, 1 themtwashingtongroup.com, 1 themusecollaborative.org, 1 +themuseexperience.nl, 1 themusicofchrisbulman.tk, 1 themusicthatnobodylikes.tk, 1 themusicuk.com, 1 @@ -145160,8 +145219,6 @@ thenorthwindonline.com, 1 thenowheremen.com, 1 thenrdhrd.nl, 1 -thenudge.com, 1 -thenutritionalreset.ca, 0 thenviews.com, 1 theo.agency, 0 theo.me, 1 @@ -145173,6 +145230,7 @@ theobmcircle.com, 1 theobromos.fr, 0 theoc4ever.tk, 1 +theoceaned.com, 1 theocharis.org, 1 theocjournal.tk, 1 theocoffee.com, 0 @@ -145244,7 +145302,6 @@ theparticipants.tk, 1 thepartner.co.uk, 1 thepartydoctors.co.uk, 1 -thepassiveplan.com, 1 thepathsofdiscovery.com, 1 thepaul.tk, 1 thepavilionbanbury.co.uk, 0 @@ -145301,6 +145358,7 @@ theportlandinnproject.com, 1 thepostflow.com, 1 thepowerboys.tk, 1 +thepowerdistrict.com, 1 theprairienews.com, 1 thepreachersportal.org, 1 thepressroom.com, 1 @@ -145311,6 +145369,7 @@ theprimegroup.ca, 1 theprimepr.in, 1 theprinceshort.tk, 1 +theprivacy.com.br, 1 theprivacysolution.com, 1 theprivatetherapyclinic.co.uk, 1 theprodigaljournal.com, 1 @@ -145321,7 +145380,7 @@ thepromenadeshopsatsauconvalley.com, 1 theprospectordaily.com, 1 theprowlernews.org, 1 -thepsi.com, 1 +thepsi.com, 0 theptclist.tk, 1 thepuffprof.com, 1 thepulicegroup.com, 1 @@ -145329,6 +145388,7 @@ thepuppetdolls.tk, 1 thepureplan.com, 1 thepurplechickens.tk, 1 +thepursuitfitnesswi.com, 1 thepuzzles.eu.org, 1 thepyre.tk, 1 thepyrographytool.com, 1 @@ -145456,11 +145516,11 @@ thesage.cf, 1 thesage.ga, 1 thesagresapartments.com, 1 +thesandb.com, 1 thesarogroup.com, 1 thesashcompany.com.au, 1 thesatriantoshow.tk, 1 thesaturdaypaper.com.au, 1 -thesaunalife.com, 1 thescarlet.org, 1 thesceneawards.com, 1 thescienceofdeduction.tk, 1 @@ -145479,6 +145539,7 @@ thesemisouthernhomemaker.com, 1 theseoframework.com, 1 theseosystem.com, 1 +theserenenook.com, 1 theserpent.tk, 1 theserver.ml, 1 theserver201.tk, 1 @@ -145496,6 +145557,7 @@ theshots.cz, 1 thesigit.tk, 1 thesignacademy.co.uk, 1 +thesignpostwsu.com, 1 thesilentfew.tk, 1 thesilentlink.org, 1 thesilentplanet.tk, 1 @@ -145521,6 +145583,7 @@ theslotz.com, 1 theslotz1.co, 1 theslotz1.uk, 1 +theslowtravelplanner.com, 1 thesmartconsumer.com, 1 thesmexperiences.com, 1 thesocialcopywriter.com, 1 @@ -145545,6 +145608,7 @@ thestandards.tk, 1 thestatementjewelry.com, 1 thestellahouse.com, 1 +thestinkingship.com, 1 thestockoasis.com, 1 thestonestudio.in, 1 thestopoff.tk, 1 @@ -145566,10 +145630,12 @@ thesugargirls.com, 1 thesultans.tk, 1 thesunflower.com, 1 +thesuntease.com, 1 thesupersunday.tk, 1 thesuppercircle.com, 1 thesupportplatform.org.uk, 1 thesurgeons.sg, 1 +thesustainabilityalliance.us, 1 theswanstation.tk, 1 theswanwindsor.co.uk, 1 theswissbay.ch, 0 @@ -145612,11 +145678,11 @@ thetrafficgeek.com, 1 thetravel.com, 1 thetravelczar.com, 1 +thetravelerspersona.com, 1 thetravelhack.com, 0 thetravelingbudget.com, 1 thetravelshop.com, 1 thetravelstylist.nl, 1 -thetreeradio.com, 1 thetrendspotter.net, 1 thetropics.tk, 1 thetrulycharming.com, 0 @@ -145686,6 +145752,7 @@ thewarwhoop.com, 1 thewatchdog.com.br, 1 thewaterfrontpoole.com, 1 +thewaternerd.com, 1 thewave.tk, 1 thewaxhouse.academy, 1 thewayofislam.ml, 1 @@ -145823,6 +145890,7 @@ thingsivesaid.com, 1 thingsof.org, 1 thingswithleaves.co.uk, 1 +thingvaktin.is, 1 think-ai.eu, 1 think-positive-watches.de, 1 think.law, 1 @@ -145830,6 +145898,7 @@ thinkbigjesse.com, 1 thinkbot.de, 1 thinkbrands.co.uk, 1 +thinkcapital.com, 1 thinkcash.nl, 1 thinkchina.sg, 1 thinkcogency.com, 1 @@ -145848,6 +145917,8 @@ thinkingnull.com, 0 thinkittech.com, 1 thinklogistics.com, 1 +thinkmarkets.asia, 1 +thinkmarkets.com, 1 thinko.it, 1 thinkoffer.com, 1 thinkon.com, 1 @@ -145879,7 +145950,6 @@ thisdayinhockey.tk, 1 thisdot.site, 1 thisfreelife.gov, 1 -thishousedoesnotexist.org, 1 thisis.id, 1 thisisacompletetest.ga, 1 thisisamericansoccer.com, 1 @@ -145907,7 +145977,6 @@ thiswasntinthebrochure.wtf, 1 thisyear.jp, 1 thitat.net, 1 -thitruongsi.com, 1 thl.com, 1 thlautogarage.nl, 1 thlfoods.com, 1 @@ -145936,8 +146005,6 @@ thomas717.com, 1 thomasbeckers.be, 1 thomascountyne.gov, 1 -thomasdbrown.com, 1 -thomasduerlund.dk, 1 thomasdybdahl.no, 1 thomasebenrett.de, 1 thomaseikel.de, 0 @@ -145985,7 +146052,6 @@ thorntonnh.gov, 1 thorntonshvacservice.com, 1 thoropass.com, 1 -thoroughbredrecords.com, 1 thors-hearth.tk, 1 thorsteinsson.com, 1 thorsten-schaefer.com, 1 @@ -146009,7 +146075,6 @@ thouky.co.uk, 1 thouqi.com, 1 thousandoaksca.gov, 1 -thousandoakselectrical.com, 1 thowzzy.be, 1 thoxyn.com, 1 thpatch.net, 1 @@ -146135,6 +146200,7 @@ throneofmolok.tk, 1 thronia2.ro, 1 throopny.gov, 1 +throughlinecare.com, 1 throughout.ga, 1 throwable.website, 1 throwaway.link, 1 @@ -146171,7 +146237,6 @@ thunderkeys.net, 1 thunderlotusgames.com, 1 thunderwolves.ca, 1 -thundr.com, 1 thunk.ai, 1 thunktank.org, 1 thuprai.com, 1 @@ -146204,6 +146269,7 @@ tiadolores.com.br, 1 tiagocasalribeiro.ml, 1 tiagomoraismorgado.tk, 1 +tiagomoreira.pt, 1 tiagoneves.tk, 1 tiagonunes.pt, 1 tiagosimao.com, 1 @@ -146246,6 +146312,7 @@ tibber.com, 1 tibbitshall.ca, 1 tibc.ch, 1 +tibcon.net, 1 tibek-cnc-technik.de, 1 tiberian.tk, 1 tibetanmalashop.com, 1 @@ -146270,6 +146337,7 @@ tickertable.com, 0 ticket-9.de, 1 ticket-time.es, 1 +ticket-tracker.co.uk, 1 ticketassist.nl, 1 ticketbande.at, 1 ticketbande.ch, 1 @@ -146284,7 +146352,6 @@ ticketbande.us, 1 ticketcity.com, 1 ticketdeal.it, 1 -ticketfan.es, 1 tickethut.be, 1 ticketix.com, 1 ticketmaze.com, 1 @@ -146294,6 +146361,8 @@ ticketpro.ca, 1 ticketroster.com, 1 tickets2004.tk, 1 +ticketscheapairline.com, 1 +ticketscheapflights.com, 1 ticketsolve.com, 0 ticketsource.co.uk, 1 ticketsource.eu, 1 @@ -146351,7 +146420,6 @@ tiendaengeneral.com, 1 tiendafetichista.com, 1 tiendamacoco.com.ar, 1 -tiendamagia.com, 1 tiendamarina.com, 1 tiendamia.co, 1 tiendamia.com, 1 @@ -146421,6 +146489,7 @@ tigernewspaper.net, 1 tigernode.com, 1 tigerprop.com, 1 +tigerroofpa.com, 1 tigerspike.co.uk, 1 tigerspike.com, 1 tigerspike.com.au, 1 @@ -146456,7 +146525,6 @@ tikhonovy.ru, 1 tiki-god.co.uk, 1 tiki.id, 1 -tikimpact.com, 1 tikitak-o-rama.tk, 1 tikkie.me, 1 tikkio.com, 1 @@ -146536,6 +146604,7 @@ timco.cloud, 1 timcomp.com, 1 timcorp.net.ph, 1 +timcpa.com, 1 timdebruijn.nl, 1 timdemisch.de, 1 timdemisch.email, 1 @@ -146556,7 +146625,6 @@ time2060.ru, 1 time2choose.com, 1 time2time.ru, 1 -timeai.io, 1 timebomb.tk, 1 timebookings.cf, 1 timebox.tk, 1 @@ -146596,8 +146664,9 @@ timeroll.ml, 1 timersuite.com, 1 timertomato.com, 1 -timerway.com, 1 +timerway.com, 0 timescrypto.com, 1 +timesdelphic.com, 1 timesedlen.dk, 1 timeseller.ru, 1 timeserver0.de, 1 @@ -146642,10 +146711,10 @@ timmyrs.de, 1 timnash.co.uk, 1 timnegocia.com.br, 0 -timnextgen.com.ph, 1 timniclasdemisch.de, 1 timniclasdemisch.eu, 1 timo-viveen.nl, 1 +timochan.cn, 1 timogrossenbacher.ch, 1 timonenko.cf, 1 timonline.tk, 1 @@ -146932,6 +147001,7 @@ tkcm.online, 1 tkd-itf.tk, 1 tkddn.com, 1 +tkglobalexperts.co.za, 1 tkhirianov.tk, 1 tkhsurgery.com, 1 tkic.com.au, 1 @@ -146980,7 +147050,6 @@ tlsmail.cc, 1 tlsrobot.se, 1 tlumaczenie.com, 1 -tlv77.net, 1 tlvgraffiti.co.il, 1 tlyphed.net, 1 tlys.de, 1 @@ -146988,7 +147057,6 @@ tm-sydney.au, 1 tm2ts.com, 1 tm80plus.com, 0 -tma.us, 1 tmachinery.cz, 1 tmadev.com.au, 1 tmartravel.com, 1 @@ -147062,7 +147130,6 @@ tnosha.gov, 1 tnosworld.com, 1 tnp.sg, 1 -tnpsconline.com, 1 tnr.com.au, 1 tnrealid.gov, 1 tnrf.eu, 1 @@ -147114,9 +147181,7 @@ tobias-kluge.com, 1 tobias-kluge.de, 0 tobias-olbrich.de, 1 -tobias-picha.de, 1 tobias-sachs.de, 1 -tobias-weidhase.de, 1 tobias.gr, 1 tobias4.com.au, 1 tobiasbrunner.net, 1 @@ -147187,7 +147252,6 @@ todaysbestinsurance.com, 1 todaysdatenow.com, 1 todaysparent.com, 1 -todaytrailer.com, 1 todayupdates.ga, 1 toddassoc.com, 1 toddcullumresearch.com, 1 @@ -147239,6 +147303,7 @@ tofu.cf, 1 tofu.kim, 1 tofuixi.com, 1 +togaether.me, 1 togashishika.com, 1 together.gov, 1 togetherplanning.com, 0 @@ -147258,10 +147323,8 @@ toilestas.ca, 1 toilestci.com, 1 toilet-guru.com, 1 -toilville.com, 1 toimitaax.fi, 1 toio.io, 1 -toitjob.com, 1 tojeit.cz, 1 tojevune.cz, 1 tok4.com, 1 @@ -147397,7 +147460,6 @@ tomatofrogs.com, 1 tomatohq.com, 1 tomaz.eu, 1 -tomba.io, 1 tombaker.me, 1 tombclan.ga, 1 tombdr.com, 1 @@ -147416,7 +147478,7 @@ tomdapice.com, 1 tomdougiamas.com, 1 tomdubovich.com, 1 -tomdudfield.com, 1 +tomdudfield.com, 0 tome.ae, 1 tome.ru, 1 tomedo.de, 1 @@ -147562,7 +147624,6 @@ tonik.tk, 1 tonikbank.com, 0 tonimorena.net, 1 -tonkatowz.com, 1 tonkawaok.gov, 1 tonmo.com, 1 tonnycat.com, 1 @@ -147591,6 +147652,7 @@ tonyhagerlund.tk, 1 tonykarbo.tk, 1 tonymanning.com, 1 +tonyrush.com, 1 tonysantos.tk, 1 tonysciuto.com, 1 tonytan.cn, 1 @@ -147652,6 +147714,7 @@ toondergroup.com, 1 toonetcreation.com, 0 toonict.nl, 0 +toonit.ai, 1 toonmate.tk, 1 toonpool.com, 1 toonsburgh.com, 1 @@ -147782,8 +147845,8 @@ topesdegama.com, 1 topeyechang.com.tw, 1 topfd.net, 1 +topfived.com, 1 topfivepercent.co.uk, 1 -topflightwildlife.com, 1 topfrags.pl, 1 topfreeporn.com, 1 topfx.com, 1 @@ -147886,12 +147949,14 @@ topsuper60.org, 1 toptapety.cz, 1 toptapparelle.it, 0 +topteamtips.com, 1 toptec.net.br, 1 toptechnews.cf, 1 toptechnews.tk, 1 topteen.tk, 1 toptenwebhostingsites.com, 1 toptexture.com, 1 +topthetater.com, 1 toptheto.com, 1 toptica-eagleyard.com, 1 toptier.com.ar, 1 @@ -147902,7 +147967,6 @@ toptravelgram.com, 1 toptropicals.com, 1 toptur.tk, 1 -toptv88.com, 1 topu.ro, 1 topupindo.net, 1 topurls.tk, 1 @@ -147911,7 +147975,6 @@ topvisor.com, 1 topvisor.ru, 1 topvpn.pl, 1 -topwatch.com, 1 topwin.la, 1 topwindows-eg.com, 1 topwipers.com, 1 @@ -147938,6 +148001,7 @@ torch.security, 0 torchbearer.tk, 1 torchmc.ru, 1 +torchonline.com, 1 tordenskjold.de, 1 tordo.net, 1 toreni.us, 1 @@ -147959,7 +148023,6 @@ torkel.se, 1 torlock.com, 1 torlock2.com, 1 -tormentedradio.com, 0 tormentgame.com, 1 tormox.ml, 1 tornada-cz.cz, 1 @@ -147991,6 +148054,7 @@ torontotransit.tk, 1 toropova.tk, 1 toros-outdoors.de, 1 +torpenhow.ai, 1 torproject.org, 0 torproject.ovh, 1 torprojects.com, 1 @@ -148007,8 +148071,6 @@ torrent.fedoraproject.org, 1 torrent.is, 1 torrent.tm, 1 -torrentbd.com, 1 -torrentbd.me, 1 torrentbox.moe, 1 torrentdb.tk, 1 torrentdownload.gq, 1 @@ -148033,6 +148095,7 @@ torstens-buecherecke.de, 1 torstensenf.de, 1 torstenzimmermann.com, 1 +tortaboutique.hu, 1 tortak.ml, 1 tortar.me, 1 torte.roma.it, 1 @@ -148076,7 +148139,7 @@ totalbyverizon.com, 1 totalcarcheck.co.uk, 1 totalcare.co.nz, 1 -totalchecklist.com, 1 +totalchecklist.com, 0 totalcontrols.eu, 1 totaleaseventures.co.ke, 1 totalemaildelivery.com, 1 @@ -148096,6 +148159,7 @@ totalfoundationpros.com, 1 totalhost.gq, 1 totalityservices.co.uk, 1 +totaljs.es, 1 totallegal.com, 1 totally-dakota.tk, 1 totallyjessica.tk, 1 @@ -148111,6 +148175,7 @@ totalparts.com.au, 1 totalsport-bg.com, 1 totaltriathlon.com, 1 +totalwealth.co.nz, 1 totalwebpartners.com, 1 totalzen.ga, 1 totch.de, 1 @@ -148145,6 +148210,7 @@ touchbasesm2.ca, 1 touchboobs.ml, 1 touchdown.co, 1 +touche-moi.com, 1 touchingwetpaint.com, 1 touchka.ga, 1 touchmagazine.eu, 1 @@ -148188,7 +148254,6 @@ tourdeltalento.org, 1 tourdewestwoud.nl, 1 toureiffel.paris, 1 -tourfunnels.com, 1 tourgest.net, 1 touringinmorocco.com, 1 tourism-exegetai.tk, 1 @@ -148228,6 +148293,7 @@ touslesdrivers.com, 1 touslesforums.tk, 1 toussaint-romain.be, 1 +tousu.com, 0 tout-a-fait.fr, 1 tout-art.ch, 1 tout-vendre.com, 1 @@ -148284,6 +148350,7 @@ towessi.tk, 1 towing-waco.com, 1 towingmoore.com, 1 +towingnashvilletn.com, 1 town-night.jp, 1 townerkc.com, 1 townforge.net, 1 @@ -148524,11 +148591,13 @@ townofwrightstownwi.gov, 1 townofwyomingwi.gov, 1 townresults.ga, 1 +townscorereport.com, 1 townsendhotel.com, 1 townshendvt.gov, 1 townshipoflower.org, 1 townshipofthenorthshore.ca, 1 townswalker.com, 1 +towpath.com, 1 towschool.org, 1 towywebdesigns.uk, 1 tox21.gov, 1 @@ -148621,6 +148690,7 @@ trabaja.xyz, 1 trabajadormigrante.gov, 1 trabajaenvitamina.cl, 1 +trabajarytrabajar.com, 1 trabajoreal.com, 1 trabajouniversitario.tk, 1 trabbel.org, 1 @@ -148650,7 +148720,6 @@ traceurdirect.com, 1 traceurlocation.com, 1 traceuroccas.com, 1 -tracinsurance.com, 1 track.plus, 1 trackablemap.com, 1 trackadblock.com, 1 @@ -148667,6 +148736,7 @@ trackfocusdirect.com, 1 trackhs.com, 1 trackify.tk, 1 +tracking-adac-wtb.de, 1 tracking-app.tk, 1 tracking.best, 1 trackinsight.com, 1 @@ -148715,6 +148785,7 @@ tradedesk.co.za, 0 tradeeasy.com, 1 tradefxp.com, 1 +tradeintocash.com, 1 tradeiq.ch, 1 tradeledger.io, 1 tradelink.cf, 1 @@ -148740,6 +148811,7 @@ tradesolution.no, 1 tradesrenovations.ca, 1 tradet.fi, 1 +tradetaurex.com, 1 tradeview.eu, 1 tradeville.ro, 1 tradewindsdental.com, 1 @@ -148844,7 +148916,6 @@ trainings-handschuhe-test.de, 1 trainingsalicante.tk, 1 trainingscatalogus.nl, 1 -trainingsecke.de, 1 trainingswiese.at, 1 trainline.io, 1 trainmagazine.nl, 1 @@ -148888,7 +148959,6 @@ tramadolhcl.ga, 1 tramclub-basel.ch, 1 tramikshop.ml, 1 -tramin.in, 1 tramitelegal.com.ar, 1 tramplin.tk, 1 tramway.org, 0 @@ -149003,7 +149073,6 @@ transinbeeld.nl, 1 transit.my.id, 1 transitables.tk, 1 -transitionslc.com, 1 transitllc.ru, 1 transito.tk, 1 transitownplaza.com, 1 @@ -149057,6 +149126,7 @@ transporticonline.com, 1 transportnews.tk, 1 transportnsw.info, 1 +transportpigeon.com, 1 transporttalent.com, 1 transsensual.com, 1 transsensualnetwork.com, 1 @@ -149076,6 +149146,7 @@ trantrongtri.info, 1 tranvia.info, 1 tranzact.net, 1 +tranzguard.com, 1 tranzron.ga, 1 trapay.net, 1 trapezegroup.de, 1 @@ -149155,7 +149226,9 @@ traveladdiction.tk, 1 traveladventure.ml, 1 travelafricamag.com, 1 +travelagent.ai, 1 travelaiengineer.pro, 1 +travelairtravel.com, 1 travelamm.com, 1 travelanchor.ga, 1 travelandtourism.tk, 1 @@ -149196,10 +149269,12 @@ travelexecutive.de, 1 travelexinternational.com, 1 travelexpress.tk, 1 +travelfab.co.uk, 1 travelfashionlife.com, 1 travelfeature.ga, 1 travelfield.org, 1 travelfiesta.ga, 1 +travelflighthotel.com, 1 travelfoot.com, 1 travelfriend.tk, 1 travelfusion.com, 1 @@ -149290,7 +149365,6 @@ traveltomachupichu.com, 1 traveltourist.tk, 1 traveltovietnam.ga, 1 -traveltruster.com, 0 travelturbo.ga, 1 travelultra.ga, 1 travelunique.ga, 1 @@ -149332,6 +149406,7 @@ trbn.me, 1 trctaborda.com.br, 1 trdepoist.net, 1 +trdesk.com, 1 tre-sp.jus.br, 1 treadmillrepair.co.nz, 0 treadwellgordon.co.nz, 0 @@ -149491,7 +149566,6 @@ trhastane.com, 1 trhknih.cz, 0 tri.gg, 1 -triad.earth, 1 triadstop.com, 1 triage.clinic, 1 triage.md, 1 @@ -149548,13 +149622,14 @@ tributh.net, 1 tributh.tk, 1 tributoconsuegra.tk, 1 +tricare.mil, 1 tricefy4.com, 1 tricherenligne.com, 1 triciaree.com, 0 tricityrogues.eu, 1 trickest.com, 1 trickey.io, 1 -trickle.works, 1 +trickle.works, 0 trico-pigmentazione.it, 1 tricolortotal.tk, 1 triconinfotech.com, 1 @@ -149591,7 +149666,6 @@ trigueros.tk, 1 trigular.de, 1 trihedron.tk, 1 -trihunter6000.com, 1 trik-komputer.tk, 1 trik.es, 0 triker.tk, 1 @@ -149721,6 +149795,7 @@ triumphgroup.com, 1 triumphmotorcycles.co.uk, 1 triventsc.com, 1 +trivid.in, 1 trividtech.in, 1 triwan.sk, 1 trixi.com, 1 @@ -149754,7 +149829,6 @@ troisprime.com, 0 trojanchronicles.tk, 1 trojanherring.com, 1 -trojanrecords.com, 1 trok.co.il, 1 trolebusesdevalparaiso.tk, 1 troll-gaming.tk, 1 @@ -149919,7 +149993,6 @@ truecrypt.org, 1 truedarkness.tk, 1 trueduality.net, 1 -trueflowplumbing.com, 1 trueformroofing.co.nz, 1 truehealth.tk, 1 trueimpactsigns.com, 1 @@ -149932,25 +150005,14 @@ truenorthtalk.com, 1 truenorthvip.com, 1 truentumvet.it, 1 -truepartner.academy, 1 -truepartner.capital, 1 truepartner.cn, 1 truepartner.education, 1 -truepartner.email, 1 truepartner.eu, 1 truepartner.fund, 1 -truepartner.group, 1 truepartner.hk, 1 truepartner.holdings, 1 -truepartner.limited, 1 -truepartner.ltd, 1 truepartner.nl, 1 truepartner.sg, 1 -truepartner.software, 1 -truepartner.tech, 1 -truepartner.technology, 1 -truepartner.university, 1 -truepartner.us, 1 truepartneradvisor.cn, 1 truepartneradvisor.com, 1 truepartneradvisor.nl, 1 @@ -149969,18 +150031,14 @@ truepartnerchinafuturesfund.cn, 1 truepartnerchinagrowthfund.cn, 1 truepartnerchinaoptionsfund.cn, 1 -truepartneredu.com, 1 truepartnereducation.cn, 1 -truepartnereducation.com, 1 truepartnerfund.cn, 1 truepartnerfund.hk, 1 truepartnerfund.nl, 1 truepartnerinvestments.com.hk, 1 truepartnerinvestments.hk, 1 -truepartnertech.com, 1 truepartnertech.nl, 1 truepartnertech.sg, 1 -truepartnertechnology.com, 1 truepartnertechnology.nl, 1 truepartnertechnology.sg, 1 truepointdigital.com.au, 1 @@ -149993,7 +150051,6 @@ truestor.com, 1 truetraveller.com, 1 truetrophies.com, 1 -truetype.tech, 1 trueweb.es, 1 truewebmaster.com, 1 truewinter.net, 1 @@ -150010,10 +150067,12 @@ trulock.tk, 1 trulycharmed.tk, 1 trulyhardseltzer.com, 1 +trulypakistan.net, 1 trumag-international.com, 1 trumanlibrary.gov, 1 trumansburgoptical.com, 1 trummer.xyz, 1 +trumoo.com, 1 trumpet-call.org, 1 trumpet-whistleblowing.eu, 1 trumplibrary.gov, 1 @@ -150051,6 +150110,7 @@ trustcloud.ai, 1 trustcrest.in, 1 trustcruit.com, 1 +trustcv.com, 1 trustdental.jp, 1 trusted-medications.com, 1 trusted-signatures.com, 1 @@ -150072,6 +150132,7 @@ trustreview.tk, 1 trustserv.de, 1 trustserver.cn, 1 +trustsig.eu, 1 truststamp.ai, 1 trustswiftly.com, 1 trustted.co.uk, 1 @@ -150104,14 +150165,17 @@ trw-reseller.com, 1 trxnews.today, 1 try-upguard.com, 1 +try.li, 1 try2hack.it, 1 trybabyschoice.com, 1 +trybeaverdock.com, 1 trycaviar.com, 1 trychameleon.com, 1 trydoggo.com, 1 tryfabulousdiet.com, 1 tryfabulousskincream.com, 1 tryfabulousskinserum.com, 1 +trygghetsteknik.se, 1 trygrupp.africa, 1 tryhard.cz, 1 tryharder.ca, 1 @@ -150190,7 +150254,6 @@ tshirai.work, 1 tshirtgenerator.ga, 1 tshirtmemoryquilts.com, 0 -tshirts.durban, 1 tshirtsangola.co.za, 1 tshirtsbotswana.co.za, 1 tshirtscapetown.com, 1 @@ -150239,6 +150302,7 @@ tst-band.tk, 1 tstr.io, 1 tstrom.net, 1 +tsttalent.com, 1 tsu.re, 0 tsuda-dental-ortho.info, 1 tsudakahama.tech, 1 @@ -150266,6 +150330,7 @@ tsuyuzakihiroyuki.com, 1 tsv-1894.de, 0 tsv-hittfeld.de, 0 +tswg.gov, 1 tswinvest.com, 1 tsxxlangel.com, 1 tsybanov.com, 1 @@ -150325,7 +150390,6 @@ ttwtrader.com, 1 tty.space, 1 tty1.net, 1 -tty12.org, 1 ttyystudio.com, 1 tu-com.es, 1 tu-muenchen.de, 1 @@ -150339,7 +150403,7 @@ tubator.com, 1 tubby.ovh, 1 tubchair.com, 1 -tube.tools, 1 +tube.tools, 0 tube8vip.com, 1 tubebegana.com, 1 tubedesire.com, 1 @@ -150370,6 +150434,7 @@ tucsonpcrepair.com, 1 tucsonsewerscopes.com, 1 tucuatro.com, 1 +tucuxi.org, 1 tudatosantejmentesen.hu, 1 tudatosdori.hu, 1 tudinerito.tk, 1 @@ -150456,6 +150521,7 @@ tullphone.com.mx, 1 tulocura.tk, 1 tulosleep.com, 1 +tulpa.network, 1 tulpawiki.org, 1 tulsa.tech, 1 tulsameetingroom.com, 1 @@ -150487,6 +150553,7 @@ tunenet.ml, 1 tuner.cloud, 1 tuneserver.tk, 0 +tunevoter.com, 1 tuning-werkstatt-nuernberg.de, 1 tuningblog.eu, 0 tunisia-tech.tk, 1 @@ -150525,7 +150592,6 @@ tuppenceworth.ie, 1 tuppennysfireplace.com, 1 tuppersexmadrid.com.es, 1 -tupperwaresalamanca.com, 1 tuprag.com.tr, 1 tupsicoayuda.com, 0 tupugoya.org, 1 @@ -150647,6 +150713,7 @@ turnalikoyu.tk, 1 turnaroundinsights.com, 1 turnbacktogod.com, 1 +turncircles.com, 1 turneragsupply.com, 0 turneroregon.gov, 1 turnet.tk, 1 @@ -150670,6 +150737,7 @@ turquoise.health, 1 turquoisetassel.com, 1 turretlabs.io, 1 +tursiae.org, 1 turtle.ai, 0 turtle.ky, 1 turtlecomputers.net, 1 @@ -150688,12 +150756,12 @@ tusar.cf, 1 tusar.ga, 1 tuscaloosacourtreporting.com, 1 +tuscandairy.com, 1 tuscanyleather.it, 0 tusconsultorex.com, 1 tusdtapi.com, 1 tusharwalaskar.com, 1 tusi.co, 1 -tuslamparasonline.com, 1 tusmedicamentos.com, 1 tusociofinanciero.com, 1 tussenuur.tk, 1 @@ -150754,7 +150822,6 @@ tuva-news.net, 1 tuvankinhdoanhonline.com, 1 tuvanmat.com, 1 -tuvi.es, 1 tuwaner.com, 1 tuwima48.pl, 1 tuxamca.com, 1 @@ -150813,7 +150880,6 @@ tvcmarketing.com, 1 tvdenevar.net, 0 tvdheijden.com, 1 -tvears.com, 1 tveni.com, 1 tvenligne.tk, 1 tver-news.net, 1 @@ -150869,6 +150935,7 @@ tvsportguide.de, 1 tvsportiva.it, 1 tvsscs.com, 1 +tvsscs.it, 1 tvstore-247.net, 1 tvszn.cz, 1 tvtj.ml, 1 @@ -150963,6 +151030,7 @@ twistyspremium.com, 1 twistysreel.com, 1 twit-guide.com, 1 +twitchauth.work, 1 twitchplaysleaderboard.info, 1 twitchy.tk, 1 twitcker.com, 1 @@ -150983,6 +151051,7 @@ twobitbusker.com, 1 twobridges.co.uk, 1 twobrothersbbq.com, 0 +twobrothersinn.com, 1 twocantalk.ca, 1 twoconnect.com, 0 twocornertiming.com, 1 @@ -151001,6 +151070,8 @@ twolittlefleas.co.uk, 1 twoninersix.com, 1 twonodes.games, 0 +twonum-servers.net, 1 +twonum.net, 1 twonum.org, 1 twoodoo.de, 1 twopinescreative.com, 1 @@ -151035,7 +151106,7 @@ txsmartbids.gov, 1 txsmartbuy.gov, 1 txtd.io, 1 -txtdb.com, 1 +txtdb.com, 0 txtdirect.com, 1 txtdirect.dev, 1 txtdirect.io, 1 @@ -151113,6 +151184,7 @@ typecho.site, 0 typeclasses.com, 1 typecodes.com, 1 +typefun.xyz, 1 typegrow.com, 1 typehub.net, 0 typeof.pw, 1 @@ -151131,6 +151203,7 @@ typica.com.tw, 1 typika.gr, 1 typing.com, 1 +typingbandhu.in, 1 typingcheck.ga, 1 typinglounge.com, 1 typist.tech, 1 @@ -151140,10 +151213,8 @@ tyr0wl.com, 1 tyrael.eu, 1 tyraga.ga, 1 -tyrannize.us, 1 tyrasuki.be, 1 tyre-search.ga, 1 -tyres-mechanical.com.au, 1 tyresales.com.au, 1 tyrkey.tk, 1 tyrocity.com, 1 @@ -151197,7 +151268,6 @@ tzunami.tk, 1 tzunamiblog.tk, 1 tzwe.com, 1 -u-buy.jp, 1 u-chan.com, 0 u-fms.com.au, 1 u-he.com, 1 @@ -151205,7 +151275,6 @@ u-msg.com.au, 1 u-page.nl, 1 u-pas.com.au, 1 -u-ranking.es, 1 u-time.com.au, 1 u-watch.it, 1 u.ls, 1 @@ -151324,7 +151393,7 @@ ubezpieczonedziecko.pl, 1 ubicaciones-vitamina.cl, 1 ubicv.com, 1 -ubik.capital, 1 +ubik.capital, 0 ubill.ge, 1 ubimail.org, 1 ubiminds.com, 1 @@ -151332,7 +151401,6 @@ ubis.group, 1 ubiurbe.com, 1 ubleam.com, 0 -ubn-speed.fr, 0 ubook.com, 1 uborcare.com, 1 uborka-812.ru, 1 @@ -151388,7 +151456,6 @@ ucphotography.net.au, 1 ucpparts.com, 1 ucppe.org, 1 -ucraft.ai, 1 ucrdatatool.gov, 1 ucretleri.net, 1 ucsdguardian.org, 1 @@ -151398,6 +151465,8 @@ uctarna.online, 1 ucware.com, 1 ucybodyinc.com, 1 +uczciweit.pl, 1 +uczciwestrony.pl, 1 udahni.com, 1 udb.kr, 1 udbina.tk, 1 @@ -151538,6 +151607,7 @@ uinvest.tk, 1 uiop.link, 1 uiquipedia.org, 1 +uir.ac.ma, 1 uisd.net, 1 uitdeoudekoektrommel.com, 1 uiterwijk.org, 1 @@ -151571,7 +151641,7 @@ ukdefencejournal.org.uk, 1 ukdri.ac.uk, 1 ukem.co.uk, 1 -ukformify.co.uk, 0 +ukformify.co.uk, 1 ukforum.net, 1 ukhas.net, 1 ukimmigration.law, 1 @@ -151579,6 +151649,7 @@ ukjent.net, 1 uklawfirm.tk, 1 uklidgaraze.fun, 1 +uklidovkaplzen.cloud, 1 uklizim-garaz.fun, 1 uklizim.fun, 1 uklizimgaraz.fun, 1 @@ -151617,7 +151688,6 @@ ukrtabletki.tk, 1 ukrzoloto.ua, 1 ukseafood.co.uk, 1 -ukstaa.org, 1 ukta.tk, 1 uktw.co.uk, 0 uku.lt, 1 @@ -151672,7 +151742,6 @@ ultimateappreviews.co, 1 ultimatebabyshowergifts.ga, 1 ultimatebattle.tk, 1 -ultimatebattles.club, 1 ultimatecheerleaders.com, 1 ultimateclub.tk, 1 ultimateconnector.com, 1 @@ -151698,6 +151767,7 @@ ultrablock.org, 1 ultrabuilds.com, 1 ultracentr.ml, 1 +ultracompanygc.com, 1 ultracoupon.net, 1 ultrafine.cf, 1 ultrahang-maganrendeles.hu, 1 @@ -151731,7 +151801,6 @@ ulysses.co.uk, 1 ulyssesenergy.it, 1 um-sachsen-pictures.de, 1 -um.es, 0 um6p.ma, 1 umagoyal.com, 1 umami.vercel.app, 1 @@ -151747,7 +151816,6 @@ umasstransit.org, 1 umatilla.gov, 1 umatillacounty.gov, 1 -umbertheprussianblue.com, 1 umbraco.com, 1 umbrellamediagroup.com, 1 umbrellaye.online, 1 @@ -151767,6 +151835,7 @@ umisonoda.com, 1 umitribe.gov, 1 umity.com.ua, 1 +umkashir.com, 1 umkdd.com, 1 umkomaaslodge-aliwalshoal.co.za, 1 umlautpress.com, 1 @@ -151792,10 +151861,10 @@ umww.com, 1 umzuege-hannover.net, 1 umzugschecker.de, 1 +umzugsmeister-wolters.de, 1 umzugsunternehmen.berlin, 1 umzugsunternehmenberlin.eu, 1 un-box.org, 1 -un-zero-un.fr, 1 una.py, 1 unacasitadepapel.com, 1 unaffectedsound.tk, 1 @@ -151938,7 +152007,6 @@ unhappy.tk, 1 uni-arts.com, 1 uni-chem.rs, 1 -uni-cleaner.com, 1 uni-watch.com, 1 uni2share.com, 1 unia.es, 1 @@ -151971,7 +152039,6 @@ uniclejess.ca, 1 unicode.gq, 1 unicode.link, 1 -unicode.website, 1 unicodeart.com, 1 unicodeplus.com, 1 unicodesign.ch, 1 @@ -151986,7 +152053,7 @@ unicorn.melbourne, 1 unicorndesign.ninja, 1 unicornheaven.net, 1 -unicorni72.online, 1 +unicornmarket.net, 1 unicornmusic.tk, 1 unicornsoft.tk, 1 unicorntooling.eu, 1 @@ -152022,7 +152089,6 @@ unikbio.com, 1 unike.tech, 1 unikimages.com, 1 -unikon.su, 1 unikos.tk, 1 unikrn.com, 1 unikrn.tech, 1 @@ -152148,7 +152214,6 @@ unitreedoor.com, 0 unitycardiology.com.au, 1 unityconsciousnessbooks.com, 1 -unityfactory.io, 1 unityor.gov, 1 unitysavannah.org, 1 unitysyndicate.tk, 1 @@ -152265,7 +152330,6 @@ unmask.earth, 1 unmatched.ventures, 1 unmetric.com, 1 -unmfoundation.com, 1 unminutomami.com, 1 unmo.com, 1 unmoneye.com, 1 @@ -152292,6 +152356,7 @@ unosconotros.com, 1 unovosti.tk, 1 unp.me, 1 +unpar.ac.id, 1 unparenting.com, 1 unpi06cannes.fr, 1 unpkg.com, 1 @@ -152322,7 +152387,6 @@ unseeliefilms.com, 1 unseeliepress.com, 1 unser-barsinghausen.de, 1 -unser-gartenbauverein.de, 1 unser-gartenforum.de, 1 unsigcrazy.art, 1 unsourirealecole.fr, 1 @@ -152345,13 +152409,13 @@ unternimmteam.de, 1 unti.me, 1 unti.tk, 1 +untold.agency, 1 untrading.org, 1 untvweb.com, 1 unufoundation.com, 1 unukase.ac.id, 1 unun.fi, 0 unusualhatclub.com, 1 -unusualsubstance.com, 1 unvarnishedco.com, 1 unveilturkey.com, 1 unvired.com, 1 @@ -152361,7 +152425,6 @@ unwishingmoon.com, 1 unwomen.de, 1 unworthy.ml, 1 -unwrittens.net, 1 unx.dk, 1 unxicdellum.cat, 1 uny.ac.id, 1 @@ -152379,13 +152442,13 @@ up.nic.in, 1 up1s.tk, 1 up2date.com.ua, 1 -up2mark.com, 0 up2staff.com, 1 upaaquila.org, 1 upaisa.com, 1 upakovka-podarkov.tk, 1 upandatom.biz, 1 upandrunningtutorials.com, 1 +upanh.org, 1 upar.org, 1 upay.uz, 1 upbad.com, 1 @@ -152397,7 +152460,7 @@ upbeatrobot.nl, 1 upbeatrobot.org, 1 upbeatrobot.social, 1 -upbit.com, 1 +upbit.com, 0 upbtrbt.com, 1 upbtrbt.eu, 1 upbtrbt.net, 1 @@ -152427,7 +152490,6 @@ upgamerengine.com.br, 1 upgamerengine.net, 1 upgeradores.com.br, 1 -upgintl.com, 1 upgrade.com, 1 upgradeguru.de, 1 upgradeit.dk, 1 @@ -152441,7 +152503,6 @@ upguard.in, 1 upguard.org, 1 upguardinc.com, 1 -uphabit.io, 1 uphold-15-party.com, 1 upholsterydesign.com.au, 1 uphost.be, 1 @@ -152475,7 +152536,6 @@ upmon.com, 1 upnetwork.ml, 1 upnext.tk, 1 -upnorth.solutions, 1 uportal.tk, 1 uppercloud.cf, 1 upperglass.co.uk, 1 @@ -152490,6 +152550,7 @@ upr.llc, 1 upr.si, 1 upr.ua, 1 +upra.gov.co, 1 uprawnienia-1kv.pl, 1 uprawnienia-dronowe.pl, 1 uprawnienia-drony.pl, 1 @@ -152542,8 +152603,8 @@ upundit.com, 1 upviews.tk, 1 upwardcreative.com, 1 -upwardflourish.com, 1 upwardtraining.co.uk, 1 +upwebmobilepro.com, 1 upwork.com, 1 upyourbusiness.nl, 1 uq1k.com, 1 @@ -152653,7 +152714,6 @@ urcentral.org, 1 urcommunitytimebanking.org.au, 1 urdoverie.com, 1 -urdumediamonitor.com, 1 urenaphoto.com, 1 ureve.paris, 1 urfreecon.tk, 1 @@ -152757,6 +152817,7 @@ usability.com.gr, 1 usability.gov, 1 usacarry.com, 1 +usacontainerllc.com, 1 usacrime.com, 1 usadba.net.ru, 1 usadepo.com, 1 @@ -152765,6 +152826,7 @@ usadirectory.tk, 1 usadocnetwork.com, 1 usaestaonline.com, 1 +usaeuc.com, 1 usage.be, 1 usagi-ku.ga, 1 usagm.gov, 1 @@ -152792,6 +152854,7 @@ usatiuk.com, 1 usatodaynetworkservice.com, 1 usatodaysportsplus.com, 1 +usautomatic.com, 1 usavingsbank.com, 1 usaweblist.tk, 1 usawireguard.com, 1 @@ -152800,6 +152863,7 @@ usbevents.co.uk, 1 usbmakers.com, 1 usbr.gov, 1 +uscc.gov, 1 uscc.org.ua, 1 uscdn.xyz, 0 uscis.gov, 1 @@ -152898,7 +152962,6 @@ usmiddleclass.net, 1 usmint.gov, 1 usmission.gov, 1 -usmoneyreserve.com, 1 usmrecycles.com, 1 usnews-new.tk, 1 usnews.ga, 1 @@ -152908,7 +152971,6 @@ usoog.com, 1 usoptical.com, 1 uspaacc.com, 1 -usparceldelivery.com, 1 usparklodging.com, 1 uspasecurity.com, 1 uspeh62.tk, 1 @@ -152920,7 +152982,6 @@ uspon.tk, 1 usportsgo.com, 1 uspory.cz, 1 -uspower.us, 1 uspsblog.com, 0 uspsoig.gov, 1 uspsolutions.at, 1 @@ -152942,14 +153003,14 @@ ustc.fun, 1 ustc.run, 1 ustg.net, 1 +ustoy.com, 1 ustr.gov, 1 -ustreasuryetf.com, 1 ustugov.kiev.ua, 1 ustugova.kiev.ua, 1 ustyj.tk, 1 usu.org.ua, 1 usuan.net, 1 -usul.ai, 1 +usul.ai, 0 usuluddin.ga, 1 usuluddin.tk, 1 usuwanie-wirusow-wordpress.pl, 1 @@ -153013,8 +153074,10 @@ utilizaciya.com, 1 utko12.ru, 1 utleg.gov, 1 +utleio.no, 1 utloperadora.com.br, 1 utodyg.ga, 1 +uton.cz, 1 utonia.ch, 1 utop.io, 1 utopialgb.org.uk, 1 @@ -153034,7 +153097,6 @@ uttama.ga, 1 uttenheim.net, 1 utterberry.io, 1 -utube.ai, 1 utural.tk, 1 utusan.com.my, 1 utvbloggen.se, 1 @@ -153072,7 +153134,6 @@ uvsa.org.au, 1 uvsar.com, 1 uvt.com.co, 1 -uwac.co.uk, 0 uwalumni.com, 0 uwat.cc, 1 uwat.cf, 1 @@ -153145,6 +153206,7 @@ uzvod.com, 1 uzzamari.com, 1 uzzamari.com.br, 1 +v-chipak.de, 1 v-cn.net, 1 v-d-p.net, 1 v-empower.com, 1 @@ -153217,6 +153279,7 @@ vaayaa.com, 1 vabusinesses.org, 1 vacaf.org, 1 +vacances-ideales-france.top, 1 vacances-ideales.top, 1 vacansier.com, 1 vacanze-in-montagna-dolomiti.com, 1 @@ -153377,8 +153440,8 @@ valeuraenergy.com, 1 valgagym.ee, 1 valgavesi.ee, 1 -valgeklaar.ee, 1 valhallastrengthsthbne.com.au, 1 +valia.health, 1 valiakhmetov.tk, 1 valiant.finance, 1 valiantprep.org, 1 @@ -153418,7 +153481,6 @@ valledibraies.org, 1 vallee-egoutiers.ca, 1 valleesenlutte.org, 1 -vallei-veluwe.nl, 1 vallejo.gov, 1 vallejoca.gov, 1 vallenar.tk, 1 @@ -153431,7 +153493,6 @@ valleycountyne.gov, 1 valleydalecottage.com.au, 1 valleydisasterfair.com, 1 -valleymarketonline.com, 1 valleyofdeath.tk, 1 valleyofpeace.co.nz, 1 valleyshop.ca, 1 @@ -153529,13 +153590,13 @@ van-rutten.nl, 1 van.ddns.net, 1 van11y.net, 1 -vanadrighem.eu, 1 vanafhier.nl, 0 vanamersfoortracing.nl, 1 vananservices.com, 1 vanarok.xyz, 0 vanbalen.be, 1 vanbarel.tk, 1 +vanboven.nl, 1 vanboyvital.tk, 1 vanbruchem.tk, 1 vanburencounty-mi.gov, 1 @@ -153548,7 +153609,6 @@ vancouverdriveband.com, 1 vancouverok.com, 1 vancouverpetsitter.ca, 1 -vancouversbestplaces.com, 1 vancouverwaseo.org, 1 vancubers.com, 1 vandaalen.email, 1 @@ -153630,7 +153690,6 @@ vanrichie.nl, 1 vanstoftotleven.nl, 1 vanta.com, 1 -vantagepointpreneed.com, 1 vantru.is, 1 vanuithartenziel.nl, 1 vanvanlines.com, 1 @@ -153638,6 +153697,7 @@ vanwijngaardentegelzetters.nl, 1 vanwoensei.xyz, 1 vanwoensel.directory, 1 +vanwoensel.net, 1 vanwort.de, 1 vanwunnik.com, 1 vanya.click, 1 @@ -153711,6 +153771,7 @@ variohyp.de, 1 variomedia.de, 1 various.at, 1 +varitas.io, 1 variusunum.com, 1 varizh.by, 1 varjo.tk, 1 @@ -153751,6 +153812,7 @@ vashdohod.ml, 1 vashel.us, 1 vasheradio.tk, 1 +vashidverivikna.com.ua, 1 vashmatrass.ru, 1 vashprazdnik.tk, 1 vasilev.wtf, 1 @@ -153778,7 +153840,6 @@ vatav.eu, 1 vatav.tk, 1 vatazhok.com, 1 -vatc.org, 1 vatcompliance.com, 1 vates.tech, 1 vatikantour.tk, 1 @@ -153791,6 +153852,7 @@ vaughanchiropractic.com, 1 vaughanrisher.com, 1 vaulavalpola.tk, 1 +vaulk.com, 1 vault-am.lu, 1 vault-tec.info, 1 vault.investments, 1 @@ -153898,7 +153960,6 @@ vdolg8000rub.gq, 1 vdolg8000rub.ml, 1 vdolg8000rub.tk, 1 -vdotdatasharing.org, 1 vdownloader.com, 1 vdprotezai.lt, 1 vdrei.at, 1 @@ -153911,6 +153972,7 @@ ve3oat.ca, 1 veadoscomfome.tk, 1 veast.network, 1 +veaverdock.com, 1 vebbankir-zajm-onlajn.gq, 1 vebdengi.tk, 1 veber.bg, 1 @@ -153947,6 +154009,7 @@ vedom.ru, 1 vedran-zulin.from.hr, 1 veeam.com, 1 +veebiaken.ee, 1 veebill.com, 1 veebiveski.ee, 1 veefna.com, 1 @@ -153956,11 +154019,9 @@ veessen.tk, 1 veetalen.art, 1 veetechnologies.com, 1 -veethi.com, 1 veeva.link, 1 veg-leiden.nl, 0 veg.lv, 0 -vega-is.com, 1 vega-rumia.com.pl, 1 vegaforeducation.com, 1 vegalanguageacademy.ca, 1 @@ -154114,7 +154175,7 @@ vendingsierra.com, 1 vendiot.com, 1 vendis.ai, 1 -vendiscapital.com, 1 +vendiscapital.com, 0 vendisrls.it, 1 venditorepoa.com.br, 1 vendloop.com, 1 @@ -154176,6 +154237,7 @@ veniceoarsman.com, 1 venicerealdeal.com, 1 venlafaxine.gq, 1 +venncare.com.au, 1 venndor.eu, 1 venndordiagram.com, 1 venndordiagram.eu, 1 @@ -154226,7 +154288,6 @@ venturum.de, 1 venturum.eu, 1 venturum.net, 1 -ventuseo.com, 1 ventusnavigation.com, 1 venuescanner.com, 1 venuescanner.net, 1 @@ -154240,6 +154301,7 @@ vepein.ga, 1 vepein.gq, 1 veply.com, 1 +ver-me.com, 1 ver.ma, 0 vera-1.ru, 1 verae.tk, 1 @@ -154258,6 +154320,8 @@ verascityscience.com, 1 verasoie.fr, 1 verata.co, 0 +veratlas.com, 1 +veraxiss.me, 1 verbacxss.it, 1 verbatimreporting.com, 1 verberne.nu, 1 @@ -154280,6 +154344,7 @@ vercel.org, 1 vercel.sh, 1 vercountyil.gov, 1 +verdant.works, 1 verdantnature.com, 1 verdensflag.dk, 1 verdeplus.net, 1 @@ -154289,6 +154354,7 @@ verdonkadvocaten.nl, 1 verduccies.com, 0 verdugosxerecistas.tk, 1 +verdurelle.bg, 1 veredadelaestrella.tk, 1 verein-kiekin.de, 1 vereinscheck.de, 1 @@ -154297,6 +154363,7 @@ verena.gallery, 1 vereshagino.tk, 1 verfassungsklage.at, 1 +vergaderenalmerehaven.nl, 1 verge-solutions.com, 1 vergelijksimonly.nl, 1 vergesense.com, 1 @@ -154329,7 +154396,6 @@ verifiny.com, 1 verifize.co.za, 1 verify-365.com, 0 -verify.gov.sg, 1 verifymyeligibility.com, 1 verifyos.com, 1 verifyyourip.com, 1 @@ -154345,6 +154411,7 @@ veritafineviolins.com, 1 veritas-data.de, 1 veritashomeschoolers.org, 1 +veritaslab.co, 1 veriteliberte.fr, 1 veriteslibertes.com, 1 veriteslibertes.fr, 1 @@ -154412,7 +154479,6 @@ vernonspeedskatingclub.com, 1 vernonvt.gov, 1 veronasera.it, 1 -veronaswellness.com, 1 veroncloud.com, 1 veronic.hu, 1 veronicasuperguide.nl, 1 @@ -154472,6 +154538,7 @@ vertexsmb.com, 1 vertexventures.co.il, 0 vertexventures.sg, 0 +vertexvps.com, 1 vertica.com, 1 verticalmindventures.com, 1 verticals.tk, 1 @@ -154531,7 +154598,6 @@ veselyjpovar.gq, 1 vesen.tk, 1 vesgroupinvest.com, 1 -vesinhcongnghiepttchome.com, 1 veski.hr, 0 vesmail.biz, 1 vesmail.email, 1 @@ -154548,7 +154614,7 @@ vestakassa-online.cf, 1 vestal.nl, 1 vestalny.gov, 1 -vestberry.com, 1 +vestberry.com, 0 vestd.com, 0 vestia.com.tr, 1 vestia.nl, 1 @@ -154575,6 +154641,7 @@ vetclick.com, 1 veteranarmy.com, 1 veteranpcs.com, 0 +veteranrealestatesa.com, 1 veterans-railcard.co.uk, 1 veteransadvantage.com, 1 veteranscrisisline.net, 1 @@ -154606,7 +154673,6 @@ vetrehabsummit.com, 1 vetren.tk, 1 vetreria.roma.it, 1 -vetres.net.au, 1 vetrnikyjavornickyhreben.cz, 1 vetrnikyrychleby.cz, 1 vets.gov, 1 @@ -154647,12 +154713,14 @@ vfree.org, 0 vfsglobal.com, 1 vfu.cz, 1 +vfxstudy.com, 1 vg-resource.com, 1 vg43.pt, 1 vgatest.nl, 1 vgbf.tk, 1 vgcheat.com, 1 vgdocs.com, 1 +vgep.nl, 1 vgerak.com, 1 vgfacts.com, 1 vgis.io, 1 @@ -154680,7 +154748,6 @@ via15.nl, 1 viabill.com, 1 viacdn.org, 1 -viacon.io, 1 viacu.org, 1 viaelegancestore.com.br, 1 viaenginfeed.com, 1 @@ -154745,7 +154812,7 @@ vician.cz, 1 vicicode.com, 1 vicinityindustrial.com.au, 1 -vicioanimal.pt, 1 +vicioanimal.pt, 0 viciousflora.com, 1 viciousracing.tk, 1 vicjuwelen-annelore.be, 1 @@ -154796,6 +154863,7 @@ victoriait.com.au, 1 victoriamn.gov, 1 victorianosaez.tk, 1 +victoriapolicefitnesstest.com.au, 1 victoriareporting.com, 1 victoriareporting.net, 1 victoriastudio.ru, 1 @@ -154823,7 +154891,7 @@ vicyu.com, 1 vidacalendaria.pt, 1 vidaliala.gov, 1 -vidanuevaparaelmundo.org, 1 +vidanuevaparaelmundo.org, 0 vidaparalela.tk, 1 vidapositiva.tk, 1 vidarity.com, 1 @@ -154833,7 +154901,7 @@ vidawichi.tk, 1 vidaxp.com, 1 vidb.me, 1 -vidboost.net, 1 +vidboost.net, 0 vidbuchanan.co.uk, 1 vidcruiter.com, 0 vide-dressing.org, 0 @@ -154913,6 +154981,8 @@ vidos.id, 1 vidracariaembh.com, 1 vidracariaespelhosbh.com.br, 1 +vidrasec.com, 1 +vids.cz, 1 vidulo.com, 1 vidyalayalms.com, 1 vidyamonk.com, 1 @@ -154962,7 +155032,6 @@ vientosur.info, 1 vieon.vn, 1 vierarkitekter.no, 1 -vieraskuu.org, 1 vierdaagsehotel.nl, 1 vieref.eu, 1 vierna.ga, 1 @@ -155008,11 +155077,13 @@ views4you.com, 1 viewstub.com, 1 viez.vn, 1 +vifluent.com, 1 vifranco.cl, 1 vifsoft.com, 1 viggio.com.br, 0 vigiaviesaitaly.com, 1 vigil.com, 0 +vigilaclick.com, 1 vigilance.ca, 1 vigilanciaysalud.com, 1 vigilantesporcolombia.org, 1 @@ -155043,7 +155114,7 @@ viikko.ml, 1 viilari.fi, 1 viilup.com, 1 -viio.me, 0 +viio.me, 1 viitanen.xyz, 1 vijay-international.com, 1 vijayam.ml, 1 @@ -155243,7 +155314,6 @@ ville-vif.fr, 1 villegasphoto.com, 1 villehardouin.fr, 1 -villejobbtp.com, 1 villek.fi, 1 villekaaria.eu, 1 villekautto.com, 1 @@ -155254,10 +155324,10 @@ villesalonen.fi, 1 villian.tk, 1 villitalia.nl, 1 -villnoesser-tal.com, 1 villu.ga, 1 villu.stream, 1 villup.com, 1 +vilna.io, 1 vilondo.com, 1 vilostore.my.id, 1 viltsu.net, 1 @@ -155383,8 +155453,8 @@ vinylplus.eu, 1 vinzer.tk, 1 vinzhelmets.com, 1 -vinzite.com, 1 vinzlocks.com, 1 +vinzrzo.fr, 1 viointel.com, 1 violapiekut.com, 1 violarenate.com, 1 @@ -155412,6 +155482,7 @@ vip6132.com, 1 vipaairportsp3.gov, 1 vipbox.city, 1 +vipc.cn, 1 vipcan.com, 1 vipenvia.com.br, 1 viper-drones.com, 1 @@ -155600,7 +155671,6 @@ visatitans.co.uk, 1 visatitans.com, 1 visaxplorer.com, 1 -visaya.com.co, 1 visceralsound.ca, 1 viscondedemaua.com.br, 1 visdetech.com, 1 @@ -155624,7 +155694,6 @@ visio.org, 0 vision-du-net.com, 1 vision-painting.com, 0 -vision-ridge.com, 1 vision-sonnenschein.de, 1 vision2005.tk, 1 visionagrupo.com, 1 @@ -155657,7 +155726,6 @@ visionxcreative.gq, 1 visionzerocfl.gov, 1 visionzeroreporting.com, 1 -visiquate.com, 1 visit-chiyoda.tokyo, 1 visit-ro.com, 1 visit-sanbenedettodeltronto.it, 1 @@ -155677,6 +155745,7 @@ visitcolumbusga.com, 1 visitconwaysc.gov, 1 visitcrete.com, 1 +visitdenbosch.nl, 1 visitdubai.com, 1 visiteasternoregon.com, 1 visiter-tunis.tk, 1 @@ -155758,6 +155827,7 @@ vitakov.tk, 1 vital-bg.com, 1 vital-heart.com, 1 +vital-strat.com, 1 vital.no, 1 vitalamin.at, 1 vitalamin.ch, 1 @@ -155840,7 +155910,6 @@ vittoria.pro, 1 vittoria.run, 1 vittoriaconseil.com, 1 -vittoriorestaurant.cz, 1 vitucho.tk, 1 vitus-meppen.de, 1 viv.fi, 1 @@ -156075,7 +156144,7 @@ vloenhout.nl, 1 vloggerfaire.com, 1 vloggerspace.tk, 1 -vlogmusic.io, 1 +vlogmusic.io, 0 vlos.com.pl, 1 vlovgr.se, 1 vltx.gr, 1 @@ -156153,11 +156222,13 @@ vns6969.com, 0 vnsc.org, 0 vntyper.org, 1 +vnumngr.com, 1 vnxf.vn, 1 vnya.loan, 1 voanaboa.pt, 1 voapt.by, 1 voatz.com, 1 +voboxcore.com, 1 vocably.de, 1 vocalcoach.com, 1 vocaloid.my, 1 @@ -156271,7 +156342,6 @@ vojk.au, 1 vojtat.cz, 1 vokabl.io, 1 -vokabula.com, 1 vokieciupamokos.lt, 1 vokimberlywi.gov, 1 vokov.ml, 1 @@ -156346,6 +156416,7 @@ vollmondstollen.de, 1 volnamista.cz, 1 volnamobile.ru, 1 +volo.global, 1 volochaevskiy.tk, 1 volochisk.tk, 1 voloder.net, 1 @@ -156359,14 +156430,14 @@ volreinsistemas.com, 1 volshebniki.ua, 1 volstatebank.com, 1 +volt-e.de, 1 volt.link, 1 volt.social, 1 volt.team, 1 -volta.io, 1 voltacircuit.com, 1 voltageelectricity.tk, 1 voltagevb.com, 1 -voltainsite.com, 1 +voltainsite.com, 0 voltalbania.org, 1 voltarengelprice.tk, 1 voltarengeneric.tk, 1 @@ -156395,6 +156466,7 @@ voltkosova.org, 1 voltkosovo.org, 1 voltletzebuerg.org, 1 +voltlinjeforening.no, 1 voltluxembourg.org, 1 voltluxemburg.org, 1 voltmagyarorszag.org, 1 @@ -156430,7 +156502,6 @@ volusiaelections.gov, 1 volusiasheriff.gov, 1 volusiavotes.gov, 1 -volveraslapelicula.com, 1 volvo-klub.cz, 1 volvo1800es.tk, 1 volvoklub.cz, 1 @@ -156496,7 +156567,6 @@ vortari.tk, 1 vorte.ga, 1 vortexbaits.com, 1 -vortexevents.net, 1 vortexflight.com, 1 vortexhosting.ga, 1 vortexplumbinginc.com, 1 @@ -156590,7 +156660,6 @@ votrespace.ca, 1 votrevoyagedenoces.fr, 1 vouchers4u.com, 1 -voucherx.co.uk, 1 vought-vip.com, 1 vous-etre-utile-ceidf.fr, 1 vous-les-jeunnes.tk, 1 @@ -156650,6 +156719,7 @@ vparilke.su, 1 vpbuilds.com, 1 vpcfiberglass.com, 1 +vpd-calculator.com, 1 vpetkov.tk, 1 vpex.de, 1 vpn-review.com, 1 @@ -156687,7 +156757,6 @@ vpsji.com, 1 vpsmore.com, 1 vpsou.com, 1 -vpspenergy.com, 1 vpsport.ch, 1 vpsssl.com, 1 vpstrial.net, 1 @@ -156880,7 +156949,6 @@ vroomvroomvroom.co.nz, 1 vros.co.id, 1 vrostove.tk, 1 -vrpornsites.xxx, 1 vrre.ag, 1 vrre.at, 1 vrre.biz, 1 @@ -156951,6 +157019,7 @@ vsee.com, 1 vsekulinar.ru, 0 vsem-reiki.tk, 1 +vsempodarok.com, 1 vsemrabota.ml, 1 vsenovosti.cf, 1 vseostile.ml, 1 @@ -156992,6 +157061,7 @@ vtbclub.xyz, 1 vtbs.moe, 1 vtcourts.gov, 1 +vtcynic.com, 1 vtech.com, 1 vtechda.com, 1 vtechhealthcare.com, 1 @@ -157018,10 +157088,8 @@ vtvnetwork.org, 1 vtwonen.be, 1 vtwonen.nl, 1 -vuasach.net, 1 vubgenerali.sk, 1 vue-sur-mer.com, 1 -vuefactory.io, 1 vuelacaruru.com, 1 vueworks.com, 1 vugt.me, 1 @@ -157048,7 +157116,6 @@ vulndetect.org, 1 vulnerability.ch, 1 vulnerabilityscans.nl, 1 -vulnerable.af, 1 vulns.sexy, 1 vulns.xyz, 1 vulnscan.org, 1 @@ -157057,7 +157124,6 @@ vultrhxl.com, 1 vulva.observer, 1 vulva.photos, 1 -vumea.top, 1 vumerity.com, 0 vunn.com, 1 vuojolahti.fi, 0 @@ -157086,7 +157152,6 @@ vvd.bz, 1 vvd.nl, 1 vvdbronckhorst.nl, 1 -vveactiefbeheer.nl, 0 vvelzen.com, 1 vvg-vermietung.de, 1 vvlemmer.tk, 1 @@ -157181,6 +157246,7 @@ w-graj.net, 1 w-hub.ru, 1 w-o-o.nl, 1 +w-oasis.co.jp, 1 w-p-k.de, 1 w-permission.com, 1 w-spotlight.appspot.com, 1 @@ -157208,6 +157274,7 @@ w36594.com, 1 w398.com, 1 w3app.nl, 1 +w3consult.org, 1 w3ctag.com, 1 w3ctag.org, 1 w3docs.com, 1 @@ -157229,7 +157296,6 @@ w4eg.de, 1 w4g-security.com, 1 w4nvu.org, 1 -w4r.nl, 1 w4solutions.de, 1 w4tec.de, 1 w4xzr.xyz, 0 @@ -157295,7 +157361,6 @@ wackyblackie.ml, 1 wackys.com, 1 wacotrib.com, 1 -wacpericias.com.br, 1 wacsports.com, 1 waddenzee.nl, 1 wade.gdn, 0 @@ -157322,7 +157387,6 @@ wageworks.com, 1 wagidopaczek.pl, 1 wagihakowe.pl, 1 -wagipaletowe.pl, 1 wagn3r.de, 1 wagrowieckierekodzielo.pl, 1 wagspuzzle.space, 1 @@ -157502,11 +157566,12 @@ waltermartmalls.com, 1 waltermartsupermarket.com, 1 waltermulders.be, 1 +waltio.com, 1 waltontrust.org, 1 waltthirion.com, 1 walutomat.pl, 1 wam-tech.com, 1 -wamdajo.com, 0 +wamdajo.com, 1 wamia.wa.gov.au, 1 wammu.eu, 1 wamobilisations.com.au, 1 @@ -157525,6 +157590,7 @@ wander.al, 0 wander.tk, 1 wanderaura.com, 1 +wandercabins.mx, 1 wanderersfc.tk, 1 wanderfost.com, 1 wanderfullcoven.tk, 1 @@ -157545,7 +157611,6 @@ wangcun.eu.org, 1 wangji.com, 1 wangjiatun.com.tw, 1 -wangjiezhe.com, 1 wangluoyunying.com, 1 wangpedersen.com, 1 wangpromherb.hu, 1 @@ -157603,7 +157668,6 @@ wapplerbrewing.com, 1 wapresri.go.id, 1 wapspaces.tk, 1 -wapsychiatry.com.au, 1 waptransfer.tk, 1 wapuru.co.jp, 1 wapveil.ml, 1 @@ -157621,6 +157685,7 @@ warcraftwikicz.tk, 1 ward.nl, 1 wardeath.tk, 1 +wardek.io, 1 wardemons.tk, 1 warden.navy, 1 wardnd.gov, 1 @@ -157659,6 +157724,7 @@ warhaggis.com, 1 warhistoryonline.com, 0 warid.ga, 1 +warigo.pl, 1 warispak.tk, 1 warking.ml, 1 warlions.info, 0 @@ -157796,6 +157862,7 @@ wastewaterservicesltd.co.uk, 0 wastewise.com, 0 wastrel.ch, 1 +wasunserwartet.de, 1 wasys.com.br, 1 wat.sh, 1 wataclinic.com, 1 @@ -157804,6 +157871,7 @@ wataugaonline.com, 1 wataugatx.gov, 1 watboeithet.nl, 1 +watbug.com, 1 watch-host.ga, 1 watch-wiki.org, 1 watchamovie.ga, 1 @@ -157814,6 +157882,7 @@ watchcow.org, 0 watchdis.tv, 1 watchdogs.tk, 1 +watchdogsmodding.com, 1 watchdreamer.com, 1 watchersrealm.tk, 1 watches-of-switzerland.co.uk, 1 @@ -157838,7 +157907,7 @@ watchfinder.hk, 1 watchfinder.hr, 1 watchfinder.hu, 1 -watchfinder.ie, 1 +watchfinder.ie, 0 watchfinder.is, 1 watchfinder.it, 1 watchfinder.lt, 1 @@ -157910,10 +157979,8 @@ waterlens.moe, 1 waterliteracy.tk, 1 waterloo-abba-show.de, 1 -waterloo1815.be, 1 waterloofaucets.com, 1 waterlootwpmi.gov, 1 -watermanaspen.co.uk, 1 watermarkktp.com, 1 watermarkly.com, 0 watermonitor.gov, 1 @@ -157952,6 +158019,7 @@ watisleukemie.tk, 1 watmar.com.au, 1 watnongpangtru.com, 1 +watobi.jp, 1 watongaok.gov, 1 watoo.tech, 1 watrd.com, 1 @@ -158087,7 +158155,6 @@ wc64.org, 1 wca.link, 1 wcaganalytics.com, 1 -wcally.com, 1 wcaquatics.org, 1 wcarc.ca, 0 wcatherinekendall.co.uk, 1 @@ -158116,6 +158183,7 @@ wcvb.com, 1 wcwcd.gov, 1 wcwcg.net, 1 +wcx.cx, 1 wd-api.com, 0 wd-ljt.com, 1 wd.is, 1 @@ -158134,6 +158202,7 @@ wdmg.com.ua, 1 wdmleds.com, 1 wdmn.eu, 1 +wdmodding.com, 1 wdmpa.org, 1 wdnmd.org, 1 wdntcr.com, 1 @@ -158142,7 +158211,6 @@ wdophoto.com, 1 wdpapi.io, 1 wdpui.io, 1 -wdrl.info, 0 wdsdownload.cf, 1 wdstrings.com, 1 wdt.cz, 0 @@ -158163,6 +158231,7 @@ wealthprofessional.ca, 1 wealthprojector.com, 1 wealthprojector.com.au, 1 +wealthsolutions.com, 1 wealthx.com, 1 wear-largesizes.tk, 1 wear-referrals.co.uk, 1 @@ -158183,18 +158252,17 @@ weareher.com, 1 weareincognito.org, 1 wearejh.com, 1 -wearemarketing.com, 1 wearemojo.com, 1 wearemoso.nl, 1 wearemullet.com, 1 wearenh.gov, 1 wearepapermill.co, 1 wearepapermill.com, 1 -wearepoo.com, 1 wearereasonablepeople.com, 0 wearereasonablepeople.nl, 0 wearesilverbullet.com, 1 wearesolomon.com, 1 +wearesolutions.com, 1 wearesuma.com, 1 wearetravellers.nl, 1 wearetuzag.com, 1 @@ -158213,7 +158281,7 @@ weatherbell.com, 1 weatherbell.net, 1 weatherfordfumc.com, 1 -weatherguard.com, 1 +weatherguard.com, 0 weathermelon.io, 1 weathernet.co.uk, 1 weatherproduct.ga, 1 @@ -158283,10 +158351,12 @@ web-wack.at, 1 web-warrior.de, 1 web-worker.cn, 1 +web-ya3.com, 1 web.ca, 1 web.de, 1 web.net, 1 web1212.top, 1 +web1n.com, 1 web22.eu, 1 web2ldap.de, 1 web2screen.tv, 1 @@ -158304,6 +158374,7 @@ webadiccion.net, 1 webadicta.net, 1 webadicto.net, 1 +webadish.co.uk, 0 webadmit.org, 1 webagenturschmid.ch, 1 webaholic.co.in, 1 @@ -158400,7 +158471,7 @@ webdesign-note.jp, 1 webdesignagency.cf, 1 webdesigncompanyindia.com, 1 -webdesignelftal.eu, 1 +webdesignelftal.eu, 0 webdesignersinchennai.tk, 1 webdesignfenua.tk, 1 webdesignplay.com, 1 @@ -158457,7 +158528,6 @@ webfoersterei.de, 1 webforce.pt, 1 webforthemasses.tk, 1 -webfrenz.com, 1 webfun.tk, 1 webgadgets.tk, 1 webgaku.net, 1 @@ -158580,7 +158650,6 @@ webnestify.cloud, 1 webnetmail4u.com, 1 webnexty.com, 1 -webnoob.net, 1 webo.agency, 1 webo.pl, 1 weboflies.tk, 1 @@ -158881,7 +158950,7 @@ weho.gov, 1 wehrmacht.org, 1 wei-mao.com.ua, 1 -wei.com, 0 +wei.com, 1 weibbb.com, 1 weibel.me, 1 weibomiaopai.com, 1 @@ -158934,6 +159003,7 @@ weisskircher.tk, 1 weissman.agency, 1 weisstech.com, 1 +weit-weg.de, 1 weiter.so, 1 weiterbildung-vdz.de, 1 weiterbildungsmonitor.eu, 1 @@ -158947,6 +159017,7 @@ wekibe.de, 1 wekipedia.com, 1 weknowhowtodoit.com, 1 +wekompare.fr, 1 welby.cat, 1 welcare.co.kr, 1 welcaremall.com, 0 @@ -158958,6 +159029,7 @@ welcomepowayan.tk, 1 welcometoohio.gov, 1 welcoop-logistique.com, 1 +welcorp.com, 1 weld.gov, 1 weldersnet.tk, 1 weldynz.co.nz, 1 @@ -158971,7 +159043,6 @@ wellbutrinxlgeneric.cf, 1 wellcarehealthsurvey.com, 1 wellcomemdhealth.com, 1 -welldeals.store, 1 welldoc.com, 0 welldocinc.com, 1 welldressedwalrus.com, 0 @@ -158999,6 +159070,7 @@ wellnesstravelhub.com, 1 wellnesszone.com, 1 welloffpodcast.ca, 1 +wellola.com, 1 wellpaid.hu, 1 wellreceived.com, 1 wellsbourne.co.uk, 1 @@ -159041,7 +159113,6 @@ welty.me, 1 wemadegod.tk, 1 wemake.cx, 1 -wemakeadifference.com.au, 1 wemakebookkeepingeasy.com, 1 wemakemx.mx, 1 wemakeonlinereviews.com, 1 @@ -159099,6 +159170,7 @@ werbewelt-tv.de, 1 werbezentrum-stiebler.de, 1 werbik.at, 1 +werbungmacher.de, 1 werehub.org, 1 wereldkoffie.eu, 1 wereldplanner.nl, 0 @@ -159124,7 +159196,6 @@ werkenbijmagentazorg.nl, 1 werkenbijpelsrijcken.nl, 1 werkenbijpromovendum.nl, 1 -werkenbijrexel.nl, 1 werkenbijsanitairwinkel.be, 1 werkenbijsanitairwinkel.nl, 1 werkenbijvanderventions.com, 1 @@ -159162,15 +159233,14 @@ weshopy.com, 1 wesl.cc, 1 wesleyanbank.co.uk, 1 -wesleymc.org, 1 wesleyville.gov, 1 wesleywarnell.com, 1 wesoco.de, 1 wespeakgeek.co.za, 1 wespeakk9.com, 1 -wespringforward.com, 1 wesreportportal.com, 1 wessafety.net, 1 +wesseldijk.eu, 1 wesseling.de, 1 wesselius.tk, 1 wessner.co, 0 @@ -159207,7 +159277,6 @@ westcoastpoly.com.au, 1 westcode.de, 1 westcountrydentalcrafts.uk, 1 -westcountrystalking.com, 1 westcreekna.org, 1 westendwifi.net, 1 westerdraai.tk, 1 @@ -159219,7 +159288,6 @@ westernmedia.ie, 1 westernpadermatologist.com, 1 westernparts.com, 0 -westernresourceadvocates.org, 1 westernriversidecog.gov, 1 westernskydental.com, 0 westernwaterca.gov, 1 @@ -159238,9 +159306,6 @@ westlake.com, 1 westlakehills.gov, 1 westlaketx.gov, 1 -westlakevillageelectric.com, 1 -westlakevillageelectrical.com, 1 -westlakevillageelectrician.com, 1 westland.eu, 1 westlandcultuur.tk, 1 westlander-nostalgie.tk, 1 @@ -159279,11 +159344,9 @@ westporthoney.com, 1 westportisland.gov, 1 westportok.gov, 1 -westreet-store.com, 1 westsalemwi.gov, 1 westsidechildrenstherapy.com, 1 westsidepackaging.com.au, 1 -westsidewinemsp.com, 1 westskinlaser.com, 1 westsoundwildlife.org, 1 westspace.org.uk, 1 @@ -159308,7 +159371,6 @@ weteam24.ru, 1 wetheghosts.eu, 1 wetheglobalpeople.com, 1 -wethemovement.org, 1 wetherbyvets.co.uk, 1 wetherspoonapprenticeshipacademy.co.uk, 1 wetnwild.com.au, 1 @@ -159321,7 +159383,7 @@ wettbuero.de, 1 wetter.de, 1 wetthost.com, 1 -wetu.com, 1 +wetu.com, 0 wetumpkaal.gov, 1 wevah.com, 0 wevape.online, 1 @@ -159338,6 +159400,7 @@ wexilapp.com, 1 wexller.com, 1 weyerstall1880.de, 1 +weygers.be, 1 wf-bigsky-master.appspot.com, 1 wf-demo-eu.appspot.com, 1 wf-demo-hrd.appspot.com, 1 @@ -159360,8 +159423,8 @@ wfrlee.com, 1 wfuogb.com, 1 wfxs.com.tw, 1 +wfy24.com, 1 wg-smue.de, 1 -wg-store.my.id, 1 wg-tools.de, 1 wg2023.com.br, 1 wgal.com, 1 @@ -159393,7 +159456,7 @@ wh-guide.de, 1 wh.gov, 1 wh966.com, 0 -whadda.uk, 0 +whadda.uk, 1 whakamatutu.org.nz, 1 whale-tales.org, 1 whalecrew.com, 1 @@ -159505,6 +159568,7 @@ wheredoi.click, 1 wheregoes.com, 1 whereicode.org, 0 +whereismyfair.com, 1 whereismyorigin.cf, 1 whereisthekeep.com, 1 whereiszakir.com, 1 @@ -159522,6 +159586,7 @@ whichgender.today, 1 whichphish.com, 1 whichwasfirst.com, 1 +whieda-plovdiv.com, 1 whiff-of-grape.ca, 0 whigfieldspain.tk, 1 whil.com, 1 @@ -159558,7 +159623,6 @@ whistleblower.report, 1 whistleblowerordning.com, 1 whistleblowers.gov, 1 -whistleblowers.org, 1 whistleblowersoftware.com, 1 whistlerbillboards.com, 1 whistlingdog.media, 0 @@ -159582,6 +159646,7 @@ whitebirdclinic.org, 1 whitebox.ga, 1 whitechristmas.com.au, 1 +whitecloudconcierge.com, 1 whitecollar.net, 1 whitecollarfraud.com, 1 whitecreekny.gov, 1 @@ -159688,7 +159753,6 @@ whoisamitsingh.com, 1 whoiscuter.ml, 1 whoiscutest.ml, 1 -whoisonthebench.com, 1 whoistheorchid.com, 1 whoiswho.tk, 1 wholebody.je, 1 @@ -159712,7 +159776,6 @@ whoopee.my, 0 whooshkaa.com, 1 whoownswhom.co.za, 1 -whop.com, 1 whoplusyou.com, 1 whoreofwallstreet.tk, 1 whorepresentsme.us, 1 @@ -159729,7 +159792,6 @@ wht.one, 1 whta.eu, 1 whta.se, 1 -whtcsj.com, 0 whwcornwall.co.uk, 1 why-brexit.uk, 1 why918.com, 0 @@ -159797,7 +159859,6 @@ widmer.bz, 1 widner.xyz, 1 widoj.gov, 1 -widow411.com, 1 widowsquad.com, 1 widsl.de, 1 widum.ru, 1 @@ -159822,6 +159883,7 @@ wienergyjobs.com, 1 wieobensounten.de, 1 wiesbadener-kurier.de, 1 +wieson.com, 1 wiet2home.nl, 1 wifesbank.com, 1 wifi-hack.com, 0 @@ -160059,7 +160121,6 @@ wildaboutarizona.com, 1 wildanalysis.ga, 1 wildbergh.tk, 1 -wildberries.lol, 1 wildbirdsuets.com, 1 wildbluepress.com, 1 wildcatdiesel.com.au, 1 @@ -160073,7 +160134,6 @@ wildern.org, 1 wildernessdestinations.com, 1 wildernpartnership.co.uk, 1 -wildeshausen272.de, 1 wildfilm.tv, 1 wildfire.gov, 1 wildfirechain.xyz, 1 @@ -160159,6 +160219,7 @@ williamle.com, 1 williammcgill.com, 1 williamparedes.tk, 1 +williamsburgservices.com.au, 1 williamscomposer.com, 1 williamscountyoh.gov, 1 williamsflintlocks.com, 0 @@ -160171,7 +160232,7 @@ willianchopin.tk, 1 willich.tk, 1 williejackson.com, 1 -willingness.ru, 1 +willingness.ru, 0 willistonpdvt.gov, 1 willit.fi, 1 willjackson.com, 1 @@ -160203,7 +160264,6 @@ willtc.uk, 1 willturner.tk, 1 willvision.com, 0 -willwilkins.com, 1 willwoodworth.com, 1 willywangstory.com.tw, 1 willywangstory.org, 1 @@ -160228,7 +160288,6 @@ wiltonsandstonequarry.com.au, 1 wiltrovira.com, 1 wiltshirehealthyschools.org, 1 -wimasons.foundation, 1 wimbledon.com, 1 wimbledon.org, 1 wimlanphen.nl, 1 @@ -160255,6 +160314,7 @@ win8.am, 1 win88-line.com, 1 win88-line.net, 1 +winabrandnew.com, 1 winampnederlands.tk, 1 winancreekbarn.com, 1 winario.de, 1 @@ -160329,6 +160389,7 @@ wine.com.my, 1 wine.my, 1 winebrasil.com.br, 1 +wineconnect.ai, 1 winedineunwind.org, 1 wineexperience.com.au, 1 wineforhelp.cz, 1 @@ -160391,6 +160452,7 @@ winnebagocountywi.gov, 1 winneconnesd3wi.gov, 1 winner.ua, 1 +winnerodds.com, 1 winnersaffiliate.com, 1 winnery.tk, 1 winnicadzika.pl, 1 @@ -160494,7 +160556,7 @@ wiris.be, 1 wirkaufen.it, 1 wirkaufendeinau.to, 1 -wirken.info, 1 +wirken.info, 0 wirksportal.com, 1 wirkstatt-lq.at, 1 wirkstatt-lq.ch, 1 @@ -160532,7 +160594,6 @@ wisdomise.io, 1 wisdomize.me, 1 wisdomteethonly.com, 1 -wisdomteethsydney.com.au, 1 wisdotplans.gov, 1 wise-parenting.com, 0 wise.design, 1 @@ -160550,6 +160611,7 @@ wisers.com.tw, 1 wisersp.com, 1 wisertp.com, 1 +wiseshifts.eu, 1 wisestatus.info, 1 wisetechglobal.cn, 1 wisetechglobal.com, 1 @@ -160558,6 +160620,7 @@ wiseupcorp.com, 1 wiseuplive.com.br, 1 wisewaynutrition.com, 1 +wish2025.com, 1 wishedu.com, 1 wishing3.com, 1 wishingyou.co.uk, 1 @@ -160605,6 +160668,7 @@ witez.net, 1 witgoedexpert.com, 1 with-environment.com, 1 +withacta.com, 1 withamscouts.org.uk, 1 withdati.fr, 1 withdcc.com, 1 @@ -160728,7 +160792,6 @@ wmar2news.com, 1 wmasphaltservices.com, 1 wmataoig.gov, 1 -wmbviaggi.it, 1 wmcuk.net, 1 wmcurrency.exchange, 1 wmcurrency.online, 1 @@ -160813,7 +160876,9 @@ wohlpa.de, 0 wohnbau-mobilitaet.ch, 1 wohnberatung-wien.at, 1 +wohnfrisch.de, 1 wohnsitz-ausland.com, 1 +wohnung-dus.de, 1 wohnungsaufloesung-berlin.net, 1 wohnungsbaukredit.ag, 1 wohnungsbaukredit.biz, 1 @@ -160843,6 +160908,7 @@ wolfachtal-alpaka.de, 1 wolfandleaf.com, 1 wolfarth.info, 1 +wolfbard.art, 1 wolfen-nord.social, 1 wolfermann.org, 1 wolfermans.com, 1 @@ -160982,6 +161048,8 @@ woodcock.cloud, 1 woodcountywi.gov, 1 woodcraftcompany.ru, 1 +woodenonesiesr.us, 1 +woodenonesiesrus.com, 1 woodenson.com, 1 woodev.us, 1 woodfarm2020.com, 1 @@ -161022,7 +161090,6 @@ woodward-vets.co.uk, 1 woodwicker.cl, 1 woodwing.cloud, 1 -woodwo.se, 1 woodworkcare.com, 1 woodworkingforabeginner.com, 1 woodwormtreatment.com, 1 @@ -161031,6 +161098,7 @@ woodysinstalaciones.com, 1 wooeffi.at, 1 woof.blue, 1 +woof.gq, 1 woofngoof.com, 1 woofsbakery.com, 1 woohoo.in, 1 @@ -161147,12 +161215,13 @@ workfromhomesites.ml, 1 workfromhometexas.tk, 1 workhandyman.com, 1 +workhorsemkt.com, 1 workin.space, 1 workindia.ml, 1 workinestonia.com, 0 working-group-cloudsecurityalliance.org, 1 workingclassmedia.com, 1 -workingfamilies.org.uk, 0 +workingfamilies.org.uk, 1 workinghardinit.work, 1 workingmachine.info, 1 workingpapers.biz, 1 @@ -161175,7 +161244,6 @@ workonit.cf, 1 workoutdigital.com, 1 workpass.co.uk, 1 -workperfect.com.au, 1 workplace.com, 1 workplace.tools, 1 workreap.tk, 1 @@ -161218,7 +161286,6 @@ world-politics.tk, 1 world-selena.tk, 1 world-tanks.tk, 1 -world-web.pro, 1 worldarmy.tk, 1 worldatwork.org, 1 worldbelow.tk, 1 @@ -161285,7 +161352,7 @@ worldjobs.tk, 1 worldjusticeproject.org, 1 worldlanguage.tk, 1 -worldline.com, 0 +worldline.com, 1 worldluxuryhome.tk, 1 worldmarathons.tk, 1 worldnewsinbox.ga, 1 @@ -161450,6 +161517,7 @@ wp-stack.pro, 1 wp-tao.com, 1 wp-webagentur.de, 1 +wp2date.com, 1 wpac.de, 1 wpadelaide.org, 1 wpauctions.com, 1 @@ -161474,7 +161542,6 @@ wpekspres.com, 1 wpetri.nl, 1 wpexplainer.com, 1 -wpfactory.io, 1 wpformation.com, 1 wpforum.tk, 1 wpg-verwaltungen.de, 1 @@ -161493,13 +161560,10 @@ wplicious.com, 1 wplistings.pro, 1 wpmafias.com, 1 -wpmaintenance.site, 1 wpmatik.com, 1 wpmeer.com, 1 wpmet.com, 1 -wpml.org, 1 wpmu-tutorials.de, 1 -wpna.fm, 1 wpnesia.id, 1 wpnews.cf, 1 wpnews.ga, 1 @@ -161588,6 +161652,7 @@ writeandedit-for-you.com, 1 writeaword.tk, 1 writebrigade.com, 1 +writememos.com, 1 writemyessay.today, 1 writemyessays.com, 1 writemypaperhub.com, 1 @@ -161617,7 +161682,6 @@ writingiswork.ga, 1 writingpapersonlineformoney.ga, 1 writingtoserve.net, 1 -writtenandrecorded.com, 1 writtenhorror.com, 1 writtenworld.bg, 1 wrm.sr, 1 @@ -161636,7 +161700,6 @@ ws3917.space, 1 wsa.poznan.pl, 1 wsadek.ovh, 1 -wsave.be, 1 wsb.pl, 1 wsc.rip, 1 wscauth.de, 1 @@ -161680,7 +161743,6 @@ wtfast.com, 1 wtfbryan.com, 0 wtfindonesia.tk, 1 -wtfit.io, 1 wtfnope.org, 1 wth-security.nl, 1 wth.in, 1 @@ -161804,7 +161866,6 @@ wwtg.gov, 1 wwv-8522.com, 1 wwv-8722.com, 1 -wwvip88.com, 1 www-2998hh.com, 1 www-33445.com, 1 www-38978.com, 1 @@ -161910,6 +161971,7 @@ www.tl, 1 www.torproject.org, 0 www.tumblr.com, 0 +www.twitter.com, 1 www.united.com, 1 www.usaa.com, 0 www.vino.com, 0 @@ -161980,6 +162042,7 @@ wyomingvalleyjuniorspartans.org, 1 wypiska.pl, 1 wypozyczalniasamochodowkrakow.gq, 1 +wypracowania.pl, 1 wyprawywedkarskiepremium.pl, 1 wyrickstaxidermy.com, 1 wyrihaximus.net, 1 @@ -162046,6 +162109,7 @@ x3650.de, 1 x36533.com, 1 x378.ch, 1 +x3flow.net, 1 x44.at, 0 x500658.com, 1 x5197.co, 1 @@ -162061,6 +162125,7 @@ x7719.com, 0 x77jj.com, 1 x77nn.com, 1 +x7blog.com, 1 x81vv.com, 1 x86.pet, 1 x90.im, 1 @@ -162078,6 +162143,7 @@ xacobeoexperience.com, 1 xactadent.com, 1 xad.ch, 1 +xadwm.top, 1 xage.com, 1 xaira.com, 0 xajh.org, 1 @@ -162101,6 +162167,7 @@ xareltohcp.com, 1 xarmenta.tk, 1 xatr0z.org, 0 +xauzit.com, 0 xav.ie, 1 xaver.exchange, 1 xavi.re, 1 @@ -162182,7 +162249,6 @@ xbjt77.com, 1 xblau.com, 1 xbox, 1 -xbox-mag.net, 1 xboxachievements.com, 1 xboxdynasty.de, 1 xbrlsuccess.appspot.com, 1 @@ -162246,6 +162312,7 @@ xcw8888.net, 0 xcw8889.net, 0 xcxmiku.com, 0 +xcysy.top, 1 xd.cm, 1 xd.gd.cn, 1 xd.gov, 1 @@ -162265,15 +162332,14 @@ xdty.org, 1 xduce.com, 1 xeditpro.com, 1 -xeerpa.com, 1 xeforce.com, 1 xehopdongmuine.vn, 1 xehost.com, 1 xeiropraktiki.gr, 1 +xelencure.com, 1 xelesante.jp, 1 xelionai.com, 1 xemptsecurity.com, 1 -xenaidigital.xyz, 1 xencrystal.me, 1 xenfo.ro, 1 xenforo.forum, 1 @@ -162312,6 +162378,7 @@ xertainty.com, 1 xertainty.de, 1 xetown.com, 1 +xeve.io, 1 xevietanh.com, 1 xevnet.com, 1 xevolkswagen.com, 1 @@ -162397,7 +162464,7 @@ xice.wang, 1 xicreative.net, 1 xiecongan.org, 1 -xiedeacc.com, 0 +xiedeacc.com, 1 xiexiexi.com, 1 xif.at, 1 xifrem.com, 1 @@ -162408,7 +162475,6 @@ xillimite.com, 1 xilnex.com, 1 xilo.net, 1 -xiluetmiami.com, 1 xiluo-sweet-home.tw, 1 ximes.cloud, 1 ximes.com, 1 @@ -162589,7 +162655,6 @@ xlblinds.nl, 1 xldl.ml, 1 xlem.cn, 1 -xler8r.com, 0 xlhalliance.org, 1 xlnaudio.com, 1 xloud.cf, 1 @@ -162709,6 +162774,8 @@ xn--4brt03c.xn--fiqs8s, 1 xn--4brt03c.xn--io0a7i, 1 xn--4gq45ay49m.com, 1 +xn--4gq45ay49m.xn--fiqs8s, 1 +xn--4gq45ay49m.xn--fiqz9s, 1 xn--4gq62f52gdss.com, 1 xn--4kro7fswi.xn--6qq986b3xl, 1 xn--4qs85t91oq9e.com, 1 @@ -162783,7 +162850,6 @@ xn--80aleen8i.site, 1 xn--80aleen8i.xn--c1avg, 1 xn--80ancacgircb8q.xn--p1ai, 1 -xn--80anogxed.xn--p1ai, 1 xn--80aocgsfei.xn--p1ai, 1 xn--80aod6g.tk, 1 xn--80apaljb0ajh8a3d.xn--p1ai, 1 @@ -162798,7 +162864,6 @@ xn--90adahrqfmec.xn--p1ai, 1 xn--90adu.xn--90a3ac, 1 xn--90agmsorb.tk, 1 -xn--90aij9af3f.com.ua, 1 xn--90aimoos.tk, 1 xn--90aizn.tk, 1 xn--90amdjbi3c0ec.xn--p1ai, 1 @@ -163001,8 +163066,10 @@ xn--jkaappi-5waa.fi, 1 xn--jlq480n2rg, 1 xn--jp8hx8f.ws, 1 +xn--jx2a33n.com, 1 xn--kckd0bd4a8tp27yee2e.com, 1 xn--keditr-0xa.biz, 1 +xn--kferkind-0za.ch, 1 xn--kinsthetik-s5a.ch, 1 xn--kkcon-fwab.nz, 1 xn--kl-oja.is, 1 @@ -163149,7 +163216,7 @@ xn--srenpind-54a.dk, 1 xn--ss-sein-fetzt-wob.de, 1 xn--strandhaus-hinter-der-dne-1wc.de, 1 -xn--stubbfrsning-uppsala-hzb.se, 1 +xn--stubbfrsning-uppsala-hzb.se, 0 xn--super-visionr-mfb.de, 1 xn--svezavaukuu-ulb08i.rs, 1 xn--sz8h.ml, 1 @@ -163172,6 +163239,7 @@ xn--u9j920h4sbt5ex10f.online, 1 xn--u9j933ksxs6hu.com, 1 xn--u9jv84l7ea468b.com, 1 +xn--u9jw87h6tdi4hqls.com, 1 xn--u9jy16ncfao19mo8i.nagoya, 1 xn--uba.eu.org, 1 xn--ug8h.st, 1 @@ -163285,10 +163353,10 @@ xosh.fr, 1 xot.gr, 1 xotaku.com, 1 -xotictrends.com, 1 xotika.tv, 1 xoue.com, 1 xoutpost.com, 1 +xovv.io, 1 xp-ochrona.pl, 1 xp.nsupdate.info, 1 xparts.com.tr, 1 @@ -163384,13 +163452,11 @@ xt.om, 1 xt177.com, 1 xt71uc.top, 1 -xtaboo3d.com, 1 xtarget.ru, 1 xtdowner.com, 1 xtec.eu.org, 1 xtechtecnologia.tec.br, 1 xtendafin.com, 1 -xtexx.eu.org, 1 xtianhe.com, 0 xtime.com, 1 xtips.us, 1 @@ -163512,7 +163578,6 @@ xurl.ltd, 1 xushuai.org, 1 xusqui.com, 1 -xuvero.com, 1 xuwei.de, 1 xuxiao.click, 1 xuyh0120.win, 1 @@ -163583,7 +163648,6 @@ xyactive.com.au, 1 xyenon.bid, 1 xyfindit.com, 1 -xyfun.net, 0 xyl.cool, 1 xylexa.ai, 1 xylimelts.com.au, 1 @@ -163853,7 +163917,6 @@ yanik.info, 1 yanisvaroufakis.eu, 1 yaniv.tv, 1 -yankeeinstitute.org, 1 yann.tw, 1 yannic.world, 0 yannickkordel.de, 1 @@ -163938,7 +164001,6 @@ yash.com, 1 yashima-shika.com, 1 yashinstore.com, 1 -yashu.store, 1 yasic.net, 1 yasikish.com, 1 yasking.org, 1 @@ -163991,6 +164053,7 @@ yay-btcl.work, 1 yay.space, 1 yayart.club, 1 +yayfor.me.uk, 1 yayginegitim.net, 1 yayl888.com, 1 yaymaker.com, 1 @@ -164118,6 +164181,7 @@ yenbainet.tk, 1 yengec.co, 1 yenhughes.law, 1 +yeniasir.com.tr, 1 yennhi.co, 1 yenpape.com, 1 yenphat.vn, 1 @@ -164169,7 +164233,6 @@ yetishirt.com, 0 yetivisite.ch, 1 yetkiliservisrehberi.com, 1 -yevhen.cc, 1 yewan.cf, 1 yewan.ml, 1 yewtu.be, 1 @@ -164327,11 +164390,8 @@ yodaremote.tk, 1 yodelmobile.com, 1 yodocon.com, 1 -yoga-bien-etre.com, 1 yoga-erde.de, 0 -yoga-good.fr, 1 yoga-in-aying.de, 1 -yoga-prive.de, 1 yoga-zentrum-narayani.de, 1 yoga.is-an-engineer.com, 1 yogaangels.ga, 1 @@ -164389,8 +164449,6 @@ yoloyolo.top, 0 yomena.in, 1 yomeuno.com, 1 -yomiren.co.jp, 1 -yomiya.eu.org, 1 yon.co.il, 0 yonalink.com, 0 yoneda-paint.com, 1 @@ -164411,6 +164469,7 @@ yopers.com, 0 yopmail.com, 1 yopmail.net, 1 +yopongolacasaconhomecenter.com, 1 yoppoy.com, 1 yops.info.pl, 1 yoramvandevelde.net, 1 @@ -164422,6 +164481,7 @@ yore.tk, 1 yorganica.ga, 1 yorgosbos.nl, 1 +yorickpeterse.com, 1 yorkcountyne.gov, 1 yorkcountysc.gov, 1 yorkcountyschools.org, 1 @@ -164447,7 +164507,6 @@ yosbeda.com, 1 yosefsa.xyz, 1 yosemo.de, 1 -yosh.is, 1 yosheenetwork.fr, 1 yoshibaworks.com, 1 yoshikawa-koumuten.co.jp, 1 @@ -164466,11 +164525,13 @@ yoto.at, 0 yotpinx.com, 0 yotta-zetta.com, 1 +yottaes.com, 1 yottahash.net, 1 yotubaiotona.net, 1 you-working.ru, 1 you.bo, 0 you15iv.com, 1 +youandmedating.in, 1 youandmepps.com.au, 1 youbehero.com, 1 youber.cz, 1 @@ -164524,7 +164585,6 @@ youkyi.fr, 1 youla.gq, 1 youla.ru, 1 -youlayla.com, 1 youlivewesnap.com, 1 youlovehers.com, 1 youmeandjunee.com.au, 1 @@ -164548,7 +164608,6 @@ younglabour.co.nz, 1 younglabour.nz, 1 younglabour.org.nz, 1 -youngleaderssummit.com.ng, 1 younglions.cf, 1 youngmodelsagency.tk, 1 youngpeopleunited.co.uk, 1 @@ -164590,6 +164649,7 @@ yourbreakfast.tk, 1 yourbristolsomerset.wedding, 1 yourbusiness.ml, 1 +yourbusiness.technology, 1 yourbusinessblueprint.com, 1 yourcareerhost.com, 1 yourcheshiremerseyside.wedding, 1 @@ -164651,6 +164711,7 @@ yourlegacy.team, 1 yourlgpd.com, 1 yourlifespirit.de, 1 +yourlink.me, 1 yourloan.gq, 1 yourlondon.wedding, 1 yourlovesong.com.mx, 1 @@ -164800,6 +164861,7 @@ yspa.tv, 1 yspertal.party, 1 ystral.com, 1 +ystv.co.uk, 1 ysuna.xyz, 1 yt-downloader.xyz, 0 yt.kg, 1 @@ -164824,6 +164886,7 @@ yu.nm.cn, 1 yu.vc, 1 yuan.ga, 1 +yuan.idv.tw, 1 yuan.nctu.me, 1 yuan.ren, 1 yuanandyuan.info, 1 @@ -164890,10 +164953,12 @@ yukonconnector.com, 1 yukonlip.com, 1 yukoslibrary.ga, 1 +yukselgorev.com, 1 yula.cf, 1 yulaiz.com, 1 yulamerola.com.br, 1 yule.hk, 1 +yule.ink, 1 yuleyule88game.com, 1 yuliana-hotel.com, 1 yulsn.io, 1 @@ -164939,6 +165004,7 @@ yuquepay.com, 1 yura.cf, 1 yuricarlenzoli.it, 1 +yurigui.com, 1 yurihi.net, 1 yurikirin.me, 1 yuriland.xyz, 1 @@ -164962,6 +165028,7 @@ yuucchi.com, 1 yuuki0xff.jp, 1 yuumari.com, 1 +yuumpk.ru, 1 yuvagalam.com, 1 yuvaskillfoundation.org, 1 yuweetek.com, 0 @@ -165084,6 +165151,7 @@ z6729.co, 1 z6882.com, 1 z6957.co, 1 +z6services.com.br, 1 z6wang.com, 1 z8011.com, 1 z8012.com, 0 @@ -165162,7 +165230,6 @@ zachaysan.com, 1 zachbolinger.com, 1 zachborboa.com, 1 -zachgibbens.org, 1 zachiti.com, 1 zachranari.tk, 1 zachschneider.ca, 1 @@ -165175,6 +165242,7 @@ zaclys.com, 0 zad-academy.com, 1 zadania.wiki, 1 +zadgroup.com.my, 1 zadm.de, 1 zadrot.tk, 1 zadroweb.com, 1 @@ -165212,7 +165280,6 @@ zahnarzt.se, 1 zahnarztpraxis-cevikel.de, 1 zahnarztpraxis-schaerding.at, 1 -zahnarztpraxis-simone-koch.de, 1 zahnarztpraxis-ural.de, 1 zahrowski.com, 1 zaija.tk, 1 @@ -165401,6 +165468,7 @@ zarja.tk, 1 zarjadnik.tk, 1 zarla.com, 1 +zarlaa.shop, 0 zarlacdn.com, 1 zarladomains.com, 1 zarlasites.com, 1 @@ -165416,9 +165484,11 @@ zaruhi.ml, 1 zary.me, 1 zas4eku.tk, 1 +zasbury.com, 1 zaschtnik.ga, 1 zastenchivost.tk, 1 zasudili.ru, 1 +zataz.com, 1 zaterdagwelpen.tk, 1 zatey.ru, 1 zatp.com, 0 @@ -165562,6 +165632,7 @@ zdxiaoda.me, 1 zdymak.by, 1 ze-mag.info, 1 +ze-seo.fr, 1 ze3kr.com, 1 zeal-and.jp, 1 zeal-interior.com, 1 @@ -165670,9 +165741,12 @@ zen-zone.tk, 1 zenaliva.com, 1 zenassociates.com, 1 +zenbalans.nl, 1 zenbox.pl, 1 zenchain.com, 1 zencube.ga, 1 +zencurity.com, 1 +zencurity.dk, 1 zendarhunters.tk, 1 zendave.au, 1 zendev.ga, 1 @@ -165705,7 +165779,6 @@ zenless.top, 1 zenlogic.com, 1 zenmail.ga, 1 -zenmassageusa.com, 1 zenmod.in.rs, 1 zenneo.com, 1 zenniereport.com, 1 @@ -165787,6 +165860,7 @@ zerolink.es, 1 zeromoment.marketing, 1 zeronet.io, 1 +zeroone.sk, 1 zeroplast24.ru, 1 zeroq.cl, 1 zeroscaler.io, 1 @@ -165798,6 +165872,7 @@ zerotoone.studio, 0 zerotrust.plus, 1 zerotwo.ga, 1 +zerowanlabs.com, 1 zerowastesonoma.gov, 1 zeroz.cf, 1 zeroz.ga, 1 @@ -165828,6 +165903,7 @@ zetsubou.games, 1 zettaplan.ru, 1 zettaport.com, 1 +zettatek.com, 1 zettlmeissl.de, 1 zety.com, 1 zety.es, 1 @@ -165842,6 +165918,7 @@ zevenbergenbos.tk, 1 zevrobroker.com, 1 zewtie.com, 1 +zeydoo.com, 1 zeyoking.com, 1 zezov.com, 1 zf.com, 1 @@ -165887,7 +165964,7 @@ zhangyiming.tech, 1 zhanwei.me, 1 zhanxiangyang.com, 1 -zhanzhangb.cn, 0 +zhanzhangb.cn, 1 zhanzhangb.com, 0 zhaochen.xyz, 1 zhaochengtan.com, 1 @@ -165920,7 +165997,6 @@ zhestokijavtor.tk, 1 zhewang.com, 1 zhi.ci, 1 -zhiboba.fun, 1 zhidkiy-kashtan.ga, 1 zhihua-lai.com, 1 zhijikaoyan.com, 1 @@ -165958,6 +166034,7 @@ zhouzanxi.com, 1 zhovner.com, 1 zhref.ch, 1 +zhrhello.top, 1 zhthings.com, 1 zhuhuo.cc, 1 zhuji.com, 1 @@ -165973,6 +166050,7 @@ zhumadilov.kz, 1 zhunlink.com, 1 zhurnalyu.ga, 1 +zhutipu.com, 1 zhuweiwei.cn, 1 zhyz.nl.eu.org, 1 zhz.moe, 1 @@ -166021,7 +166099,6 @@ zillum.com, 1 zilon.com.co, 1 zilore.com, 1 -zilpay.io, 1 zilsen.com, 1 zilv.life, 1 zilver.nl, 1 @@ -166044,7 +166121,6 @@ zinabnews.tk, 1 zinchenko.gq, 1 zindagilive.tk, 1 -zindec.com, 1 zinewords.com, 1 zing.com.pl, 1 zing.me, 1 @@ -166143,7 +166219,6 @@ zkvi.nl, 1 zkz.kz, 1 zl-19.com, 1 -zl-29.com, 1 zl-59.com, 1 zl-89.com, 1 zl.lv, 1 @@ -166184,10 +166259,8 @@ zlatatlapka.cz, 1 zlatograd.bg, 1 zlatom.ru, 1 -zlatyruce.cz, 1 zlavomat.sk, 1 zlhuodong.vip, 1 -zlima12.com, 1 zlogin.nl, 1 zlotykameleon.tk, 1 zlotyslawecin.tk, 1 @@ -166202,7 +166275,6 @@ zmcyclefitness.com, 1 zmeya.tk, 1 zmgroup.cz, 1 -zmiguel.me, 0 zmizelasumava.cz, 1 zmk.fr, 1 zmprjg.ml, 1 @@ -166344,6 +166416,7 @@ zoko.tk, 1 zokuomthawn.tk, 1 zollernalbtour.de, 1 +zolline.com, 1 zollo-hauswartung.ch, 1 zollprozess.ch, 1 zoloft-medication.ml, 1 @@ -166427,6 +166500,7 @@ zonneglossis.tk, 1 zonnenberg.de, 1 zonnigduiven.nl, 1 +zonopoly.io, 1 zontractors.com, 1 zoo-tver.ru, 1 zooforum.tk, 1 @@ -166565,7 +166639,7 @@ zsnm.pl, 1 zsoltbereczki.tk, 1 zsplesivec.cz, 1 -zsq.im, 1 +zsq.im, 0 zsrbcs.com, 1 zstaticcdn.com, 1 zstgmnachod.cz, 1 @@ -166577,18 +166651,20 @@ ztable.io, 1 ztalk.org, 1 ztctarrin.com, 1 +zten.org, 1 ztickerz.nl, 1 ztmovies.cf, 1 ztn.sh, 1 ztt.im, 1 ztv.su, 1 -zuan-in.com, 1 +zuan-in.com, 0 zuan-in.net, 1 zubel.it, 1 zubenciy.tk, 1 zubilo-perm.ru, 1 zubr.net, 1 zubro.net, 0 +zuby.pro, 1 zuccarellostiftelsen.no, 1 zuccolivillage.com.au, 1 zudomc.me, 1 @@ -166610,6 +166686,8 @@ zuiverjegeest.nl, 1 zuiververloskundigen.nl, 1 zukong.party, 1 +zukunft-immobilienverwaltung.de, 1 +zukunft-immobilienwirtschaft.de, 1 zukunft-mobilitaet.net, 1 zukunft-niederrhein.de, 1 zukunftswege.at, 1 @@ -166688,7 +166766,6 @@ zwitterion.au, 1 zwitterion.org, 1 zwk.de, 1 -zwnews.com, 1 zwofroue.ch, 1 zwolle1.nl, 1 zwollemag.nl, 1 @@ -166764,6 +166841,7 @@ zzops.nl, 1 zzops.org, 1 zzphuis.nl, 1 +zzprisico.nl, 1 zzsec.org, 1 zzw.ca, 1 zzz-diary.com, 1 diff -Nru thunderbird-140.9.0esr/security/manager/tools/PreloadedHPKPins.json thunderbird-140.10.0esr/security/manager/tools/PreloadedHPKPins.json --- thunderbird-140.9.0esr/security/manager/tools/PreloadedHPKPins.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/tools/PreloadedHPKPins.json 2026-04-21 14:52:59.000000000 +0000 @@ -26,8 +26,8 @@ { "chromium_data" : { - "cert_file_url": "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static.pins?format=TEXT", - "json_file_url": "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static_pins.json?format=TEXT", + "cert_file_url": "https://raw.githubusercontent.com/chromium/chromium/refs/heads/main/net/http/transport_security_state_static.pins", + "json_file_url": "https://raw.githubusercontent.com/chromium/chromium/refs/heads/main/net/http/transport_security_state_static_pins.json", "substitute_pinsets": { // Use the larger google_root_pems pinset instead of google "google": "google_root_pems" diff -Nru thunderbird-140.9.0esr/security/manager/tools/log_list.json thunderbird-140.10.0esr/security/manager/tools/log_list.json --- thunderbird-140.9.0esr/security/manager/tools/log_list.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/manager/tools/log_list.json 2026-04-21 14:52:59.000000000 +0000 @@ -1,6 +1,6 @@ { - "version": "85.16", - "log_list_timestamp": "2026-03-15T13:34:00Z", + "version": "85.43", + "log_list_timestamp": "2026-04-12T13:36:12Z", "operators": [ { "name": "Google", diff -Nru thunderbird-140.9.0esr/security/nss/cpputil/nss_scoped_ptrs.h thunderbird-140.10.0esr/security/nss/cpputil/nss_scoped_ptrs.h --- thunderbird-140.9.0esr/security/nss/cpputil/nss_scoped_ptrs.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/cpputil/nss_scoped_ptrs.h 2026-04-21 14:53:00.000000000 +0000 @@ -56,6 +56,15 @@ void operator()(SEC_PKCS12DecoderContext* dcx) { SEC_PKCS12DecoderFinish(dcx); } + void operator()(SEC_PKCS7DecoderContext* dcx) { + SEC_PKCS7ContentInfo* cinfo = SEC_PKCS7DecoderFinish(dcx); + if (cinfo) { + SEC_PKCS7DestroyContentInfo(cinfo); + } + } + void operator()(SEC_PKCS7ContentInfo* cinfo) { + SEC_PKCS7DestroyContentInfo(cinfo); + } void operator()(NSSInitContext* init) { NSS_ShutdownContext(init); } }; @@ -96,6 +105,8 @@ SCOPED(SECKEYPublicKey); SCOPED(SECMODModule); SCOPED(SEC_PKCS12DecoderContext); +SCOPED(SEC_PKCS7DecoderContext); +SCOPED(SEC_PKCS7ContentInfo); #undef SCOPED diff -Nru thunderbird-140.9.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst thunderbird-140.10.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst --- thunderbird-140.9.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/doc/rst/releases/nss_3_112_4.rst 2026-04-21 14:52:59.000000000 +0000 @@ -0,0 +1,52 @@ +.. _mozilla_projects_nss_nss_3_112_4_release_notes: + +NSS 3.112.4 release notes +======================== + +`Introduction <#introduction>`__ +-------------------------------- + +.. container:: + + Network Security Services (NSS) 3.112.4 was released on *13 April 2026**. + +`Distribution Information <#distribution_information>`__ +-------------------------------------------------------- + +.. container:: + + The HG tag is NSS_3_112_4_RTM. NSS 3.112.4 requires NSPR 4.36 or newer. + + NSS 3.112.4 source distributions are available on ftp.mozilla.org for secure HTTPS download: + + - Source tarballs: + https://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/NSS_3_112_4_RTM/src/ + + Other releases are available :ref:`mozilla_projects_nss_releases`. + +.. _changes_in_nss_3.112.4: + +`Changes in NSS 3.112.4 <#changes_in_nss_3.112.4>`__ +------------------------------------------------------------------ + +.. container:: + + - Bug 2030135 - improve error handling in PK11_ImportPrivateKeyInfoAndReturnKey. + - Bug 2029752 - Improving the allocation of S/MIME DecryptSymKey. + - Bug 2029462 - store email on subject cache_entry in NSS trust domain. + - Bug 2029425 - Heap use-after-free in cert_VerifyCertChainOld via dangling certsList[] entry on NameConstraints violation. + - Bug 2029323 - Improve size calculations in CMS content buffering. + - Bug 2028001 - avoid integer overflow while escaping RFC822 Names. + - Bug 2027378 - Reject excessively large ASN.1 SEQUENCE OF in quickder. + - Bug 2027365 - Deep copy profile data in CERT_FindSMimeProfile. + - Bug 2027345 - Improve input validation in DSAU signature decoding. + - Bug 2026311 - avoid integer overflow in RSA_EMSAEncodePSS. + - Bug 2019357 - RSA_EMSAEncodePSS should validate the length of mHash. + - Bug 2026156 - Add a maximum cert uncompressed len and tests. + - Bug 2026089 - Clarify extension negotiation mechanism for TLS Handshakes. + - Bug 2023209 - ensure permittedSubtrees don't match wildcards that could be outside the permitted tree. + - Bug 2023207 - Fix integer underflow in tls13_AEAD when ciphertext is shorter than tag. + - Bug 2019224 - Remove invalid PORT_Free(). + - Bug 1964722 - free digest objects in SEC_PKCS7DecoderFinish if they haven't already been freed. + - Bug 1935995 - make ss->ssl3.hs.cookie an owned-copy of the cookie. + diff -Nru thunderbird-140.9.0esr/security/nss/gtests/der_gtest/der_gtest.gyp thunderbird-140.10.0esr/security/nss/gtests/der_gtest/der_gtest.gyp --- thunderbird-140.9.0esr/security/nss/gtests/der_gtest/der_gtest.gyp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/gtests/der_gtest/der_gtest.gyp 2026-04-21 14:53:00.000000000 +0000 @@ -14,6 +14,7 @@ 'der_getint_unittest.cc', 'der_quickder_unittest.cc', 'p12_import_unittest.cc', + 'p7_import_unittest.cc', 'secasn1decode_unittest.cc', '<(DEPTH)/gtests/common/gtests.cc' ], diff -Nru thunderbird-140.9.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc thunderbird-140.10.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc --- thunderbird-140.9.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/gtests/der_gtest/p12_import_unittest.cc 2026-04-21 14:53:00.000000000 +0000 @@ -231,6 +231,13 @@ 0x51, 0x04, 0x08, 0xa1, 0x52, 0xdd, 0x64, 0x46, 0xe9, 0x9e, 0x3e, 0x02, 0x02, 0x08, 0x00}; +unsigned char leak_p12[] = { + 0x30, 0x82, 0x20, 0x20, 0x02, 0x01, 0xff, 0x30, 0x82, 0x09, 0x20, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x50, + 0x30, 0x3f, 0x02, 0x01, 0x20, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x30, 0x20, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01}; + class PK12ImportTest : public ::testing::Test {}; TEST_F(PK12ImportTest, ImportPK12With2P7) { @@ -248,4 +255,20 @@ ASSERT_EQ(SECFailure, rv); } +TEST_F(PK12ImportTest, FailsToImportButShouldNotLeak) { + SECItem password = {siBuffer, nullptr, 0}; + ScopedPK11SlotInfo slot(PK11_GetInternalSlot()); + ScopedSEC_PKCS12DecoderContext dcx( + SEC_PKCS12DecoderStart(&password, slot.get(), nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS12DecoderUpdate( + dcx.get(), const_cast(leak_p12), sizeof(leak_p12)); + ASSERT_EQ(SECSuccess, rv); + rv = SEC_PKCS12DecoderVerify(dcx.get()); + // This is not a valid PKCS12 file, so a failing return value is expected. + // However, the implementation shouldn't leak memory as a result. + ASSERT_EQ(SECFailure, rv); +} + } // namespace nss_test diff -Nru thunderbird-140.9.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc thunderbird-140.10.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc --- thunderbird-140.9.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/gtests/der_gtest/p7_import_unittest.cc 2026-04-21 14:53:00.000000000 +0000 @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* 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 "nss.h" +#include "secpkcs7.h" + +#include "gtest/gtest.h" +#include "nss_scoped_ptrs.h" + +namespace nss_test { + +// This is an invalid PKCS7 message. Among other things, it contains some +// unknown hash OIDs. This should fail to parse, but it should be safe to try. +static const uint8_t p7_with_unknown_hashes[] = { + 0x30, 0x4d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x02, 0xa0, 0x40, 0x30, 0x3e, 0x02, 0x01, 0x20, 0x31, 0x27, 0x30, 0x0b, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05, 0x30, + 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05, + 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x04, 0x30, 0x10, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x07, 0x01, 0xa0, 0x03, 0x04, 0x01, 0x00}; + +// This is an invalid PKCS7 message. It contains multiple hash OIDs (that's not +// what makes it invalid). When it fails to parse, the associated digest data +// structures should be freed correctly. +static const uint8_t p7_with_multiple_hashes[] = { + 0x30, 0x4d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, + 0x02, 0xa0, 0x40, 0x30, 0x3e, 0x02, 0x01, 0x20, 0x31, 0x27, 0x30, 0x0b, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x30, + 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, + 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x04, 0x30, 0x10, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x07, 0x01, 0xa0, 0x03, 0x04, 0x01, 0x00}; + +class P7ImportTest : public ::testing::Test {}; + +TEST_F(P7ImportTest, FailSafeWithUnknownHashes) { + ScopedSEC_PKCS7DecoderContext dcx(SEC_PKCS7DecoderStart( + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS7DecoderUpdate( + dcx.get(), reinterpret_cast(p7_with_unknown_hashes), + sizeof(p7_with_unknown_hashes)); + ASSERT_EQ(SECFailure, rv); +} + +TEST_F(P7ImportTest, NoLeakWithMultipleHashes) { + ScopedSEC_PKCS7DecoderContext dcx(SEC_PKCS7DecoderStart( + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr)); + ASSERT_TRUE(dcx); + SECStatus rv = SEC_PKCS7DecoderUpdate( + dcx.get(), reinterpret_cast(p7_with_multiple_hashes), + sizeof(p7_with_multiple_hashes)); + ASSERT_EQ(SECFailure, rv); +} + +} // namespace nss_test diff -Nru thunderbird-140.9.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp thunderbird-140.10.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp --- thunderbird-140.9.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp 2026-04-21 14:53:00.000000000 +0000 @@ -2132,6 +2132,45 @@ Result::ERROR_BAD_DER, Result::ERROR_BAD_DER }, + // Wildcard SANs have subtle outcomes. + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName(".example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + // A certificate with a wildcard SAN entry like `*.example.com` can't be + // issued by a CA with a DNSName name constraint entry like `foo.example.com` + // in either the permitted or excluded subtrees. If in the permitted subtree, + // the certificate would be valid for `bar.example.com`, which would violate + // the constraint. If in the excluded subtree, the certificate would be valid + // for `foo.example.com`, which would violate the constraint. + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("foo.example.com")), + Result::ERROR_CERT_NOT_IN_NAME_SPACE, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.foo.example.com"), + GeneralSubtree(DNSName("example.com")), + Success, + Result::ERROR_CERT_NOT_IN_NAME_SPACE + }, + { ByteString(), DNSName("*.example.com"), + GeneralSubtree(DNSName("foo.example.org")), + Result::ERROR_CERT_NOT_IN_NAME_SPACE, + Success + }, + // `*invalid.example.com` is an invalid presented DNSID. + { ByteString(), DNSName("*invalid.example.com"), + GeneralSubtree(DNSName("invalid.example.com")), + Result::ERROR_BAD_DER, + Result::ERROR_BAD_DER + }, + ///////////////////////////////////////////////////////////////////////////// // Basic IP Address constraints (non-CN-ID) diff -Nru thunderbird-140.9.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc thunderbird-140.10.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc --- thunderbird-140.9.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/gtests/ssl_gtest/ssl_certificate_compression_unittest.cc 2026-04-21 14:53:00.000000000 +0000 @@ -272,6 +272,25 @@ return SECSuccess; } +/* Decode function that does NOT check input->len != outputLen (unlike + * SimpleXorCertCompDecode). It always sets receivedOutputLen = outputLen and + * returns SECSuccess, bypassing the actualCertLen != decodedCertLen fallback + * so that only the explicit uncompressed_length bounds check blocks an + * oversized allocation. */ +static int called_count = 0; +static SECStatus PermissiveXorCertCompDecode(const SECItem* input, + uint8_t* output, size_t outputLen, + size_t* receivedOutputLen) { + called_count++; + size_t copy = PR_MIN(input->len, outputLen); + PORT_Memcpy(output, input->data, copy); + for (size_t i = 0; i < copy; i++) { + output[i] ^= 0x55; + } + *receivedOutputLen = outputLen; + return SECSuccess; +} + /* These tests are checking the behaviour * using the different compression algorithms. * @@ -500,8 +519,6 @@ EXPECT_TRUE(SSLInt_ExtensionNegotiated(server_->ssl_fd(), ssl_certificate_compression_xtn)); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); uint16_t certCompressionAlg = filterExtension->getCertCompressionAlg(); EXPECT_EQ(certCompressionAlg, serverPreferableAlg.id); @@ -964,6 +981,56 @@ * } CompressedCertificate; */ +/* Overwrites the uncompressed_length field of a CompressedCertificate message + * with an arbitrary uint24 value, enabling precise boundary-value testing. */ +class TLSCompressedCertUncompressedLenSetter : public TlsRecordFilter { + public: + TLSCompressedCertUncompressedLenSetter(const std::shared_ptr& a, + uint32_t len) + : TlsRecordFilter(a), len_(len) { + EnableDecryption(); + } + + protected: + PacketFilter::Action FilterRecord(const TlsRecordHeader& header, + const DataBuffer& record, size_t* offset, + DataBuffer* output) override { + uint8_t inner_content_type; + DataBuffer plaintext; + uint16_t protection_epoch = 0; + TlsRecordHeader out_header(header); + + if (!Unprotect(header, record, &protection_epoch, &inner_content_type, + &plaintext, &out_header)) { + return KEEP; + } + + uint64_t skip = + findPointerToHandshakeType(plaintext, ssl_hs_compressed_certificate); + if (skip >= plaintext.len() || + plaintext.data()[skip] != ssl_hs_compressed_certificate) { + return KEEP; + } + + /* uncompressed_length is a uint24 at offset 6 from the HandshakeType byte. + */ + plaintext.Write(skip + 6, len_, 3); + + DataBuffer ciphertext; + bool ok = Protect(spec(protection_epoch), out_header, inner_content_type, + plaintext, &ciphertext, &out_header); + EXPECT_TRUE(ok); + if (!ok) { + return KEEP; + } + *offset = out_header.Write(output, *offset, ciphertext); + return CHANGE; + } + + private: + uint32_t len_; +}; + TEST_F(TlsConnectStreamTls13, CertificateCompression_CompressionFunctionCreatesABufferOfSize0) { ConfigureVersion(SSL_LIBRARY_VERSION_TLS_1_3); @@ -1214,6 +1281,47 @@ client_->CheckErrorCode(SSL_ERROR_RX_MALFORMED_CERTIFICATE); } +/* Boundary test for the 100KB uncompressed_length cap. + * At limit (100KB): passes bounds check, Certificate parser sees trailing + * zeros and fires illegal_parameter (tls13con.c:4362) — proves the bounds + * check did not trigger. + * One over (100KB+1): caught by the bounds check (tls13con.c:4220) and fires + * bad_certificate. */ +TEST_F(TlsConnectStreamTls13, CertificateCompression_UncompressedLenBoundary) { + SSLCertificateCompressionAlgorithm t = {0xff01, "test function", + SimpleXorCertCompEncode, + PermissiveXorCertCompDecode}; + + auto run = [&](uint32_t len, uint8_t expected_alert, bool expect_decoded) { + called_count = 0; + Reset(); + EnsureTlsSetup(); + MakeTlsFilter(server_, len); + EXPECT_EQ(SECSuccess, + SSLExp_SetCertificateCompressionAlgorithm(server_->ssl_fd(), t)); + EXPECT_EQ(SECSuccess, + SSLExp_SetCertificateCompressionAlgorithm(client_->ssl_fd(), t)); + ExpectAlert(client_, expected_alert); + StartConnect(); + client_->SetServerKeyBits(server_->server_key_bits()); + client_->Handshake(); + server_->Handshake(); + ASSERT_TRUE_WAIT((client_->state() != TlsAgent::STATE_CONNECTING), 5000); + ASSERT_EQ(TlsAgent::STATE_ERROR, client_->state()); + client_->ExpectSendAlert(kTlsAlertCloseNotify); + server_->ExpectReceiveAlert(kTlsAlertCloseNotify); + client_->CheckErrorCode(SSL_ERROR_RX_MALFORMED_CERTIFICATE); + if (expect_decoded) { + EXPECT_EQ(called_count, 1); + } else { + EXPECT_EQ(0, called_count); + } + }; + + run(100 * 1024, kTlsAlertIllegalParameter, true); + run(100 * 1024 + 1, kTlsAlertBadCertificate, false); +} + TEST_F(TlsConnectStreamTls13, CertificateCompression_ReceivedCertificateTooLong) { EnsureTlsSetup(); @@ -1391,8 +1499,6 @@ server_->ReadBytes(50); EXPECT_EQ(1U, called); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); SendReceive(60); client_->CheckClientAuthCompleted(); @@ -1469,8 +1575,6 @@ server_->ReadBytes(50); EXPECT_EQ(1U, called); - EXPECT_TRUE(SSLInt_ExtensionNegotiated(client_->ssl_fd(), - ssl_certificate_compression_xtn)); SendReceive(60); client_->CheckClientAuthCompleted(); diff -Nru thunderbird-140.9.0esr/security/nss/lib/certdb/alg1485.c thunderbird-140.10.0esr/security/nss/lib/certdb/alg1485.c --- thunderbird-140.9.0esr/security/nss/lib/certdb/alg1485.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/certdb/alg1485.c 2026-04-21 14:52:59.000000000 +0000 @@ -1400,13 +1400,13 @@ if (dest && src && src->data && src->len && src->data[0]) { PRUint32 len = src->len; PRUint32 i; - PRUint32 reqLen = len + 1; + PRUint64 reqLen = (PRUint64)len + 1; /* are there any embedded control characters ? */ for (i = 0; i < len; i++) { if (NEEDS_HEX_ESCAPE(src->data[i])) reqLen += 2; } - if (*pRemaining > reqLen) { + if (*pRemaining >= reqLen) { for (i = 0; i < len; ++i) { PRUint8 c = src->data[i]; if (NEEDS_HEX_ESCAPE(c)) { @@ -1422,7 +1422,7 @@ } } *dest++ = '\0'; - *pRemaining -= reqLen; + *pRemaining -= (PRUint32)reqLen; } } return dest; @@ -1440,7 +1440,7 @@ char* pBuf = NULL; PORTCheapArenaPool tmpArena; PRUint32 maxLen = 0; - PRInt32 finalLen = 0; + PRUint32 finalLen = 0; SECStatus rv; SECItem subAltName; diff -Nru thunderbird-140.9.0esr/security/nss/lib/certdb/stanpcertdb.c thunderbird-140.10.0esr/security/nss/lib/certdb/stanpcertdb.c --- thunderbird-140.9.0esr/security/nss/lib/certdb/stanpcertdb.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/certdb/stanpcertdb.c 2026-04-21 14:52:59.000000000 +0000 @@ -1045,10 +1045,15 @@ nssSMIMEProfile *stanProfile; stanProfile = nssCryptoContext_FindSMIMEProfileForCertificate(cc, c); if (stanProfile) { - rvItem = - SECITEM_AllocItem(NULL, NULL, stanProfile->profileData->size); - if (rvItem) { - rvItem->data = stanProfile->profileData->data; + if (stanProfile->profileData) { + rvItem = + SECITEM_AllocItem(NULL, NULL, + stanProfile->profileData->size); + if (rvItem) { + PORT_Memcpy(rvItem->data, + stanProfile->profileData->data, + stanProfile->profileData->size); + } } nssSMIMEProfile_Destroy(stanProfile); } diff -Nru thunderbird-140.9.0esr/security/nss/lib/certhigh/certvfy.c thunderbird-140.10.0esr/security/nss/lib/certhigh/certvfy.c --- thunderbird-140.9.0esr/security/nss/lib/certhigh/certvfy.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/certhigh/certvfy.c 2026-04-21 14:53:00.000000000 +0000 @@ -736,7 +736,7 @@ certsList = tmpCertsList; } for (i = 0; i < subjectNameListLen; i++) { - certsList[namesCount + i] = subjectCert; + certsList[namesCount + i] = CERT_DupCertificate(subjectCert); } namesCount += subjectNameListLen; namesList = cert_CombineNamesLists(namesList, subjectNameList); @@ -993,6 +993,11 @@ rv = SECFailure; done: if (certsList != NULL) { + for (int i = 0; i < namesCount; i++) { + if (certsList[i]) { + CERT_DestroyCertificate(certsList[i]); + } + } PORT_Free(certsList); } if (issuerCert) { diff -Nru thunderbird-140.9.0esr/security/nss/lib/cryptohi/dsautil.c thunderbird-140.10.0esr/security/nss/lib/cryptohi/dsautil.c --- thunderbird-140.9.0esr/security/nss/lib/cryptohi/dsautil.c 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/cryptohi/dsautil.c 2026-04-21 14:52:59.000000000 +0000 @@ -72,19 +72,18 @@ unsigned char *pDst = dest->data; unsigned int cntSrc = src->len; unsigned int cntDst = dest->len; - int zCount = cntDst - cntSrc; - if (zCount > 0) { + if (cntSrc <= cntDst) { + unsigned int zCount = cntDst - cntSrc; PORT_Memset(pDst, 0, zCount); PORT_Memcpy(pDst + zCount, pSrc, cntSrc); return SECSuccess; } - if (zCount <= 0) { - /* Source is longer than destination. Check for leading zeros. */ - while (zCount++ < 0) { - if (*pSrc++ != 0) - goto loser; - } + /* Source is longer than destination: extra leading bytes must be zero. */ + unsigned int extra = cntSrc - cntDst; + while (extra--) { + if (*pSrc++ != 0) + goto loser; } PORT_Memcpy(pDst, pSrc, cntDst); return SECSuccess; @@ -190,6 +189,12 @@ if (status != SECSuccess) goto loser; + /* A valid DER INTEGER for r or s is at most len+1 bytes (len bytes of + ** magnitude plus at most one leading zero sign byte). Reject anything + ** larger before attempting the conversion to avoid pathological inputs. */ + if (sig.r.len > len + 1 || sig.s.len > len + 1) + goto loser; + /* Convert sig.r and sig.s from variable length signed integers to ** fixed length unsigned integers. */ diff -Nru thunderbird-140.9.0esr/security/nss/lib/freebl/blapii.h thunderbird-140.10.0esr/security/nss/lib/freebl/blapii.h --- thunderbird-140.9.0esr/security/nss/lib/freebl/blapii.h 2026-03-20 19:18:38.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/freebl/blapii.h 2026-04-21 14:52:59.000000000 +0000 @@ -88,6 +88,7 @@ unsigned int emLen, unsigned int emBits, const unsigned char *mHash, + unsigned int mHashLen, HASH_HashType hashAlg, HASH_HashType maskHashAlg, const unsigned char *salt, diff -Nru thunderbird-140.9.0esr/security/nss/lib/freebl/rsa_blind.c thunderbird-140.10.0esr/security/nss/lib/freebl/rsa_blind.c --- thunderbird-140.9.0esr/security/nss/lib/freebl/rsa_blind.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/freebl/rsa_blind.c 2026-04-21 14:53:00.000000000 +0000 @@ -200,7 +200,8 @@ goto cleanup; } - rv = RSA_EMSAEncodePSS(encoded_msg, pkS->modulus.len, bit_len_n, msgHash, hashAlg, hashAlg, salt, saltLen); + rv = RSA_EMSAEncodePSS(encoded_msg, pkS->modulus.len, bit_len_n, msgHash, + sizeof(msgHash), hashAlg, hashAlg, salt, saltLen); /* 2. If EMSA-PSS-ENCODE raises an error, raise the error and stop. */ if (rv != SECSuccess) { diff -Nru thunderbird-140.9.0esr/security/nss/lib/freebl/rsapkcs.c thunderbird-140.10.0esr/security/nss/lib/freebl/rsapkcs.c --- thunderbird-140.9.0esr/security/nss/lib/freebl/rsapkcs.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/freebl/rsapkcs.c 2026-04-21 14:52:59.000000000 +0000 @@ -1239,6 +1239,7 @@ unsigned int emLen, unsigned int emBits, const unsigned char *mHash, + unsigned int mHashLen, HASH_HashType hashAlg, HASH_HashType maskHashAlg, const unsigned char *salt, @@ -1252,14 +1253,22 @@ SECStatus rv; hash = HASH_GetRawHashObject(hashAlg); - dbMaskLen = emLen - hash->length - 1; + PORT_Assert(hash); + + if (mHashLen < hash->length) { + PORT_SetError(SEC_ERROR_INVALID_ARGS); + return SECFailure; + } /* Step 3 */ - if (emLen < hash->length + saltLen + 2) { + if ((saltLen > emLen) || + (hash->length + 2 > emLen - saltLen)) { PORT_SetError(SEC_ERROR_OUTPUT_LEN); return SECFailure; } + dbMaskLen = emLen - hash->length - 1; + /* Step 4 */ if (salt == NULL) { rv = RNG_GenerateGlobalRandomBytes(&em[dbMaskLen - saltLen], saltLen); @@ -1336,15 +1345,17 @@ SECStatus rv; hash = HASH_GetRawHashObject(hashAlg); - dbMaskLen = emLen - hash->length - 1; /* Step 3 + 4 */ - if ((emLen < (hash->length + saltLen + 2)) || + if ((saltLen > emLen) || + (hash->length + 2 > emLen - saltLen) || (em[emLen - 1] != 0xbc)) { PORT_SetError(SEC_ERROR_BAD_SIGNATURE); return SECFailure; } + dbMaskLen = emLen - hash->length - 1; + /* Step 6 */ zeroBits = 8 * emLen - emBits; if (em[0] >> (8 - zeroBits)) { @@ -1458,7 +1469,7 @@ emLen--; em++; } - rv = RSA_EMSAEncodePSS(em, emLen, modulusBits - 1, input, hashAlg, + rv = RSA_EMSAEncodePSS(em, emLen, modulusBits - 1, input, inputLen, hashAlg, maskHashAlg, salt, saltLength); if (rv != SECSuccess) goto done; diff -Nru thunderbird-140.9.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp thunderbird-140.10.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp --- thunderbird-140.9.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/mozpkix/lib/pkixnames.cpp 2026-04-21 14:53:00.000000000 +0000 @@ -172,6 +172,12 @@ NameConstraint = 2, }; +enum class NameConstraintsSubtrees : uint8_t +{ + permittedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 0, + excludedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 1 +}; + enum class AllowWildcards { No = 0, Yes = 1 }; // DNSName constraints implicitly allow subdomain matching when there is no @@ -184,16 +190,22 @@ bool IsValidDNSID(Input hostname, IDRole idRole, AllowWildcards allowWildcards); +// `subtreesType` is relevant only when `referenceDNSIDRole` is +// `IDRole::NameConstraint`. Result MatchPresentedDNSIDWithReferenceDNSID( Input presentedDNSID, AllowWildcards allowWildcards, AllowDotlessSubdomainMatches allowDotlessSubdomainMatches, IDRole referenceDNSIDRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceDNSID, /*out*/ bool& matches); +// `subtreesType` is relevant only when `referenceDNSIDRole` is +// `IDRole::NameConstraint`. Result MatchPresentedRFC822NameWithReferenceRFC822Name( Input presentedRFC822Name, IDRole referenceRFC822NameRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceRFC822Name, /*out*/ bool& matches); } // namespace @@ -212,7 +224,7 @@ return MatchPresentedDNSIDWithReferenceDNSID( presentedDNSID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::ReferenceID, - referenceDNSID, matches); + nullptr, referenceDNSID, matches); } // Verify that the given end-entity cert, which is assumed to have been already @@ -731,7 +743,7 @@ rv = MatchPresentedDNSIDWithReferenceDNSID( presentedID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::ReferenceID, - referenceID, foundMatch); + nullptr, referenceID, foundMatch); break; case GeneralNameType::iPAddress: @@ -741,7 +753,7 @@ case GeneralNameType::rfc822Name: rv = MatchPresentedRFC822NameWithReferenceRFC822Name( - presentedID, IDRole::ReferenceID, referenceID, foundMatch); + presentedID, IDRole::ReferenceID, nullptr, referenceID, foundMatch); break; case GeneralNameType::directoryName: @@ -767,20 +779,16 @@ return Success; } -enum class NameConstraintsSubtrees : uint8_t -{ - permittedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 0, - excludedSubtrees = der::CONSTRUCTED | der::CONTEXT_SPECIFIC | 1 -}; - Result CheckPresentedIDConformsToNameConstraintsSubtrees( GeneralNameType presentedIDType, Input presentedID, Reader& nameConstraints, NameConstraintsSubtrees subtreesType); + Result MatchPresentedIPAddressWithConstraint(Input presentedID, Input iPAddressConstraint, /*out*/ bool& foundMatch); + Result MatchPresentedDirectoryNameWithConstraint( NameConstraintsSubtrees subtreesType, Input presentedID, Input directoryNameConstraint, /*out*/ bool& matches); @@ -886,7 +894,7 @@ rv = MatchPresentedDNSIDWithReferenceDNSID( presentedID, AllowWildcards::Yes, AllowDotlessSubdomainMatches::Yes, IDRole::NameConstraint, - base, matches); + &subtreesType, base, matches); if (rv != Success) { return rv; } @@ -911,7 +919,7 @@ case GeneralNameType::rfc822Name: rv = MatchPresentedRFC822NameWithReferenceRFC822Name( - presentedID, IDRole::NameConstraint, base, matches); + presentedID, IDRole::NameConstraint, &subtreesType, base, matches); if (rv != Success) { return rv; } @@ -1094,6 +1102,7 @@ AllowWildcards allowWildcards, AllowDotlessSubdomainMatches allowDotlessSubdomainMatches, IDRole referenceDNSIDRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, Input referenceDNSID, /*out*/ bool& matches) { @@ -1184,18 +1193,28 @@ return NotReached("Skipping '*' failed", Result::FATAL_ERROR_LIBRARY_FAILURE); } - do { - // This will happen if reference is a single, relative label - if (reference.AtEnd()) { - matches = false; - return Success; - } - uint8_t referenceByte; - if (reference.Read(referenceByte) != Success) { - return NotReached("invalid reference ID", - Result::FATAL_ERROR_INVALID_ARGS); - } - } while (!reference.Peek('.')); + // For the permittedSubtrees of a name constraint, wildcard presented + // DNSIDs of the form `*.example.com` only match if the name constraint is + // of the form `.example.com` or `example.com`. To put it another way, a + // permittedSubtrees of `foo.example.com` does not match a wildcard + // presented DNSID of `*.example.com`, because in that case, the + // certificate could be valid for `bar.example.com`, which does not match + // the name constraint. + if (referenceDNSIDRole != IDRole::NameConstraint || + (subtreesType && *subtreesType != NameConstraintsSubtrees::permittedSubtrees)) { + do { + // This will happen if reference is a single, relative label + if (reference.AtEnd()) { + matches = false; + return Success; + } + uint8_t referenceByte; + if (reference.Read(referenceByte) != Success) { + return NotReached("invalid reference ID", + Result::FATAL_ERROR_INVALID_ARGS); + } + } while (!reference.Peek('.')); + } } for (;;) { @@ -1552,11 +1571,13 @@ } } +// `subtreesType` is relevant only when `referenceRFC822NameRole` is +// `IDRole::NameConstraint`. Result -MatchPresentedRFC822NameWithReferenceRFC822Name(Input presentedRFC822Name, - IDRole referenceRFC822NameRole, - Input referenceRFC822Name, - /*out*/ bool& matches) +MatchPresentedRFC822NameWithReferenceRFC822Name( + Input presentedRFC822Name, IDRole referenceRFC822NameRole, + /*optional*/ const NameConstraintsSubtrees* subtreesType, + Input referenceRFC822Name, /*out*/ bool& matches) { if (!IsValidRFC822Name(presentedRFC822Name)) { return Result::ERROR_BAD_DER; @@ -1599,6 +1620,7 @@ return MatchPresentedDNSIDWithReferenceDNSID( presentedDNSID, AllowWildcards::No, AllowDotlessSubdomainMatches::No, IDRole::NameConstraint, + subtreesType, referenceRFC822Name, matches); } } diff -Nru thunderbird-140.9.0esr/security/nss/lib/nss/nss.h thunderbird-140.10.0esr/security/nss/lib/nss/nss.h --- thunderbird-140.9.0esr/security/nss/lib/nss/nss.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/nss/nss.h 2026-04-21 14:53:00.000000000 +0000 @@ -22,10 +22,10 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define NSS_VERSION "3.112.3" _NSS_CUSTOMIZED +#define NSS_VERSION "3.112.4" _NSS_CUSTOMIZED #define NSS_VMAJOR 3 #define NSS_VMINOR 112 -#define NSS_VPATCH 3 +#define NSS_VPATCH 4 #define NSS_VBUILD 0 #define NSS_BETA PR_FALSE diff -Nru thunderbird-140.9.0esr/security/nss/lib/pk11wrap/pk11pk12.c thunderbird-140.10.0esr/security/nss/lib/pk11wrap/pk11pk12.c --- thunderbird-140.9.0esr/security/nss/lib/pk11wrap/pk11pk12.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/pk11wrap/pk11pk12.c 2026-04-21 14:53:00.000000000 +0000 @@ -733,12 +733,15 @@ rv = PK11_ImportAndReturnPrivateKey(slot, lpk, nickname, publicValue, isPerm, isPrivate, keyUsage, privk, wincx); -loser: - if (arena != NULL) { - PORT_FreeArena(arena, PR_TRUE); + if (rv != SECSuccess) { + goto loser; } + PORT_FreeArena(arena, PR_TRUE); + return SECSuccess; - return rv; +loser: + PORT_FreeArena(arena, PR_TRUE); + return SECFailure; } SECStatus diff -Nru thunderbird-140.9.0esr/security/nss/lib/pkcs7/p7decode.c thunderbird-140.10.0esr/security/nss/lib/pkcs7/p7decode.c --- thunderbird-140.9.0esr/security/nss/lib/pkcs7/p7decode.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/pkcs7/p7decode.c 2026-04-21 14:52:59.000000000 +0000 @@ -230,6 +230,8 @@ { int i, digcnt; + p7dcx->worker.digcnt = 0; + if (digestalgs == NULL) return SECSuccess; @@ -257,7 +259,6 @@ } p7dcx->worker.depth = depth; - p7dcx->worker.digcnt = 0; /* * Create a digest context for each algorithm. @@ -277,7 +278,6 @@ * but we cannot know that until later. */ if (digobj == NULL) { - p7dcx->worker.digcnt--; continue; } @@ -306,25 +306,19 @@ PLArenaPool *poolp, SECItem ***digestsp) { - struct sec_pkcs7_decoder_worker *worker; - const SECHashObject *digobj; - void *digcx; - SECItem **digests, *digest; - int i; - void *mark; - /* * XXX Handling nested contents would mean that there is a chain * of workers -- one per each level of content. The following * would want to find the last worker in the chain. */ - worker = &(p7dcx->worker); + struct sec_pkcs7_decoder_worker *worker = &(p7dcx->worker); /* * If no digests, then we have nothing to do. */ - if (worker->digcnt == 0) + if (worker->digcnt == 0) { return SECSuccess; + } /* * No matter what happens after this, we want to stop filtering. @@ -340,46 +334,46 @@ * was digested. */ if (!worker->saw_contents) { - for (i = 0; i < worker->digcnt; i++) { - digcx = worker->digcxs[i]; - digobj = worker->digobjs[i]; + for (int i = 0; i < worker->digcnt; i++) { + void *digcx = worker->digcxs[i]; + const SECHashObject *digobj = worker->digobjs[i]; (*digobj->destroy)(digcx, PR_TRUE); } + worker->digcnt = 0; return SECSuccess; } - mark = PORT_ArenaMark(poolp); + void *mark = PORT_ArenaMark(poolp); /* * Close out each digest context, saving digest away. */ - digests = - (SECItem **)PORT_ArenaAlloc(poolp, (worker->digcnt + 1) * sizeof(SECItem *)); - digest = (SECItem *)PORT_ArenaAlloc(poolp, worker->digcnt * sizeof(SECItem)); - if (digests == NULL || digest == NULL) { + SECItem **digests = + (SECItem **)PORT_ArenaZAlloc(poolp, (worker->digcnt + 1) * sizeof(SECItem *)); + if (digests == NULL) { p7dcx->error = PORT_GetError(); PORT_ArenaRelease(poolp, mark); return SECFailure; } - for (i = 0; i < worker->digcnt; i++, digest++) { - digcx = worker->digcxs[i]; - digobj = worker->digobjs[i]; - - digest->data = (unsigned char *)PORT_ArenaAlloc(poolp, digobj->length); - if (digest->data == NULL) { + for (int i = 0; i < worker->digcnt; i++) { + const SECHashObject *digobj = worker->digobjs[i]; + digests[i] = SECITEM_AllocItem(poolp, NULL, digobj->length); + if (!digests[i]) { p7dcx->error = PORT_GetError(); PORT_ArenaRelease(poolp, mark); return SECFailure; } + } - digest->len = digobj->length; - (*digobj->end)(digcx, digest->data, &(digest->len), digest->len); - (*digobj->destroy)(digcx, PR_TRUE); + for (int i = 0; i < worker->digcnt; i++) { + void *digcx = worker->digcxs[i]; + const SECHashObject *digobj = worker->digobjs[i]; - digests[i] = digest; + (*digobj->end)(digcx, digests[i]->data, &(digests[i]->len), digests[i]->len); + (*digobj->destroy)(digcx, PR_TRUE); } - digests[i] = NULL; + worker->digcnt = 0; *digestsp = digests; PORT_ArenaUnmark(poolp, mark); @@ -1084,6 +1078,13 @@ if (p7dcx->worker.decryptobj) { sec_PKCS7DestroyDecryptObject(p7dcx->worker.decryptobj); } + for (int i = 0; i < p7dcx->worker.digcnt; i++) { + void *digcx = p7dcx->worker.digcxs[i]; + const SECHashObject *digobj = p7dcx->worker.digobjs[i]; + (*digobj->destroy)(digcx, PR_TRUE); + } + p7dcx->worker.digcnt = 0; + PORT_FreeArena(p7dcx->tmp_poolp, PR_FALSE); PORT_Free(p7dcx); return cinfo; diff -Nru thunderbird-140.9.0esr/security/nss/lib/pki/tdcache.c thunderbird-140.10.0esr/security/nss/lib/pki/tdcache.c --- thunderbird-140.9.0esr/security/nss/lib/pki/tdcache.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/pki/tdcache.c 2026-04-21 14:53:00.000000000 +0000 @@ -91,6 +91,7 @@ PRTime lastHit; NSSArena *arena; NSSUTF8 *nickname; + NSSASCII7 *email; }; typedef struct cache_entry_str cache_entry; @@ -229,6 +230,7 @@ NSSCertificate *cert, nssList **subjectList, NSSUTF8 **nickname, + NSSASCII7 **email, NSSArena **arena) { PRStatus nssrv; @@ -242,6 +244,7 @@ nssList_Remove(ce->entry.list, cert); *subjectList = ce->entry.list; *nickname = ce->nickname; + *email = ce->email; *arena = ce->arena; nssrv = PR_SUCCESS; #ifdef DEBUG_CACHE @@ -276,35 +279,34 @@ static PRStatus remove_email_entry( nssTDCertificateCache *cache, - NSSCertificate *cert, + NSSASCII7 *email, nssList *subjectList) { PRStatus nssrv = PR_FAILURE; cache_entry *ce; - /* Find the subject list in the email hash */ - if (cert->email) { - ce = (cache_entry *)nssHash_Lookup(cache->email, cert->email); + if (email) { + ce = (cache_entry *)nssHash_Lookup(cache->email, email); if (ce) { nssList *subjects = ce->entry.list; /* Remove the subject list from the email hash */ if (subjects) { nssList_Remove(subjects, subjectList); #ifdef DEBUG_CACHE - log_item_dump("removed subject list", &cert->subject); - PR_LOG(s_log, PR_LOG_DEBUG, ("for email %s", cert->email)); + PR_LOG(s_log, PR_LOG_DEBUG, + ("removed subject list for email %s", email)); #endif if (nssList_Count(subjects) == 0) { /* No more subject lists for email, delete list and * remove hash entry */ (void)nssList_Destroy(subjects); - nssHash_Remove(cache->email, cert->email); + nssHash_Remove(cache->email, email); /* there are no entries left for this address, free space * used for email entries */ nssArena_Destroy(ce->arena); #ifdef DEBUG_CACHE - PR_LOG(s_log, PR_LOG_DEBUG, ("removed email %s", cert->email)); + PR_LOG(s_log, PR_LOG_DEBUG, ("removed email %s", email)); #endif } } @@ -323,6 +325,7 @@ cache_entry *ce; NSSArena *arena; NSSUTF8 *nickname = NULL; + NSSASCII7 *email = NULL; #ifdef DEBUG_CACHE log_cert_ref("attempt to remove cert", cert); @@ -339,10 +342,10 @@ } (void)remove_issuer_and_serial_entry(td->cache, cert); (void)remove_subject_entry(td->cache, cert, &subjectList, - &nickname, &arena); + &nickname, &email, &arena); if (nssList_Count(subjectList) == 0) { (void)remove_nickname_entry(td->cache, nickname, subjectList); - (void)remove_email_entry(td->cache, cert, subjectList); + (void)remove_email_entry(td->cache, email, subjectList); (void)nssList_Destroy(subjectList); nssHash_Remove(td->cache->subject, &cert->subject); /* there are no entries left for this subject, free the space used @@ -537,6 +540,9 @@ if (nickname) { ce->nickname = nssUTF8_Duplicate(nickname, arena); } + if (cert->email) { + ce->email = nssUTF8_Duplicate(cert->email, arena); + } nssList_SetSortFunction(list, nssCertificate_SubjectListSort); /* Add the cert entry to this list of subjects */ nssrv = nssList_AddUnique(list, cert); @@ -710,6 +716,7 @@ PRUint32 added = 0; cache_entry *ce; NSSCertificate *rvCert = NULL; + NSSASCII7 *email = NULL; NSSUTF8 *certNickname = nssCertificate_GetNickname(cert, NULL); /* Set cc->trust and cc->nssCertificate before taking td->cache->lock. @@ -817,13 +824,13 @@ } if (added >= 2) { (void)remove_subject_entry(td->cache, cert, &subjectList, - &certNickname, &arena); + &certNickname, &email, &arena); } if (added == 3 || added == 5) { (void)remove_nickname_entry(td->cache, certNickname, subjectList); } if (added >= 4) { - (void)remove_email_entry(td->cache, cert, subjectList); + (void)remove_email_entry(td->cache, email, subjectList); } if (subjectList) { nssHash_Remove(td->cache->subject, &cert->subject); diff -Nru thunderbird-140.9.0esr/security/nss/lib/smime/cmsdecode.c thunderbird-140.10.0esr/security/nss/lib/smime/cmsdecode.c --- thunderbird-140.9.0esr/security/nss/lib/smime/cmsdecode.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/smime/cmsdecode.c 2026-04-21 14:53:00.000000000 +0000 @@ -322,7 +322,6 @@ loser: if (mark) PORT_ArenaRelease(poolp, mark); - PORT_Free(childp7dcx); p7dcx->childp7dcx = NULL; return SECFailure; } @@ -555,8 +554,19 @@ SECItem *dataItem = &decoderData->data; offset = dataItem->len; + /* Reject if accumulated size would exceed unsigned int storage. */ + if (len > (unsigned long)(PR_UINT32_MAX - dataItem->len)) { + p7dcx->error = SEC_ERROR_INPUT_LEN; + goto loser; + } if (dataItem->len + len > decoderData->totalBufferSize) { - int needLen = (dataItem->len + len) * 2; + /* Use size_t to avoid truncating the 64-bit sum to int. + * Double to amortize repeated reallocations across chunks. */ + size_t needLen = (size_t)dataItem->len + len; + /* Only double if the result still fits in unsigned int. */ + if (needLen <= PR_UINT32_MAX / 2) { + needLen *= 2; + } dest = (unsigned char *) PORT_ArenaAlloc(p7dcx->cmsg->poolp, needLen); if (dest == NULL) { @@ -567,7 +577,7 @@ if (dataItem->len) { PORT_Memcpy(dest, dataItem->data, dataItem->len); } - decoderData->totalBufferSize = needLen; + decoderData->totalBufferSize = (unsigned int)needLen; dataItem->data = dest; } diff -Nru thunderbird-140.9.0esr/security/nss/lib/smime/cmspubkey.c thunderbird-140.10.0esr/security/nss/lib/smime/cmspubkey.c --- thunderbird-140.9.0esr/security/nss/lib/smime/cmspubkey.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/smime/cmspubkey.c 2026-04-21 14:52:59.000000000 +0000 @@ -566,6 +566,7 @@ SECStatus rv; PORT_Memset(&keyWrapAlg, 0, sizeof(SECAlgorithmID)); + PORT_Memset(&originatorpublickey, 0, sizeof(SECKEYPublicKey)); PORT_Assert(bulkalgtag != SEC_OID_UNKNOWN); target = PK11_AlgtagToMechanism(bulkalgtag); diff -Nru thunderbird-140.9.0esr/security/nss/lib/softoken/softkver.h thunderbird-140.10.0esr/security/nss/lib/softoken/softkver.h --- thunderbird-140.9.0esr/security/nss/lib/softoken/softkver.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/softoken/softkver.h 2026-04-21 14:52:59.000000000 +0000 @@ -17,10 +17,10 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define SOFTOKEN_VERSION "3.112.3" SOFTOKEN_ECC_STRING +#define SOFTOKEN_VERSION "3.112.4" SOFTOKEN_ECC_STRING #define SOFTOKEN_VMAJOR 3 #define SOFTOKEN_VMINOR 112 -#define SOFTOKEN_VPATCH 3 +#define SOFTOKEN_VPATCH 4 #define SOFTOKEN_VBUILD 0 #define SOFTOKEN_BETA PR_FALSE diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/dtlscon.c thunderbird-140.10.0esr/security/nss/lib/ssl/dtlscon.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/dtlscon.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/dtlscon.c 2026-04-21 14:53:00.000000000 +0000 @@ -1101,7 +1101,7 @@ { int errCode = SSL_ERROR_RX_MALFORMED_HELLO_VERIFY_REQUEST; SECStatus rv; - SSL3ProtocolVersion temp; + SSL3ProtocolVersion version; SSL3AlertDescription desc = illegal_parameter; SSL_TRC(3, ("%d: SSL3[%d]: handle hello_verify_request handshake", @@ -1130,22 +1130,39 @@ * Therefore we do not do anything to enforce a match, just * read and check that this value is sane. */ - rv = ssl_ClientReadVersion(ss, &b, &length, &temp); + rv = ssl_ClientReadVersion(ss, &b, &length, &version); if (rv != SECSuccess) { goto loser; /* alert has been sent */ } - /* Read the cookie. - * IMPORTANT: The value of ss->ssl3.hs.cookie is only valid while the - * HelloVerifyRequest message remains valid. */ - rv = ssl3_ConsumeHandshakeVariable(ss, &ss->ssl3.hs.cookie, 1, &b, &length); + /* HelloVerifyRequest is a DTLS 1.2 (and earlier) mechanism; DTLS 1.3 uses + * a cookie extension in HelloRetryRequest instead. Reject an HVR that + * claims a version newer than DTLS 1.2 and cap the negotiable version. + */ + if (version > SSL_LIBRARY_VERSION_TLS_1_2) { + desc = illegal_parameter; + goto alert_loser; + } + if (ss->vrange.max > SSL_LIBRARY_VERSION_TLS_1_2) { + ss->vrange.max = SSL_LIBRARY_VERSION_TLS_1_2; + } + + /* Read the cookie. */ + SECItem cookie; + rv = ssl3_ConsumeHandshakeVariable(ss, &cookie, 1, &b, &length); if (rv != SECSuccess) { goto loser; /* alert has been sent */ } - if (ss->ssl3.hs.cookie.len > DTLS_COOKIE_BYTES) { + if (cookie.len > DTLS_COOKIE_BYTES) { desc = decode_error; goto alert_loser; /* malformed. */ } + PORT_Assert(!ss->ssl3.hs.cookie.data && !ss->ssl3.hs.cookie.len); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); + rv = SECITEM_CopyItem(NULL, &ss->ssl3.hs.cookie, &cookie); + if (rv != SECSuccess) { + goto loser; + } ssl_GetXmitBufLock(ss); /*******************************/ @@ -1154,6 +1171,8 @@ ssl_ReleaseXmitBufLock(ss); /*******************************/ + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); + if (rv == SECSuccess) return rv; diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3con.c thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3con.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3con.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3con.c 2026-04-21 14:53:00.000000000 +0000 @@ -14266,6 +14266,7 @@ SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); SECITEM_FreeItem(&ss->ssl3.hs.srvVirtName, PR_FALSE); SECITEM_FreeItem(&ss->ssl3.hs.fakeSid, PR_FALSE); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); /* Destroy the DTLS data */ if (IS_DTLS(ss)) { diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3ext.c thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3ext.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3ext.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3ext.c 2026-04-21 14:53:01.000000000 +0000 @@ -336,6 +336,26 @@ xtnData->numAdvertised, ex_type); } +void +ssl3_RecordExtensionNegotiated(const sslSocket *ss, TLSExtensionData *xtnData, + PRUint16 ex_type) +{ + /* Record that an extension was negotiated during a full TLS handshake. + * This function must NOT be used to track extensions carried in + * post-handshake messages (e.g. CertificateRequest during PHA); + * their negotiation state should instead be stored in dedicated fields on + * TLSExtensionData or sslSocket (e.g. xtnData->compressionAlg for + * certificate compression). */ + PORT_Assert(!ss->firstHsDone || + ss->opt.enableRenegotiation != SSL_RENEGOTIATE_NEVER); + PORT_Assert(!arrayContainsExtension(xtnData->negotiated, + xtnData->numNegotiated, ex_type)); + PORT_Assert(xtnData->numNegotiated < SSL_MAX_EXTENSIONS); + if (xtnData->numNegotiated < SSL_MAX_EXTENSIONS) { + xtnData->negotiated[xtnData->numNegotiated++] = ex_type; + } +} + PRBool ssl3_ExtensionAdvertisedClientHelloInner(const sslSocket *ss, PRUint16 ex_type) { diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3ext.h thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3ext.h --- thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3ext.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3ext.h 2026-04-21 14:53:00.000000000 +0000 @@ -175,6 +175,9 @@ PRBool ssl3_ExtensionNegotiated(const sslSocket *ss, PRUint16 ex_type); PRBool ssl3_ExtensionAdvertised(const sslSocket *ss, PRUint16 ex_type); +void ssl3_RecordExtensionNegotiated(const sslSocket *ss, + TLSExtensionData *xtnData, + PRUint16 ex_type); SECStatus ssl3_RegisterExtensionSender(const sslSocket *ss, TLSExtensionData *xtnData, diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3exthandle.c thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3exthandle.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/ssl3exthandle.c 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/ssl3exthandle.c 2026-04-21 14:53:00.000000000 +0000 @@ -165,7 +165,7 @@ ssl3_FreeSniNameArray(xtnData); xtnData->sniNameArr = names; xtnData->sniNameArrSize = 1; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_server_name_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_server_name_xtn); } return SECSuccess; @@ -345,7 +345,7 @@ } xtnData->nextProtoState = SSL_NEXT_PROTO_NEGOTIATED; - xtnData->negotiated[xtnData->numNegotiated++] = extension; + ssl3_RecordExtensionNegotiated(ss, xtnData, extension); return SECITEM_CopyItem(NULL, &xtnData->nextProto, &result); } @@ -447,7 +447,7 @@ SECITEM_FreeItem(&xtnData->nextProto, PR_FALSE); xtnData->nextProtoState = SSL_NEXT_PROTO_SELECTED; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_app_layer_protocol_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_app_layer_protocol_xtn); return SECITEM_CopyItem(NULL, &xtnData->nextProto, &protocol_name); } @@ -528,7 +528,7 @@ PORT_Assert(ss->sec.isServer); /* remember that we got this extension. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_cert_status_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_cert_status_xtn); if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { sender = tls13_ServerSendStatusRequestXtn; @@ -606,7 +606,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_cert_status_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_cert_status_xtn); return SECSuccess; } @@ -859,7 +859,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_session_ticket_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_session_ticket_xtn); return SECSuccess; } @@ -1309,7 +1309,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_session_ticket_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_session_ticket_xtn); /* Parse the received ticket sent in by the client. We are * lenient about some parse errors, falling back to a fullshake @@ -1387,7 +1387,7 @@ /* remember that we got this extension and it was correct. */ CONST_CAST(sslSocket, ss) ->peerRequestedProtection = 1; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_renegotiation_info_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_renegotiation_info_xtn); if (ss->sec.isServer) { /* prepare to send back the appropriate response */ rv = ssl3_RegisterExtensionSender(ss, xtnData, @@ -1522,7 +1522,7 @@ } /* OK, this looks fine. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_use_srtp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_use_srtp_xtn); xtnData->dtlsSRTPCipherSuite = cipher; return SECSuccess; } @@ -1593,7 +1593,7 @@ /* OK, we have a valid cipher and we've selected it */ xtnData->dtlsSRTPCipherSuite = cipher; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_use_srtp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_use_srtp_xtn); return ssl3_RegisterExtensionSender(ss, xtnData, ssl_use_srtp_xtn, @@ -1639,8 +1639,12 @@ return SECFailure; } - /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signature_algorithms_xtn; + /* Keep track of negotiated extensions. Only the server consumes this + * entry; on the client, skipping prevents numNegotiated overflow + * during repeated post-handshake CertificateRequests. */ + if (ss->sec.isServer) { + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signature_algorithms_xtn); + } return SECSuccess; } @@ -1711,7 +1715,7 @@ SSL_GETPID(), ss->fd)); /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_extended_master_secret_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_extended_master_secret_xtn); if (ss->sec.isServer) { return ssl3_RegisterExtensionSender(ss, xtnData, @@ -1758,7 +1762,7 @@ } *scts = *data; /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signed_cert_timestamp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signed_cert_timestamp_xtn); return SECSuccess; } @@ -1794,7 +1798,7 @@ return SECFailure; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_signed_cert_timestamp_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_signed_cert_timestamp_xtn); PORT_Assert(ss->sec.isServer); return ssl3_RegisterExtensionSender(ss, xtnData, ssl_signed_cert_timestamp_xtn, @@ -1934,7 +1938,7 @@ } /* Remember that we negotiated this extension. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_supported_groups_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_supported_groups_xtn); return SECSuccess; } @@ -1975,7 +1979,7 @@ /* We can't enforce the maximum on a server. But we do need to ensure * that we don't apply a limit that is too large. */ xtnData->recordSizeLimit = PR_MIN(maxLimit, limit); - xtnData->negotiated[xtnData->numNegotiated++] = ssl_record_size_limit_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_record_size_limit_xtn); return SECSuccess; } diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/tls13con.c thunderbird-140.10.0esr/security/nss/lib/ssl/tls13con.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/tls13con.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/tls13con.c 2026-04-21 14:52:59.000000000 +0000 @@ -3031,6 +3031,7 @@ rv = ssl3_HandleParsedExtensions(ss, ssl_hs_hello_retry_request); ssl3_DestroyRemoteExtensions(&ss->ssl3.hs.remoteExtensions); if (rv != SECSuccess) { + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECFailure; /* Error code set below */ } rv = tls13_MaybeHandleEchSignal(ss, savedMsg, savedLength, PR_TRUE); @@ -3064,10 +3065,12 @@ } ssl_ReleaseXmitBufLock(ss); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECSuccess; loser: ssl_ReleaseXmitBufLock(ss); + SECITEM_FreeItem(&ss->ssl3.hs.cookie, PR_FALSE); return SECFailure; } @@ -4060,6 +4063,20 @@ return SECFailure; } + /* Cap the decompressed size to prevent memory exhaustion. The wire field + * is a uint24 (max 16MB) but the CompressedCertificate path bypasses the + * 128KB cap applied to regular handshake messages. 100KB matches the limit + * enforced by OpenSSL and BoringSSL. */ +#define MAX_CERT_UNCOMPRESSED_LEN (100 * 1024) + if (decodedCertLen > MAX_CERT_UNCOMPRESSED_LEN) { + SSL_TRC(50, ("%d: TLS13[%d]: %s uncompressed_length %u exceeds limit %u", + SSL_GETPID(), ss->fd, SSL_ROLE(ss), + decodedCertLen, MAX_CERT_UNCOMPRESSED_LEN)); + FATAL_ERROR(ss, SSL_ERROR_RX_MALFORMED_CERTIFICATE, bad_certificate); + return SECFailure; + } +#undef MAX_CERT_UNCOMPRESSED_LEN + /* opaque compressed_certificate_message<1..2^24-1>; */ PRUint32 compressedCertLen = 0; rv = ssl3_ConsumeHandshakeNumber(ss, &compressedCertLen, 3, &b, &length); @@ -4989,6 +5006,10 @@ PORT_Memcpy(ivOut, ivIn, ivLen); } if (decrypt) { + if (inLen < tagLen) { + PORT_SetError(SEC_ERROR_INPUT_LEN); + return SECFailure; + } inLen = inLen - tagLen; tag = (unsigned char *)in + inLen; /* tag is const on decrypt, but returned on encrypt */ diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/tls13ech.c thunderbird-140.10.0esr/security/nss/lib/ssl/tls13ech.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/tls13ech.c 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/tls13ech.c 2026-04-21 14:52:59.000000000 +0000 @@ -2442,7 +2442,7 @@ PORT_SetError(SSL_ERROR_BAD_2ND_CLIENT_HELLO); return SECFailure; } - ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ssl_tls13_encrypted_client_hello_xtn; + ssl3_RecordExtensionNegotiated(ss, &ss->xtnData, ssl_tls13_encrypted_client_hello_xtn); /* Only overwrite client_random with client_inner_random if CHInner was * succesfully used for handshake (NOT if HRR is received). */ diff -Nru thunderbird-140.9.0esr/security/nss/lib/ssl/tls13exthandle.c thunderbird-140.10.0esr/security/nss/lib/ssl/tls13exthandle.c --- thunderbird-140.9.0esr/security/nss/lib/ssl/tls13exthandle.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/ssl/tls13exthandle.c 2026-04-21 14:53:00.000000000 +0000 @@ -446,8 +446,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_tls13_key_share_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_key_share_xtn); return SECSuccess; @@ -746,7 +745,7 @@ return SECSuccess; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_pre_shared_key_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_pre_shared_key_xtn); return SECSuccess; alert_loser: @@ -816,7 +815,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_pre_shared_key_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_pre_shared_key_xtn); xtnData->selectedPsk = candidate; return SECSuccess; @@ -860,7 +859,7 @@ return SECFailure; } - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_early_data_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_early_data_xtn); return SECSuccess; } @@ -885,7 +884,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_early_data_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_early_data_xtn); return SECSuccess; } @@ -1036,20 +1035,27 @@ PORT_Assert(ss->vrange.max >= SSL_LIBRARY_VERSION_TLS_1_3); - /* IMPORTANT: this is only valid while the HelloRetryRequest is still valid. */ + SECItem cookie; rv = ssl3_ExtConsumeHandshakeVariable( - ss, &CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, 2, + ss, &cookie, 2, &data->data, &data->len); if (rv != SECSuccess) { PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_RETRY_REQUEST); return SECFailure; } - if (!ss->ssl3.hs.cookie.len || data->len) { + if (!cookie.len || data->len) { ssl3_ExtSendAlert(ss, alert_fatal, decode_error); PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_RETRY_REQUEST); return SECFailure; } + PORT_Assert(!ss->ssl3.hs.cookie.data && !ss->ssl3.hs.cookie.len); + SECITEM_FreeItem(&CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, PR_FALSE); + rv = SECITEM_CopyItem(NULL, &CONST_CAST(sslSocket, ss)->ssl3.hs.cookie, &cookie); + if (rv != SECSuccess) { + return SECFailure; + } + return SECSuccess; } @@ -1101,7 +1107,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_cookie_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_cookie_xtn); return SECSuccess; } @@ -1138,7 +1144,7 @@ * NST immediately following the client Finished. */ if (!IS_DTLS(ss)) { /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_post_handshake_auth_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_post_handshake_auth_xtn); } return SECSuccess; @@ -1209,8 +1215,7 @@ } /* Keep track of negotiated extensions. */ - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_tls13_psk_key_exchange_modes_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_psk_key_exchange_modes_xtn); return SECSuccess; } @@ -1554,8 +1559,7 @@ } xtnData->peerDelegCred = dc; - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_delegated_credentials_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_delegated_credentials_xtn); return SECSuccess; alert_loser: ssl3_ExtSendAlert(ss, alert_fatal, illegal_parameter); @@ -1619,8 +1623,7 @@ /* Keep track of negotiated extensions. */ xtnData->peerRequestedDelegCred = PR_TRUE; - xtnData->negotiated[xtnData->numNegotiated++] = - ssl_delegated_credentials_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_delegated_credentials_xtn); return ssl3_RegisterExtensionSender( ss, xtnData, ssl_delegated_credentials_xtn, @@ -1709,7 +1712,7 @@ } xtnData->ech->receivedInnerXtn = PR_TRUE; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_tls13_encrypted_client_hello_xtn; + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_tls13_encrypted_client_hello_xtn); return SECSuccess; alert_loser: @@ -1995,7 +1998,9 @@ for (int j = 0; j < ss->ssl3.supportedCertCompressionAlgorithmsCount; j++) { if (ss->ssl3.supportedCertCompressionAlgorithms[j].id == alg) { xtnData->compressionAlg = alg; - xtnData->negotiated[xtnData->numNegotiated++] = ssl_certificate_compression_xtn; + if (ss->sec.isServer) { + ssl3_RecordExtensionNegotiated(ss, xtnData, ssl_certificate_compression_xtn); + } algFound = SECSuccess; break; } diff -Nru thunderbird-140.9.0esr/security/nss/lib/util/nssutil.h thunderbird-140.10.0esr/security/nss/lib/util/nssutil.h --- thunderbird-140.9.0esr/security/nss/lib/util/nssutil.h 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/util/nssutil.h 2026-04-21 14:53:00.000000000 +0000 @@ -19,10 +19,10 @@ * The format of the version string should be * ".[.[.]][ ]" */ -#define NSSUTIL_VERSION "3.112.3" +#define NSSUTIL_VERSION "3.112.4" #define NSSUTIL_VMAJOR 3 #define NSSUTIL_VMINOR 112 -#define NSSUTIL_VPATCH 3 +#define NSSUTIL_VPATCH 4 #define NSSUTIL_VBUILD 0 #define NSSUTIL_BETA PR_FALSE diff -Nru thunderbird-140.9.0esr/security/nss/lib/util/quickder.c thunderbird-140.10.0esr/security/nss/lib/util/quickder.c --- thunderbird-140.9.0esr/security/nss/lib/util/quickder.c 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/lib/util/quickder.c 2026-04-21 14:53:00.000000000 +0000 @@ -522,11 +522,18 @@ } } while ((SECSuccess == rv) && (counter.len)); + /* Limit entry data to 1 GiB. */ + if (SECSuccess == rv && subTemplate->size && + totalEntries > ((size_t)1 << 30) / subTemplate->size) { + PORT_SetError(SEC_ERROR_BAD_DER); + rv = SECFailure; + } + if (SECSuccess == rv) { /* allocate room for pointer array and entries */ /* we want to allocate the array even if there is 0 entry */ entries = (void**)PORT_ArenaZAlloc(arena, sizeof(void*) * (totalEntries + 1) + /* the extra one is for NULL termination */ - subTemplate->size * totalEntries); + (size_t)subTemplate->size * totalEntries); if (entries) { entries[totalEntries] = NULL; /* terminate the array */ @@ -540,7 +547,7 @@ PRUint32 entriesIndex = 0; for (entriesIndex = 0; entriesIndex < totalEntries; entriesIndex++) { entries[entriesIndex] = - (char*)entriesData + (subTemplate->size * entriesIndex); + (char*)entriesData + ((size_t)subTemplate->size * entriesIndex); } } } diff -Nru thunderbird-140.9.0esr/security/nss/moz.yaml thunderbird-140.10.0esr/security/nss/moz.yaml --- thunderbird-140.9.0esr/security/nss/moz.yaml 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/security/nss/moz.yaml 2026-04-21 14:52:59.000000000 +0000 @@ -9,8 +9,8 @@ description: nss url: https://hg-edge.mozilla.org/projects/nss - release: e65740334234fa690d1a80c807fb578bb030ed2b (2026-02-13T14:13:57Z). - revision: e65740334234fa690d1a80c807fb578bb030ed2b + release: b2cdc99736d77bf188220c8e780c413f967eb1c7 (2026-04-13T21:48:26Z). + revision: b2cdc99736d77bf188220c8e780c413f967eb1c7 license: MPL-2.0 license-file: COPYING diff -Nru thunderbird-140.9.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json thunderbird-140.10.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json --- thunderbird-140.9.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json 2026-04-21 14:53:01.000000000 +0000 @@ -5,6 +5,5153 @@ "blocked": [], "unblocked": [], "softblocked": [ + "sendurl@runa-dte.cl:1.2.6", + "sendurl@runa-dte.cl:1.2.5", + "sendurl@runa-dte.cl:1.2.4", + "proxy-mode-toggle@vmkspv.github.io:1.0.0" + ] + }, + "schema": 1776040598218, + "key_format": "{guid}:{version}", + "stash_time": 1776062106995, + "id": "5d5d7704-53e0-4ccf-aa36-bb13c0595177", + "last_modified": 1776062193033 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sciencedirect-bibtex-inline@example.com:1.0.0", + "flash@coffeeandfunc.com:0.9.6", + "flash@coffeeandfunc.com:0.9.4", + "{d0be5df1-d9d2-4f2c-b700-6a7111d604af}:1.0", + "{d0be5df1-d9d2-4f2c-b700-6a7111d604af}:2.0", + "FirefoxExtension@TGPFilter:1.0", + "{03044fa0-9503-42bd-95b7-cec8b1e32402}:1.0", + "meutema_1776026877036@exportado:1.0", + "nifty-temu-scraper2@nifty.codes:3.1.6", + "nifty-taobao-scraper@nifty.codes:3.1.0", + "nifty-spotify-scraper@nifty.codes:3.1.0", + "nifty-skyscanner-scraper@nifty.codes:3.1.0", + "nifty-skyscanner-scraper@nifty.codes:3.1.3", + "nifty-shopee-scraper@nifty.codes:3.1.0", + "nifty-shopee-scraper@nifty.codes:3.1.2", + "nifty-shopee-scraper@nifty.codes:3.1.4", + "nifty-shein-scraper@nifty.codes:3.1.0", + "nifty-shein-scraper@nifty.codes:3.1.2", + "nifty-shein-scraper@nifty.codes:3.1.3", + "nifty-rightmove-scraper@nifty.codes:3.1.0", + "nifty-rightmove-scraper@nifty.codes:3.1.2", + "nifty-rightmove-scraper@nifty.codes:3.1.3", + "nifty-pinterest-scraper@nifty.codes:3.1.0", + "nifty-pinterest-scraper@nifty.codes:3.1.2", + "nifty-patreon-scraper@nifty.codes:3.1.0", + "nifty-patreon-scraper@nifty.codes:3.1.2", + "nifty-patreon-scraper@nifty.codes:3.1.3", + "nifty-mercari-scraper@nifty.codes:3.1.0", + "nifty-mercari-scraper@nifty.codes:3.1.2", + "nifty-mercari-scraper@nifty.codes:3.1.3", + "nifty-mercari-scraper@nifty.codes:3.1.4", + "nifty-meetup-scraper@nifty.codes:3.1.0", + "nifty-meetup-scraper@nifty.codes:3.1.2", + "nifty-meetup-scraper@nifty.codes:3.1.3", + "nifty-meetup-scraper@nifty.codes:3.1.4", + "nifty-lazada-scraper@nifty.codes:3.1.0", + "nifty-lazada-scraper@nifty.codes:3.1.2", + "nifty-lazada-scraper@nifty.codes:3.1.3", + "nifty-lazada-scraper@nifty.codes:3.1.4", + "nifty-instagram-scraper@nifty.codes:3.1.0", + "nifty-instagram-scraper@nifty.codes:3.1.2", + "nifty-instagram-scraper@nifty.codes:3.1.3", + "nifty-instagram-scraper@nifty.codes:3.1.4", + "nifty-gumroad-scraper@nifty.codes:3.1.0", + "nifty-gumroad-scraper@nifty.codes:3.1.2", + "nifty-gumroad-scraper@nifty.codes:3.1.3", + "nifty-gumroad-scraper@nifty.codes:3.1.4", + "nifty-grailed-scraper@nifty.codes:3.1.0", + "nifty-grailed-scraper@nifty.codes:3.1.2", + "nifty-grailed-scraper@nifty.codes:3.1.3", + "nifty-grailed-scraper@nifty.codes:3.1.4", + "nifty-glassdoor-scraper@nifty.codes:3.1.0", + "nifty-glassdoor-scraper@nifty.codes:3.1.2", + "nifty-glassdoor-scraper@nifty.codes:3.1.3", + "nifty-glassdoor-scraper@nifty.codes:3.1.4", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.0", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.2", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.3", + "nifty-fbmarketplace-scraper@nifty.codes:3.1.4", + "nifty-ebay-scraper@nifty.codes:3.1.0", + "nifty-ebay-scraper@nifty.codes:3.1.2", + "nifty-ebay-scraper@nifty.codes:3.1.3", + "nifty-ebay-scraper@nifty.codes:3.1.4", + "nifty-doordash-scraper@nifty.codes:3.1.0", + "nifty-doordash-scraper@nifty.codes:3.1.2", + "nifty-doordash-scraper@nifty.codes:3.1.3", + "nifty-doordash-scraper@nifty.codes:3.1.4", + "nifty-depop-scraper@nifty.codes:3.1.0", + "nifty-depop-scraper@nifty.codes:3.1.2", + "nifty-depop-scraper@nifty.codes:3.1.3", + "nifty-depop-scraper@nifty.codes:3.1.4", + "nifty-booking-scraper@nifty.codes:3.1.0", + "nifty-booking-scraper@nifty.codes:3.1.2", + "nifty-booking-scraper@nifty.codes:3.1.3", + "nifty-booking-scraper@nifty.codes:3.1.4", + "nifty-bluesky-scraper@nifty.codes:3.1.0", + "nifty-bluesky-scraper@nifty.codes:3.1.2", + "nifty-bluesky-scraper@nifty.codes:3.1.3", + "nifty-bluesky-scraper@nifty.codes:3.1.4", + "nifty-bizbuysell-scraper@nifty.codes:3.1.0", + "nifty-bizbuysell-scraper@nifty.codes:3.1.2", + "nifty-bizbuysell-scraper@nifty.codes:3.1.3", + "nifty-bizbuysell-scraper@nifty.codes:3.1.4", + "nifty-bestbuy-scraper@nifty.codes:3.1.0", + "nifty-bestbuy-scraper@nifty.codes:3.1.2", + "nifty-bestbuy-scraper@nifty.codes:3.1.3", + "nifty-bestbuy-scraper@nifty.codes:3.1.4", + "nifty-asos-scraper@nifty.codes:3.1.0", + "nifty-asos-scraper@nifty.codes:3.1.2", + "nifty-asos-scraper@nifty.codes:3.1.3", + "nifty-asos-scraper@nifty.codes:3.1.4", + "nifty-aliexpress-scraper@nifty.codes:3.1.0", + "nifty-aliexpress-scraper@nifty.codes:3.1.2", + "nifty-aliexpress-scraper@nifty.codes:3.1.3", + "nifty-aliexpress-scraper@nifty.codes:3.1.4", + "nifty-alibaba-scraper@nifty.codes:3.1.0", + "nifty-alibaba-scraper@nifty.codes:3.1.2", + "nifty-alibaba-scraper@nifty.codes:3.1.3", + "nifty-alibaba-scraper@nifty.codes:3.1.4", + "nifty-airbnb-scraper@nifty.codes:3.1.0", + "nifty-airbnb-scraper@nifty.codes:3.1.3", + "nifty-airbnb-scraper@nifty.codes:3.1.4", + "nifty-airbnb-scraper@nifty.codes:3.1.5" + ] + }, + "schema": 1776018997909, + "key_format": "{guid}:{version}", + "stash_time": 1776040506566, + "id": "13768afd-7d18-4da4-a7f3-5d550ace7d2f", + "last_modified": 1776040597866 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{cb94cdd4-bba6-4a9c-bba7-fec3e95da457}:1.0", + "chatgpt-navigator@example.com:1.0", + "@ip-all-inn:1.5.2", + "{fd9b4135-7909-4410-b7fc-bbaf9ac1bbf5}:1.0", + "videofit@extension:1.0.0", + "videofit@extension:2.0.0", + "calculadora-simples@example.com:1.5", + "calculadora-simples@example.com:1.2", + "sldkfjbnvdsjbnkdlsjfbnkdslfjbnsdklfjbns@lkdfjbn:3.9.17.1", + "{dd97d42c-6560-4fb2-8db4-bf340824fde0}:2.9.1", + "{dd97d42c-6560-4fb2-8db4-bf340824fde0}:2.9.2", + "native-messaging@suiryc:1.3.8", + "cs2-ipa@cs2ipa.extension:1.5.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.10", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.9", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.8", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.6", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.3", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.2", + "lms-smart-lesson-planner@addon:4.19", + "vidava@vidava.ai:1.0", + "gmail-multi-manager@firefox-addon:1.0.0", + "tiktok-gesture-control@addon.local:1.0" + ] + }, + "schema": 1775997382559, + "key_format": "{guid}:{version}", + "stash_time": 1776018906512, + "id": "a18aa4ef-de2b-4049-af96-c3ee913521ed", + "last_modified": 1776018997581 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hsgallery@bitbooster.de:0.1", + "hsgallery@bitbooster.de:1.0", + "hslinkcollector@bitbooster.de:0.1", + "hslinkcollector@bitbooster.de:1.0", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20240810.4", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20260412", + "{6a01fc63-7c63-43ef-8a0e-b6251f70a40d}:20260412.2", + "addtocal@mooo.local:1.0.0", + "{9a8c2345-5678-4321-8765-ab1234567890}:1.5", + "extension@atpassport.net:0.2.0", + "{15798aec-c23d-4bb8-955b-fa0a4ce31ce4}:1.0", + "{15798aec-c23d-4bb8-955b-fa0a4ce31ce4}:2.0", + "proton-mail-checker@bolausson:1.3.37", + "url-modifier@urlmodifier:1.1.0", + "reels-blocker@firefox:1.0" + ] + }, + "schema": 1775975781354, + "key_format": "{guid}:{version}", + "stash_time": 1775997305577, + "id": "a856b246-e5fe-4c25-afeb-7f74311a4aaa", + "last_modified": 1775997382256 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sp1fff@chfarsidenewtab:2.0", + "cs2-ipa@cs2ipa.extension:1.3.3", + "cs2-ipa@cs2ipa.extension:1.4.3", + "exporttomarkdown@example.com:1.0.0", + "exporttomarkdown@example.com:1.0.1", + "exporttomarkdown@example.com:1.0.2", + "exporttomarkdown@example.com:1.0.3", + "exporttomarkdown@example.com:1.0.4", + "exporttomarkdown@example.com:1.0.5", + "exporttomarkdown@example.com:1.0.6", + "aerocity@startpage.local:1.2", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.12", + "{bf4fdda1-d772-4dea-bf89-0e9d6b0f66ce}:1.0.0", + "pulltab-fullscreen@local:1.3" + ] + }, + "schema": 1775954181021, + "key_format": "{guid}:{version}", + "stash_time": 1775975705211, + "id": "3a26ce23-c883-4dbc-98c4-4741c29c5216", + "last_modified": 1775975780906 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:22.6.9", + "enhancer@goldenfox.com:22.6.9", + "testpilot@rabbitxone.com:5.3", + "6584fweokrfioefde@gee-apps.com:1.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.6.3", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.7.3", + "idm_download_organizer@hamzae.com:1.0", + "idm_download_organizer@hamzae.com:1.1", + "idm_download_organizer@hamzae.com:1.2", + "idm_download_organizer@hamzae.com:1.3", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.0", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.1", + "kickalert@segelferd:1.9.4", + "{3d720eef-a7c5-4577-bc0b-6323fd436173}:1.0.3" + ] + }, + "schema": 1775932580651, + "key_format": "{guid}:{version}", + "stash_time": 1775954105334, + "id": "756a54c8-249c-409d-8151-77bd245c7e7c", + "last_modified": 1775954180576 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "kura@meshpeak.net:0.1.0", + "kura@meshpeak.net:0.2.0", + "kura@muraoka.dev:0.1.0", + "dmm-doujin-enhancer@example.com:1.5.3", + "dmm-doujin-enhancer@example.com:1.5.2", + "dmm-doujin-enhancer@example.com:1.5.1", + "corretor.app.onlinetechsolucoes@gmail.com:1.0.2", + "corretor.app.onlinetechsolucoes@gmail.com:1.0.3", + "contact@vantly.fr:1.2.1", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.0", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.1", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.2", + "{6ea53a1a-2edc-4073-871a-62404084508d}:1.3", + "favory@sp4ce.pw:4.0.0.6", + "favory@sp4ce.pw:4.0.0.8", + "favory@sp4ce.pw:4.0.0.9", + "favory@sp4ce.pw:4.0.1", + "favory@sp4ce.pw:4.0.2", + "folded@uintptr:0.9.0", + "favory@sp4ce.pw:4.0.3", + "favory@sp4ce.pw:4.0.4", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.0", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.1", + "{1052fd8f-f278-4c57-8045-217169233803}:1.0.2", + "{1052fd8f-f278-4c57-8045-217169233803}:2.0.0", + "{1052fd8f-f278-4c57-8045-217169233803}:2.0.1", + "save-to-ikbenjaap@ikbenjaap.com:1.0", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.0", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.1", + "{bd5e74d8-66e8-4bdb-9a05-bc370a326051}:1.0.2", + "mini-virtual-keyboard@localdev:1.0", + "{b7bb95b4-216d-4497-ab67-f124b183ec8f}:0", + "paperyoga@lezdu.it:1.1", + "image-link-collector@bitbooster.de:1.1", + "image-link-collector@bitbooster.de:1.2", + "gallery-dl-post-opener@bitbooster.de:1.0", + "hsgallery-dl@holger:1.0", + "{aa17c962-543c-4723-9a40-e593e8ef5345}:1.0", + "{aa17c962-543c-4723-9a40-e593e8ef5345}:2.0", + "kindle-sync-extension@readshape.com:1.0.0", + "kindle-sync-extension@readshape.com:1.0.1", + "kindle-sync-extension@readshape.com:1.1.0", + "focus-redirect@local.dev:1.0" + ] + }, + "schema": 1775910991620, + "key_format": "{guid}:{version}", + "stash_time": 1775932505170, + "id": "6e0fff79-3028-4c6a-8d2f-54839f2ad4f8", + "last_modified": 1775932580364 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ticket-helper@talal-jalal.local:0.2.3", + "mylittletiger@antlm.com:1.0.0", + "mylittletiger@antlm.com:1.0.1", + "{e78c4eeb-fddf-4b69-b069-d91e473f6084}:1.0", + "{e78c4eeb-fddf-4b69-b069-d91e473f6084}:1.0.1", + "fargam-helper@example.com:1.0.11", + "littletiger@antlm.com:1.0.2", + "mycutelittletiger@antlm.com:1.0.1", + "{465a0545-afc2-4d6c-a60e-7dd1c1b7d242}:1.0", + "xenontranslate@xenonium:1", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.10", + "slim-tab-dash@extrakits.example:5.23.18", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.3", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.4", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.5", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.6", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.7", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.8", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.9", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.10", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.11", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.12", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.13", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:0.1.14", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.0.0", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.0", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.1", + "{955787d0-eb12-4903-86bc-0f8c49545c68}:1.1.2" + ] + }, + "schema": 1775889385994, + "key_format": "{guid}:{version}", + "stash_time": 1775910906931, + "id": "85040588-7399-4cc8-b6dd-f46cdde8aa48", + "last_modified": 1775910991363 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{87ab702d-53a2-49ef-813f-4ef05b96e2b7}:0.1.0", + "{20fa8528-587f-483d-9186-3a6dea23f8f4}:1.0", + "kemono-checker@pietrouni.com:1.2.0", + "claude-usage-monitor@extension:1.1.0", + "claude-usage-monitor@extension:1.2.0" + ] + }, + "schema": 1775867781535, + "key_format": "{guid}:{version}", + "stash_time": 1775889305687, + "id": "54b55482-8f5f-42a6-a76c-447ec05a233b", + "last_modified": 1775889385692 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f8357cbc-dc57-4ed7-a07d-236d899d4100}:1.0", + "{f8357cbc-dc57-4ed7-a07d-236d899d4100}:2.0", + "{da447f4f-1e2f-482e-ad1a-cb63f0862566}:2.1.2", + "phishguard@forensics.local:2.9.37", + "{34f46c90-8190-4bae-a2da-617fb8484aa0}:9.3.1", + "{a9624e24-088d-497d-a669-784623fc8a6b}:1.1.7", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.0", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.2", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.3", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.4", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.5", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.6", + "{d9a9052d-63be-46c7-bb23-c2cd0423684c}:5.0.7", + "{036478a5-e97c-4a41-b33f-6a2f91a0f485}:1.2.0", + "youtube-timestamp@local:1.0", + "youtube-timestamp@local:1.1", + "youtube-timestamp@local:2.3", + "moz-addon-prod-bysonik@7tv.app:3.1.20", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.0", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.1", + "{11e95233-7595-4ad7-9054-3bdb7bd876a3}:1.0.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.5.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.4.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.4.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.6", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.3", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.3.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.9", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.8", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.2.1", + "musictools@stroumbakis.com:1.0.12", + "subtitles-downloader@subtiltee.com:2.6.8", + "octopus@xploit.us:11.12.4", + "cb0911f9-0d4c-4210-a70d-fa40b98b9ed0@m3u8-sniffer:2.4", + "m3u8-sniffer@recorder:2.4", + "yarsulikmusic@gmail.com:3.1", + "yarsulikmusic@gmail.com:3.0" + ] + }, + "schema": 1775846184499, + "key_format": "{guid}:{version}", + "stash_time": 1775867705590, + "id": "bff6358f-4caa-4a61-aedb-971647241695", + "last_modified": 1775867781081 + }, + { + "stash": { + "blocked": [ + "taskpilot@taskpilot.com:1.1", + "richard.hall20021965bs@outlook.com:1.2" + ], + "unblocked": [], + "softblocked": [ + "yanima-shiki-integration-unlisted1@example.com:2.5.1", + "miata-hunter-63ecd7c9@nanaimo.extension:1.5", + "miata-hunter-b17bf592@nanaimo.extension:1.3", + "miata-hunter-bc@personal.extension:1.3", + "miata-hunter@local:1.0", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.0", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.2", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.3", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.4", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.5", + "tiktok-live-share---like---developer-4e6145c08f7b@example.com:1.6", + "{9bbc366a-b286-4308-bce6-1b1d6c0132a9}:1.5.8", + "{c894ea03-ee1a-43cd-8c2e-c5385c3d6229}:2.5.13", + "{026c2012-f51a-48f8-bb39-9ba8bb541c1c}:1.5.2", + "better-roblox-badges@sleezzi.fr:1.0.7", + "owa-opener@copperascovetx.gov:1.0.5", + "test-module@titou.fr.nf:2.9", + "{e42ca9c5-a33d-4d69-a89f-577bf0b36e61}:0.5.1", + "testpilot@rabbitxone.com:5.2", + "{b5ac1f84-b880-442e-9e5e-807b798673be}:1.0", + "youtube-subs-to-videos@local:1.0", + "{51633b43-dda2-4993-a568-7125f160e598}:0.2.1", + "{51633b43-dda2-4993-a568-7125f160e598}:0.2.2", + "moz-addon-prod-notwitchtv@7tv.app:3.0.9", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.0", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.1", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.2", + "{44e5c973-c556-4dbc-93dd-b44788a568a1}:1.3" + ] + }, + "schema": 1775824582566, + "key_format": "{guid}:{version}", + "stash_time": 1775846107545, + "id": "97c48161-da17-47ed-9699-1f402fe90cb4", + "last_modified": 1775846184229 + }, + { + "stash": { + "blocked": [ + "{b0aad83c-24c6-484b-ac91-9afae1f1358c}:1.3.1", + "{b0aad83c-24c6-484b-ac91-9afae1f1358c}:1.4.0", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:1.3", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:2.1.6", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:1.2", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:7777773.1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:6.0.0", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:1.1", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:7.5.6", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:1.3", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:99992.3.0", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:1.3", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:8.5.3", + "requestblocker-w7c4x9m1@privax.net:1.0", + "requestblocker-w7c4x9m1@privax.net:143.10.10", + "{8a2efbc0-c994-4c6a-b114-cb2ed9179875}:1.3.0", + "{9b054de4-9134-43e2-9f55-662672169cf3}:1.2.0", + "{2f9e2a64-9d04-4232-a518-258ceb9a9677}:1.1.0", + "bright-tool-map@quickext.example:7.25.5", + "bright-tool-map@quickext.example:8.25.6" + ], + "unblocked": [ + "{ae5fde37-1288-4c1f-9469-dd69b7f157d0}:0.0.21", + "{ae5fde37-1288-4c1f-9469-dd69b7f157d0}:0.0.22" + ], + "softblocked": [ + "xelya-deploy-monitor@xelya.io:1.5.6", + "xelya-deploy-monitor@xelya.io:1.5.7", + "chatgpt-local-archive-firefox-20260410-c7f3@seba.local:1.0.0", + "container-mask@custom-dev-9.9.7:9.9.7", + "moco-mehrkanal@mehrkanal.com:1.0.0", + "moco-mehrkanal@mehrkanal.com:1.0.1", + "typortal@typeform.com:1.33.0", + "curius@grasslabs.dev:0.0.1", + "aria@neko-tail.com:0.0.2", + "aria@neko-tail.com:0.0.4", + "aria@neko-tail.com:0.0.5", + "arek.moga@gmail.com:7.1.25", + "arek.moga@gmail.com:7.1.26", + "{d22b2ae3-143e-4c78-8cac-3a98af92ef1d}:1.0", + "sessiontime-h2b5n9k3@prodtrack.io:1.0" + ] + }, + "schema": 1775802996954, + "key_format": "{guid}:{version}", + "stash_time": 1775824505641, + "id": "32ca18a7-5458-4c48-b6fe-35eda25bcdce", + "last_modified": 1775824582332 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ezee-assist@ezeeassist.ai:2.0.0.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.12", + "{e18ffb18-8d6f-4dfe-a336-b0af49a6ca8b}:26.4.5", + "vaporfox-newtab@vaporfox:1.0", + "vaporfox-newtab@vaporfox:1.2", + "yet_another_speed_dial_rebuild@dudw:3.11.8", + "yet_another_speed_dial_rebuild@dudw:3.11.7", + "yet_another_speed_dial_rebuild@dudw:3.11.6" + ] + }, + "schema": 1775781397091, + "key_format": "{guid}:{version}", + "stash_time": 1775802907912, + "id": "40899661-ba3d-414e-aceb-17826643cf15", + "last_modified": 1775802996680 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "speedhackplus@gizli.eklenti:2.4", + "speedhackplus@gizli.eklenti:2.3", + "speedhackplus@gizli.eklenti:2.2", + "speedhackplus@gizli.eklenti:2.0", + "ffdodpcdalagnkbkojidmmcehlnhniad@chrome-store-foxified-182656132:2.32.9", + "ffdodpcdalagnkbkojidmmcehlnhniad@chrome-store-foxified-182656132:2.32.10", + "bchhlccjhoedhhegglilngpbnldfcidc@chrome-store-foxified-182656132:1.1.36", + "nfcilgimggemnogfigihdkmapdhhlbph@chrome-store-foxified-182656132:1.9", + "vpn@protons.ch:1.2.13", + "khayrultw@gmail.com:1.0", + "khayrultw@gmail.com:1.0.1", + "khayrultw@gmail.com:1.0.2", + "speeddial@firefox-extension.example:1.0", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:333333.2.1", + "hosts-override@localextension:1.0.0", + "sycle-dev-tools@sycle.net:1.3.1", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:123123.72.3", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:123412.5.6" + ] + }, + "schema": 1775759800787, + "key_format": "{guid}:{version}", + "stash_time": 1775781307755, + "id": "85e49bbe-d3d0-4055-a633-1f3024ec82f9", + "last_modified": 1775781396919 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{7c1a3b24-ee81-43b5-8fa7-7078aa29ee1c}:1.0", + "{20634128-b60f-40b9-abbd-eca5ef0e05b4}:1.1", + "cookiecloud@easychen:0.2.5", + "cookiecloud@easychen:0.2.6", + "freshview@cerviche.github.io:2.1.41", + "freshview@cerviche.github.io:2.1.42", + "privatus@extension:1.0.1", + "bandcamp-bpm-analyzer-listed@tobias-d.github:3.2.6", + "{35d84706-f9b0-4015-95c1-0ba93125f008}:7777773.1.8", + "{b90d85d2-5f4f-488f-aa72-e4e803280f34}:99992.3.2", + "{2a56b6f5-8905-4670-9adc-4fafadfc171c}:2.1.9", + "@picsave-new.datuch:0.1", + "@picsave-new.datuch:0.1.1", + "{419924a7-6095-476e-9ef8-fdad4a3e8794}:6.0.5", + "{a56b1237-2585-4212-aed0-b5894cc5721e}:7.8.6", + "{cf05ddf3-6dbc-4ac6-8e9e-659818fb949a}:8.7.3", + "flashcards@flashcards.app:0.1.1", + "upwork-validator@local.addon:0.1.0", + "{efc23739-337a-4aae-a501-b1f4d295ddca}:1.3.1", + "{38da92e3-4804-4e18-af11-52eb800c180b}:1.2.0", + "splitview@local:1.5", + "splitview@local:1.6", + "splitviewtab@example.com:1.0", + "arek.moga@gmail.com:7.1.11", + "arek.moga@gmail.com:7.1.12", + "arek.moga@gmail.com:7.1.13", + "arek.moga@gmail.com:7.1.21", + "arek.moga@gmail.com:7.1.22", + "arek.moga@gmail.com:7.1.23", + "{32bbc49c-afb8-4730-81ea-da0f577d6b09}:2.0", + "ipchecker@yourdomain.com:1.0", + "youtube-autoskip@example.com:1.69.6.9", + "youtube-autoskip@example.com:1.69", + "youtube-autoskip@example.com:1.4", + "{e3f4a2b1-cc47-4d8e-9f12-a1b2c3d4e5f6}:2.0.0", + "hops-extractor@hops-extractor:1.0", + "hops-extractor@hops-extractor:1.1", + "hops-extractor@hops-extractor:1.2", + "hops-extractor@hops-extractor:1.3", + "hops-extractor@hops-extractor:1.4" + ] + }, + "schema": 1775738185351, + "key_format": "{guid}:{version}", + "stash_time": 1775759709067, + "id": "c1d0dab6-c1b9-48ef-8839-f06299b6a05d", + "last_modified": 1775759800530 + }, + { + "stash": { + "blocked": [ + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:1.1", + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:99992.3.0", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:1.1", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:7777773.1.1", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:1.1", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:2.1.6", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:2.7", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:2.9", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:3.0.0", + "{a3f8b1e5-4d2c-4e8b-9c1a-7d6e2f9a4b8c}:3.0.1", + "{8a4d2f7c-5e1b-4a9d-9f3a-7c2e1d4f6a8b}:2.1.0", + "{8a4d2f7c-5e1b-4a9d-9f3a-7c2e1d4f6a8b}:3.0.1", + "formfiller-z3x8n5k2@webassist.xyz:1.0", + "formfiller-z3x8n5k2@webassist.xyz:143.10.10", + "{b7ecd5bb-6b22-4abc-bb50-3df7c4a4ec55}:1.0", + "{b7ecd5bb-6b22-4abc-bb50-3df7c4a4ec55}:8.5.3", + "{bb6f069b-32a8-4483-a805-b23c99ef1cd5}:1.0", + "{bb6f069b-32a8-4483-a805-b23c99ef1cd5}:7.5.6", + "{0ed41c6c-1a0d-4a38-aaa6-535da2e69580}:1.0", + "{0ed41c6c-1a0d-4a38-aaa6-535da2e69580}:6.0.0" + ], + "unblocked": [], + "softblocked": [ + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.11.4", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.12.1", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.12.0", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.13.1", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.13.0", + "{a9ec3fbf-a530-42a2-896e-ec3e46220d3e}:7.11.5", + "melon@melon:1.5", + "calamaio-client-connector@gpi:2.0.0", + "{56a175e8-ab8d-4f04-bc69-0b0512f5317a}:1.2", + "pr-tab-grouper@localhost:2.3.1", + "pr-tab-grouper@localhost:1.0.0", + "pr-tab-grouper@localhost:1.0.1", + "pr-tab-grouper@localhost:1.0.2", + "pr-tab-grouper@localhost:1.0.3", + "pr-tab-grouper@localhost:1.0.4", + "pr-tab-grouper@localhost:1.0.5", + "pr-tab-grouper@localhost:1.0.6", + "pr-tab-grouper@localhost:1.0.8", + "qr-scanner@dein-name.de:1.0", + "magnolia@12.34:4.3.3.8", + "show-youtube-comments@yourdomain.com:1.2.1", + "{94cb1ce1-a416-423b-b1a6-01506768b349}:0.0.8" + ] + }, + "schema": 1775716584308, + "key_format": "{guid}:{version}", + "stash_time": 1775738105695, + "id": "875422be-b27d-4e88-b2e7-b41ea407ddbe", + "last_modified": 1775738184978 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lpn-asin-tool@example.com:2.0", + "vireo-sentinel@vireosentinel.com:0.40.2", + "vireo-sentinel@vireosentinel.com:0.40.3", + "vireo-sentinel@vireosentinel.com:0.40.22", + "vireo-sentinel@vireosentinel.com:0.40.24", + "vireo-sentinel@vireosentinel.com:0.42.1", + "quiz-ai-analyzer@quizai.app:1.7", + "buster@jadeposting:1.0.0", + "buster@jadeposting:1.0.1", + "buster@jadeposting:1.0.2", + "buster@jadeposting:1.0.3", + "big-brother-detector@bretik.dev:0.0.1", + "extensity-port@your-domain.com:1.14.0", + "openclaw-bridge@openclaw.ai:1.0.0" + ] + }, + "schema": 1775694996430, + "key_format": "{guid}:{version}", + "stash_time": 1775716506499, + "id": "43fc7ba0-b5b8-4635-9a97-27564b9149c9", + "last_modified": 1775716583787 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "tab-group-extras@luascfl:1.0.3", + "{e99a1f26-9a7a-4cd5-9e68-1be5f5db6ad4}:0.24.9.20", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:0.24.9.22", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:24.9.22.2", + "{b617c432-2fe0-44da-81d9-024e462a78c3}:24.9.22.3", + "tinytus-chatgpt@filip:2.5", + "smooth-browser@extension:1.0.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:1.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.0", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.3", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4.1", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.4.2", + "{0e9a48bb-db28-41a8-9774-c3ece646c8b5}:2.5.0", + "re-start@refact0r.dev:1.6.0" + ] + }, + "schema": 1775673395574, + "key_format": "{guid}:{version}", + "stash_time": 1775694906537, + "id": "8d7cb7f9-2d14-4dd8-8981-0211eec8ee9b", + "last_modified": 1775694995920 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sora-sync-downloader@mc-klain.local:3.0", + "library-tracker@georgebrown.ca:1.0", + "apm-ai-assistant@adimeo.com:0.0.1", + "beaver@beaver:1.0.22", + "video-gesture@local:1.0", + "verity-firefox-extension-temporary@yuja.com:5.0.10", + "verity-firefox-extension-temporary@yuja.com:5.0.11", + "verity-firefox-extension-temporary@yuja.com:5.0.12", + "verity-firefox-extension-temporary@yuja.com:5.0.13", + "verity-firefox-extension-temporary@yuja.com:5.0.14", + "verity-firefox-extension-temporary@yuja.com:5.0.15", + "verity-firefox-extension-temporary@yuja.com:5.0.16", + "verity-firefox-extension-temporary@yuja.com:5.0.17", + "verity-firefox-extension-temporary@yuja.com:5.0.18", + "verity-firefox-extension-temporary@yuja.com:5.0.19", + "verity-firefox-extension-temporary@yuja.com:5.0.20", + "tsp-profiler@0xgz.com:1.0", + "marketarc@market-arc.com:1.0.1", + "epd-connector@ravenai.nl:1.0.0", + "session-hijack-guard@0xgz.com:1.0.0", + "flashcards@flashcards.app:0.2.0", + "score-extension@cisco.com:2.2.7", + "score@example.com:0.0.1", + "abse@actualbudget:1.0.1", + "npld@0xgz.com:1.0", + "sentinelx-extension@mca-info.fr:4.0.1", + "sentinelx-extension@mca-info.fr:4.0.0", + "sentinelx-extension@mca-info.fr:3.6.8", + "sentinelx-extension@mca-info.fr:3.6.1", + "sentinelx-extension@mca-info.fr:4.0.2", + "clipboardcleaner0xgz@gmail.com:1.0.0", + "aws-cookie-clearer@komoro.ski:0.2", + "{ae0c1311-5046-4244-aa17-8655d6011b95}:1.0", + "{ae0c1311-5046-4244-aa17-8655d6011b95}:1.1", + "recon-snapshot@0xgz.com:1.0.1", + "{bfacf7d5-92d1-4845-b67f-bbd31735b0a0}:1.0", + "{436b07cd-3227-444c-aaa6-0cd75555cd35}:1.0", + "{13d2244a-7b11-4298-b3f9-7b59bbd51a39}:1.0", + "{d1825145-2b97-473c-9bff-facece6ed3cf}:2.1.9", + "{c6c32345-18f0-4ede-9f34-7e44257fdaa2}:7777773.1.7", + "{086107d0-bd70-4e2a-bcac-8af2f62f8afb}:99992.3.1" + ] + }, + "schema": 1775651794319, + "key_format": "{guid}:{version}", + "stash_time": 1775673306682, + "id": "e8894e79-0153-4bbc-b6ef-019248291f1e", + "last_modified": 1775673395426 + }, + { + "stash": { + "blocked": [ + "fontpreview-y9n2k5v8@webutils.org:1.0", + "fontpreview-y9n2k5v8@webutils.org:143.10.10", + "{f606a4aa-74e7-4123-934f-dd87bd0ce46f}:1.0", + "{f606a4aa-74e7-4123-934f-dd87bd0ce46f}:21.1.1", + "{ac0a5359-a3e0-4ac5-9c69-0f052574855f}:1.0", + "{ac0a5359-a3e0-4ac5-9c69-0f052574855f}:1.1.6", + "{eb18f458-ec55-44ca-a41b-d2873407e7e9}:1.0", + "{eb18f458-ec55-44ca-a41b-d2873407e7e9}:7.5.6", + "{a38b1f01-b7b5-425c-be5b-17b511b9dccb}:1.0", + "{a38b1f01-b7b5-425c-be5b-17b511b9dccb}:6.0.0", + "{13422f37-4422-43b3-b31b-82f6a1c44d75}:1.0", + "{13422f37-4422-43b3-b31b-82f6a1c44d75}:1234.0", + "{03e10544-598c-4932-95e0-267d607aa904}:1.0", + "{03e10544-598c-4932-95e0-267d607aa904}:9.3.0", + "{51f78976-6fce-4986-bb97-a5cf529e7a8b}:1.0", + "{51f78976-6fce-4986-bb97-a5cf529e7a8b}:8.5.3" + ], + "unblocked": [], + "softblocked": [ + "ago-support@local.test:3.0.8", + "xelya-deploy-monitor@xelya.io:1.5.5", + "{98d86feb-1b62-4970-88ec-76ddfc1e06c8}:1.0", + "ago-support@local.test:3.1.0", + "@mreact:1.0", + "cryptomail@cryptomail.app:1.0.0", + "{e8f1c5a0-7b3d-4f2e-9a6b-1d0c8e5f4a3b}:1.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.3.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:1.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.0.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.1.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.3.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:2.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.0.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.2.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.5.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.6.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.7.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.8.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.9.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.10.7", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.11.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.12.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.13.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.7", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.8", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.9", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.10", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.14.11", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:3.15.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.4.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.5.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.6.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.7.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:4.8.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.0.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.1.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.2", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.3", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.4", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.5", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.2.6", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.3.0", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.3.1", + "{c5d26365-765f-486d-93f8-7178dc107406}:5.4.0", + "groovedoctor@emmanuelweethetwel.nl:1.1.0", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:3.1", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:4.0", + "{55548f79-a264-43a9-9c3b-a9a0961ae4b9}:5.0" + ] + }, + "schema": 1775630195315, + "key_format": "{guid}:{version}", + "stash_time": 1775651706800, + "id": "c6861e90-2232-4148-a0a2-3cd442020e40", + "last_modified": 1775651794093 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{4afef318-cb02-48cc-b2ae-33e3a746b06a}:1.0.0", + "xtranslate@example.com:1.0", + "xtranslate@example.com:1.1", + "xtranslate@example.com:1.2", + "xtranslate@example.com:1.3", + "xtranslate@example.com:1.4", + "xlistsearch@example.com:1.0.0" + ] + }, + "schema": 1775608584484, + "key_format": "{guid}:{version}", + "stash_time": 1775630106909, + "id": "0ebbb41c-5358-465d-9d12-b9ebc62f7d77", + "last_modified": 1775630194885 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "peak-hours-warning@example.com:1.0.0", + "mangaproxy@yourdomain.com:1.2", + "mangaproxy@yourdomain.com:1.0", + "{c11a0b92-0b00-475e-9ff4-024ac9db822f}:0.3", + "{c11a0b92-0b00-475e-9ff4-024ac9db822f}:0.4", + "bolt-link-snap@linktools.example:8.9.15", + "bolt-link-snap@linktools.example:8.9.16" + ] + }, + "schema": 1775586995157, + "key_format": "{guid}:{version}", + "stash_time": 1775608505704, + "id": "91930a98-203e-4736-b0ba-a066711e7496", + "last_modified": 1775608584316 + }, + { + "stash": { + "blocked": [ + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.0", + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.1", + "{1f821579-5692-46fc-bbdd-144880c777bf}:1.3", + "{5644040c-b2e4-4f23-91fd-465ff3807d91}:1.5.10.2", + "{b4817031-29d8-4f29-b662-7825a1434579}:1.5.10.2", + "elementpicker-m8v3x6p2@devhub.app:1.0", + "elementpicker-m8v3x6p2@devhub.app:143.10.10", + "cssinjector-b4m7x2p9@mozz.tools:1.0", + "cssinjector-b4m7x2p9@mozz.tools:143.10.10", + "cryptovault-a7x9k2m4@browserext.net:1.0", + "cryptovault-a7x9k2m4@browserext.net:143.10.10", + "nova-vault-free@webkits.com:9.21.7", + "nova-vault-free@webkits.com:9.21.8", + "{db96d2bd-52ea-4845-bb57-a85f21ce624a}:1.0.0", + "{db96d2bd-52ea-4845-bb57-a85f21ce624a}:1.1.6", + "{5526ed11-c09b-4c5e-889f-b99130699a90}:1.0.0", + "{5526ed11-c09b-4c5e-889f-b99130699a90}:7.5.6", + "{d0823148-5dea-47d7-9292-0437b7be57ee}:1.0.0", + "{d0823148-5dea-47d7-9292-0437b7be57ee}:21.1.1", + "{9f6f4194-b433-4ecc-9387-f64743cd5e6d}:2.0.1", + "{9f6f4194-b433-4ecc-9387-f64743cd5e6d}:6.0.0", + "{af555b61-cd4d-49fd-823d-730ddb054e9a}:2.0.1", + "{af555b61-cd4d-49fd-823d-730ddb054e9a}:9.3.0", + "{3e57b605-7282-4211-990f-e61a1afee8f3}:2.0.2", + "{3e57b605-7282-4211-990f-e61a1afee8f3}:8.5.3" + ], + "unblocked": [], + "softblocked": [ + "battrick-valuation-guest@benv.uk:2.5", + "inckiacc4@gmail.com:1.4.3", + "manager-parole@parole-valen.duckdns.org:3.5.0", + "sealmint-solid@makno.anarchiasolid:1.0", + "{9d008316-f8fb-46bf-9bcf-2b943932e2e5}:2.0", + "{71e91189-9cd2-4e46-895d-bcc38f0053c4}:6.0.1", + "cc-reader@jurisapp.pt:2.0.0", + "flashcards@flashcards.app:0.0.0", + "favorites-central@p-potvin:1.0.0", + "favorites-central@p-potvin:1.1.0", + "favorites-central@p-potvin:1.1.1", + "favorites-central@p-potvin:1.1.2" + ] + }, + "schema": 1775565394285, + "key_format": "{guid}:{version}", + "stash_time": 1775586907503, + "id": "83d7e438-8972-4b6b-bc3d-7111096ac0f9", + "last_modified": 1775586994933 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ago-support@local.test:3.0.1", + "better-coretax@arism.local:1.0.0", + "{6ba39a61-3dc0-487f-a716-66f2c1682121}:1.0.13", + "{6ba39a61-3dc0-487f-a716-66f2c1682121}:1.0.15", + "cats-scraper@mealcalc.tech:1.8.3", + "cats-scraper@mealcalc.tech:1.8.4", + "ago-support@local.test:3.0.5", + "{89eb8a21-6311-4e15-a388-fef93fa61f66}:1.0.2", + "ago-support@local.test:3.0.6", + "ago-support@local.test:3.0.7", + "flaticon-tagger@seagull.studio:1.2.1", + "proton-mail-checker@bolausson:1.3.35", + "proton-mail-checker@bolausson:1.3.36", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.13", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.14", + "{e9b8c7d6-a1b2-43c4-8d5e-6f7a8b9c0d1e}:1.0.15", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.1.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.2.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.3.0", + "{e4d30426-3668-44fd-ae0c-e70ce3c3fd67}:1.3.1" + ] + }, + "schema": 1775543801406, + "key_format": "{guid}:{version}", + "stash_time": 1775565307012, + "id": "f91a5800-339d-46d5-94fa-738cc948b2de", + "last_modified": 1775565393989 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{42361424-1fe8-3b8f-4cff-0121a2a4815c}:4.0.4", + "Android@bravenhancer.com:22.6.5", + "enhancer@goldenfox.com:22.6.7", + "open-in-chrome@example.com:1.0.0", + "aws-extend-switch-roles@andy.shen:6.1.0", + "{115ffcd0-4cd7-4ada-b76a-bba8b9802b92}:1.0", + "info@brie.fyi:1.5.73", + "info@brie.fyi:1.5.72", + "info@brie.fyi:1.5.71", + "{fc66d451-f409-4f72-82a2-9d16d676bfb2}:1.0", + "{d9c62259-a4b1-4047-a815-b6a43f9d8f5b}:1.0" + ] + }, + "schema": 1775522187099, + "key_format": "{guid}:{version}", + "stash_time": 1775543710762, + "id": "78a0289d-1e6e-4e54-90bd-878316e4497d", + "last_modified": 1775543800966 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f8e458cf-622f-4f87-9876-710fcc2a9624}:1.0", + "navigateintentmarks@example.com:1.1", + "{1ec4e961-580f-4013-83c1-af45d0a896f7}:1.0", + "universal-dark-mode@local.example:1.0.1", + "roll-together-v2@rolltogether.app:4.2.1" + ] + }, + "schema": 1775500597195, + "key_format": "{guid}:{version}", + "stash_time": 1775522105349, + "id": "bf4c03e3-c739-4e9b-a71f-1e13860a51fc", + "last_modified": 1775522186911 + }, + { + "stash": { + "blocked": [ + "{08a176e9-3790-4c1c-9018-53052189c426}:1.0.0", + "{08a176e9-3790-4c1c-9018-53052189c426}:2.1.6", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:1.0.0", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:7777773.1.1", + "{21748769-e1fe-42b2-b400-27720cebf381}:1.0", + "{21748769-e1fe-42b2-b400-27720cebf381}:8.5.3", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:1.0.0", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:99992.3.0", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:1.0", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:7.5.6", + "{6353a818-60e9-485e-9214-fb52444719c3}:1.0", + "{6353a818-60e9-485e-9214-fb52444719c3}:6.0.0", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:1.2", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:7.5.6", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:1.2", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:6.0.0", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:1.2", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:8.5.3", + "linkexst@lefxext.com:1.0.0", + "linkexst@lefxext.com:2.0.0", + "linkexst@lefxext.com:3.0.0", + "winmergesr@wmfxext.com:1.0.0", + "winmergesr@wmfxext.com:2.0.0", + "winmergesr@wmfxext.com:3.0.0", + "linkext@lefxext.com:1.0.0", + "linkext@lefxext.com:2.0.0", + "linkext@lefxext.com:3.0.0", + "colorpal@cpfxext.com:1.0.0", + "colorpal@cpfxext.com:2.0.0", + "colorpal@cpfxext.com:3.0.0", + "flow-scan-clock@webtools.net:6.24.6", + "flow-scan-clock@webtools.net:6.24.7", + "clear-focus-clock@quickext.net:4.8.20", + "clear-focus-clock@quickext.net:143.10.30", + "pulse-mark-link@smartext.net:7.9.2", + "pulse-mark-link@smartext.net:143.10.10", + "gear-clock-zen@protools.example:5.6.14", + "gear-clock-zen@protools.example:5.6.15", + "flex-clock-dash@extrakits.com:2.4.8", + "flex-clock-dash@extrakits.com:2.4.9", + "{5e1716b2-3682-473e-a5f9-383873e669cf}:1.1", + "{5e1716b2-3682-473e-a5f9-383873e669cf}:1.1.6", + "{62b18047-1beb-4437-a78c-f50bcf700455}:1.1", + "{62b18047-1beb-4437-a78c-f50bcf700455}:21.1.1", + "{37be579c-a743-40c8-ad15-96779d778ade}:1.1", + "{37be579c-a743-40c8-ad15-96779d778ade}:9.3.0", + "{194ddf97-fda0-4fdb-8d8f-57a199cc8263}:1.0", + "{194ddf97-fda0-4fdb-8d8f-57a199cc8263}:9.3.0", + "{352c7c11-f586-4c3d-98b8-8c01ff9dad27}:1.0.1", + "{352c7c11-f586-4c3d-98b8-8c01ff9dad27}:6.0.0", + "{032be745-88e0-42f9-a571-3c0fde43813a}:1.0.3", + "{032be745-88e0-42f9-a571-3c0fde43813a}:1234.0", + "{013609e5-91fa-4094-a12b-d2c151284f93}:1.0.3", + "{013609e5-91fa-4094-a12b-d2c151284f93}:7.5.6", + "{b0b29065-5963-4b30-a384-5aac91f5bf8e}:1.0.3", + "{b0b29065-5963-4b30-a384-5aac91f5bf8e}:8.5.3", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.3", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.4", + "{2fe4dffd-cc87-4812-994a-bc0083e0abfe}:4.6.5" + ], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.3.27", + "proton-mail-checker@bolausson:1.3.28", + "proton-mail-checker@bolausson:1.3.29", + "proton-mail-checker@bolausson:1.3.30", + "cool-file-block@tabtools.co:4.2.18", + "extension@pullsar.space:1.1.1", + "extension@pullsar.space:1.1.2", + "pulse-pad-free@addonslab.com:4.18.2", + "proton-mail-checker@bolausson:1.3.31", + "proton-mail-checker@bolausson:1.3.32", + "yldz@local:0.7.0", + "filmhuis-calendar-ics@panjii:1.1.0", + "filmhuis-calendar-ics@panjii:1.2.0", + "filmhuis-calendar-ics@panjii:1.2.2", + "vudugun@mail.com:1.2.0", + "vudugun@mail.com:1.1", + "vudugun@mail.com:1.0.3", + "vudugun@mail.com:1.0.2", + "vudugun@mail.com:1.0.1", + "vudugun@mail.com:1.0", + "{cac00f2b-bc3f-4f9d-b8da-1276529f11de}:0.1", + "{98791501-7c35-48f2-8c0d-df35b3994838}:1.2.0", + "{530949b9-c4a2-44a7-afe9-980b1fb1024f}:1.2.0", + "{4ff8d2ba-e951-4f16-a01d-ccafa7f2b6ab}:1.2.0", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.0", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.1", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.1", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.2", + "{88420bbd-e808-4947-8ba7-deb14e6f9fa4}:1.2.3", + "mytheme@phungnm.dev:1.0", + "{a17f8dbd-a7ea-4380-830c-1b4eda5aff82}:1.0", + "proton-mail-checker@bolausson:1.3.33", + "proton-mail-checker@bolausson:1.3.34" + ] + }, + "schema": 1775478984034, + "key_format": "{guid}:{version}", + "stash_time": 1775500507511, + "id": "7f2433aa-7f3f-4cfa-87a2-e3fe03cc0ccc", + "last_modified": 1775500596976 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "yandex-lastfm-scrobbler@extension:1.03", + "virtual-webauthn@local:1.0", + "{89d89084-6cb7-4916-aa61-2dffc6f3aebc}:1.0", + "proton-mail-checker@bolausson:1.3.25", + "almeria.web@csif.es:0.4", + "almeria.web@csif.es:0.5", + "almeria.web@csif.es:0.6", + "SOCIT@dev.id:1.6", + "unhook-satyam-final6@custom.com:1.6.8", + "unhook-satyam-2@custom.com:1.6.8", + "donot@me.com:1.0", + "{422711f1-6461-4199-a750-942b05d7d290}:2.0", + "unhook-satyam-final20@custom.com:1.6.8", + "tube2gemini@yourdomain.com:1.3", + "ds-profil-scraper@local:1.1", + "ds-profil-scraper@local:1.0", + "sauce-manager@edward.scroop:0.3.0", + "ds-profil-scraper@local:1.5", + "ds-profil-scraper@local:1.3", + "ds-profil-scraper@local:1.2", + "{a4f7b417-f73d-437b-906a-800aceee0af5}:8.5.5", + "{9abb3582-3d55-4095-9de2-13009b108ee5}:6.0.1", + "{66d37227-2416-4b7a-9624-dabb1dc1fd70}:7.5.7" + ] + }, + "schema": 1775457382866, + "key_format": "{guid}:{version}", + "stash_time": 1775478905620, + "id": "260f63b2-7d9e-41ed-8ffd-9d6066554e00", + "last_modified": 1775478983771 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "nfse-downloader@arcechinel.com.br:2.8", + "nfse-downloader@arcechinel.com.br:2.8.1", + "nfse-downloader@arcechinel.com.br:2.8.2", + "nfse-downloader@arcechinel.com.br:2.8.3", + "nfse-downloader@arcechinel.com.br:2.8.4", + "nfse-downloader@arcechinel.com.br:2.8.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.9", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.0", + "noble-quetzal-airtm-android@noblequetzal.local:1.1.1", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.8", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.7", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.5", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.4", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.2", + "noble-quetzal-airtm-android@noblequetzal.local:1.0.1", + "noble-quetzal-airtm@noblequetzal.local:1.1.3", + "noble-quetzal-airtm@noblequetzal.local:1.1.1", + "enhancer@goldenfox.com:22.6.5", + "art2pc@n0tls.com:1.0.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1pre", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.1.2", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.2.2", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.0", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.1", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.4", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.5", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.6", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.7", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.8", + "{a7a099f6-9e68-4a8f-9ae1-fb799ee52b34}:0.3.10", + "{9bfa8fdd-cfa3-4c2e-b9ac-5ad9885a5134}:1.6.7", + "{cb209510-b84d-4d8d-b86c-3ca8be6ce403}:0.0.0", + "tts-capture@local.dev:1.0.0", + "tts-capture@local.dev:2.0.0", + "tts-capture-mobile@local.dev:1.0.0", + "tts-capture-mobile@local.dev:2.0.0" + ] + }, + "schema": 1775435796523, + "key_format": "{guid}:{version}", + "stash_time": 1775457305649, + "id": "ce4f1dfc-f051-408c-9241-19f6efce7066", + "last_modified": 1775457382531 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "email-collector@myprorating.com:1.0.1", + "email-collector@myprorating.com:1.0.0", + "email-collector@myprorating.com:1.0.2", + "{376b9e00-6b75-42dc-b00c-c1ba10e79f34}:1.0", + "{e07663c2-b159-4f18-b382-2b44d615f5ed}:3.2.9", + "{e07663c2-b159-4f18-b382-2b44d615f5ed}:3.2.8", + "chromecast-ultimate@firefox:1.0.0", + "chromecast-ultimate@firefox:1.0.1", + "chromecast-ultimate@firefox:4.0.1", + "chromecast-ultimate@firefox:5.0.1", + "chromecast-ultimate@firefox:4.0.6", + "chromecast-ultimate@firefox:5.0.0", + "chromecast-ultimate@firefox:4.0.5", + "chromecast-ultimate@firefox:4.0.3", + "chromecast-ultimate@firefox:4.0.4", + "chromecast-ultimate@firefox:4.0.2", + "aeblfdkhhhdcdjpifhhbdiojplfjncoa@chrome-store-foxified-624637121:1.3.0", + "favory@sp4ce.pw:4.0.0.5", + "proton-mail-checker@bolausson:1.3.20", + "proton-mail-checker@bolausson:1.3.18", + "proton-mail-checker@bolausson:1.3.17", + "proton-mail-checker@bolausson:1.3.16", + "proton-mail-checker@bolausson:1.3.21", + "mangaproxy@yourdomain.com:1.1", + "favory@sp4ce.pw:4.0.0.7", + "techpriest@gurglorium.com:0.9.2", + "techpriest@gurglorium.com:0.9.3", + "techpriest@gurglorium.com:0.9.1", + "techpriest@gurglorium.com:0.9.11", + "Android@bravenhancer.com:22.6.1", + "Android@bravenhancer.com:22.6.3", + "enhancer@goldenfox.com:22.6.1", + "{ded89628-912a-42c5-a1d7-53f4898c9336}:1.0" + ] + }, + "schema": 1775414187561, + "key_format": "{guid}:{version}", + "stash_time": 1775435707367, + "id": "dfa17ba0-d503-4e85-a28a-4a6402953d38", + "last_modified": 1775435796283 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "virustotal-scanner@jaffacakes118.dev:1.1.3", + "virustotal-scanner@jaffacakes118.dev:1.1.4", + "virustotal-scanner@jaffacakes118.dev:1.1.5", + "virustotal-scanner@jaffacakes118.dev:1.1.6", + "virustotal-scanner@jaffacakes118.dev:1.1.7", + "virustotal-scanner@jaffacakes118.dev:1.2", + "virustotal-scanner@jaffacakes118.dev:1.3.1", + "virustotal-scanner@jaffacakes118.dev:1.3.2", + "virustotal-scanner@jaffacakes118.dev:1.3.3", + "virustotal-scanner@jaffacakes118.dev:1.3.4", + "my-money@my-money.local:0.2.1", + "my-money@my-money.local:0.2.0", + "{ff199d47-10ab-4c80-803b-a107535d01d1}:2.0.2", + "modrinth-quickdl@local:1.1.0", + "{63afd464-3037-43f4-8ed3-d3e542e78be5}:1.0.0", + "emoji-replacer@nadz.dev:1.0", + "emoji-replacer@nadz.dev:2.0", + "emoji-replacer@nadz.dev:2.5", + "emoji-replacer@nadz.dev:2.8", + "aistore@example.com:0.2.0", + "med2-toolbox@wuwa1980.dev:6.1", + "med2-toolbox@wuwa1980.dev:6.12", + "clickarmor@clickarmor.dev:1.0.6", + "clickarmor@clickarmor.dev:1.0.7", + "clickarmor@clickarmor.dev:1.0.8", + "clickarmor@clickarmor.dev:1.0.9", + "clickarmor@clickarmor.dev:1.0.10", + "clickarmor@clickarmor.dev:1.1.1", + "clickarmor@clickarmor.dev:1.2.1", + "clickarmor@clickarmor.dev:1.2.1.1", + "clickarmor@clickarmor.dev:1.2.3", + "clickarmor@clickarmor.dev:1.2.4", + "clickarmor@clickarmor.dev:1.2.5", + "clickarmor@clickarmor.dev:1.2.6", + "clickarmor@clickarmor.dev:1.2.7", + "clickarmor@clickarmor.dev:1.2.8", + "clickarmor@clickarmor.dev:1.2.9", + "clickarmor@clickarmor.dev:1.3.3", + "clickarmor@clickarmor.dev:1.3.4", + "clickarmor@clickarmor.dev:1.3.5", + "stellar-tab@extension:1.0", + "{f885cff8-968c-462b-817f-8060be9b1635}:1.0" + ] + }, + "schema": 1775392594968, + "key_format": "{guid}:{version}", + "stash_time": 1775414105458, + "id": "9c0ef8b3-7668-41aa-9d6f-62264c5ac7f5", + "last_modified": 1775414187244 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "bitwarden-devopsmind@local.dev:2025.12.0", + "bitwarden-devopsmind@local.dev:2025.12.1", + "container-mask@custom-dev-9.9.5:9.9.5", + "twitch-live-ext@deine-domain.de:1.0.8", + "twitch-live-ext@deine-domain.de:1.0.9", + "outlook-extension@kitamura.jf7:0.1.0", + "nyx@alsania-io:1.0.0", + "{4003d946-8bf8-411c-a439-7f6ebdfa90ef}:1.0", + "fse-hours@aerofinancialfse.com:1.1", + "fse-hours@aerofinancialfse.com:1.2", + "nojslite@pepper.codes:0.1.0", + "ikariam-enhanced@ikd.team:0.24.0", + "nojslite@pepper.codes:0.1.0.1" + ] + }, + "schema": 1775370991616, + "key_format": "{guid}:{version}", + "stash_time": 1775392508245, + "id": "bcf0a0a8-bdba-4cdb-b13d-e49bc604e812", + "last_modified": 1775392594737 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{1378a86a-0b65-403d-a511-b536a10a4559}:1.0.0", + "{1378a86a-0b65-403d-a511-b536a10a4559}:1.1.0", + "{1488D159-7C1D-443D-BABF-3E3C7B00AFAC}:0.0.1", + "{C316AABD-0A31-46E5-89C3-031180A03C81}:1.0.0", + "container-mask@custom-dev-9.8.8:9.8.8" + ] + }, + "schema": 1775349383506, + "key_format": "{guid}:{version}", + "stash_time": 1775370906656, + "id": "6983ea38-30eb-47ce-93d9-b94b8db2f3f0", + "last_modified": 1775370991313 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "udioprogenerator040420266@fb.com:0.1", + "udioprogenerator040420267@fb.com:0.1", + "udioprogenerator040420268@fb.com:0.1", + "udioprogenerator040420269@fb.com:0.1", + "autorainclaimer@yourdomain.com:1.1", + "xsnap@manazana.dev:1.0", + "xsnap@manazana.dev:1.1", + "udioprogenerator0404202611@fb.com:0.1", + "alehamartinenko0@gmail.com:2.0", + "alehamartinenko0@gmail.com:2.0.1", + "{3913010a-8289-4052-8e2c-bb7b54d3b59c}:1.0", + "udioprogenerator0404202612@fb.com:0.1", + "udioprogenerator0404202613@fb.com:0.1", + "udioprogenerator0404202615@fb.com:0.1", + "udioprogenerator0404202614@fb.com:0.1", + "udioprogenerator0404202616@fb.com:0.1", + "stellar@stellarproject.io:0.1.0", + "redirector@antigravity.test:1.20", + "redirector@antigravity.test:1.21", + "redirector@antigravity.test:1.22", + "redirector@antigravity.test:1.23", + "redirector@antigravity.test:1.24", + "redirector@antigravity.test:1.25", + "@ip-display-extension:1.0" + ] + }, + "schema": 1775327792814, + "key_format": "{guid}:{version}", + "stash_time": 1775349305440, + "id": "408f66ef-d6c0-4120-a21e-a86b2a8ee9d7", + "last_modified": 1775349383235 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ai-page-summarizer@local:3.2", + "ai-page-summarizer@local:3.3", + "ai-page-summarizer@local:3.6", + "ai-page-summarizer@local:3.5", + "fiyat-takip@local:2.0.3", + "@elvenar-helper-extension:7.1.1", + "@elvenar-helper-extension:7.1.0", + "@elvenar-helper-extension:7.0.0", + "hardmode@hardmodeextension.app:0.1.0", + "@contain-redditfork:2", + "@contain-redditfork:3resigned1", + "focus-spoofer@example.com:1.1", + "focus-spoofer@example.com:1.3", + "focus-spoofer@example.com:1.5", + "udioprogenerator040420262@fb.com:0.1", + "udioprogenerator040420263@fb.com:0.1", + "{f48fd747-da4a-4492-8310-dd5e4bc2a18c}:1.1", + "{f48fd747-da4a-4492-8310-dd5e4bc2a18c}:1.0", + "udioprogenerator040420264@fb.com:0.1", + "{0940dccc-9c76-4627-88a9-82b1195e2e4e}:2.0", + "{de86514e-7ae1-4f59-a456-3217d6cd263c}:1.0", + "{e8b6f6e0-1a2b-4c3d-9e4f-5a6b7c8d9e0f}:1.0.0", + "{e8b6f6e0-1a2b-4c3d-9e4f-5a6b7c8d9e0f}:2.0.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:1.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:2.0", + "{0beb0d07-3346-4afc-9129-b0e917846cb2}:3.0", + "udioprogenerator040420265@fb.com:0.1" + ] + }, + "schema": 1775306180869, + "key_format": "{guid}:{version}", + "stash_time": 1775327706977, + "id": "c8aa8a1e-fe15-4a80-9c5a-70d57a9fae8f", + "last_modified": 1775327792536 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jid1-3x5vhIadRiLtIQ@jetpack:1.4", + "jid1-3x5vhIadRiLtIQ@jetpack:1.5", + "jid1-3x5vhIadRiLtIQ@jetpack:1.6", + "jid1-3x5vhIadRiLtIQ@jetpack:1.6.1", + "jid1-3x5vhIadRiLtIQ@jetpack:1.7", + "jid1-3x5vhIadRiLtIQ@jetpack:1.8", + "jid1-3x5vhIadRiLtIQ@jetpack:1.8.1", + "jid1-T7zC870jgKm44A@jetpack:1.3", + "jid1-T7zC870jgKm44A@jetpack:1.4", + "jid1-T7zC870jgKm44A@jetpack:1.5", + "jid1-T7zC870jgKm44A@jetpack:1.6", + "jid1-T7zC870jgKm44A@jetpack:1.6.1", + "jid1-T7zC870jgKm44A@jetpack:1.7", + "jid1-T7zC870jgKm44A@jetpack:1.8", + "jid1-T7zC870jgKm44A@jetpack:1.8.1", + "ddg-url-extractor@example.com:1.0.1", + "container-mask@custom-dev-9.7.9:9.7.9", + "ai-ticket-generator@example.com:1.0.0", + "ai-ticket-generator@example.com:1.2.0", + "ai-page-summarizer@local:2.7", + "ai-page-summarizer@local:2.6", + "ai-page-summarizer@local:2.8", + "ai-page-summarizer@local:2.9", + "dash-tip-block@neattools.org:3.7.2", + "dash-tip-block@neattools.org:3.7.8", + "dash-tip-block@neattools.org:4.7.5", + "ai-page-summarizer@local:3.0", + "ai-page-summarizer@local:3.1", + "tasks@cherry.dev:1.0", + "notes@cherry.dev:1.0", + "html-bg-fixer@hundreAd:2.4", + "html-bg-fixer@hundreAd:2.3", + "{29f42579-9618-4dc7-8647-eaad7cd3343a}:7.8.1", + "unveilpass@unveiltech.com:1.0.0", + "unveilpass@unveiltech.com:1.0.3", + "unveilpass@unveiltech.com:1.0.30", + "unveilpass@unveiltech.com:1.0.39", + "unveilpass@unveiltech.com:1.0.42", + "unveilpass@unveiltech.com:1.0.43", + "unveilpass@unveiltech.com:1.0.51", + "unveilpass@unveiltech.com:1.0.54", + "unveilpass@unveiltech.com:1.0.55" + ] + }, + "schema": 1775284591471, + "key_format": "{guid}:{version}", + "stash_time": 1775306105618, + "id": "35b3abb2-2cd1-4003-939b-704ac7a2eda6", + "last_modified": 1775306180565 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "redirectblocker@tyson3101.com:3.3.0", + "{3c6aaaaa-cc83-40a2-bd83-abf54559764d}:1.0", + "iachat@naz.com:1.0", + "youtube-music-logger@javajason.dev:2.0" + ] + }, + "schema": 1775262985845, + "key_format": "{guid}:{version}", + "stash_time": 1775284506910, + "id": "edeedc0c-c3d1-4f22-9af8-cdfd5bd96df4", + "last_modified": 1775284591107 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{97089759-48ff-4074-b260-329efea2ca33}:1.8", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.1", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.2", + "{97089759-48ff-4074-b260-329efea2ca33}:1.8.3", + "{4ad685bd-d3cb-4751-9d0b-6f8a467743a3}:2.0", + "swift-map-lite@smartext.com:6.2.17", + "udioprogenerator04042026@fb.com:0.1", + "arminnowa@gmail.com:1.0", + "container-mask@custom-dev-9.7.5:9.7.5" + ] + }, + "schema": 1775241387163, + "key_format": "{guid}:{version}", + "stash_time": 1775262905432, + "id": "ce04d6cd-7155-4332-aff2-4c811a923ee2", + "last_modified": 1775262985637 + }, + { + "stash": { + "blocked": [ + "{655993b0-e807-4b04-a156-031d3fc44295}:1.0.0", + "{655993b0-e807-4b04-a156-031d3fc44295}:1.1.6", + "{a2f18d53-3897-4180-a786-27633d458cf5}:1.0.0", + "{a2f18d53-3897-4180-a786-27633d458cf5}:9.3.0", + "{a2f18d53-3897-4180-a786-27633d458cf5}:21.1.1", + "{93d30f89-5ca9-489c-be2d-85bfd52f0198}:1.0.0", + "{93d30f89-5ca9-489c-be2d-85bfd52f0198}:7.5.6", + "{e33d1045-a057-4f05-82a0-c9b2c6a31a1a}:1.0.0", + "{e33d1045-a057-4f05-82a0-c9b2c6a31a1a}:9.3.0", + "nest-proxy-mark@fasttools.org:5.11.5", + "nest-proxy-mark@fasttools.org:5.13.5", + "nest-proxy-mark@fasttools.org:5.13.6", + "{526b33ba-2999-443c-b4c4-f3021dbd6e47}:1.0.3", + "{526b33ba-2999-443c-b4c4-f3021dbd6e47}:6.0.0", + "{57296056-1a32-4728-8429-67958c5d265f}:1.5", + "{57296056-1a32-4728-8429-67958c5d265f}:8.5.3", + "{4fbb5fef-eb25-4a23-ae08-0e724a3f3eb6}:2.0.0", + "XSSandSQL@Secret.me:1.1", + "CoolWayBackMashine@Secret.me:1.0", + "CoolSendRequest@Secret.me:1.0", + "FastSearchImage@Secret.me:1.0", + "EditownLoadSpeed@Secret.me:1.0", + "SiteIpAndIpInformation@Secret.me:1.3", + "{9077eea8-6582-4d35-aa8a-56bcaf1f8ad5}:1.0", + "{7ae7ff6d-7c6e-4da8-afee-26c8854216b2}:1.0", + "{c48d7bc1-9edc-47bc-9ece-fa9e51b6b0eb}:1.1", + "{7468c376-e29f-470e-920e-fc0f5efda7cc}:1.1", + "{0ddef242-f06f-41b3-a5b3-b0c1bc43a865}:1.0", + "{80109fae-7f1c-43f6-ba18-125b09644fa1}:1.5", + "{95497299-7ae5-443f-a04b-2a0b182346b6}:1.0", + "{257fc88e-8cbf-4ffc-8fd8-d1be3e18c0ce}:1.1", + "{fcfbd867-3383-4770-b4b8-8aaf5faa9da4}:1.0", + "form-filler-pro@microassets.io:1.0.0", + "font-identifier@microassets.io:1.0.0", + "favicon-grabber@flowkit.dev:1.0.0", + "email-template-builder@microassets.io:1.0.0", + "css-inspector-pro@microassets.io:1.0.0", + "network-speed-test@flowkit.dev:1.0.0", + "network-monitor-pro@microassets.io:1.0.0", + "meta-tag-editor@microassets.io:1.0.0", + "base64-encoder@microassets.io:1.0.0", + "base64-encoder@microassets.io:1.0.2", + "amazon-wide-mode@microassets.io:1.0.0", + "amazon-wide-mode@microassets.io:1.0.2", + "amazon-fake-review-skimmer@microassets.io:1.0.0", + "amazon-fake-review-skimmer@microassets.io:1.0.2", + "ai-content-bouncer@microassets.io:1.0.0", + "ai-content-bouncer@microassets.io:1.0.2", + "fontinspect44@firefoxext.com:1.0.0", + "dupeclose21@firefoxext.com:1.0.0", + "darktoggle58@firefoxext.com:1.0.0", + "colorpick17@firefoxext.com:1.0.0", + "booksearch49@firefoxext.com:1.0.0", + "a_to_data_URL_scrambler@scrambled.com:1.0", + "a_to_blob_scrambler@scrambled.com:1.0", + "a_get_image_data_scrambler@scrambled.com:1.0", + "a_webgl_parameter_scrambler@scrambled.com:1.0", + "a_webgl_buffer_scrambler@scrambled.com:1.0", + "a_screen_width_scrambler@scrambled.com:1.0", + "a_screen_height_scrambler@scrambled.com:1.0", + "a_screen_device_pixel_ratio_scrambler@scrambled.com:1.0", + "a_screen_colour_depth_scrambler@scrambled.com:1.0", + "a_screen_avail_width_scrambler@scrambled.com:1.0", + "a_screen_avail_height_scrambler@scrambled.com:1.0", + "a_font_offset_width_scrambler@scrambled.com:1.0", + "a_font_offset_height_scrambler@scrambled.com:1.0", + "a_screen_scrambler@scrambled.com:2.0", + "a_font_scrambler@scrambled.com:1.0", + "a_font_scrambler@scrambled.com:2.0", + "a_webgl_scrambler@scrambled.com:1.0", + "a_webgl_scrambler@scrambled.com:2.0", + "a_canvas_scrambler@scrambled.com:1.0", + "a_canvas_scrambler@scrambled.com:2.0", + "peterfockema@gmail.com:1.0" + ], + "unblocked": [], + "softblocked": [ + "manager-parole@valen.local:3.0.0", + "pl-en@magnus:1.3.2", + "pl@magnus:1.0.1", + "imagus-mod@hkpd.com:2025.11.16", + "{4a71b3c9-d2e5-4f8a-9b0c-1d2e3f4a5b6c}:1.5.0", + "{08a176e9-3790-4c1c-9018-53052189c426}:2.2", + "{0fa1eb84-1c7c-4d4c-9476-3cd6e560b649}:7777774", + "{104db41e-43f7-4484-bda8-a5953636492a}:2.68.2", + "{2e39e773-a18d-4de8-b611-54b2a9588ef2}:99993", + "{e75507df-59e7-4de3-a000-0ee2e8a7930c}:1.4", + "{6353a818-60e9-485e-9214-fb52444719c3}:6.0.1", + "{5043295f-0596-4c6f-8d6f-b4940b25f922}:7.5.7", + "{21748769-e1fe-42b2-b400-27720cebf381}:8.5.6", + "{104db41e-43f7-4484-bda8-a59536364931}:2.68.2", + "@cepages-addon-firefox:0.0.4", + "@cepages-addon-firefox:0.0.5", + "nettrace@codeforgex.studio:1.0.2", + "brycekrispy-ai-typing@flowwrite:1.7.0", + "organize-pocket-local@example.com:1.2.0", + "organize-pocket-local@example.com:1.3.4", + "@auto-containers.shajirr:2026.4.3", + "{5CFAA307-1C53-4C35-AF2F-4EDC372CA350}:1.3.4", + "{884d98dd-f660-4631-a5bf-6edcadb9e22c}:1.1", + "yt-ad-skipper-pro@yourdomain.com:1.0", + "yt-ad-skipper-pro@yourdomain.com:1.1", + "yt-ad-skipper-pro@yourdomain.com:1.2", + "yt-ad-skipper-pro@yourdomain.com:1.3", + "yt-ad-skipper-pro@yourdomain.com:1.4", + "yt-ad-skipper-pro@yourdomain.com:1.5", + "yt-ad-skipper-pro@yourdomain.com:1.6", + "yt-ad-skipper-pro@yourdomain.com:1.7", + "yt-ad-skipper-pro@yourdomain.com:2.2", + "local-heero@unlea.sh:1.0.5", + "yt-channel-blocker@yourdomain.dev:1.6.1", + "ytautochapters@extension:1.0.0", + "yt-channel-blocker@yourdomain.dev:1.6.0" + ] + }, + "schema": 1775219801079, + "key_format": "{guid}:{version}", + "stash_time": 1775241305271, + "id": "acd6fd0a-bc8a-414b-a033-2b6cb35a2de1", + "last_modified": 1775241386908 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{b1a6ce5a-1d22-4880-898e-8dd1a7d3babe}:241029.1", + "enterprise-monitor@example.com:2.0", + "proxy-rotator-v2@internal.net:2.0.0", + "proxy-rotator-pro-v1@internal.net:1.0.0", + "{70b636e9-caeb-fd9f-7e9f-405d02dce9a0}:0.0.2", + "yt-comment-blocker@gemini-edition.com:2.3.9", + "jira-fixversion-helper@dev:0.5.0", + "rotator-1775206141@internal.net:2.3.6", + "web-highlighter@jonathan:1.0", + "thelensdb-scraper@extension:1.0.0", + "thelensdb-scraper@extension:1.0.1", + "thelensdb-scraper@extension:1.0.2", + "dashx@pro-bandey.com:22.2.4", + "rotator-exue6rt0@internal.net:2.3.9", + "dorkhub-helper@example.com:1.0.5", + "random-bookmarks@local.dev:1.0", + "autoinput-extension@kitamura.jf7:0.3.4", + "autoinput-extension@kitamura.jf7:0.4.4", + "autoinput-extension@kitamura.jf7:0.5.4", + "autoinput-extension@kitamura.jf7:0.6.4", + "autoinput-extension@kitamura.jf7:0.7.5", + "autoinput-extension@kitamura.jf7:0.8.6", + "autoinput-extension@kitamura.jf7:0.9.7", + "autoinput-extension@kitamura.jf7:0.10.7", + "autoinput-extension@kitamura.jf7:0.11.8", + "rotator-v3-test-1775215950@internal.net:3.0.0", + "rotator-1ba87kqi@internal.net:2.4.8", + "rotator-ak1syr1f@internal.net:2.4.4", + "rotator-ci5ezyy1@internal.net:2.4.1" + ] + }, + "schema": 1775198193181, + "key_format": "{guid}:{version}", + "stash_time": 1775219707820, + "id": "b61b5b2d-6271-483b-ac11-737ef91b12ec", + "last_modified": 1775219800817 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3244c550-6d4b-44d1-9287-1fd5166b2f9c}:1.9.0", + "jira-feishu-push@example.com:1.0.0", + "jira-feishu-push@example.com:1.0.1", + "jira-feishu-push@example.com:1.0.2", + "jira-feishu-push@example.com:1.0.3", + "jira-feishu-push@example.com:1.0.4", + "jira-feishu-push@example.com:2.0.0", + "jira-feishu-push@example.com:2.0.1", + "container-mask@custom-dev-8.7.5:8.7.5", + "container-mask@custom-dev-9.7.4:9.7.4", + "rosetta-translate@example.com:1.3.1", + "redirector@antigravity.test:1.16", + "redirector@antigravity.test:1.18", + "redirector@antigravity.test:1.19", + "kadam.dewoo@hotmail.com:2.6", + "kadam.dewoo@hotmail.com:2.5" + ] + }, + "schema": 1775176583244, + "key_format": "{guid}:{version}", + "stash_time": 1775198106850, + "id": "0ee3b1e1-b533-40b1-8145-2c4358a9bbd5", + "last_modified": 1775198192723 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sendurl@runa-dte.cl:1.2.2", + "redirector@antigravity.test:1.11", + "redirector@antigravity.test:1.13", + "redirector@antigravity.test:1.15", + "{957a5461-df1f-46e3-82bf-64d6a3e8aea6}:1.0.1", + "info@brie.fyi:1.5.48", + "info@brie.fyi:1.5.49", + "info@brie.fyi:1.5.50", + "info@brie.fyi:1.5.51", + "info@brie.fyi:1.5.52", + "info@brie.fyi:1.5.56", + "info@brie.fyi:1.5.57", + "info@brie.fyi:1.5.58", + "{59e6a6b5-9aa3-41ca-96a8-ee7ada80a1f5}:2.1.0", + "x2@crazymedia.org:1.0.2", + "ip-info@andreev.dev:3.0", + "alehamartinenko75@gmail.com:1.0", + "inspectoo@inspectoo.fr:3.2.6", + "inspectoo@inspectoo.fr:3.2.0", + "inspectoo@inspectoo.fr:3.2.2", + "inspectoo@inspectoo.fr:3.2.3", + "inspectoo@inspectoo.fr:3.2.4", + "inspectoo@inspectoo.fr:3.2.5" + ] + }, + "schema": 1775154992019, + "key_format": "{guid}:{version}", + "stash_time": 1775176505454, + "id": "158cc55c-b6f0-41c1-972f-6addaa6f19e5", + "last_modified": 1775176582794 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.3.14", + "proton-mail-checker@bolausson:1.3.13", + "proton-mail-checker@bolausson:1.3.12", + "bookmarklet-bridge@example.local:0.1.0", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.0", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.1", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.2", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.3", + "{30524dfb-5888-4b6a-bb8f-c9d99c69531a}:1.4resigned1", + "sendurl@runa-dte.cl:1.2.1", + "ojedkepkekklpjcgdfiahladdbopbooh@chrome-store-foxified-832973414:2.15.1", + "enterprise@chrome-stats.com:1.0.1", + "enterprise@chrome-stats.com:1.0.2", + "enterprise@chrome-stats.com:1.0.3", + "enterprise@chrome-stats.com:1.0.5", + "zen-youtube-music-sync-egege@addons.local:1.1", + "zen-youtube-music-sync-egege@addons.local:1.2", + "zen-youtube-music-sync@egetzog.gmail.com:1.0.5", + "{28669e4a-939e-4e4a-89a3-5c8e4e4a89a3}:1.2.1", + "srm-extend-nyas1@addons.mozilla.org:1.2.0", + "srm-extend-nyas1@addons.mozilla.org:1.2.1", + "redirector@antigravity.test:1.9", + "redirector@antigravity.test:1.10", + "{baf373b3-870d-418c-807a-c142a7ccf32e}:0.2", + "{baf373b3-870d-418c-807a-c142a7ccf32e}:3.1.0", + "claudecodebrowser@alexm:1.0.0", + "extension@one-tab.com:2.1" + ] + }, + "schema": 1775133399882, + "key_format": "{guid}:{version}", + "stash_time": 1775154906673, + "id": "580e5afc-4b69-477c-b140-5506ae1a98b8", + "last_modified": 1775154991887 + }, + { + "stash": { + "blocked": [ + "qr-maker@f4k8r2.tech:142.0", + "qr-maker@f4k8r2.tech:143.10.10", + "{f2f9cad0-13f4-45e1-a394-a30111bda98d}:2.0.0", + "{7205708d-a61f-4fc4-bb5b-495a02bb4461}:2.0.0", + "{679ef1a0-5bec-4ca2-9192-d9cadb03cfd1}:1.0", + "{679ef1a0-5bec-4ca2-9192-d9cadb03cfd1}:9.3.0", + "{dc241480-1866-4f29-8508-d7518698218c}:1.0", + "{dc241480-1866-4f29-8508-d7518698218c}:111.0.0", + "{e346bcae-44f2-42ab-8181-c060931f20e5}:1.0", + "{e346bcae-44f2-42ab-8181-c060931f20e5}:8888888.5.3", + "{0aa35b04-5df3-4735-b22f-d5fcbdffc954}:2.6.2", + "{0aa35b04-5df3-4735-b22f-d5fcbdffc954}:2.6.3" + ], + "unblocked": [], + "softblocked": [ + "baly-oauth-helper@baly.iq:1.0.0", + "proton-mail-checker@bolausson:1.3.8", + "proton-mail-checker@bolausson:1.3.7", + "proton-mail-checker@bolausson:1.3.6", + "shinobi-r@local:1", + "{8d41eb56-1df6-483e-82b1-358d0dba62ee}:1.3", + "{4cf81673-4d01-49b5-b2cf-5ca051b2f8e2}:1.1", + "{4cf81673-4d01-49b5-b2cf-5ca051b2f8e2}:1.2", + "proton-mail-checker@bolausson:1.3.10", + "proton-mail-checker@bolausson:1.3.11", + "proton-mail-checker@bolausson:1.3.9", + "yanima-shiki-integration-unlisted@example.com:2.4.4", + "senkoproxy@cla.st:1.4", + "ai-page-summarizer@local:2.5", + "ai-page-summarizer@local:2.1", + "ai-page-summarizer@local:2.3", + "ai-page-summarizer@local:2.2", + "ai-page-summarizer@local:2.0", + "ai-page-summarizer@local:1.9", + "ai-page-summarizer@local:1.8", + "ai-page-summarizer@local:1.7", + "ai-page-summarizer@local:1.6", + "ai-page-summarizer@local:1.5", + "ai-page-summarizer@local:1.4", + "ai-page-summarizer@local:1.3", + "ai-page-summarizer@local:1.2", + "ai-page-summarizer@local:1.1", + "ai-page-summarizer@local:1.0", + "ai-page-summarizer@local:2.4", + "navigation-profiles@vaskveider.com:1.0.0", + "youtube-auto-pip@local:1.0.0", + "youtube-auto-pip@local:1.0.1", + "navigation-profiles@vaskveider.lmtd:1.0.0.0" + ] + }, + "schema": 1775111797552, + "key_format": "{guid}:{version}", + "stash_time": 1775133307184, + "id": "6cd95470-fbb3-4ed9-8f1b-4a3fb96a701c", + "last_modified": 1775133399638 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "navigation-profiles-dev@vaskveider.org:1.0.1", + "@tpfignore2:1.0", + "@tpfignore2:1.0.1", + "redirector@antigravity.test:1.7", + "redirector@antigravity.test:1.8", + "organize-pocket-local@example.com:1.5.0", + "{f41256b4-75a1-4ffa-9a40-13b25f905af4}:1.0", + "{56c0a2df-2134-4bf4-8df9-5f12b450c19e}:1.0", + "openinsteam@maclews.eu:1.0" + ] + }, + "schema": 1775090194314, + "key_format": "{guid}:{version}", + "stash_time": 1775111706975, + "id": "bd71fbc9-9a26-45bc-b167-98d766e4daa1", + "last_modified": 1775111797106 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lspdofficertools@example.com:1.2", + "yanima-shiki-integration-unlisted1@example.com:2.4.4", + "yanima-shiki-integration-unlisted1@example.com:2.5.0", + "pullsar@pullsar.space:1.0.0", + "pullsar@pullsar.space:1.1.0", + "pullsar@pullsar.space:1.1.1", + "mon-extension-chat@mon-domaine.com:1.0", + "finbee-injector-firefox@snaiges.github.com:1.0", + "fuelgauge@fuelgauge.pro:2.5.0", + "fuelgauge@fuelgauge.pro:2.8.0", + "rodex-roblox@shojo.dev:2.0.0", + "c411-rutorrent@schiz0b0y.dev:1.0", + "c411-rutorrent@schiz0b0y.dev:1.1", + "{b2641859-361e-4252-9d33-594d7318d34c}:1.0", + "sosyalpaylas-pro@firefox-eklenti.local:1.0", + "{b2641859-361e-4252-9d33-594d7318d34c}:1.1", + "xthread-copier@victor.local:1.0", + "chatbot-interceptor@clickcannabis.com:1.0.0", + "hospital-intel@example.com:1.0", + "hospital-intel@example.com:1.1", + "hospital-intel@example.com:1.2", + "hospital-intel@example.com:1.3", + "hospital-intel@example.com:1.4", + "hospital-intel@example.com:1.5", + "hospital-intel@example.com:1.6", + "navigation-profiles@vaskveider.org:1.0", + "navigation-profiles@vaskveider.org:1.0.1", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:1.0.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:111.0.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:1111", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:99992.3.0", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:7777773.1.1", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:8888874.5.6", + "{0eefc54b-6da4-4e9e-87ce-4cb07ed58257}:8888888.5.3", + "{8a3ad40a-5ba8-4c4a-8be7-01ddedb43c85}:2.0.0", + "container-mask@custom-dev-8.7.4:8.7.4" + ] + }, + "schema": 1775068601952, + "key_format": "{guid}:{version}", + "stash_time": 1775090107073, + "id": "40a96a61-2a98-486a-96f7-e7d51a647877", + "last_modified": 1775090193809 + }, + { + "stash": { + "blocked": [ + "shariarja.m.an.1.9.98@gmail.com:2.0", + "joettel.i.ng.2.5.88@gmail.com:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "recent-tabs@jasonsavard.com:5.3", + "recent-tabs@jasonsavard.com:5.2", + "{29b1f50f-62d6-4b4d-89de-7b26061f4b0a}:1.0.1", + "{29b1f50f-62d6-4b4d-89de-7b26061f4b0a}:1.0.2", + "tachibana.garren@gmail.com:1.0.0", + "ngfilter@tachibana.garren:1.0.0", + "siemens-gpt-assistant@adomi.ovh:1.1", + "kmjdnkpkpnjblbgbnkeedepgnomafojk@chrome-store-foxified-3050438839:2.0.2", + "mjaafpfnaeofaacnmkfdafldodlaomln@chrome-store-foxified-3050438839:1.702.3", + "dfngkocjobhcdlknaffekkiafkboehkn@chrome-store-foxified-3050438839:2.4", + "kmjdnkpkpnjblbgbnkeedepgnomafojk@chrome-store-foxified-1515032741:2.0.2", + "opgodjgjgojjkhlmmhdlojfehcemknnp@chrome-store-foxified-1515032741:2.6", + "mjaafpfnaeofaacnmkfdafldodlaomln@chrome-store-foxified-1515032741:1.702.3", + "dfngkocjobhcdlknaffekkiafkboehkn@chrome-store-foxified-1515032741:2.4", + "ropro-advanced-controls@robodin08.local:1.7.1", + "snippet-expander@my-custom-extension.com:1.0.0", + "{58667500-6249-4336-3960-000000000001}:1.0.2", + "{0f7d53b4-bfff-41b4-ad60-bcca8996ec94}:2.2.8", + "frimao-copy@villness.com:2.4.4", + "frimao-copy@villness.com:2.4.5", + "frimao-copy@villness.com:2.4.6", + "proton-mail-checker@bolausson:1.3.2", + "proton-mail-checker@bolausson:1.3.3", + "readpaper-utils@mooninsky:1.7.6.2", + "hindi-vllm-horde@prl-cnit:2.0.0", + "download-twitter-image@suienzan_firefox:1.0.0", + "download-twitter-image@unlisted:1.0.1", + "simple-pocket@example.com:2.0.0", + "simple-pocket@example.com:2.0.1", + "profile_launcher@hyseki.com:1.0", + "paperyoga@lezdu.it:1.0", + "container-ua@custom-dev:1.0.0", + "music_player@extension.org:1.0", + "FixYT@ThePillenwerfer:0.1", + "FixYT@ThePillenwerfer:1.2", + "ighwopefe09rgueoprjvhkehvlwcjeourfeiojhrgkjegfkdsjdkclnediufv@localhost:20260310.1" + ] + }, + "schema": 1775046995721, + "key_format": "{guid}:{version}", + "stash_time": 1775068506687, + "id": "a15db654-b4e8-4705-84cf-25bb79853fff", + "last_modified": 1775068601662 + }, + { + "stash": { + "blocked": [ + "brandon.perez25091969na@outlook.com:1.9", + "asciiart-p3q8n1v9@devtool.dev:1.0", + "asciiart-p3q8n1v9@devtool.dev:143.10.30", + "timer-stopwatch@m7h3q6.cc:142.0", + "timer-stopwatch@m7h3q6.cc:143.10.10", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.2", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.3", + "{c346f2dc-74c6-4fc1-bc20-a955e0061166}:4.8.4" + ], + "unblocked": [], + "softblocked": [ + "custom-newtab-pro@hesip.local:1.0.1", + "proton-mail-checker@bolausson:1.3.0", + "proton-mail-checker@bolausson:1.3.1", + "fr24-to-simbrief@aussiematt95.github.com:1.0", + "fr24-to-simbrief@aussiematt95.github.com:1.0.1", + "fr24-to-simbrief@aussiematt95.github.com:1.0.2", + "fr24-to-simbrief@aussiematt95.github.com:1.0.3", + "fr24-to-simbrief@aussiematt95.github.com:1.0.4", + "fr24-to-simbrief@aussiematt95.github.com:1.0.5", + "fr24-to-simbrief@aussiematt95.github.com:1.0.6", + "fr24-to-simbrief@aussiematt95.github.com:1.0.7", + "fr24-to-simbrief@aussiematt95.github.com:1.0.8", + "fr24-to-simbrief@aussiematt95.github.com:1.0.8.1", + "fr24-to-simbrief@aussiematt95.github.com:1.1.0", + "hololyzer-dark-mode@example.com:1.0", + "hololyzer-dark-mode@example.com:2.0", + "creatio.quick.feed.replies@earthlink.iq:1.0", + "jira-time-log@local:1.0.2", + "kinolenta@aprelteam.su:1.0", + "kinolenta@aprelteam.su:1.1", + "kinolenta@aprelteam.su:1.2.0", + "Gesturefy@mod:2.1.6", + "Gesturefy@mod:3.1.2", + "Gesturefy@mod:3.1.2.1", + "Gesturefy@mod:3.2.5", + "Gesturefy@mod:3.2.6", + "datavault@local:1.0.1", + "datavault@local:1.0.0", + "{9d1f059c-cada-4111-9696-41a62d64e3bc}:0.17.9" + ] + }, + "schema": 1775025397863, + "key_format": "{guid}:{version}", + "stash_time": 1775046907404, + "id": "26f57ecd-5b9b-4226-a656-8cf3183726e4", + "last_modified": 1775046995506 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "simple-hello-world@example.com:1.2.0", + "yanima-shiki-integration-unlisted1@example.com:2.5.4", + "openguessrblind@limitfinity:1.0.0", + "{82a0bd6c-8b2e-4202-817a-d675c1202700}:1.0", + "{82a0bd6c-8b2e-4202-817a-d675c1202700}:2.0", + "{b37aaba1-7695-4001-97d6-8ba5fd12c0f5}:1.0", + "read_frog@0x64.in:1.22.0", + "smarteligibility-test-amber@axora.ai:2.1.0" + ] + }, + "schema": 1775003799074, + "key_format": "{guid}:{version}", + "stash_time": 1775025306876, + "id": "fd820ffd-0e4b-4aa5-9aaa-ad4c96bb58ee", + "last_modified": 1775025397598 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hero-dev@amazon.com:1.0.0", + "{b3e97b5a-44ac-41f5-ab11-3580dd8249f0}:1.1.1", + "{b3e97b5a-44ac-41f5-ab11-3580dd8249f0}:1.1.2", + "{0a75d802-9aed-41e7-8daa-24c067386e82}:8.12.12.22", + "Android@bravenhancer.com:22.5.5", + "enhancer@goldenfox.com:22.5.5", + "cookie-isolator@extension:2.1.5", + "sendurl@runa-dte.cl:1.2.0", + "cookie-isolator@extension:2.1.4", + "lupamoodle@fmesasc:1.6.0", + "redirector@antigravity.test:1.6", + "tabconductor@antigravity.test:1.0.4", + "tabconductor@antigravity.test:1.0.7", + "tabconductor@antigravity.test:1.0.8", + "scrollanchor@antigravity.test:1.0.7", + "scrollanchor@antigravity.test:1.0.8", + "snipstash@antigravity.test:1.0.0", + "snipstash@antigravity.test:1.1.0", + "snipstash@antigravity.test:1.2.0", + "amazon_enterprise_access@amazon:2.0.0.0", + "{6e162813-aa0d-40ea-945b-7e8bab9a15fd}:1.0" + ] + }, + "schema": 1774982195755, + "key_format": "{guid}:{version}", + "stash_time": 1775003707253, + "id": "fdf92a8e-72ed-4901-a2de-201b094acef5", + "last_modified": 1775003798853 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.6", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.8", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.11", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.12", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.13", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.14", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.15", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.16", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.17", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.18", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.19", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.20", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.21", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.22", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.24", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.25", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.26", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.5.27", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.6.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.7.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.7.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.1", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.3", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.5", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.7", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.8.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.10.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.0", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.2", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.4", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.8", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.9", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.10", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.13", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.14", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.15", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.16", + "{bcb1e569-53ab-4475-868f-42062864eaa9}:11.11.17", + "{67ab1450-21b4-48f7-b375-9a32f218177d}:1.0", + "{8be129a8-091f-454b-913b-9246c4d4ad20}:1.0", + "phishkitchen-qr@cofensepdc.com:1.0.0", + "unisport-pro@example.com:1.3.1.1", + "webrootsecurewebextensions@webroot.com:1.2.0.58", + "webrootsecurewebextensions@webroot.com:1.2.0.62", + "movie-ratings@extension.local:1.0.0", + "movie-ratings@extension.local:1.0.1", + "movie-ratings@extension.local:1.0.2", + "movie-ratings@extension.local:1.0.3", + "movie-ratings@extension.local:1.0.4", + "movie-ratings@extension.local:1.0.5", + "movie-ratings@extension.local:1.0.6", + "movie-ratings@extension.local:1.0.7", + "movie-ratings@extension.local:1.0.8", + "movie-ratings@extension.local:1.0.9", + "movie-ratings@extension.local:1.0.10", + "movie-ratings@extension.local:1.0.11", + "movie-ratings@extension.local:1.0.12", + "movie-ratings@extension.local:1.0.13", + "movie-ratings@extension.local:1.1.0", + "movie-ratings@extension.local:1.2.0", + "movie-ratings@extension.local:1.2.1", + "{7c7038b0-6f45-4a8f-bc05-8aed4598765e}:2.7", + "docebo-silencer@transmedics:1.0", + "docebo-silencer@transmedics:1.1", + "eapw-wiki-enhancements@ewd-data:1.0", + "@smart-video-audio-download:2.1.18", + "macmdnlopncdoehmjhfenfblflnohoen@chrome-store-foxified-112476551:1.4", + "geminiexportpro@local-dev.com:1.1.0", + "foxus-private-notes@evaldas:1.1", + "foxus-private-notes@evaldas:1.2", + "foxus-private-notes@evaldas:1.3", + "ai-chat-project-exporter@dougg0k:1.0.11", + "decluttr@getdecluttr.app:0.2.0" + ] + }, + "schema": 1774960597707, + "key_format": "{guid}:{version}", + "stash_time": 1774982106993, + "id": "cf349b9f-a2e1-4aa4-9f70-68752334edcd", + "last_modified": 1774982195541 + }, + { + "stash": { + "blocked": [ + "{20206a5e-66c7-46a3-b820-9e1866ebb05a}:1.1", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:1.1", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:1.2", + "{6386e8b1-e54f-4357-925a-8cc13395c5d0}:11.0.0", + "{aeb2198e-dc01-4fdc-b338-a81b6a30a749}:1.1", + "{aeb2198e-dc01-4fdc-b338-a81b6a30a749}:11.0.0" + ], + "unblocked": [], + "softblocked": [ + "ikea-uk-autofill-2.00@yourdomain.local:2.0", + "proton-mail-checker@bolausson:1.1.17", + "proton-mail-checker@bolausson:1.1.18", + "proton-mail-checker@bolausson:1.1.19", + "proton-mail-checker@bolausson:1.1.21", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0.1", + "{003bd454-3d2b-4ea0-8059-6a6e36ed4322}:1.0.0.2", + "orange-dark@orange.com:1.0", + "{87c67e89-f6a6-4d42-8b16-ecd4c360024b}:1.0", + "{5f31c899-2264-468d-8b3b-c1f0474bed29}:1.0", + "mynotesatking-interactive@local.dev:1.0", + "github-markdown-tables@local:1.0.0", + "lobbydog_extension@javahippie.net:1.0.0", + "claude-usage-badge@local:1.0", + "ado-active-comments-filter@local:1.0" + ] + }, + "schema": 1774938996445, + "key_format": "{guid}:{version}", + "stash_time": 1774960506762, + "id": "4f554533-7909-461d-bf5b-0f8978f4384a", + "last_modified": 1774960597500 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "lockd@74k1.sh:1.0.0", + "lockd@74k1.sh:1.0.1", + "lockd@74k1.sh:1.0.2", + "lockd@74k1.sh:1.1.0", + "lockd@74k1.sh:1.1.1", + "lockd@74k1.sh:1.2.0", + "lockd@74k1.sh:1.2.1", + "{7adc56c5-a572-4f64-9422-64cd174ff29a}:1.0", + "xelya-deploy-monitor@xelya.io:1.5.3", + "xelya-deploy-monitor@xelya.io:1.5.4", + "{6a0f4baa-11d5-4626-a97e-f8944606c03d}:2.0", + "ynew--timer@example.com:1.5", + "ynew--timer@example.com:1.4", + "ynew--timer@example.com:1.3", + "miao.jr.life@outlook.com:0.9.5", + "aaaamynew--timer@example.com:1.2", + "timer-link-opener@example.com:1.0", + "timer-link-opener@example.com:1.1" + ] + }, + "schema": 1774917394790, + "key_format": "{guid}:{version}", + "stash_time": 1774938906957, + "id": "6e8243f6-48a8-427e-aceb-a185381b647d", + "last_modified": 1774938996306 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ikea-autofill-1.0@yourdomain.local:1.0", + "xelya-deploy-monitor@xelya.io:1.5.1", + "xelya-deploy-monitor@xelya.io:1.5.2", + "cronos-extension@cronos.dev:1.0.5", + "{d7c93b2d-5bf9-41ec-b2a1-2a19fee76126}:2.0.0", + "{ed012e23-827e-443f-90fb-0d22f8ddfd7b}:121", + "vivenciasventec@gmail.com:1.0", + "{e6773859-81a3-413e-8884-efa512148f62}:1.0", + "{e6773859-81a3-413e-8884-efa512148f62}:2.0", + "quincys-manga-translator@quincy.com:1.0" + ] + }, + "schema": 1774895791699, + "key_format": "{guid}:{version}", + "stash_time": 1774917307604, + "id": "4a47d062-49b3-46c0-84ba-a2f583e2cea5", + "last_modified": 1774917394535 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{6b6739ea-901b-41fb-8d16-ced0298b3e46}:1.1.4", + "toytique@toytique.be:1.4.22", + "toytique@toytique.be:1.4.21", + "toytique@toytique.be:1.4.20", + "toytique@toytique.be:1.4.19", + "toytique@toytique.be:1.4.18", + "toytique@toytique.be:1.4.16", + "toytique@toytique.be:1.4.15", + "toytique@toytique.be:1.4.17", + "xelya-deploy-monitor@xelya.io:1.5.0", + "{e75507df-59e7-4de3-a000-0ee2e8a7930b}:1.4", + "{111cf42d-8893-4fd8-8986-4d2e91edbbc5}:0.2", + "{fe5b20e4-6f85-4816-bdcd-504a4d9130ee}:1.0", + "{9969fec5-92d1-48fa-a44e-130df28702cb}:1.0", + "{29209932-d5dd-4f0f-9907-38c37b80b85b}:1.0", + "clickarmor@clickarmor.dev:1.3.2", + "clickarmor@clickarmor.dev:1.3.1", + "{1524e030-24b0-4c07-ad63-29d8002b4ec6}:2.35.0", + "Saneaki@saneaki.net:1.7", + "{c2ab844c-55f1-4f46-bfd9-83b868dcd0b9}:1.0", + "mstickets@mesuresystems.com:1.0", + "cs2-ipa@cs2ipa.extension:1.2.1", + "cs2-ipa@cs2ipa.extension:1.3.1", + "{339d423b-daac-4fc9-81ab-f36f90bf575c}:1.0", + "{3cb56e28-ab11-4f88-beb5-511ddbcd93ea}:1.1.5", + "aria2-integrate-firefox@extension:1.0.0", + "audiocatch@yourdomain.com:1.0", + "audiocatch@yourdomain.com:1.1", + "{b3db236b-c2ee-4b5c-9c37-11baab8a70c0}:1.0.0", + "ikea-autofill@yourdomain.local:1.1" + ] + }, + "schema": 1774874194523, + "key_format": "{guid}:{version}", + "stash_time": 1774895706778, + "id": "285f09c2-8e6c-4a73-bc60-be240774da51", + "last_modified": 1774895791532 + }, + { + "stash": { + "blocked": [ + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:1.0.0", + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:12.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:1.0.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:19.0", + "tab-manager-pro@x7k9m2.dev:142.0", + "tab-manager-pro@x7k9m2.dev:142.40.30", + "{10e62ac9-70e1-4d4f-b5f3-c0d356f96d11}:1.0.0", + "{10e62ac9-70e1-4d4f-b5f3-c0d356f96d11}:100101.0.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:1.0", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:1.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:3.1.3", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:11.0.0", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:22.1", + "{3c18a807-5eb1-43f6-ba9c-7ba2f4bb492c}:77.1", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:1.0", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:33.5.3", + "{15074d3a-4825-4591-8dd6-bd6b519408d0}:44.0", + "{14ef8f53-fd1c-4c64-bf02-1851b182cf3c}:1.0", + "{14ef8f53-fd1c-4c64-bf02-1851b182cf3c}:11.0.0", + "{ba0a7c95-d11b-42cd-b5c0-2fe14451a53f}:1.7", + "{ba0a7c95-d11b-42cd-b5c0-2fe14451a53f}:1.8", + "{523c8816-9517-4dba-9ab9-f9bb5880d045}:3.1.8", + "{523c8816-9517-4dba-9ab9-f9bb5880d045}:3.1.9", + "{26bcb76f-42f1-40c2-88ab-ada6c88768d8}:5.1.3", + "{26bcb76f-42f1-40c2-88ab-ada6c88768d8}:5.1.14", + "live-us-football-scores@scorelivesus.com:4.12.9", + "{d00a030c-dc8d-486a-ba4c-067b1670175d}:1.0", + "{d00a030c-dc8d-486a-ba4c-067b1670175d}:31.15.4", + "{6932cea7-acab-45f3-8afd-2b4afc065b83}:1.1", + "{6932cea7-acab-45f3-8afd-2b4afc065b83}:106.0.1", + "{f909bd25-460b-423f-89fc-03ea7472592f}:1.0", + "slushAPP@outlook.com:2.1.5", + "clicker10_2@gmail.com:1.0", + "clicker10_1@gmail.com:1.0", + "{92d6ea9e-ebad-400d-b1b1-9dc9277b2ff2}:1.0", + "{16c04327-7ba7-4856-a70f-0fdad3cbfe22}:1.0", + "{34222326-eddf-49c3-bd31-8f3af43e28a8}:1.0", + "{4de383b0-900e-4b8c-874d-1cb788236ac1}:1.5", + "{06c6268f-fc42-4209-a099-de592067edd1}:1.1", + "{37fac786-e9dc-4b13-90f8-07df877658f7}:0.2.1", + "{2b665607-0837-413b-82e3-38a2444eb9e8}:2.2.3", + "{1e49de0c-1e36-42d1-b833-0d4705ce5c77}:1.3.7", + "{a39cbbfc-3ee2-4916-94f9-fa08a8013226}:3.4.2.0", + "{80581b74-21ff-4dcb-a846-f13f8037d6dc}:0.1.7", + "{5cbe5a1d-4ce1-40ef-9bf7-aae944d8cfdb}:1.4.1", + "{b7701cb1-6572-44a6-bd5e-2f4fbbcbbc49}:1.2.0", + "{ee888eb8-27b0-490d-93c0-939a2874411a}:2026.3.23", + "{3045fc91-260f-4451-b55c-85e610b0868c}:1.1.4", + "{cc9c0a4f-7b04-428f-91a9-d229534cced1}:2.2.0", + "{407f807e-eb80-4ac2-bcb1-cc077d98bfd4}:2.0.5", + "{73b6f5c5-9103-4d73-9507-036b286b3d28}:0.3.0", + "{4f201645-fa61-4e52-8a29-42fca4fb8778}:1.0", + "{eb186dfb-f41d-4903-966e-58f6c7fadfd2}:1.0" + ], + "unblocked": [], + "softblocked": [ + "itvx-autofill@yourdomain.local:1.1", + "universal-scraper@local-dev:1.0", + "universal-scraper@local-dev:1.0.1", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.3", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.8", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.9", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.11", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.10", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.12", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.13", + "ukihunter@github.com:1.0.1", + "mater-purissima-shield@example.com:1.0.0", + "mater-purissima-shield@example.com:1.0.1", + "souzamilhas@extension.firefox:10.1.0.1485", + "{5c9354e6-9c11-4cd6-97a5-dcd0f6727f31}:1.0" + ] + }, + "schema": 1774852592568, + "key_format": "{guid}:{version}", + "stash_time": 1774874107128, + "id": "2780f9fd-ae42-49dd-ba21-c3202607ac9b", + "last_modified": 1774874194294 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{ca9190dd-986b-4338-be8e-8a79cba20491}:1.0.0", + "{ca9190dd-986b-4338-be8e-8a79cba20491}:1.0.1", + "antidebug-breaker@browserplug.local:3.0.4", + "tab-guardian@example.com:1.3.7", + "chartai@livewellmedical.ca:1.0.0", + "chartai@livewellmedical.ca:1.0.1", + "chartai@livewellmedical.ca:1.0.2", + "chartai@livewellmedical.ca:1.0.3", + "chartai@livewellmedical.ca:1.0.4", + "chartai@livewellmedical.ca:1.0.5", + "chartai@livewellmedical.ca:1.0.6", + "aria2-integrate@extension:1.0.0" + ] + }, + "schema": 1774830992177, + "key_format": "{guid}:{version}", + "stash_time": 1774852506843, + "id": "57294baa-ab1d-42e3-8d22-b0e44d52153e", + "last_modified": 1774852592354 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "gmngpagflejjoblmmamaonmnkghjmebh@chrome-store-foxified--1624070162:2.3.7", + "noaneddfkdjfnfdakjjmocngnfkfehhd@chrome-store-foxified--1624070162:4.1.2", + "okmepbglpjobecobbkeodgdnpcfnjldc@chrome-store-foxified--1624070162:1.6.1", + "{a685065d-4f22-423a-ba57-76022aed8144}:0.2.8", + "{a685065d-4f22-423a-ba57-76022aed8144}:0.2.9resigned1", + "kontenmanager@gmx.de:2026.0.4.0", + "kontenmanager@gmx.de:2026.0.4.1", + "kontenmanager@gmx.de:2026.0.4.2", + "personal-test-img-downloader@extension.local:1.0.3", + "proton-mail-checker@bolausson:1.1.14", + "{19b1ce41-2ac9-4dc0-942f-4aaa0f6ddffb}:1.0", + "{7dec58ba-dcb2-4efb-8201-fd1e0eacd836}:1.0", + "linkedin-suggested-posts-remover@valerian.dtdg.fr:1.0.0", + "linkedin-suggested-posts-remover@valerian.dtdg.fr:1.0.1", + "{a8ea2335-200b-4292-8106-c68bcd50e834}:2.0", + "melon@melon:1.4", + "proton-mail-checker@bolausson:1.1.15", + "proton-mail-checker@bolausson:1.1.16", + "{4f24bc7f-144e-41bf-b836-94419eed4a5e}:1.0", + "local-search@jeff486wet:1.0", + "local-search@jeff486wet:1.1" + ] + }, + "schema": 1774809391662, + "key_format": "{guid}:{version}", + "stash_time": 1774830906798, + "id": "69a81e4f-dda1-43ef-a60c-e61d05e0bf01", + "last_modified": 1774830991929 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "michaelzuraw123@gmail.com:1.0", + "{6b6739ea-901b-41fb-8d16-ced0298b3e46}:1.1.3", + "wa-number-checker@checknumber.ai:0.0.1", + "arden4@wurkang.com:2.0.0", + "autofill-orbit-yourchewyplace@2024:1.0", + "autofill-orbit@local:1.0", + "autofill-universal@local:1.0", + "Android@bravenhancer.com:22.4.5", + "enhancer@goldenfox.com:22.4.5", + "Microshit@stockman50:0.0.6", + "kindle2pdfapp@gmail.com:1.0.5", + "{ba176907-666b-4301-949f-a5498efa6910}:1.0", + "kiosk_controller_light@teacher.com:1.0", + "tasalo@tasalo.app:0.1.0", + "biblioweb.barcode@localdomain58-1.com:1.1.3", + "biblioweb.barcode@localdomain.com:1.0.0", + "biblioweb.barcode@localdomain.com:1.1.2", + "kiosk_controller_light@teacher.com:1.1", + "proton-mail-checker@bolausson:1.1.12", + "proton-mail-checker@bolausson:1.1.13" + ] + }, + "schema": 1774787794462, + "key_format": "{guid}:{version}", + "stash_time": 1774809307263, + "id": "09caaadc-bab1-4c84-a5ef-7520b31e66c7", + "last_modified": 1774809391367 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{190d130f-4ee8-46a4-9c80-70a8164ec3af}:1.0", + "atom@escorp.dynamics:0.0.1", + "atom@escorp.dynamics:0.0.2", + "atom@escorp.dynamics:0.0.3", + "atom@escorp.dynamics:0.0.4", + "atom@escorp.dynamics:0.0.5", + "atom@escorp.dynamics:0.0.6", + "atom@escorp.dynamics:0.0.7", + "atom@escorp.dynamics:0.0.8", + "atom@escorp.dynamics:0.0.9", + "atom@escorp.dynamics:0.0.10", + "atom@escorp.dynamics:0.0.11", + "atom@escorp.dynamics:0.0.12", + "escorp-automation@escorp.local:0.1.0", + "speed-dial-v2@gt.org:1.0.1", + "speed-dial-v2@gt.org:1.0.2", + "speed-dial-v2@gt.org:1.0.3", + "speed-dial-v2@gt.org:1.0.4", + "gemini-link-analyzer-pro@yourdomain.com:1.2", + "{c6bd1ff8-e4b8-4281-bfd9-8abdfa524421}:1.0", + "youtube-fixer@lomanto.cc:1.0", + "youtube-fixer@lomanto.cc:1.1", + "arcana@ankerlab.de:1.0.0" + ] + }, + "schema": 1774766194832, + "key_format": "{guid}:{version}", + "stash_time": 1774787707298, + "id": "2333c0d6-75ab-4e15-a81a-98d0e8a606f6", + "last_modified": 1774787794240 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{be69632f-eb0e-425b-a8a0-e2ac993856ad}:1.0", + "dns-check@irfani.dev:1.0.2", + "dns-check@irfani.dev:1.0.3", + "dns-check@irfani.dev:2.2.6", + "{9f24a14d-1577-43a0-86f8-2e95a0ad96e0}:1.0", + "{3b2404ab-3049-458f-9d4c-f943de5ad21f}:1.0", + "{72b47e84-4de9-40e4-a9bf-0f142d794282}:1.0", + "respectful-reaction-button@gongahkia.dev:2.1.0", + "nectar-smart-sender-android-dev@celran.local:0.1.0", + "adman-ext@adman.com:0.6.3" + ] + }, + "schema": 1774744592409, + "key_format": "{guid}:{version}", + "stash_time": 1774766106463, + "id": "6a305459-eb35-46f0-b5dc-c221b4c765d3", + "last_modified": 1774766194625 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{fa55a5ec-ddd9-45d3-93d4-b38777cd32ca}:1.0", + "{5fb5b4a4-6485-4e28-bd6d-62837f0c7340}:2025.7.30", + "cookie-isolator@extension:2.0.5", + "cookie-isolator@extension:2.0.3", + "cookie-isolator@extension:2.0.2", + "funpay-auto-rais@example.com:1.1.0", + "speed-dial@gt.org:1.0.0", + "cookie-isolator@extension:2.1.1", + "cookie-isolator@extension:2.1.0", + "cookie-isolator@extension:2.0.8", + "cookie-isolator@extension:2.0.6", + "cookie-isolator@extension:2.0.1", + "cookie-isolator@extension:2.0.0", + "{44628ace-0d3c-4b4b-a523-0464c57201a7}:1.0", + "{44628ace-0d3c-4b4b-a523-0464c57201a7}:1.1", + "{a7c9e2f1-83b4-4d6a-b5f0-9f1c7d3a8b62}:1.5" + ] + }, + "schema": 1774722986199, + "key_format": "{guid}:{version}", + "stash_time": 1774744506516, + "id": "94aa838e-c686-4164-bc1a-f9006aa95e74", + "last_modified": 1774744592211 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "crosspoint-reader@xteink:1.0.3", + "jt-power-tools@king0light.ai:4.0.4", + "jt-power-tools@king0light.ai:4.03", + "promedico-helper-dev@degrotedokter:1.8.1.2", + "promedico-helper-dev@degrotedokter:1.8.1.1", + "promedico-helper-dev@degrotedokter:1.8.1", + "favory@sp4ce.pw:4.0.0.4", + "{19f5a1d0-ab2b-4bc7-8c63-1572b7cda578}:0.0.2", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:7.0", + "chatgpt-markdown-exporter@example.com:1.0", + "chatgpt-markdown-exporter@example.com:1.1", + "cs2-ipa@cs2ipa.extension:1.1.1", + "cs2-ipa@cs2ipa.extension:1.1.0", + "ai-analyzer@analyzer.plus:1.2.0", + "ai-analyzer@analyzer.plus:1.3.0", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:7.0.1", + "export-domain@ffminus:1.0.0" + ] + }, + "schema": 1774701394376, + "key_format": "{guid}:{version}", + "stash_time": 1774722906058, + "id": "e809eb09-cc58-40c9-b625-3203a9e95169", + "last_modified": 1774722986078 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{06c3fcc0-aa1d-4e9e-a6ee-6ed41f8502bc}:1.0", + "{6fa22361-a688-4341-a195-5c6ff257c9e4}:1.5.1", + "wall-ai-pro@protection.firefox:2.3.3", + "{80ee7cfd-6e60-48c2-8b61-83f505b6c37a}:0.2", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:6.7", + "mj-ultimate-82@majapahlevi.local:8.2", + "{29f08ecf-b667-48cc-957d-7ac6bdca35a7}:3.8.1", + "dark-ai-gen8@sage-pilot.com:8.2", + "ultimate@majapahlevi.local:8.3", + "{badadf39-8379-45f9-ad98-2b0543054686}:1.0.11", + "youtube-levelup@tn3w:1.3.9.1", + "manga-preloader-pro@arab-readers.net:6", + "shield-privacy@shield-extension.com:1.0.0", + "promedico-helper@degrotedokter:1.1.0", + "promedico-helper@degrotedokter:1.1.1", + "promedico-helper@degrotedokter:1.1.2", + "promedico-helper@degrotedokter:1.1.3", + "promedico-helper@degrotedokter:1.1.4", + "promedico-helper@degrotedokter:1.1.5", + "promedico-helper@degrotedokter:1.1.6", + "promedico-helper@degrotedokter:1.1.7", + "promedico-helper@degrotedokter:1.1.9", + "promedico-helper@degrotedokter:1.2", + "promedico-helper@degrotedokter:1.2.1", + "promedico-helper@degrotedokter:1.2.2", + "promedico-helper@degrotedokter:1.3", + "promedico-helper@degrotedokter:1.3.1", + "promedico-helper@degrotedokter:1.3.4", + "promedico-helper@degrotedokter:1.3.5", + "promedico-helper@degrotedokter:1.3.655", + "promedico-helper@degrotedokter:1.3.656", + "promedico-helper@degrotedokter:1.3.658", + "promedico-helper@degrotedokter:1.3.659", + "promedico-helper@degrotedokter:1.3.660", + "promedico-helper@degrotedokter:1.3.661", + "promedico-helper@degrotedokter:1.3.662", + "promedico-helper@degrotedokter:1.3.663", + "promedico-helper@degrotedokter:1.3.664", + "promedico-helper@degrotedokter:1.3.665", + "promedico-helper@degrotedokter:1.3.666", + "promedico-helper@degrotedokter:1.4", + "promedico-helper@degrotedokter:1.4.1", + "promedico-helper@degrotedokter:1.5", + "promedico-helper@degrotedokter:1.6", + "promedico-helper@degrotedokter:1.6.1", + "promedico-helper@degrotedokter:1.6.2", + "promedico-helper@degrotedokter:1.6.3", + "promedico-helper@degrotedokter:1.6.4", + "promedico-helper@degrotedokter:1.7", + "promedico-helper@degrotedokter:1.7.1", + "promedico-helper@degrotedokter:1.7.1.1", + "promedico-helper@degrotedokter:1.7.1.2", + "promedico-helper@degrotedokter:1.7.1.3", + "promedico-helper@degrotedokter:1.7.1.4", + "promedico-helper@degrotedokter:1.7.1.5", + "promedico-helper@degrotedokter:1.7.1.6", + "promedico-helper@degrotedokter:1.7.2", + "promedico-helper@degrotedokter:1.7.3.1", + "promedico-helper@degrotedokter:1.7.4", + "promedico-helper@degrotedokter:1.8" + ] + }, + "schema": 1774679794527, + "key_format": "{guid}:{version}", + "stash_time": 1774701306496, + "id": "2c7603a0-e66e-4882-895c-8017033db649", + "last_modified": 1774701394182 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3942991c-83a9-494d-94e2-73a9c849ff94}:241029.1", + "{d935e25d-ba99-4e65-961c-40bf2986b585}:1.1", + "sendurl@runa-dte.cl:1.1.7", + "extension@laterbag.app:1.2.0", + "sendurl@runa-dte.cl:1.1.8", + "odfmimo@gmail.com:1.0", + "sendurl@runa-dte.cl:1.1.9", + "pokemonkin@manual-sniper.local:2.0", + "pokemonkin@manual-sniper.local:2.1.0", + "pokemonkin@manual-sniper.local:3.0.1", + "cloudbeds-helper@yourdomain.com:1.0.0", + "{cbecf433-b46d-480c-81ff-18698975a214}:1.0" + ] + }, + "schema": 1774658198616, + "key_format": "{guid}:{version}", + "stash_time": 1774679706253, + "id": "46b48b01-39ad-4de7-a415-fc07ba93d2b4", + "last_modified": 1774679794327 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ip-lookup@extension:1.0", + "snow-autofill@extension:3.8.0", + "{cf59882a-468a-445e-8979-9a8f344eb697}:56543230", + "{1dbebc3b-e9e9-4bcd-8596-93af38c0d08b}:1.0", + "{fff98d6d-7019-4869-bda2-5cc83ab58f7a}:1.0", + "link-cleaner-redirects@local:1.0.1", + "kimai-time-tracker@firefox-addon:1.0.1.2", + "{81a3f49f-615f-40ec-8955-29957b1e7cd0}:1.0", + "{81a3f49f-615f-40ec-8955-29957b1e7cd0}:2.0", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.0", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.1", + "{9b339cc3-57ad-4e59-9397-923e4b20316a}:1.2", + "mirsal@noon:1.1.1", + "mirsal@noon:1.2.1", + "home-sweet-home@extension.firefox:1.16.3" + ] + }, + "schema": 1774636597910, + "key_format": "{guid}:{version}", + "stash_time": 1774658107290, + "id": "460f664b-08b5-44f3-9dd9-592fc89f8e3f", + "last_modified": 1774658198174 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{bafecbbe-1b7a-4837-b23e-c01d999c5942}:0.2", + "{94454c16-9dcd-495c-a059-24ca36a81d32}:0.2", + "browser-cli@browser-cli:0.1.0", + "{107edad7-6cd1-42fa-b657-a670180da3c7}:2.2.8", + "proton-mail-checker@bolausson:1.1.9", + "proton-mail-checker@bolausson:1.1.10", + "proton-mail-checker@bolausson:1.1.11", + "live-lineups@yourdomain.com:3.0", + "reliant-reddit@esswhyy.dev:1.0", + "yt-safe-place-mr2026@mathis-roediger:1.2", + "{e8f1b2c3-4d5a-6f7e-8a9b-0c1d2e3f4a5b}:1.2", + "magnolia@12.34:4.3.3.2", + "booky@bookmark-ai.com:0.3.2", + "tabcloser@local:1.0", + "tabcloser@local:1.0.1", + "{0c6228d4-38c1-403b-9222-9416fd48a1a1}:100102.0.1", + "{cf59882a-468a-445e-8979-9a8f344eb697}:100102.0.1" + ] + }, + "schema": 1774614998170, + "key_format": "{guid}:{version}", + "stash_time": 1774636508404, + "id": "5c63267d-1aa1-43f3-8c1a-e18ada778850", + "last_modified": 1774636597600 + }, + { + "stash": { + "blocked": [ + "ElizabethBrooks5653@outlook.com:1.2", + "dark-toggle@t3v7m9.co:142.0", + "dark-toggle@t3v7m9.co:143.10.10", + "dark-toggle@t3v7m9.co:143.10.40", + "color-picker@v9m3k7.app:142.0", + "color-picker@v9m3k7.app:142.50.20", + "{2529ae60-42ae-469f-b08f-95cf1a3c1658}:5.8.2", + "{2529ae60-42ae-469f-b08f-95cf1a3c1658}:5.8.3", + "david.wilson19031973xau@outlook.com:1.7" + ], + "unblocked": [], + "softblocked": [ + "something@something.com:1.6.7", + "something@something.com:1.6.8", + "rrr-agent@rrr.dev:1.0.6", + "{7f966ba5-2826-4ac8-8964-f6ab6d38ddd2}:0.1.0", + "{7f966ba5-2826-4ac8-8964-f6ab6d38ddd2}:0.1.1", + "{08b67931-8fe6-4be9-b973-6000b10228b0}:0.1.0", + "{b1aec080-b697-42e4-9d28-3e4052c86cb1}:0.1.0", + "{10843efc-a1a9-45b6-8b3e-3f9dc8d6aca3}:0.1.0", + "dictionary-plus2@vrdx23.com:5.9.1", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.0", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.1", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.2", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.3", + "{813a6e1f-153c-4bc6-afad-9b5c16f984e7}:1.4", + "snap-search@sohnyj:1.0.0", + "snap-search@sohnyj:1.0.1", + "myaddon1@example.com:0.0.8", + "myaddon-firefox2@example.com:0.0.8", + "myaddon-firefox1@example.com:0.0.8", + "myaddon-firefox@example.com:0.0.8", + "myaddon-firefox3@example.com:0.0.8", + "myaddon-firefox4@example.com:0.0.8", + "myaddon-firefox5@example.com:0.0.8", + "myaddon-firefox6@example.com:0.0.8", + "myaddon-firefox7@example.com:0.0.8", + "flow-tracker@example.com:1.0", + "flow-tracker@example.com:1.1", + "proton-mail-checker@bolausson:1.1.1", + "proton-mail-checker@bolausson:1.1.2", + "proton-mail-checker@bolausson:1.1.3", + "proton-mail-checker@bolausson:1.1.4", + "proton-mail-checker@bolausson:1.1.5", + "proton-mail-checker@bolausson:1.1.6", + "proton-mail-checker@bolausson:1.1.7", + "{c30df4b5-5fb1-4957-98b6-394a75efbc87}:0.2", + "proton-mail-checker@bolausson:1.1.8" + ] + }, + "schema": 1774593390815, + "key_format": "{guid}:{version}", + "stash_time": 1774614906980, + "id": "736e8899-3012-413c-bfa7-b82054573fc0", + "last_modified": 1774614997973 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{e75507df-59e7-4de3-a000-0ee2e8a7930a}:1.4", + "{660480a1-806e-48fa-b8c9-b3be6e5586c4}:3.1.0", + "{d6669d52-3dd5-4b22-8d62-c6009a59cd47}:1.2.3", + "native-dark-mode-for@hardened-browsers:1.2", + "{c6383a59-b48b-447a-88d6-5990bea56eb7}:0.2", + "cs2-ipa@cs2ipa.extension:1.0.4", + "{9ded95f7-2236-4a0d-adeb-c160b3450881}:0.2", + "{83c3b545-300a-49c0-8b05-958ea7bd6e5c}:0.2", + "{e2df71fa-cf23-4f14-b2df-7c30ddaabe56}:0.2", + "{bf496fb0-6951-4240-85ef-38b4d2b43bfa}:0.2", + "yt-downloader@local:1.0.0", + "{c180b96e-aa23-4ee4-9fd3-b839ef0ef4d0}:0.2", + "amazon-review-requester@sellersprite.com:2.0.0", + "p1-parser@logistics.com:2.5.0", + "linkumori-addon-official@ClearURLs:1.0", + "nomail@mail.ru:0.0.4", + "nomail@mail.ru:0.0.3", + "nomail@mail.ru:0.0.5", + "nomail@mail.ru:0.0.1", + "nomail@mail.ru:0.0.2", + "nomail@mail.ru:0.0.6", + "nomail@mail.ru:0.0.7", + "nomail@mail.ru:0.0.8", + "nomail@mail.ru:0.0.9", + "nomail@mail.ru:0.0.10", + "nomail@mail.ru:0.0.11", + "nomail@mail.ru:0.1.1", + "nomail@mail.ru:0.1.2", + "nomail@mail.ru:0.1.3", + "nomail@mail.ru:0.1.4", + "nomail@mail.ru:0.1.5", + "nomail@mail.ru:0.1.6", + "nomail@mail.ru:0.1.7", + "nomail@mail.ru:0.1.8", + "unhook123456@local:1.6.7" + ] + }, + "schema": 1774571792113, + "key_format": "{guid}:{version}", + "stash_time": 1774593306973, + "id": "50e582da-66a8-4dbc-acfd-fd51b16946f5", + "last_modified": 1774593390552 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "gameonhigh@gmail.com:1.0", + "css-editor@yourusername:0.1", + "cdd-print-button@pharmtheon.io:1.0.0", + "yt-ad-skipper-pro@yourdomain.com:2.1", + "yt-ad-skipper-pro@yourdomain.com:3.1", + "getresponse-price-tracker@addons.mozilla.org:1.0.0", + "password-gen@b2h5j8.net:142.0", + "password-gen@b2h5j8.net:142.20.30", + "focus-mode-lite@example.com:1.1", + "currency-quick-converter@example.com:1.1", + "scrollanchor@antigravity.test:1.0.0", + "scrollanchor@antigravity.test:1.0.1", + "scrollanchor@antigravity.test:1.0.2", + "scrollanchor@antigravity.test:1.0.3", + "scrollanchor@antigravity.test:1.0.4", + "scrollanchor@antigravity.test:1.0.5", + "scrollanchor@antigravity.test:1.0.6", + "quick-notes@p4q8n1.io:142.0", + "quick-notes@p4q8n1.io:142.40.30", + "twitch-live-ext@deine-domain.de:1.0", + "twitch-live-ext@deine-domain.de:1.0.1", + "twitch-live-ext@deine-domain.de:1.0.2", + "twitch-live-ext@deine-domain.de:1.0.3", + "twitch-live-ext@deine-domain.de:1.0.4", + "twitch-live-ext@deine-domain.de:1.0.5", + "twitch-live-ext@deine-domain.de:1.0.6", + "twitch-live-ext@deine-domain.de:1.0.7", + "Android@bravenhancer.com:22.4.1", + "enhancer@goldenfox.com:22.4.1", + "enhancer@goldenfox.com:22.4.2", + "favory@sp4ce.pw:4.0.0.3", + "{648bdc74-94c6-4196-8789-d5947268867c}:7.0", + "{ed860648-f54f-4dc9-9a0d-501aec4313f5}:3.4.1.0", + "citecheck-lite@example.com:1.0.0", + "link-short@n6r4w2.org:142.0", + "link-short@n6r4w2.org:214.50.10", + "quoyle@quoyle.app:1.0.0", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:1.4", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.0", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.1", + "{e9df396f-bdd8-4e79-bc7c-92017a928891}:2.2", + "quoyle@quoyle.app:1.0.1" + ] + }, + "schema": 1774550192396, + "key_format": "{guid}:{version}", + "stash_time": 1774571706449, + "id": "d4b9edb6-92fe-403f-8886-3652b5a47acd", + "last_modified": 1774571792003 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ff-tab-selector-ll@example.com:1.0", + "get-lyric@shuhun:0.1.0", + "get-lyric@shuhun:0.2.0", + "get-lyric@shuhun:0.2.1", + "{c8f63954-349f-436a-83cc-f618522b5557}:2.0", + "{c8f63954-349f-436a-83cc-f618522b5557}:3.0", + "{c8f63954-349f-436a-83cc-f618522b5557}:4.0", + "{26829ba1-3f55-4bfb-a87b-d456a62a14aa}:1.0", + "{ab8187f2-e83d-4335-891f-8f85c3199ccf}:1.0", + "{ab8187f2-e83d-4335-891f-8f85c3199ccf}:2.0", + "{33535af6-ba32-4b9a-abed-524b6fee50b8}:1.0", + "{33535af6-ba32-4b9a-abed-524b6fee50b8}:2.0", + "{49cda625-674c-40ec-959a-b77c49aa064c}:1.0", + "{49cda625-674c-40ec-959a-b77c49aa064c}:2.0", + "{bc7e4b68-de3e-4c90-8171-4edd5beb3671}:1.0", + "{fac07c04-adeb-4c6e-94b3-18db77b6d886}:1.0", + "{fac07c04-adeb-4c6e-94b3-18db77b6d886}:2.0", + "nook@shaaanuu.dev:1.0", + "952cc4911f83c70af97ec42cc3b9fdf8@yourdomain.com:1.0", + "{fa3f446c-b87e-4f56-bd4f-2dbaf8a8f885}:1.0.0", + "{fa3f446c-b87e-4f56-bd4f-2dbaf8a8f885}:9991.0.1", + "ppg-dev-multitool@polskapress.pl:1.4", + "urlshare-inbox@leo:1.0.2", + "x-home-timeline-button-clicker@example.com:1.0", + "hdokiejnpimakedhajhdlcegeplioahd@chrome-store-foxified-3983407102:4.1.40.69", + "xelya-deploy-monitor@xelya.io:1.4.9", + "xelya-deploy-monitor@xelya.io:1.4.8", + "x-stash@example.com:0.1.0", + "{315900f0-158b-11f1-b4ac-0800200c9a66}:1.7", + "js-extension@debug.local:1.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.6", + "jex@jamf.com:1.0.5", + "yt-ad-skipper-pro@yourdomain.com:3.0", + "mermaidpreviewer@nathandaven.com:1.5.2", + "mermaidpreviewer@nathandaven.com:1.5.3", + "gemini-cookie-sync@example.com:0.2.0", + "gemini-cookie-sync@example.com:0.2.2", + "gemini-cookie-sync@example.com:0.2.3", + "gemini-cookie-sync@example.com:0.2.4", + "gemini-cookie-sync@example.com:0.2.5" + ] + }, + "schema": 1774528594989, + "key_format": "{guid}:{version}", + "stash_time": 1774550106936, + "id": "eb5f7655-ee71-4dd6-a8fd-306d03f14446", + "last_modified": 1774550192173 + }, + { + "stash": { + "blocked": [ + "{5ff046a4-58d5-49b8-9fac-fc4b4390453d}:1.0.0", + "{5ff046a4-58d5-49b8-9fac-fc4b4390453d}:19.0", + "{9ecb001c-1118-40e9-8f3b-b1fc9d9c8e87}:1.0.0", + "{9ecb001c-1118-40e9-8f3b-b1fc9d9c8e87}:9991.0.1", + "{d7503d08-3c88-455b-a4ae-b1457e1f5467}:1.0.0", + "{d7503d08-3c88-455b-a4ae-b1457e1f5467}:12.0" + ], + "unblocked": [], + "softblocked": [ + "ECPPRODearningPlugin@mail.ru:0.1.1", + "ECPPRODearningPlugin@mail.ru:0.0.2", + "city_skylines_theme@extensions.local:1.0", + "slop-detector@ranakoti:1.0.0", + "ff-tab-selector@example.com:1.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.5", + "browserskins@kinetixsyntax.studio:1.0.0", + "@kkplayer:26.3.121", + "senkoproxy@shlyapniktgk.com:1.0", + "@kkplayer:26.3.261", + "{a796d249-4d5f-4e7b-9f4d-360906787c3f}:3.0.0", + "@kkplayer:26.3.262", + "autorefresher@dineshkarthik.dev:1.2", + "contact@bulenox.codes:4.3.24.10", + "lambda-env-extractor@yourname.com:1.0.0", + "env-encryption-manager@1.0.0-dev:1.0.0", + "env-encryption-manager@1.0.1-dev:1.0.1", + "env-encryption-manager@surya-am.com:1.0.2", + "env-encryption-manager@surya-am.com:1.0.3", + "orbit-plus@level-level.com:1.0.0" + ] + }, + "schema": 1774506992987, + "key_format": "{guid}:{version}", + "stash_time": 1774528506899, + "id": "d58216d2-ac76-4431-9170-9a490a88001b", + "last_modified": 1774528594553 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sendurl@runa-dte.cl:1.1.6", + "{ad0ca5ca-616b-4fef-91ed-8b4d925a77ec}:1", + "Android@bravenhancer.com:22.1.0", + "Android@bravenhancer.com:22.3.0", + "{1683e81c-678a-40a9-89e2-d50175c7911e}:1.0", + "{1683e81c-678a-40a9-89e2-d50175c7911e}:1.1", + "Android@bravenhancer.com:22.2.9", + "FirefoxThemeKizunaAkari@SameR.jp:2.0", + "Android@bravenhancer.com:22.3.3", + "aun-task-counter@phonogram.co.jp:1.0.1", + "auto-completar-meia@km-gestao.com.br:1.0.2", + "auto-completar-meia@km-gestao.com.br:1.0.1", + "auto-completar-meia@km-gestao.com.br:1.0.3", + "Android@bravenhancer.com:22.3.1", + "Android@bravenhancer.com:22.3.5", + "{ffd97b9d-7f93-441a-8b43-4aa8f817851a}:1.0.0", + "Android@bravenhancer.com:22.3.6", + "Android@bravenhancer.com:22.3.4", + "Android@bravenhancer.com:22.3.7", + "Android@bravenhancer.com:22.3.8", + "Android@bravenhancer.com:22.3.9", + "enhancer@goldenfox.com:22.0.4", + "Android@bravenhancer.com:22.4.0", + "enhancer@goldenfox.com:22.4.0", + "{25585cb8-5d69-4e81-a300-810d31f64181}:11.0.13" + ] + }, + "schema": 1774485391383, + "key_format": "{guid}:{version}", + "stash_time": 1774506906468, + "id": "9379fea6-f088-4256-8fa6-bb9289715597", + "last_modified": 1774506992739 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "youtube-to-wordpress@extension.local:1.5.3", + "youtube-to-wordpress@extension.local:1.5.4", + "youtube-to-wordpress@extension.local:1.0.0", + "sendurl@runa-dte.cl:1.1.3", + "bjgmbpodpcgmnpfjmigcckcjfldcicnd@chrome-store-foxified-3960903896:1.3", + "{897a2025-4870-4824-ae30-6f0667dd52c8}:1.3", + "khbbdndcakejgofaekchimcdmkcjofeo@chrome-store-foxified-3960903896:1.2", + "sendurl@runa-dte.cl:1.1.4", + "{cae10dc8-fafc-40bc-840c-51391885699e}:1.0.0", + "polyx@jakeayy.xyz:0.1.0", + "Android@bravenhancer.com:22.0.3", + "Android@bravenhancer.com:22.2.8", + "sendurl@runa-dte.cl:1.1.5", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.4", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.3", + "gemini-assistant@your-unique-name.com:1.0.0", + "activity-copier@misa.tool:1.0" + ] + }, + "schema": 1774463794269, + "key_format": "{guid}:{version}", + "stash_time": 1774485306243, + "id": "85b29c29-3544-43a9-b4e3-9bbc6a40b3f3", + "last_modified": 1774485391117 + }, + { + "stash": { + "blocked": [ + "hellow@addon.mozilla.org:1.0.11", + "eye-care@addon.mozilla.org:5.0.11" + ], + "unblocked": [], + "softblocked": [ + "shelf-height@local:1.0.0", + "@cepages-addon-firefox:0.0.2", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.2", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.3", + "@cepages-addon-firefox:0.0.3", + "kimai-time-tracker@firefox-addon:1.3.0", + "kimai-time-tracker@firefox-addon:1.0.0", + "{d5e70c58-7b3a-4f1e-9c2b-a1b2c3d4e5f7}:0.0.4", + "holycookie@holycrm.com:1.0.1", + "rodex@rodex.extension:1.0.0", + "arsblock@local.dev:1.1", + "600soundvolume@1fexd.github.io:1.5.5", + "sendurl@runa-dte.cl:1.1.1", + "arsblock@local.dev:1.2", + "sendurl@runa-dte.cl:1.1.2", + "sendurl@runa-dte.cl:1.1.0", + "multi-text-selector@freeaitoolsbox.com:1.1", + "multi-text-selector@freeaitoolsbox.com:1.1.1", + "yo@fr0st.xyz:1.0.8", + "youtube-to-wordpress@extension.local:1.0.1", + "youtube-to-wordpress@extension.local:1.3.1", + "youtube-to-wordpress@extension.local:1.4.0", + "youtube-to-wordpress@extension.local:1.5.0" + ] + }, + "schema": 1774442183515, + "key_format": "{guid}:{version}", + "stash_time": 1774463706779, + "id": "d1a1a9b7-f578-41a9-9b85-242113626271", + "last_modified": 1774463794075 + }, + { + "stash": { + "blocked": [ + "{396e1015-e794-49ad-8710-c87139cb8ade}:1.0.0", + "{396e1015-e794-49ad-8710-c87139cb8ade}:12.0", + "{1dc7dfef-6a20-4518-bc97-27ba23f1d2f5}:1.0.0", + "{1dc7dfef-6a20-4518-bc97-27ba23f1d2f5}:100101.0.1", + "{17cc8d8e-7c2f-4b73-94e2-936abef6e517}:1.0.0", + "{17cc8d8e-7c2f-4b73-94e2-936abef6e517}:9991.0.1", + "XSSSQL@Secret.me:1.1", + "{c1d3a01b-1fd1-4f59-bc76-873728a4ad60}:1.0.0", + "WayBackMashine@Secret.me:1.0", + "{6da5ae71-9391-4c88-8663-c064e1ec71f2}:1.0.0", + "SendRequest@Secret.me:1.0", + "{84e374d9-b8db-4c58-85d7-7b32058f0906}:1.0.0", + "SearchImage@Secret.me:1.0", + "{422c3bdb-f82a-4ac8-bd2e-0e7267c2f4ca}:1.0.0", + "DownLoadSpeed@Secret.me:1.0", + "{84d09ff4-1b3c-43e4-bb19-cab45b903e5e}:1.0.0", + "{8a0b2e00-4ff9-43b2-90a7-420d438cb836}:1.0.0", + "SiteIpAndIpSiteInfo@Secret.me:1.1", + "SiteIpAndIpSiteInfo@Secret.me:1.2", + "SiteIpAndIpSiteInfo@Secret.me:1.3", + "{266e3020-c334-4f39-bc37-c92dd03ed523}:1.0.0", + "scrolltotop-a3421778e1a8@local:1.0.0", + "{0f5322fb-016c-4c49-9598-685cab16b150}:1.0.0", + "wordcounter-b5f7ad35fe13@local:1.0.0", + "{1641c05c-6a54-484c-8ef9-b8a3517792c7}:1.0.0", + "reloadtimer-31f49c1f1f33@local:1.0.0", + "{987cfc95-828b-4ab7-9d38-580680483d8a}:1.2.0", + "{b78e4e35-f788-4cd6-828f-406b61f95960}:1.0.0", + "{5765756f-e6ca-4cb8-9421-9829f04b2d06}:1.5.0", + "highlighter-addcc2321914@local:1.0.0", + "rightclickfix-74801ccb56aa@local:1.0.0", + "{db93a623-ac44-44f7-8fa8-e6a829a64a68}:1.3.0", + "{2bfa5777-4623-4cfd-b9c8-8ffb47501f0e}:1.2.0", + "tabcopier-98c37d0a68e8@local:1.0.0", + "{4df2506a-8f4c-4f04-99d5-7486717d56bf}:1.4.0", + "autoscroll-0fdf30288348@local:1.0.0", + "{758579f6-3bf9-40dd-b3e1-59cebbb34cd9}:1.1.0", + "{ce5a8bd4-29c6-4c3a-a899-f6491de6840f}:1.1.0", + "{8d5a6e95-e5d4-4254-80e4-eec2a7a30ab2}:1.3.0", + "highlighttitle-4e468164fbc4@local:1.0.0", + "{476c95b5-ca62-4d8b-9270-24f9d3ff5c3c}:1.3.0", + "autocopy-9a76bd35e444@local:1.0.0", + "{a18a98e7-2872-4b26-a793-d4638abde71c}:1.4.0", + "{662e94d9-2691-42a0-bd05-93af7c93680c}:1.2.0", + "urlcleaner-29a16de4a745@local:1.0.0", + "{d5cec5cb-5cef-45a9-9672-af4033608eb2}:1.5.0", + "{189eead7-e817-40d4-b3bb-f67b84878f24}:1.4.0", + "{52abe28c-2e09-4943-b668-7f81bb881529}:1.5.0", + "{bf812a1b-1184-442a-8914-2718c094055d}:1.3.0", + "{7c306a56-b203-4aa0-9f97-5c92b0bf3fe4}:1.1.0", + "{99340434-64d9-4814-bf5a-59c75242c7c7}:1.3.0", + "{f1a59f75-014c-4b61-a723-32a190b2aa89}:1.2.0", + "{6788fb4c-5c77-4874-852e-17f801305e12}:1.1.0", + "{347e4ba2-c4da-40f8-8fd7-f060a6194c86}:1.1.0", + "{34c0dcee-09d1-436c-ad09-1e62ed352567}:1.2.0", + "{2cf3c984-92fa-4eb6-a27b-7a2bf61dd9df}:1.5.0", + "{4c449f11-43da-4676-9a7c-544e76cbda19}:1.5.0", + "{6e021a41-a8f4-4aa6-9346-d19fa853d2e7}:1.4.0", + "{969bb5ec-8df7-43f3-a22a-5ec5e5b32260}:1.4.0", + "core-v5-4-1774214338@internal.net:5.4.0", + "{af160c2c-112b-4dee-a09e-2e13669388a6}:1.5.0", + "core-v5-3-1774214188@internal.net:5.3.0", + "{ceefc7db-dda8-4457-8b28-a8ddefefa362}:1.5.0", + "{764bfa57-fa1d-4055-b77a-443244e0105a}:1.3.0", + "{36af52df-d3d7-4489-89fa-b32bcdded7fb}:1.2.0", + "web-core-v5-autolog-1774213098@research.tools:5.1.0", + "{7c19877f-df8e-496a-8e3a-4a9d9515e69c}:1.1.0", + "{6f8ebb52-2cd2-42d9-91e4-6b789ac86d2d}:1.1.0", + "v4-2-1@internal.system:6.2.1", + "{4aa37435-8cc0-4b38-84cf-ff0a77120ef3}:1.3.0", + "{6514a640-2665-4634-ad9e-4f4321421873}:1.5.0", + "{effe825b-3205-41f9-84fa-f2977abe8fc6}:1.4.0", + "v4-1-injector@internal.system:6.1.0", + "{51086e08-3542-44c0-b60f-8cd589da6d52}:1.2.0", + "{0be7ab22-eaf7-40de-b6e6-5cb7d6d0a51f}:1.2.0", + "v3-7-full@internal.system:5.7.0", + "{79f2fc71-919e-47e0-aedf-e8d1cad54f09}:1.3.0", + "{38fe0c8c-2c82-47ac-9740-2c81e1afc3cc}:1.4.0", + "v3-4-blackbox@internal.system:5.4.0", + "{119eedab-533d-40d1-bbba-d91df2cb09ba}:1.1.0", + "v3-3-collector@internal.system:5.3.1", + "{c4a05660-6cb3-4e54-a413-1a6b05f57da7}:1.4.0", + "{952f0d46-0a2e-45bc-b83f-c484be78086d}:1.4.0", + "{4f848503-5bf5-4a44-992c-d3c33428cc04}:1.2.0", + "web-core-v5-2@internal.system:5.2.0", + "{57a0640d-7466-45ce-a92e-ae6b87577d81}:1.3.0", + "{7197d421-e79a-4681-903e-a58670fa53f5}:1.3.0", + "{a649ba20-c5b7-4b11-8131-1fdb55318e53}:1.0", + "web-core-v5-ultra@internal.system:5.0.0", + "{7d9e4586-1618-4940-9c9f-1ed049687629}:1.1.0", + "{10e6d4fa-e824-41b2-b2ac-af8cd0c2680e}:1.0", + "{62f563dd-5f35-43b5-9f76-bf6767af8e3d}:1.2.0", + "web-core-v4-1@internal.system:4.1.0", + "{9f6cc316-9c64-488b-a6a9-dc9757a485bc}:1.4.0", + "{592ce810-6e84-4a0e-81cd-255c3c3f77d3}:1.0", + "web-core-v4@internal.system-tools.org:4.0.0", + "{377fa0eb-4e61-4c0e-b2c8-be8c9c9d003b}:1.1.0", + "{ff0cc499-8888-4fb7-a0c3-63fda4f6652c}:1.0", + "{d7596977-8d9e-436f-9bef-18a7f99caf7a}:1.5.0", + "sys-tool-core@internal.net:1.0.0", + "{3c3afcfd-3439-4201-b236-db14c5fd8ee1}:1.5.0", + "{b263dfa4-0e05-442f-b0ba-709df97863fe}:1.0", + "data-lifecycle-v2@system-tools.org:2.0.0", + "{e3305827-3393-4354-9ff6-07d3b2d00e7f}:1.0", + "data-lifecycle-manager@system-tools.org:1.5.1", + "{688e149d-7e20-4572-a6dd-11047124d6b7}:1.2.0", + "{15b7327c-e80a-40b6-9438-87ebc82a6092}:1.2.0", + "{7cecb693-7e24-4e04-b508-39cf6a49573e}:1.0", + "dlm-pro-v15@internal-tools.net:1.5.1", + "{ae97a60a-9fb7-4546-b2c1-9744b27cd5f6}:1.3.0", + "{6591b86c-d991-48b9-80c3-50e935ca68da}:1.0", + "{dede0655-048a-49d8-95a0-fcc8a3455256}:1.3.0", + "core-v2-optimizer@system-tools.org:1.0.0", + "{7e30e631-76c4-408c-89ac-bbba35e61ec0}:1.0", + "{2b7cf099-863e-4dc0-9155-291372f6d546}:1.4.0", + "core-opt-v13@system-tools.org:1.0.0", + "{886aeb0d-a987-4f78-a67b-4460d85043eb}:1.1.0", + "{f9760df7-5dfb-4b51-8f40-a5869e6d962f}:1.0", + "{e7835e89-f762-47af-ad56-2140bd946e90}:1.5.0", + "{00440599-e2df-46dc-a80f-9a22b0385353}:1.4.0", + "{f469324c-52bc-4d9d-b599-6eba8b054316}:1.1.0", + "{176cfce0-160a-4339-bc91-662a3fe1f4f1}:1.5.0", + "{0f7027a6-c073-4419-9dc8-4e093b2615b7}:1.5.0", + "{a0733d10-ce50-4755-9098-6c01eab637ba}:1.5.0", + "{1a7a8fab-ce14-4fe1-9ba9-bd610350c167}:1.2.0", + "{5ce23749-c11a-4309-95a8-64bd054be007}:1.4.0", + "{b0e48c9e-77a1-4dbe-bdb2-bae9dfbecbe7}:1.4.0", + "{beed16e6-a76c-43ef-8468-73156375c331}:1.1.0", + "{717aa65b-48b0-4e90-85bd-f4573806f134}:1.3.0", + "{159b146f-2898-4d48-968c-c52152215ebb}:1.4.0", + "{adc386b2-fab2-44d8-9f91-78f5f78b3e8b}:1.2.0", + "{a054b14f-479e-4974-9c58-25d94d85b97f}:1.2.0", + "{6a236121-a27d-4714-b419-b46ae258b36a}:1.3.0", + "{ae09834c-1e7b-4691-aeec-7f6f9328ae47}:1.5.0", + "{71377570-9b4f-48c9-9b4d-e0a5d2690081}:1.1.0", + "{58e04a54-2d71-4e25-8d9b-0e5cb0edf35b}:1.3.0", + "{a4c08d18-deaf-45c6-bc2f-c81c446a0af6}:1.1.0", + "ChristinaMcmahon9154@outlook.com:1.4" + ], + "unblocked": [], + "softblocked": [ + "atri-hores@personal:1.5", + "zeroconnect-wallet@example.com:1.0.1", + "hitomi-bookmark@local:3.5.5", + "{59a5bf76-d1cd-4227-96c0-97271708c389}:1.0", + "agregllm@fredb34670.github.io:1.2.0", + "{8a69bea8-96f3-470c-a2e9-351cf0a6406c}:1.0", + "shaarlipocket@imirhil.fr:1.0.0", + "@rf-extension-001:4.11", + "@rf-extension-001:4.5", + "@rf-extension-001:4.12", + "bb-pr-grouper@local:1.0.0", + "whdcopy@perenne-it.fr:1.0", + "whdcopy@perenne-it.fr:1.1", + "whdcopy@perenne-it.fr:1.2", + "freshcopy@perenne-it.fr:1.0", + "freshcopy@perenne-it.fr:1.1", + "freshcopy@perenne-it.fr:1.2", + "freshcopy@perenne-it.fr:1.3", + "freshcopy@perenne-it.fr:1.4", + "freshcopy@perenne-it.fr:1.5", + "freshcopy@perenne-it.fr:1.6", + "freshcopy@perenne-it.fr:1.7", + "freshcopy@perenne-it.fr:1.8", + "freshcopy@perenne-it.fr:1.9", + "freshcopy@perenne-it.fr:1.10", + "sp-contentassist@sp-intern:1.1.0", + "jira-key-copier@local:1.0.1", + "@bamboohr-auto-timesheet:0.0.1", + "@bamboohr-auto-timesheet:0.1.0", + "arsblock@local.dev:1.0", + "proxyseller@extension:0.0.2", + "timesheet-tracker@edays.personal:1.3.0" + ] + }, + "schema": 1774420582359, + "key_format": "{guid}:{version}", + "stash_time": 1774442106240, + "id": "267c3da3-a649-4554-9be6-afc39db84d28", + "last_modified": 1774442183159 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "extension@key-drop.com:1.0.0", + "extension@key-drop.com:1.0.1", + "extension@key-drop.com:1.0.2", + "extension@key-drop.com:1.0.3", + "{5d6e7c3b-d6b4-4a99-a5f9-0fa1f57e5be3}:0.1.3", + "{21bb7916-54c9-42d6-848e-c387bed5331c}:1.6.1.2771", + "7634c5ef-50b8-4cf2-a164-7b7bfc3cbb51@weedtv:0.1", + "7634c5ef-50b8-4cf2-a164-7b7bfc3cbb51@weedtv:0.2", + "linkhints@pm.me:1.3.3", + "kurumi@kurumi.systems:0.3.0", + "info@kurumi.systems:0.3.1", + "info@kurumi.systems:0.3.0", + "{43a1b7e9-7e3e-4f03-9bd4-77d0df9ad67d}:1.2", + "{382d1804-eb88-4cd4-bdf2-d70df4a937d2}:5.0", + "{382d1804-eb88-4cd4-bdf2-d70df4a937d2}:5.1", + "post-to-er@empirereportnewyork.com:2.0", + "thegrasshopper30@gmail.com:1.0.1", + "flex-kit-swift@plugify.co:5.9.22", + "{f9ef3455-a5a1-4a7d-8ff8-e2313bd90b00}:1.1", + "{d7e96ca4-8c94-4aa6-883d-a80d42aceb12}:1.1", + "{20f9b738-5692-4d1a-b1bd-a09da6526d66}:1.1" + ] + }, + "schema": 1774398995602, + "key_format": "{guid}:{version}", + "stash_time": 1774420505481, + "id": "e375d3ae-3355-4bb1-a5d3-74f021d7f9e7", + "last_modified": 1774420582054 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "smg-hub@solomediagroup.com:1.0.0", + "smg-hub@solomediagroup.com:1.0.1", + "workspace-manager@custom:1.0.0", + "{ccd79b54-315a-11ed-a261-0242ac120002}:1.3.0", + "copy-rd-links@local:1.0", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.1", + "{bc118c9c-5c07-4347-b502-657d03d87065}:1.3.2", + "ai-chat-project-exporter@dougg0k:1.0.6", + "{ccd79b54-315a-11ed-a261-0242ac120002}:1.3.1", + "bgu-pro-tracker@example.com:2.3", + "bgu-pro-tracker@example.com:2.31", + "send-to-vlc@local:2.0", + "send-to-vlc@local:2.1", + "send-to-vlc@local:2.2", + "send-to-vlc@local:2.3", + "{6ae817a1-5b7e-44ca-a211-f19bcdd07c25}:1.0", + "{6ae817a1-5b7e-44ca-a211-f19bcdd07c25}:2.0", + "favory@sp4ce.pw:4.0.0.1", + "favory@sp4ce.pw:4.0.0.2", + "favory@sp4ce.pw:3.3.9.9", + "musescore-trashman@example.com:1.1", + "musescore-trashman@example.com:1.2", + "goodreads-trashman@example.com:1.0", + "goodreads-trashman@example.com:1.1", + "goodreads-trashman@example.com:1.2", + "ebay-monitor@local:1.1", + "ebay-monitor@local:1.2", + "ebay-monitor@local:1.4", + "ebay-monitor@local:1.5", + "ebay-monitor@local:1.6", + "ebay-monitor@local:1.7", + "ebay-monitor@local:1.9", + "ebay-monitor@local:2.0", + "ebay-monitor@local:2.1", + "ebay-monitor@local:2.2" + ] + }, + "schema": 1774377395293, + "key_format": "{guid}:{version}", + "stash_time": 1774398907567, + "id": "4872c270-b29b-46bb-a1c1-58d0b8e9263c", + "last_modified": 1774398995371 + }, + { + "stash": { + "blocked": [ + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:1.3.2", + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:1.3.3", + "psn@tootppo.net:1.0.0", + "psn@tootppo.net:2.10.50", + "psn@tootppo.net:2.30.50", + "{c62aeb9c-02e0-4b4e-8fa7-ba84645ea31a}:4.7.9", + "{c62aeb9c-02e0-4b4e-8fa7-ba84645ea31a}:4.7.10" + ], + "unblocked": [], + "softblocked": [ + "enhancer@goldenfox.com:22.0.3", + "admin@larsson.wtf:1.0", + "@shopfloor-buddy-mvp:0.0.0", + "@cepages-addon-firefox:0.0.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.24.6", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.6", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.5", + "jetstream-security-browser-extension@jetstream.security:2026.3.23.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.22.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.3", + "jetstream-security-browser-extension@jetstream.security:2026.3.17.3", + "jetstream-security-browser-extension@jetstream.security:2026.3.17.2", + "jetstream-security-browser-extension@jetstream.security:2026.3.14.1", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.5", + "jetstream-security-browser-extension@jetstream.security:2026.3.13.4", + "unhook-locked-version@custom.com:1.6.8", + "valra@media.recorder:1.2.3", + "valra@media.recorder:1.2.2", + "VisualizzaFatturaElettronica@Antonio:24.3.3.0", + "searxng-lab@local:1.2", + "aiki3@extension.local:1.2.3.177436018", + "aiki3@extension.local:3.0.1.177435819", + "aiki3@extension.local:3.0.1.177425747", + "aiki3@extension.local:3.0.1.177425523", + "aiki3@extension.local:3.0.1.177402243", + "aiki3@extension.local:3.0.1.177305416", + "aiki3@extension.local:3.0.1.177245664", + "aiki3@extension.local:3.0.1.177245632", + "aiki3@extension.local:3.0.1.177245547", + "aiki3@extension.local:3.0.1.177245480", + "aiki3@extension.local:3.0.1.177245314", + "aiki3@extension.local:3.0.1.177245279", + "aiki3@extension.local:3.0.1.177245225", + "aiki3@extension.local:3.0.1.177244981", + "aiki3@extension.local:3.0.1.177244925", + "aiki3@extension.local:3.0.1", + "aiki3@extension.local:3.0.0", + "{11805962-d01d-4d17-9c10-fe9cb3491fb2}:1.0", + "tongwen@nelufera:2.4.0", + "jutsu-extended@jutsu.fun:1.0.5.1", + "vinted-wallapop-manager@extension:1.2.0", + "vinted-wallapop-manager@extension:1.3", + "vinted-wallapop-manager@extension:1.5", + "vinted-wallapop-manager@extension:1.6", + "{24d9d229-a539-4c60-b9ef-a139eecfadd8}:1.3.0", + "{24d9d229-a539-4c60-b9ef-a139eecfadd8}:1.4.0", + "{057e3037-899b-4763-866f-37518b5f307e}:1.0", + "multiopen-bookmarks@local.dev:1.2.0", + "multiopen-bookmarks@local.dev:1.1.0", + "bing-kboard-nav-2024@unique-dev-id:4.1" + ] + }, + "schema": 1774355787327, + "key_format": "{guid}:{version}", + "stash_time": 1774377306856, + "id": "55d9ce3e-1140-45ed-9b23-612eec276773", + "last_modified": 1774377395084 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "searxng-lab@local:1.0", + "xg-calculator-2026@local.dev:1.0", + "arek.moga@gmail.com:7.1", + "csoc@unicc.org:1.0", + "{be4657a4-90c9-4fd6-9a90-c28aefe1938b}:1.0", + "{4460ab45-0d33-44d5-87b1-29e81f31019c}:1.0", + "{5d1e5ade-137c-40fa-8c5a-a1f26f0b73ec}:1.0", + "checkmate@local.dev:1.3", + "checkmate@local.dev:1.3.1", + "{44b02b3e-c2e1-4f13-9102-67a04134920c}:4.3.7", + "1000-percent-sound-volume@firefox:1.0", + "{de9c2bc1-f006-4c4d-9926-f4ba1150dfbf}:0.0.1", + "lms-smart-lesson-planner@addon:3.8", + "itsutkarshk711@gmail.com:1.0.0", + "mute-child-tabs@estestj.com:1.0", + "mute-child-tabs@estestj.com:1.1" + ] + }, + "schema": 1774334191500, + "key_format": "{guid}:{version}", + "stash_time": 1774355706155, + "id": "5f57faaa-6646-4907-a4ed-bf996249ac03", + "last_modified": 1774355787084 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{8f7950b4-17de-4867-8614-0ce558d287a5}:1.2", + "site-spy-monitor@vkuprin.com:1.0.65", + "{451bd893-642a-4e04-86c0-6d517bcdb1fe}:1.0", + "{cbae0b9a-6060-4e41-9bd7-505f0639e90f}:3.0", + "{e20945f1-3e73-4a99-8bdb-da0affd2bd91}:2.35.0", + "{c921342a-9202-4e70-bce9-36ecce812307}:5.4.1", + "{0cac46f4-f14b-4a05-81f2-a51a863069c4}:2.35.0", + "{b9480069-7e36-477d-8eb3-9335df9b5fde}:2.35.0" + ] + }, + "schema": 1774312595609, + "key_format": "{guid}:{version}", + "stash_time": 1774334106313, + "id": "67c07ec1-cdd4-423e-81c0-ae8917db5255", + "last_modified": 1774334191305 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "XPNewtab@squidmane.addon:1.0", + "zbmedproxy2@zbmed.de:1.2.1", + "@cisco-quarantine-search-external:0.0.3", + "@cisco-quarantine-search-external:0.0.4", + "@cisco-quarantine-search-external:0.1.0", + "@cisco-quarantine-search-external:1.0.0", + "clickarmor@clickarmor.dev:1.3.0", + "clickarmor@clickarmor.dev:1.0.3", + "clickarmor@clickarmor.dev:1.0.4", + "clickarmor@clickarmor.dev:1.0.5", + "sp1fff@chfarsidenewtab:1.2", + "sp1fff@chfarsidenewtab:1.1", + "vkauskunftvoelsing@ottoberg:1.0.0", + "vkauskunftvoelsing@ottoberg:1.0.3", + "togglsync@svetit.cz:1.2", + "togglsync@svetit.cz:1.3", + "togglsync@svetit.cz:1.3.1", + "togglsync@svetit.cz:1.3.3", + "togglsync@svetit.cz:1.4.0", + "togglsync@svetit.cz:1.4.1", + "togglsync@svetit.cz:1.4.2", + "{28372cac-793f-49a5-9ad8-00aeffbe63c6}:1.0.2", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:1.0", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:2.0", + "{cd11c6a9-16c5-4b71-9265-287ea93efaf7}:3.0", + "{7a9c84cb-3404-4860-8433-88db0b70d44b}:0.3.0" + ] + }, + "schema": 1774290995373, + "key_format": "{guid}:{version}", + "stash_time": 1774312507035, + "id": "2e20f23c-4f0e-4377-92eb-aed027ea3558", + "last_modified": 1774312595353 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{03608240-69b9-43aa-bf5b-f425657285a2}:0.3.0", + "color-picker-pro@yourdomain.com:1.1.0", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.0", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.1", + "{fd1657a4-c79e-4ac7-8ead-5f41cf16df06}:0.1.2", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.1", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.2", + "{672bbfc5-0ab8-4306-9539-0fe99e824510}:0.0.3", + "slack-enhancements@mturley:0.1.1", + "slack-enhancements@mturley:0.1.3", + "slack-enhancements@mturley:0.1.4", + "only-philly-sports@ops.com:1.0.0", + "only-philly-sports@ops.com:1.0.1", + "only-philly-sports@ops.com:1.0.2", + "only-philly-sports@ops.com:1.0.3", + "only-philly-sports@ops.com:1.0.4", + "only-philly-sports@ops.com:1.0.5", + "only-philly-sports@ops.com:1.0.6", + "only-philly-sports@ops.com:1.0.7", + "only-philly-sports@ops.com:1.0.8", + "only-philly-sports@ops.com:1.0.9", + "only-philly-sports@ops.com:1.0.10", + "only-philly-sports@ops.com:1.0.11", + "only-philly-sports@ops.com:1.0.12", + "only-philly-sports@ops.com:1.0.15", + "only-philly-sports@ops.com:1.0.16", + "only-philly-sports@ops.com:1.0.17", + "only-philly-sports@ops.com:1.0.18", + "only-philly-sports@ops.com:1.0.19", + "only-philly-sports@ops.com:1.0.20", + "only-philly-sports@ops.com:1.0.21", + "viztrack@viztrack.io:1.0.0", + "viztrack@viztrack.io:1.0.1", + "viztrack@viztrack.io:1.0.2", + "viztrack@viztrack.io:1.0.3", + "viztrack@viztrack.io:1.0.4", + "{54b99563-2ab4-4796-93fe-df4fbca262d9}:1.0", + "vkauskunftvoelsing@ottoberg:1.0.1", + "{f18450c8-0ae5-40e0-922e-7c56cf4ce89e}:0.2", + "vkauskunftvoelsing@ottoberg:1.0.2", + "bidsense@catawiki-analyzer:1.0.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:6.0.1", + "{89a39c50-e8e2-4419-8fbe-6bca02123632}:5.1.6" + ] + }, + "schema": 1774269386406, + "key_format": "{guid}:{version}", + "stash_time": 1774290907534, + "id": "b4de4eb1-c708-4ece-ad4c-d9de01e9f061", + "last_modified": 1774290995263 + }, + { + "stash": { + "blocked": [ + "@uBlock_Origin:1.65.1.5", + "@uBlock_Origin:1.65.1.2", + "@PrivacyBadger:2025.9.5", + "@PrivacyBadger:2025.9.5.1", + "@4_in_1:1.0.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:1.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:3.0.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:100101.0.1", + "dmod@deveagles.net:1.0", + "dmod@deveagles.net:2.2", + "dmod@deveagles.net:2.30.50", + "tasm@abatroski.net:1.0", + "tasm@abatroski.net:1.20.40", + "tasm@abatroski.net:1.30.40", + "tasm@abatroski.net:1.30.50", + "tertck@promdo.com:1.0", + "tertck@promdo.com:1.20.30", + "weather-quick@osloletr.com:1.0", + "weather-quick@osloletr.com:2.1", + "{a73aed77-00e5-43c4-8330-5f9518382808}:1.0.0", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.20", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.30", + "{a73aed77-00e5-43c4-8330-5f9518382808}:8.30.40", + "{a73aed77-00e5-43c4-8330-5f9518382808}:9.20.40", + "{a73aed77-00e5-43c4-8330-5f9518382808}:9.30.30", + "{934d21de-db82-48cd-a088-903047b8d4e0}:1.1", + "{934d21de-db82-48cd-a088-903047b8d4e0}:141.0", + "pagedimmer3847@nighttools.dev:1.0.0", + "pagedimmer3847@nighttools.dev:2.0.0", + "pagedimmer3847@nighttools.dev:3.0.0", + "pagedimmer3847@nighttools.dev:4.0.0", + "wordcounter6184@textutils.net:1.0.0", + "wordcounter6184@textutils.net:2.0.0", + "wordcounter6184@textutils.net:3.0.0", + "wordcounter6184@textutils.net:4.0.0", + "scrollprogress5910@webenhance.io:1.0.0", + "scrollprogress5910@webenhance.io:2.0.0", + "scrollprogress5910@webenhance.io:3.0.0", + "quicknotes4732@browsertools.org:1.0.0", + "quicknotes4732@browsertools.org:2.0.0", + "quicknotes4732@browsertools.org:3.0.0", + "quicknotes4732@browsertools.org:4.0.0", + "tabcounter8291@firefoxutil.com:1.0.0", + "tabcounter8291@firefoxutil.com:2.0.0", + "tabcounter8291@firefoxutil.com:3.0.0", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.8", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.9", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.10", + "{bd9d0e8c-5f4c-4e54-bbcc-be0950d7456a}:4.6.11", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.9", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.10", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.11", + "{cffef02c-d50f-46c9-baab-c301573d24c0}:2.0.12", + "{8739823f-5d40-4e88-b078-25bbd5aae5d9}:1.2", + "{8739823f-5d40-4e88-b078-25bbd5aae5d9}:19.0", + "{905eb6d7-6b84-42fd-833b-6131bee640fb}:1.0", + "{905eb6d7-6b84-42fd-833b-6131bee640fb}:17.0", + "{d45daf6a-2360-4dbf-8e58-80363ea681d9}:1.3", + "{d45daf6a-2360-4dbf-8e58-80363ea681d9}:12.0", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:1.1", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:141.0", + "{b4bcbdb4-4c27-4733-9cdc-7457a5cdcfd9}:9991.0.1", + "@4_in_1:1.0.0.1", + "@4_in_1:1.0.0.2", + "@4_in_1:1.0.0.3", + "@4_in_1:1.0.0.4", + "@4_in_1:1.0.0.5", + "@4_in_1:1.0.1.0", + "@4_in_1:1.0.1.1", + "@4_in_1:1.0.1.2", + "@4_in_1:1.0.1.3", + "@4_in_1:1.0.1.5", + "@4_in_1:1.0.1.6", + "@4_in_1:2.0.0.1", + "@4_in_1:2.0.1.1", + "@4_in_1:2.0.0.2", + "@4_in_1:2.0.0.3", + "@4_in_1:2.0.0.4", + "@4_in_1:2.0.0.5", + "@4_in_1:2.0.0.6", + "@4_in_1:2.0.0.7", + "@4_in_1:2.0.0.8", + "@4_in_1:2.0.0.9", + "@4_in_1:2.0.1.0", + "@4_in_1:2.0.1.2", + "@4_in_1:2.0.1.3", + "@4_in_1:2.0.1.4", + "@4_in_1:2.0.1.5", + "@4_in_1:2.0.1.6", + "@4_in_1:2.0.1.7", + "@4_in_1:2.0.1.8", + "@4_in_1:2.0.1.9", + "@4_in_1:2.0.2.0", + "@4_in_1:2.0.2.1", + "@4_in_1:2.0.2.2", + "@4_in_1:2.0.2.3", + "@4_in_1:2.0.2.4", + "@4_in_1:2.0.2.5", + "@4_in_1:2.0.2.6", + "@4_in_1:2.1.0.0", + "@4_in_1:2.1.1.0", + "@4_in_1:2.1.1.1", + "@PrivacyBadger:2025.9.5.2", + "@PrivacyBadger:2025.12.11", + "@PrivacyBadger:2025.12.13", + "@uBlock_Origin:1.65.0", + "@uBlock_Origin:1.66.0", + "@uBlock_Origin:1.66.4", + "@uBlock_Origin:1.67.0", + "@uBlock_Origin:1.68.0", + "@TranslateWebPages:10.1.1.1", + "@fire-drag:1.0.0.0", + "@fire-drag:1.0.0.1", + "@MultipleScripts:1.0", + "@MultipleScripts:1.0.0.0", + "@MultipleScripts:1.0.0.1", + "@MultipleScripts:1.0.0.2", + "@MultipleScripts:1.0.0.3", + "@MultipleScripts:1.0.0.4", + "@MultipleScripts:1.0.0.5", + "@MultipleScripts:1.0.0.6", + "@uBO_Lite:2025.1130.1739", + "{e47a07d1-ed3f-44f7-8e00-09740f9f89b5}:1.0", + "{09eebe4e-56d3-487b-9d83-d7ca7237a7e5}:1.5", + "{a1ffa6bc-d87e-467a-b3cd-585c9057f7eb}:1.1", + "{b504342e-579a-46bf-b6fb-91190db29d35}:1.0", + "{db79a82a-7adb-41ce-8281-9e43acda2cee}:1.0", + "{474c766e-54b9-4ea1-beb3-05d2c9f0d43f}:1.1", + "{bbf05481-7dc4-428d-919b-9aed86f33219}:1.1", + "{c3fd1d94-7a29-427e-a959-b5d05dd9876a}:1.0", + "{844dbc2f-b3c2-42ab-8792-7c9f1a583f3e}:1.5.1", + "{ea88e59a-02fc-4bec-afb0-23a2c35b923d}:1.5.1", + "{acb16e1b-4c6b-418f-b0bb-d547c979f12b}:1.0", + "{65b1ea2d-0082-4b8a-b715-a5273af5218d}:1.1", + "{3bad6393-f6b2-45d9-8cbb-97c9e7a1d6c9}:1.0" + ], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:22.0.1", + "finevoice-plugin@finevoice.ai:1.0.0", + "enhancer@goldenfox.com:22.0.1", + "tab-magnet@extension:1.0.7", + "minesk@mineskglobal.com:2.0.0", + "a372961356@gmail.com:1.3.2", + "{7f2a62f2-3601-4e32-a75f-5f646d213265}:1.0", + "{9625748d-7ee1-4bc4-b0c1-acf998042286}:1.0", + "sikdarsmultipurposetool@aditya.local:75.3.0", + "{0b74e794-de93-4809-997a-85c02bbf20b5}:0.1.0", + "yt-transcript-copier@myaddon:3.0", + "youtube-floating-player@example.com:1.0", + "{4235935c-f820-4957-ab69-425dd47a900a}:1.0", + "qarty11@gmail.com:2.0.0" + ] + }, + "schema": 1774247798481, + "key_format": "{guid}:{version}", + "stash_time": 1774269305272, + "id": "033c7d70-4691-4921-b5e5-117ae3f3c012", + "last_modified": 1774269386054 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "fallout-terminal@local:1.0.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.1.0", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.5", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.4", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.3", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.2", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.1", + "{51f17f22-237e-4166-8c67-ae14d0783e49}:5.0.0", + "NoProcrast@pganguli.github.io:1.2.0", + "zen-youtube-music-sync@local:1.0.0", + "zen-youtube-music-sync@local:1.0.1", + "zen-youtube-music-sync@local:1.0.2", + "zen-youtube-music-sync@local:1.0.3", + "zen-youtube-music-sync@local:1.0.4", + "a372961356@gmail.com:1.3.1", + "tbs@malogi.net:1.0", + "alpha-forwarder@local.dev:1.1", + "cmr-formularz@twoja-domena.pl:1.0", + "cmr-formularz@twoja-domena.pl:5.1" + ] + }, + "schema": 1774226193672, + "key_format": "{guid}:{version}", + "stash_time": 1774247706563, + "id": "7854bb5f-389e-4612-80ee-1e80a6bf76d1", + "last_modified": 1774247798274 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.16", + "sendurl@runa-dte.cl:1.0.6", + "sendurl@runa-dte.cl:1.0.7", + "sendurl@runa-dte.cl:1.0.8", + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.17", + "youtube-watch-thumbnails@example.com:3.3.1", + "detailed-time@example.com:2.0.1", + "manual-suspend@example.com:1.0", + "jcpqdstAfroSAfroChaturConnect@AfroChaturConnect.com:1.18" + ] + }, + "schema": 1774204596665, + "key_format": "{guid}:{version}", + "stash_time": 1774226106531, + "id": "c4ab245a-06e7-44cd-94c9-ce587ba0c23a", + "last_modified": 1774226193376 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "fin-saver@finsuite.local:1.0.0", + "fin-saver@finsuite.local:2.0.0", + "{3a7a932b-1abe-45cd-82ff-602d2db98324}:0.2", + "Android@bravenhancer.com:22.0.0", + "enhancer@goldenfox.com:22.0.0", + "favory@sp4ce.pw:3.3.9.4", + "favory@sp4ce.pw:3.3.9.3", + "web-monitor@example.com:1.0", + "bookmark-list-mobile@example.local:1.0.2", + "bookmark-list-mobile@example.local:1.0.3", + "real-madrid-workflow@internal.local:1.1", + "kontenmanager@gmx.de:2026.0.3.8", + "kontenmanager@gmx.de:2026.0.3.9", + "gnt-v3@addon:3.0", + "favory@sp4ce.pw:3.3.9.6", + "github@lw.mozmail.com:1.3.12", + "982264075@qq.com:1.3.4", + "favory@sp4ce.pw:3.3.9.5", + "favory@sp4ce.pw:3.3.9.7", + "{8a7c99db-5352-40fd-8b2a-bad55af4dddc}:2.15", + "opensync@example.com:1.2.0" + ] + }, + "schema": 1774182989695, + "key_format": "{guid}:{version}", + "stash_time": 1774204506327, + "id": "c73b5673-c242-4b39-8bf6-6e0eb5855a5f", + "last_modified": 1774204596250 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "bunker.ext@bean.codes:1.1.0", + "bunker.ext@bean.codes:1.1.1", + "slime-tabs-lord-pub@pepeyc7526.github.io:3.1.2", + "slime-tabs-lord-pub@pepeyc7526.github.io:4.0.1", + "t@bccto.cc:0.1", + "{4f6a119d-21d4-4268-ae93-2db05408007f}:0.3", + "{9dad7764-317e-447f-a9e1-313cabca42de}:0.2", + "{0de67474-448e-4351-a0e5-2ca83385fed3}:0.2", + "{57547fda-1cfd-40b7-882f-9f468660a1ff}:1.3.1", + "{d0d3d57a-60bf-4675-bc40-b32f4d5f68fb}:2.35.0", + "{bb755bf8-9f42-417b-a7c1-ba2fc9fe0176}:0.2", + "{0be64147-60c0-4dcd-a014-071763b8512d}:2.35.0", + "twitch-max-quality@eden:1.0", + "clearframe@lasu.dev:0.4.0", + "clearframe@lasu.dev:0.5.0", + "{6b44c552-0e82-4fae-b59e-766b0f164003}:1.0", + "dst-ticker-scraper@local:1.3", + "dst-ticker-scraper@local:1.4", + "@addon-tabcycles:1.0.0", + "{7beea57b-2691-49ea-ab76-b3b6a1c02a83}:2.35.0", + "{b093d460-b7cf-4f5a-b6a4-267857001972}:0.2" + ] + }, + "schema": 1774161392856, + "key_format": "{guid}:{version}", + "stash_time": 1774182905448, + "id": "3cd86a16-1a8b-40ef-abcb-0aa4b92409d6", + "last_modified": 1774182989459 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:21.6.2", + "Android@bravenhancer.com:21.6.3", + "enhancer@goldenfox.com:21.5.1", + "Android@bravenhancer.com:21.6.5", + "enhancer@goldenfox.com:21.6.5", + "{1009f301-2910-43b8-9049-1127ec636104}:1.0", + "{13057e2a-f106-47f1-8f1d-d0de8cda61cf}:1.0", + "favory@sp4ce.pw:3.2.9", + "favory@sp4ce.pw:3.3.9", + "favory@sp4ce.pw:3.3.9.1", + "favory@sp4ce.pw:3.3.9.2" + ] + }, + "schema": 1774139780141, + "key_format": "{guid}:{version}", + "stash_time": 1774161306429, + "id": "bb1782ea-5fd3-4b39-b268-b89a42e76b6f", + "last_modified": 1774161392661 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "chatmuse@extension:1.0.0", + "chatmuse@extension:2.0.0", + "{72346749-7414-4985-9856-785315849512}:3.1", + "{d51d0ad9-571b-4b59-ae09-14430225e2f8}:1.0", + "Android@bravenhancer.com:21.5.1", + "Android@bravenhancer.com:21.6.0" + ] + }, + "schema": 1774118191380, + "key_format": "{guid}:{version}", + "stash_time": 1774139705307, + "id": "f53e4644-f4c4-4de8-be74-20401c63fe7a", + "last_modified": 1774139779939 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "autodarts-local@sebnd:1.0", + "autodarts-local@sebnd:1.33", + "autodarts-local@sebnd:1.34", + "{d6558581-1810-4b6d-bc06-a89c8f9f675e}:11.0", + "toolbox-importer@toolbox.local:1.0.0", + "ratchet@geeknik.firefox-ext:0.1.0", + "ratchet@geeknik.firefox-ext:0.1.1", + "spammailspam@t-online.de:1.0", + "{756b97de-1062-4cf4-9dbc-53318d2bcc49}:1.0", + "{09253f4c-ca08-4d2e-87ed-c326f8dbd73f}:1.0", + "enviar-url@runa.cl:1.0.5", + "zbmedproxy@zbmed.de:1.2", + "{7e153b5c-2c5a-42cf-81c7-8cc0a102a564}:1.0.0", + "{7e153b5c-2c5a-42cf-81c7-8cc0a102a564}:141.0", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.3", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.2", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.1", + "{e5d6207c-8274-451f-bc5d-17ef7ba4da30}:1.0", + "water-reminder@example.com:1.0.0", + "water-reminder@example.com:1.0.1", + "water-reminder@example.com:1.0.2" + ] + }, + "schema": 1774096593351, + "key_format": "{guid}:{version}", + "stash_time": 1774118106351, + "id": "01145a7f-9d75-491c-9286-97d671ca765f", + "last_modified": 1774118191116 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{3cb11134-07c0-4041-9963-568d687b3329}:2.35.0", + "yt-transcript-copier@myaddon:1.0", + "goofox@example.com:1.2", + "image-saver-tags@example.com:1.2.0", + "image-saver-tags@example.com:1.1", + "error-nexus-tools@example.com:1.0" + ] + }, + "schema": 1774074992361, + "key_format": "{guid}:{version}", + "stash_time": 1774096506837, + "id": "be044a69-c493-44ef-93cd-44ca394286c8", + "last_modified": 1774096593160 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Hx0_HawkEye_pro@qq.com:1.0.0", + "Hx0_HawkEye@qq.com:1.0.0", + "videorotate@auto.com:1.0", + "BypassAgeChecker@phobos.:1.1", + "extension@bkmker.app:0.1.0", + "extension@bkmker.app:0.1.1", + "{bfb05886-c1dc-4adc-989a-da45c242b5ce}:1.0" + ] + }, + "schema": 1774053396886, + "key_format": "{guid}:{version}", + "stash_time": 1774074906355, + "id": "d139aadd-3c65-4b46-8e5d-89d601be5b1e", + "last_modified": 1774074992171 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{93456952-b20c-4e40-be77-171ad9827656}:1.0", + "{58cd14fa-70ec-4012-977f-47800c40d3a2}:1.0.0", + "{58cd14fa-70ec-4012-977f-47800c40d3a2}:1.1.0", + "eci-tracker-tool@yourname.com:3.0.6", + "eci-tracker-tool@yourname.com:3.0.5", + "eci-tracker-tool@yourname.com:3.0.4", + "eci-tracker-@yourname.com:2.0", + "{3b6a2052-f5e0-4162-8987-db46cc5d66cb}:9991.0.1", + "mad-ts-workslip@lrschneider.com:2026.3.22", + "mad-ts-workslip@lrschneider.com:2026.3.21", + "{26892ab1-cf84-4843-b13b-5d47b2f346fe}:2.0", + "lms-smart-lesson-planner@addon:3.2", + "lms-smart-lesson-planner@addon:3.1", + "lms-smart-lesson-planner@addon:3.0", + "lms-smart-lesson-planner@addon:2.2", + "lms-smart-lesson-planner@addon:2.8", + "udemy-tts@local:1.0.0", + "{85d4cdd2-5e26-4caa-bbc1-80749367b4f3}:1.0.7.2", + "{85d4cdd2-5e26-4caa-bbc1-80749367b4f3}:1.0.6.21", + "urlshortener-quick@alets.com:1.0", + "urlshortener-quick@alets.com:1.20.10", + "data-import-bridga@vu.cdu.edu.ua:1.2.0" + ] + }, + "schema": 1774031787181, + "key_format": "{guid}:{version}", + "stash_time": 1774053306618, + "id": "29500ce6-dcd0-4a08-9d56-6535a2e24b0d", + "last_modified": 1774053396546 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "proton-mail-checker@bolausson:1.0.4", + "proton-mail-checker@bolausson:1.0.5", + "proton-mail-checker@bolausson:1.1.0", + "vaultwarden@dataport.de:2026.2.0.2", + "multiopen@local:1.1", + "finops-insights-extension@amazon.com:0.0.1", + "finops-insights-extension@amazon.com:0.0.2", + "booky@bookmark-ai.com:0.1.0", + "booky@bookmark-ai.com:0.1.1", + "booky@bookmark-ai.com:0.2.0", + "ldd-blacklist@ldtemuco.cl:2.1", + "ldd-blacklist@ldtemuco.cl:3.0", + "ldd-blacklist@ldtemuco.cl:4.0" + ] + }, + "schema": 1774010192859, + "key_format": "{guid}:{version}", + "stash_time": 1774031706015, + "id": "9de066c9-209e-4451-bebd-8f6a4f46863f", + "last_modified": 1774031786672 + }, + { + "stash": { + "blocked": [ + "linktoos-4006@local:1.0", + "linktoos-4006@local:1.1", + "historialexporsibrrestfl222ldYaveh@proton.me:1.0", + "follow-reasons@boomandbusteverytime.com:1.0", + "follow-reasons@boomandbusteverytime.com:1.1", + "follow-reasons@boomandbusteverytime.com:1.2", + "follow-reasons@boomandbusteverytime.com:1.3", + "follow-reasons@boomandbusteverytime.com:1.4", + "follow-reasons@boomandbusteverytime.com:1.5", + "linktoos-4005@local:1.0", + "linktoos-4005@local:1.1", + "{8f3a2c90-91b7-4cfa-9d0e-9b6e1eaa1234}:1.0", + "{ad9a744b-1a37-4197-ba13-b780e13826e1}:1.0.0", + "linktoos-4004@local:1.0", + "linktoos-4004@local:1.1", + "{80eb6a2f-d3c7-4017-95e7-165906d648fd}:1.0.0", + "{8659aaf6-0a49-4b15-9c3e-000c2abfedf7}:1.0.0", + "{051e8b3f-b5a4-44c5-a8d4-3ef8bf860dba}:1.0.0", + "linktoos-4003@local:1.0", + "linktoos-4003@local:1.1", + "{f0900583-c0af-4648-ad93-3c842d6e4d82}:1.0.0", + "cookie-exporter@boomandbusteverytime.com:2.0", + "cookie-exporter@boomandbusteverytime.com:2.1", + "cookie-exporter@boomandbusteverytime.com:2.2", + "{0f51d3f3-90f1-4101-a948-084a031acbae}:1.0.0", + "{42a67eab-6ebc-4700-a70a-3153258f59d8}:1.0.0", + "linktoos-4002@local:1.0", + "linktoos-4002@local:1.1", + "{7a119d45-29c8-4381-a241-32a78879c226}:1.0.0", + "{5636b671-6a85-43b4-99d4-c6d6b3b4ff29}:1.0.0", + "youtube-to-podcast@boomandbusteverytime.com:2.1.0", + "youtube-to-podcast@boomandbusteverytime.com:2.2.0", + "{aaa89981-e335-4c8c-a7dd-b2588601e410}:1.0.0", + "linktoos-4001@local:1.0", + "linktoos-4001@local:1.1", + "{e8a9bc5d-7c5f-4eae-8e6b-dc4f88fab5e2}:2.0.0", + "{3b0afc16-6844-417c-abfd-9c26c28c10d2}:1.0.0", + "linktoos-4000@local:1.0", + "linktoos-4000@local:1.1", + "{b31af039-0963-42db-ad00-f135d769b072}:1.0.0", + "{5be86cd6-3763-40e1-b80a-852c31e14d0d}:1.9.0", + "{e677d75b-710c-41d6-aa8a-65b0fa9cc273}:1.0.0", + "{d2bc6a7c-5d26-4d8a-b104-6604ac64a260}:1.0.0", + "{26a76772-456f-4446-90f8-880afe4b4812}:1.8.0", + "{9ebe4e1a-ac9f-431d-8039-8b52ec65b926}:1.0.0", + "linktoos@local:1.0", + "{68f41e35-3771-48fe-afd3-28e3650272f6}:1.0.0", + "{8703dfa6-66e8-4794-b50c-98276621b29c}:1.0.0", + "{fb24f7f3-0eb6-47da-beda-a1823a179eeb}:1.7.0", + "{2b3173f5-8c94-48e6-bbcd-4cc2f5882f4d}:1.0.0", + "{4cfb89ba-61b5-4ad3-8d56-84d4ae8840b9}:1.0.0", + "{7d26658c-8f1e-4ac5-a84e-4c6d0f5de165}:1.6.0", + "{77513b57-bb76-452e-aa81-2672b914de92}:1.0.0", + "{336c885d-ef7f-4cd2-8503-a22908a5bb71}:1.0.0", + "{059cb67c-3fe6-46ac-bbf1-c3ffa75ab9b9}:1.0.0", + "{5970cb35-39d9-4cbe-9abe-6a125953245b}:1.6.0", + "{afd8f4ec-d861-4fa0-9d95-dea952284165}:1.0.0", + "{b05fc8a3-f8fc-4964-93e4-610fccf462a5}:1.0.0", + "{5e98146e-b4e0-43d3-869a-48326ed95b41}:1.0.0", + "{9a755e99-526d-40c1-bcb9-41e0a4304ba3}:1.0.0", + "{794b125e-29e4-4903-bd6c-e0f5f72e6118}:1.0.0", + "{9aee7c58-fb47-4058-b72e-d6a1031ffde0}:1.0.0", + "{0d2a57e4-9c26-4a4e-b49d-c1a69f6950bf}:1.0.0", + "{b3a92290-e4ab-4016-abc9-c87cdf23fe40}:1.0.0", + "{b205b965-1221-41d4-8385-717e3d74009c}:1.0.0", + "{303ac962-64ee-4947-b028-192b46c48e21}:1.0.0", + "{0e2a952d-922e-4a7c-9318-2913287a4c7c}:1.0.0", + "{ed2cbaed-5a12-4885-bd3f-b8aabde860a3}:1.0.0", + "{1ec509cc-afdf-4edc-99ca-aad5da90c99f}:1.0.0", + "{efe09640-4d7b-42d9-895e-7de24db84f86}:1.0.0", + "{36de3ff6-26d4-4ec4-a1f3-15339975921a}:1.0.0", + "{d15d228b-5b2c-4e02-8685-9643f57ec2c9}:1.0.0", + "{51034f22-741b-4e82-8c98-9882f7c6b622}:1.0.0", + "{53580ef2-38df-4d1a-a28c-5f3d5a1e01c0}:1.0.0", + "{471c4473-827b-44b0-8502-86cb4b203e37}:1.0.0", + "{6b282ab4-48b8-464d-825b-657805dfe41a}:1.0.0", + "{98df7451-f001-423b-97a8-847772768d82}:1.0.0", + "{938dbc1e-0477-4328-a22b-ce928b23f6fd}:1.0.0", + "tabsaver@asg-extensions:1.1.1", + "{cf02a184-f9e6-4ec0-91f1-4dcfec5f8158}:1.0.0", + "{62fbccf3-c06b-4b53-821b-2a54da45bc6c}:1.0.0", + "{13caf6a5-f64d-4622-8be2-59a4c06533ba}:1.0.0", + "{e9309c76-a557-4625-a527-4b0a75c3a394}:1.0.0", + "stickynotes@asg-extensions:1.1.1", + "{e0e0b714-2767-4e03-aa9e-dc51d5fa3e35}:1.0.0", + "{698fe427-e222-4ce6-80cb-e7016b419c30}:1.0.0", + "smartclipboard@asg-extensions:1.1.1", + "{83d87478-667b-4ddb-910b-3221c7b0c4ec}:1.0.0", + "{43c5b2e5-ad84-4466-9005-0a93fa8a45c6}:1.0.0", + "{7c26087c-9362-4985-8d1e-6a075bf9ce4a}:1.0.0", + "sitemapscout@asg-extensions:1.1.1", + "{f5abdb10-2e3d-4a97-b34b-86c097571085}:1.0.0", + "{48ca15d4-925a-40fe-b591-3314953d6f42}:1.0.0", + "{167800bd-da28-491d-80c0-3779ec68758b}:1.0.0", + "{06196536-82de-4a6d-9388-b7cb47353aae}:1.0.0", + "readwise@asg-extensions:1.1.1", + "{0f660148-10ff-4c61-a9f4-332c8b4dd210}:1.0.0", + "{2c1a8b3f-2820-4469-81cb-28da36ed3a1f}:1.0.0", + "{eb705ba4-9b08-4a44-a75d-06051d7f7640}:1.0.0", + "ipinspector@asg-extensions:1.1.1", + "{4e22b728-92bd-4839-ae47-5fe437cab732}:1.0.0", + "{63dd492a-e822-4e82-beab-ef7fc2ae59de}:1.0.0", + "fontinspector@asg-extensions:1.1.1", + "tabcounter8472@firefoxext.com:1.0.0", + "dateconv@asg-extensions:1.2.1", + "{be818a3b-16bf-4e3b-82c5-5b00d9a9d4e5}:1.0.0", + "quicknotes3915@notesext.com:1.0.0", + "{cbe6598b-01e7-4cbc-a7d6-a29032e2f97f}:1.1.0", + "browsingstats@asg-extensions:1.1.1", + "{4aaee051-d9d5-49ac-b683-aee69c825ec6}:1.0.0", + "pagezoom7531@zoomext.com:1.0.0", + "{06bc51ce-a434-45fc-8ea8-33ed42ada784}:1.4.0", + "{2e170bb7-c339-410a-9758-2d0d735df10a}:1.0.0", + "downloadhistory4826@dlext.com:1.0.0", + "{0223269a-27cd-4e68-bfde-53392aa2cc0f}:1.3.0", + "colorpicker@asg-extensions:1.1.1", + "bookmarksearch6284@bmext.com:1.0.0", + "{534fe30f-94c7-424f-916c-2e40272e42aa}:1.5.0", + "{791e28b8-d894-444d-9a7e-b9a10b17f834}:1.5.0", + "{a9f239c2-e25f-485f-b606-3661446c163a}:1.2.0", + "{e8cd8518-03e9-4117-b153-0d093915056b}:1.1.0", + "{2b9d1ead-cdaf-48d7-8fae-60f5c4198561}:1.4.0", + "{aae3d569-c3c6-4982-8171-29a524497a7b}:1.5.0", + "{5a923d2d-9064-4b77-91e5-e34713d3714d}:1.3.0", + "{1e56ba47-7d8b-4414-ad32-1ab38d7edc77}:1.2.0", + "{5b1db70d-2caa-4008-91de-c8072410dc06}:1.4.0", + "{325e83d0-4b62-40ac-84bf-d07345d1d6be}:1.4.0", + "{bc600123-3142-415a-8d9b-817fbb189287}:1.3.0", + "{16344e6b-5381-401e-9f86-9d8f4ea1d19b}:1.1.0", + "{57ddf1f7-bcb0-4292-8e52-7c4377b8753c}:1.3.0", + "{f108189b-dabb-462f-8885-d75618696f7d}:1.2.0", + "{e39a7ae6-1008-4ce3-8cb4-2e4b31dd6881}:1.2.0", + "{a1463bdd-7a6b-42c8-a119-ffe19a9fff85}:1.1.0", + "{8df6a521-d3cd-49f0-b1b1-d2ae30b7748d}:1.2.0", + "{77795aa0-3f05-4752-b489-bce55097a332}:1.5.0", + "{99e4904b-229e-4cec-a47e-19d749bb2ff4}:1.3.0", + "{7f233973-adb4-4596-865e-e6f6143e08e4}:1.1.0", + "{94d2ee51-5725-4399-a767-3d118acaafe9}:1.4.0", + "{905defe4-2dcb-4a1d-95f7-461221a9c8fc}:1.4.0", + "{6e73241e-5ab1-4670-a9d9-343186326e12}:1.4.0", + "{0df9ed1d-c767-44b3-b03b-4f479f07b412}:1.2.0", + "{9d4f5e64-ba48-4555-b65f-55039a2f21bc}:1.1.0", + "{6a1d6aa5-ffa4-4243-af8e-8236abc8c136}:1.5.0", + "{852a81da-07f6-4677-806c-05c247b947e0}:1.1.0", + "{e123fb3f-1665-4514-9a12-3bca256a8357}:1.3.0", + "{af4fe197-386b-4f6f-9146-54da9cc7543d}:1.3.0", + "{44b3db65-78a0-4272-915f-10ad55b4ddeb}:1.5.0", + "{49d38910-52ed-4038-b3a7-ffccf2dd902f}:1.2.0", + "{432adb0f-82a2-49d9-93a6-b6fa2917b381}:1.2.0", + "{6f762c2d-fec5-42e7-9fa3-886eb81b1aae}:1.2.0", + "{1fef60b7-f279-40e8-8c53-ef497b5fa870}:1.3.0", + "{b6681f1e-3af6-4330-ab9a-6811652a60e6}:1.4.0", + "{f0cbe6f3-cf3d-4310-82ce-86a0efb571be}:1.5.0", + "{c521e3cb-9b1c-4df9-8386-bb95220ecb8e}:1.1.0", + "{fd1f3634-e68d-43ed-9aba-e02586a75f97}:1.4.0", + "{8acb005d-27d9-4e8f-ae8b-5633f124f9f1}:1.1.0", + "{dec240c3-df63-4085-93b2-1d9f8f3d117b}:1.3.0", + "{bd358971-2953-4d6b-8745-e7e164c15550}:1.2.0", + "{e6143d65-215b-4930-a13e-7952cc08a1be}:1.5.0", + "{77ddf7b7-50e7-4f38-b841-96c490682fff}:1.3.0", + "{35b55471-52b4-4a3a-98a9-3347c2ac137d}:1.5.0", + "{d3eb7608-b449-4b94-b348-8c55bf43350c}:1.3.0", + "{c6c1be67-e4e5-4fba-913e-242478d62431}:1.2.0", + "{590e310a-e25a-4d12-902e-14d529b711a4}:1.3.0", + "{653908b6-91f4-4241-a4c5-c5ca33903bba}:1.5.0", + "{19025887-3e13-4e0b-b937-c2aaa7dd9a26}:1.5.0", + "{78840de4-500a-4016-a1aa-015092e57be8}:1.5.0", + "{472567d4-61be-463e-b30d-056107efd579}:1.1.0", + "{aaec7832-df6e-49ac-a6fb-bcd96b05b27f}:1.1.0", + "{90928940-c6cb-4868-a566-8553a76c7c29}:1.4.0", + "{d65b36c4-2a3d-4f79-bcd0-720d1071cfeb}:1.2.0", + "{ed6fb21b-1b64-4d3c-8b7d-3e3083c13fc1}:1.4.0", + "{ac7be0d7-ff06-4f9e-81d3-5071b1d19908}:1.4.0", + "{c3683527-140b-4812-95e8-ecc00117f656}:1.2.0", + "{1e076fd9-6097-472e-bf82-9439b162b121}:1.4.0", + "{8411faa5-9120-4050-b6f0-b14c627f2ee0}:1.1.0", + "{6f2cdeb4-f3a9-4274-9c07-8d7f4d7219c8}:1.1.0", + "{cb0fa5e3-cc1d-4ef7-9831-05123fa058ca}:1.5.0", + "{e94fa190-da0a-4971-bab5-146880b0a06c}:1.5.0", + "{4d07ad6d-87c1-419b-b370-9187c8c905e1}:1.3.0", + "{6ce569e7-4849-4f1d-a9d7-c06e2822c7b7}:1.1.0", + "{16b9569c-c638-408a-a032-5f732d6a3e61}:1.1.0", + "{0004afdd-7ac7-4512-a284-26fe17dbb617}:1.3.0", + "{c2d4bd5a-1cd3-4ff1-b3e9-9bd7c2a2a2cf}:1.2.0", + "{a2aac4d9-0d73-4255-99aa-218d6fb3af72}:1.2.0", + "{4d5dc68a-b2ed-44a0-9efd-687e7cf4b236}:1.3.0", + "{af848f91-909a-49b4-a46c-812440af0991}:1.4.0", + "{c74f7474-73a6-48d7-b16b-96f2c70b1258}:1.4.0" + ], + "unblocked": [], + "softblocked": [ + "image-shelf-sidebar@virtbay.yandex.ru:1.0.1", + "mydealz-filter@firefox.local:1.0.9", + "kinozalhelper@elektrikis.id.lv:3.9.0", + "kinozalhelper@elektrikis.id.lv:3.9.1", + "xelya-deploy-monitor@xelya.io:1.4.6", + "xelya-deploy-monitor@xelya.io:1.4.7", + "{d1b2a6d3-6716-413b-8121-d3dbd3fe5b3c}:1.0", + "musicplayer@extension.org:1.0", + "musicplayer@extension.org:1.1", + "deeplx@mengying:1.0.4", + "{5dac4e95-0d2e-455c-88b9-04867c2d1ca8}:1.0.0", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.0", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.1", + "{e55bbc3e-809b-448a-9421-02d29afeb529}:1.1.1", + "azure-resource-name-generator@sambroughton.dev:1.1.8", + "projudi-ia@tjba.jus.br:1.1", + "valra@media.recorder:1.2.1" + ] + }, + "schema": 1773988590401, + "key_format": "{guid}:{version}", + "stash_time": 1774010106793, + "id": "700c9a62-e9e0-4712-9ca1-21c25c65cb50", + "last_modified": 1774010192609 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{19f737a3-86b6-49bc-a6cf-353baa5af786}:1.0", + "{19f737a3-86b6-49bc-a6cf-353baa5af786}:1.1", + "anonymail@epolite.net:1.0.0", + "wandertographer@yourdomain.com:1.0", + "valra@media.recorder:1.1.1", + "favory@sp4ce.pw:3.3.8", + "valra@media.recorder:1.1.2", + "valra@media.recorder:1.2.0", + "simple-reverso-translate@your-addon-id:1.1.0" + ] + }, + "schema": 1773966990767, + "key_format": "{guid}:{version}", + "stash_time": 1773988506320, + "id": "c12efa7e-f55e-4c46-8a08-12e20d17e80b", + "last_modified": 1773988590218 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "hugo1.arnal@epitech.eu:1.0", + "pastetome@pastetome.com:1.0.0", + "{5b167a48-6e38-4bfd-91a1-f5cb7eb2fdb2}:1.0", + "{188b1ba7-0369-429b-9f85-2ad19cb0d90d}:1.0", + "codes-autofill@m-sistemos.lt:1.1.1", + "{47e4af17-f0e7-41d3-ad5e-0169e256f816}:1.0" + ] + }, + "schema": 1773945380820, + "key_format": "{guid}:{version}", + "stash_time": 1773966906333, + "id": "e9c3b5c7-8709-4163-867d-e2e40903dc40", + "last_modified": 1773966990580 + }, + { + "stash": { + "blocked": [ + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:1.0.0", + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:3.0.0", + "{b13f7217-afb2-47d6-b3a7-7331736d8f5c}:12.0", + "{c67039ad-db7c-4468-90b8-c3077747e372}:1.0.0", + "{bd5ab3c6-62d1-4ff6-bdcf-816889a47374}:1.0.0", + "{f5263a94-4c8c-4b3c-a839-90ec9e22f4ab}:3.6.4", + "{f5263a94-4c8c-4b3c-a839-90ec9e22f4ab}:3.6.5", + "{f4f26a3a-914d-49d7-8553-7df571cd7315}:1.1", + "{f4f26a3a-914d-49d7-8553-7df571cd7315}:19.0", + "{19c7b840-4795-4047-965c-dff82609fdf4}:1.1", + "{19c7b840-4795-4047-965c-dff82609fdf4}:17.0", + "{86f2bcda-849b-48d6-ae73-274eca9fbf97}:1.0", + "{86f2bcda-849b-48d6-ae73-274eca9fbf97}:12.0", + "{aeebcb90-908a-42f5-a824-cd5bc7c48011}:1.2", + "{aeebcb90-908a-42f5-a824-cd5bc7c48011}:3.0.0", + "{e038cd8d-3f43-4244-96d0-7b075a6f3bf0}:1.0.0", + "{e038cd8d-3f43-4244-96d0-7b075a6f3bf0}:102.0", + "wolfsysneosys55@outlook.com:1.7" + ], + "unblocked": [], + "softblocked": [ + "cipheria@sundaramrai02.gmail.com:1.0.0", + "max@loader.invalid:4.0", + "extension@stealthsurf.app:1.0.8", + "albert-correcteur@ac-bordeaux.fr:0.2.6", + "{bec8b007-60b8-473a-8cc5-aa26286ea32e}:0.1.0", + "{f37ecd5c-9fad-4601-9b85-adf50ba01782}:1.2", + "{f37ecd5c-9fad-4601-9b85-adf50ba01782}:1.3", + "lms-smart-lesson-planner@addon:1.2", + "lms-smart-lesson-planner@addon:1.3", + "lms-smart-lesson-planner@addon:1.4", + "lms-smart-lesson-planner@addon:1.5", + "lms-smart-lesson-planner@addon:1.7", + "lms-smart-lesson-planner@addon:1.8", + "lms-smart-lesson-planner@addon:1.9", + "lms-smart-lesson-planner@addon:2.0", + "pim-activator@extension:2.0.0", + "CAEJobLog@tenneco.com:5.0.1", + "anthracite@psyopgirl.dev:0.1.0", + "smart-auto-refresh@cbelleza.local:1.1.0", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.3", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.0", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.0.4", + "{32e06eb9-ef89-4b9f-84e0-8413f42d070e}:1.1.5", + "fin-downloader@local:1.0.0", + "rpvs-export@extension:1.1.0", + "max@loader.invalid:4.1", + "redditZen@personal:1.3", + "redditZen@personal:1.4", + "redditZen@personal:1.3.1", + "vault2fa@example.com:1.1.2" + ] + }, + "schema": 1773923784465, + "key_format": "{guid}:{version}", + "stash_time": 1773945305253, + "id": "85fac927-5d75-4faf-8d00-344d585aa10a", + "last_modified": 1773945380721 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "custom-home@personal.extension:1.3.0", + "custom-home@personal.extension:1.3.1", + "{1e9ff2a8-fcfe-491e-8a3f-2173251deeaf}:1.1", + "{77a25798-fcf3-48e7-b01e-3cc9f313ecad}:1.0", + "sikdarsmultipurposetool@aditya.local:75.2.5", + "tc@ttvrjnsoever.nl:1.1resigned1", + "tc@ttvrjnsoever.nl:1.0" + ] + }, + "schema": 1773902182485, + "key_format": "{guid}:{version}", + "stash_time": 1773923705428, + "id": "0fd1fef9-75bb-45a7-b05e-ea0b3f4eefae", + "last_modified": 1773923784353 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@money-dollar:1.0.1", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.0", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.1", + "{fbb6684e-9172-4a59-b55b-39c9b69ffb74}:1.2", + "kiosk_controller@teacher.com:1.7", + "clean-youtube@example.com:2.0.0", + "shhh@shhh.skin:0.1.0", + "mooniedove123@gmail.com:2.0.0.0" + ] + }, + "schema": 1773880593915, + "key_format": "{guid}:{version}", + "stash_time": 1773902105415, + "id": "a88aa9df-6087-4b80-8cf5-10616da6e170", + "last_modified": 1773902182201 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{0f9a3838-8c5d-4b41-929d-b90d041537e5}:1.0.9", + "{0f9a3838-8c5d-4b41-929d-b90d041537e5}:1.0.10", + "noten-addon@htl-braunau.at:1.4", + "{4c5d1a00-2ece-451f-a93e-f7a7258f64a3}:1.3.0", + "clear-storage-button@local:2.0", + "clear-storage-button@local:2.1", + "{9176e133-9f84-4656-81bf-697e69a0b009}:0.0.14", + "{b79fd8a2-5af9-46e8-ae53-283e157cdce3}:1.0.2", + "{b79fd8a2-5af9-46e8-ae53-283e157cdce3}:1.0.3", + "datavault@extension:1.0.0", + "{9176e133-9f84-4656-81bf-697e69a0b009}:0.0.15", + "set-constant@local:1.0.0", + "set-constant@local:1.0.1", + "set-constant@local:1.0.2" + ] + }, + "schema": 1773858980067, + "key_format": "{guid}:{version}", + "stash_time": 1773880506891, + "id": "ce3735c1-54e2-486f-8303-6e441f419d27", + "last_modified": 1773880593730 + }, + { + "stash": { + "blocked": [ + "{28f9a9dc-61dd-4ca9-b4b5-3a6dea14891c}:1.0", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:1.524", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:1.549", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.28", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.38", + "{6e829acd-af7a-4af1-8516-eeb4a2f1961d}:2.1.46" + ], + "unblocked": [ + "firefoxstore@textselect.click:1.0.0", + "firefoxstore@textselect.click:1.7.0" + ], + "softblocked": [ + "native-dark-mode@hardened-browsers:1.0.9", + "native-dark-mode@hardened-browsers:1.0.8", + "native-dark-mode@hardened-browsers:1.0.0", + "native-dark-mode@hardened-browsers:1.0.1", + "native-dark-mode@hardened-browsers:1.1.0", + "native-dark-mode@hardened-browsers:1.1.1", + "native-dark-mode@hardened-browsers:1.0.2", + "native-dark-mode@hardened-browsers:1.0.3", + "native-dark-mode@hardened-browsers:1.0.4", + "native-dark-mode@hardened-browsers:1.0.5", + "native-dark-mode@hardened-browsers:1.0.6", + "native-dark-mode@hardened-browsers:1.0.7", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.1", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.2", + "{aa0ab95c-6b9e-4ae7-95d3-315e69bd9af5}:0.3", + "pdf-scanner-serp@combined.com:2.2.0", + "checklist@personal:1.0", + "xelya-deploy-monitor@xelya.io:1.4.3", + "xelya-deploy-monitor@xelya.io:1.4.4", + "xelya-deploy-monitor@xelya.io:1.4.5", + "moodle-ai-solver@moodle-solver.com:1.1", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.1", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.2", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.3", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:0.0.6", + "{4eaa011e-304b-450a-b6c9-72939c6ef656}:1.1", + "deepspace-newtab-tab@heyna.info:1.3", + "deepspace-newtab-tab@heyna.info:1.7", + "deepspace-newtab-tab@heyna.info:1.8", + "kiosk_controller@teacher.com:1.1", + "kiosk_controller@teacher.com:1.0", + "kiosk_controller@teacher.com:1.2", + "kiosk_controller@teacher.com:1.3", + "kiosk_controller@teacher.com:1.4", + "enhancer@goldenfox.com:21.5.0", + "Android@bravenhancer.com:21.5.0", + "kiosk_controller@teacher.com:1.5", + "kiosk_controller@teacher.com:1.6", + "{765863d4-a393-489a-86ec-01dc6816b3f8}:1.1", + "{30db2827-220b-4e18-8d78-b125dda2661a}:3.1.3", + "native-dark-mode@hardened-browsers:1.2", + "{75385496-91f6-484e-af8b-b7497d90d957}:5.8.2", + "noimgur@yobson.xyz:1.0.0", + "noimgur@yobson.xyz:1.1.0", + "noimgur@yobson.xyz:1.1.1", + "noimgur@yobson.xyz:1.2.0" + ] + }, + "schema": 1773837381642, + "key_format": "{guid}:{version}", + "stash_time": 1773858905242, + "id": "86a8c1ec-d93a-450d-8a25-cdf1ae512bdb", + "last_modified": 1773858979806 + }, + { + "stash": { + "blocked": [ + "@show-hidden-pass:2.0.1", + "{2166b05b-0c9f-44be-8040-0727537e6291}:1.0.0", + "{2166b05b-0c9f-44be-8040-0727537e6291}:2.0.0", + "{354b4f95-86b2-42e4-a6df-91dd8c44d120}:1.0.0", + "{354b4f95-86b2-42e4-a6df-91dd8c44d120}:2.0.0", + "{63ba749d-5451-423f-957d-d575e6ed6b3b}:1.0.0", + "{63ba749d-5451-423f-957d-d575e6ed6b3b}:2.0.0", + "{3e213942-7229-4b63-b7d5-bb7e22ec2528}:1.0.0", + "{3e213942-7229-4b63-b7d5-bb7e22ec2528}:2.0.0", + "{ea923f87-fc99-478d-9be4-fd9d11d79cbc}:1.0.0", + "{ea923f87-fc99-478d-9be4-fd9d11d79cbc}:2.0.0", + "help@enableright.click:1.0.0", + "help@enableright.click:2.1.0", + "help@enableright.click:2.1.1", + "help@enableright.click:2.2.0", + "infoaddon@allowright.click:1.0.0", + "infoaddon@allowright.click:2.1.0", + "infoaddon@allowright.click:2.2.0", + "addon@allowcopy.pro:1.0.1", + "addon@allowcopy.pro:2.1.0", + "addon@allowcopy.pro:2.2.0", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.1", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.2", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.5", + "{597f0247-0ce0-41e7-8e1d-373ef25871d2}:2.1.6", + "page-word-counter-5c4a9460ef994b79@addons.example:1.0.1", + "focus-timer@example.com:1.0", + "tab-notes@example.com:1.0.1", + "auto-reload-tabs-1fc49d7899cb@local.example:1.0.0", + "close-duplicate-tabs-838a0899dc7f@local.example:1.0.0", + "copy-clean-url-57cc5676060b@local.example:1.0.0", + "auto-refresh-clean-2026@example.com:1.0.0", + "focus-mode-clean-2026@example.com:1.0.0", + "quick-notes-local-2026-02-24@example.com:1.0.0", + "quick-notes-2a7816ca@example.com:1.0.0", + "reader-mode-toggle@example.com:1.0.0", + "tab-session-saver@example.com:1.0.0", + "clean-url-copier@example.com:1.0.0", + "url-cleaner-copy@example.com:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "{ffe9c1e2-bfa9-48dd-a27a-a2ce273f1d2f}:1.0.0", + "sci-barcode-lookup@consulado:1.2.0", + "ariang-ng-extension@github.com:1.0.0", + "af3af4310d2eb1a6a6ff3727cd05266ada357a6b@EasyTemplateVista:1.2", + "phoenix-box@0xr3db0mb.com:1.3.0", + "cookies-inspector-pro@replaction:1.1.3", + "{42fd09c8-ec81-4daf-aefb-c142a475accd}:0.15", + "{42fd09c8-ec81-4daf-aefb-c142a475accd}:0.16", + "open-in-regular-mode@sealabs:1.0.4", + "{1e7c9e06-8c7a-44ca-aaac-cae7520fe112}:1.0.2", + "miguelsaizpardo565@gmail.com:2.0", + "{9c81a572-7b31-4439-bf97-c31715b422b3}:25.9.296", + "notebooklm-cookie-sync@example.com:0.2.0", + "{c577efc7-5a65-47a8-9370-30ec73e9f5e3}:0.0.0", + "{cf2f8c55-13be-42c6-a0ca-e5fdcd3b4856}:1.0", + "{40111824-b072-4329-960e-d108a42cc2ac}:1.0" + ] + }, + "schema": 1773815783513, + "key_format": "{guid}:{version}", + "stash_time": 1773837305866, + "id": "8809ca2d-7a67-4c69-b2ff-319440ea0794", + "last_modified": 1773837381388 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{ec215b09-5901-48a8-b45e-b06ea540eaa3}:1.0", + "favory@sp4ce.pw:3.3.7", + "tabvolume@example.com:1.0", + "pomodoro-focus@milmanart.win:1.0.1", + "{95ccf8ff-7b52-49b6-9319-cbca4bcc7677}:1.0.5", + "{95ccf8ff-7b52-49b6-9319-cbca4bcc7677}:1.0.6", + "{58823624-33aa-4f2f-ad15-4de95e90c0af}:1.8.0" + ] + }, + "schema": 1773794184243, + "key_format": "{guid}:{version}", + "stash_time": 1773815705971, + "id": "4cd06056-0221-4ab0-8347-d344862bb94a", + "last_modified": 1773815783333 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{b63c3b86-2d61-42a4-b81c-9b2567009b57}:1.0", + "autclisri@example.com:1.2.1", + "{c9c4ca5d-7a57-4bab-803f-63f0e9d58f56}:1.0", + "autclisri@example.com:1.2.2", + "distraction-block@lyndipc.github.io:1.2.0", + "greennav@orunza.com:0.6.4", + "favory@sp4ce.pw:3.3.6", + "sikdarsmultipurposetool@aditya.local:75.1.4", + "speeddial@red.com:1.0", + "extension@retenly.ai:2.0.1", + "{e207c997-46a2-4a7e-96b3-06f87a631b7d}:1.0.0" + ] + }, + "schema": 1773772579594, + "key_format": "{guid}:{version}", + "stash_time": 1773794105560, + "id": "0519af01-0f5e-4d7e-93d6-c5adc16832cd", + "last_modified": 1773794184074 + }, + { + "stash": { + "blocked": [ + "{b78fc2d6-87bb-4290-b05a-51a627592c26}:0.1.0", + "600volume@sasha-dev:2.0.4", + "volume-control@merna.net:2.0.4" + ], + "unblocked": [], + "softblocked": [ + "site-specific-languages@hmpf.org:1.0.0", + "site-specific-languages@hmpf.org:1.1.0", + "site-specific-languages@hmpf.org:1.2.0", + "xelya-deploy-monitor@xelya.io:1.3.5", + "xelya-deploy-monitor@xelya.io:1.3.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.7", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.10", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.12", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.13", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.14", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.15", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.16", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.17", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.18", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.19", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.20", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.23", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.24", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.25", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.26", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.0.27", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.1.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.2.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.3.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.3.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.4.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.4.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.5.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.6.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.6.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.7.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.7.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.8.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.7", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.8", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.10", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:0.9.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:1.1.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.0.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.1.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.6", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.8", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.9", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.2.11", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.3.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.4.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.5.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.0", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.1", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.2", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.3", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.4", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.5", + "{aee9e933-52b6-410a-8c3f-99c6be596b4e}:2.6.7", + "{ae0ffb8d-c020-4ad5-9e19-20583266eb8d}:1.0", + "{042f49ed-42ca-4338-b490-463e0700ec04}:4", + "xelya-deploy-monitor@xelya.io:1.3.7", + "xelya-deploy-monitor@xelya.io:1.4.0", + "xelya-deploy-monitor@xelya.io:1.4.1", + "enhancer@goldenfox.com:21.2.0", + "magnolia@12.34:4.3.2.3", + "kontenmanager@gmx.de:2026.0.3.7", + "xelya-deploy-monitor@xelya.io:1.4.2", + "aria2-integration@extension:1.0.0", + "Android@bravenhancer.com:21.2.5", + "Android@bravenhancer.com:21.3.0", + "Android@bravenhancer.com:21.3.1", + "enhancer@goldenfox.com:21.2.5", + "enhancer@goldenfox.com:21.3.0", + "@pingu777:1.0", + "checkmydns@codeforgex.studio:1.0.1", + "favory@sp4ce.pw:3.3.5", + "Android@bravenhancer.com:21.4.4", + "Android@bravenhancer.com:21.3.2", + "enhancer@goldenfox.com:21.4.4", + "enhancer@goldenfox.com:21.3.2", + "albert-correcteur@ac-bordeaux.fr:0.1.0", + "albert-correcteur@ac-bordeaux.fr:0.1.1", + "Android@bravenhancer.com:21.3.4", + "enhancer@goldenfox.com:21.3.4", + "arek.moga@gmail.com:7.1.1", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.0.0", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.1.0", + "{0a4f90d2-d13b-4e67-acee-5adc3e65a25d}:1.1.1" + ] + }, + "schema": 1773750982439, + "key_format": "{guid}:{version}", + "stash_time": 1773772505407, + "id": "95deb752-4757-4304-9305-b02450ae71ab", + "last_modified": 1773772579500 + }, + { + "stash": { + "blocked": [ + "{e894f986-e3c9-4357-bbf6-32b65f5c7172}:1.0", + "{e894f986-e3c9-4357-bbf6-32b65f5c7172}:1.0.4", + "{357a6c4d-669d-4b54-b66c-edd9cda42df2}:1.0", + "{357a6c4d-669d-4b54-b66c-edd9cda42df2}:1.0.4", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.2", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.3", + "{214ce87e-d532-4651-925e-3166209c64c6}:1.0.4", + "{c10e3b3d-8812-47e5-86dd-1ce1dbc1e2f8}:1.0", + "{46036f0f-911e-4df2-9d8d-bab3e8e1a31f}:1.0", + "{44eb78ee-fe54-451a-bcc1-7f9a85ce26ea}:1.0" + ], + "unblocked": [], + "softblocked": [ + "xelya-deploy-monitor@xelya.io:1.2.1", + "{8f0ba4bf-5249-46ec-8dc8-4eb9e11ed2c1}:0.3.1", + "xelya-deploy-monitor@xelya.io:1.3.0", + "locacloak@bingfoon:1.2.0", + "xelya-deploy-monitor@xelya.io:1.3.2", + "parth-translator-notepad@parthrathod.tk:1.0.0", + "{899a008c-fcc4-4455-8ebb-51dbc46d72b0}:1.0", + "{66beaf8c-a91a-4507-802e-8def57ac4694}:1.0", + "copydocument@mozilla.mozilla:4", + "xelya-deploy-monitor@xelya.io:1.3.3", + "xelya-deploy-monitor@xelya.io:1.3.4", + "syncie@halifox.com:0.0.1", + "ooki@halifox.com:0.0.1", + "tab-advance@example.com:2.1", + "{9595ea39-0348-4cb6-8e5a-4b958f3eefa0}:2.0", + "radoslaw.worek@phumargo.pl:1.1", + "locacloak@bingfoon:1.0.0", + "{a6669b0f-2404-4b88-b1e1-53b12f92c40f}:6.4", + "smartdarkmodepro@local:2.3", + "@rf-extension-001:4.1" + ] + }, + "schema": 1773729378992, + "key_format": "{guid}:{version}", + "stash_time": 1773750905613, + "id": "e99653cc-dfb5-4736-b4f5-6b4481f3f103", + "last_modified": 1773750982308 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:21.2.0", + "sokmil-speed-buttons@local:0.1.0", + "sokmil-speed-controller@example.com:1.0", + "snow-autofill@extension:3.1.0", + "{e3903e12-da58-b0a2-d4cc-017750127e12}:1.1", + "cool-page-nova@cleankits.co:7.15.6", + "lite-dash-data@neattools.com:7.17.20", + "lite-dash-data@neattools.com:7.18.10", + "scholar-port@your-domain.com:0.4.8", + "core-tool-clean@proaddons.com:5.20.3", + "favory@sp4ce.pw:3.3.2", + "favory@sp4ce.pw:3.3.3", + "favory@sp4ce.pw:3.3.4", + "snow-autofill@extension:3.6.0", + "{12b889ed-9611-4166-bdab-073f08348c89}:1.0", + "bright-track-tip@netplugs.com:8.22.13", + "bright-track-tip@netplugs.com:8.30.10", + "bright-track-tip@netplugs.com:8.30.20", + "bright-track-tip@netplugs.com:8.30.30" + ] + }, + "schema": 1773707783809, + "key_format": "{guid}:{version}", + "stash_time": 1773729305164, + "id": "6294cac6-9732-4e8e-8d87-9a11e0985738", + "last_modified": 1773729378705 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "support@networkthinking.com:1.1.0", + "midscroll@extension:1.3", + "midscroll@extension:1.2", + "xelya-deploy-monitor@xelya.io:1.2.0", + "@elvenar-helper-extension:6.0.11", + "@elvenar-helper-extension:6.0.6", + "yt-g@example.com:0.1.1", + "favory@sp4ce.pw:3.2.8", + "favory@sp4ce.pw:3.3.1", + "bleau-info-extender@local:0.1", + "gabrielmrc310@gmail.com:3.6.12" + ] + }, + "schema": 1773686181749, + "key_format": "{guid}:{version}", + "stash_time": 1773707705771, + "id": "ef7375ed-8043-4629-a202-7098647674ff", + "last_modified": 1773707783605 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.0.0", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.0.1", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.1", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.2", + "{cdaf3803-bb0b-41e2-b369-a504caff36da}:1.3.3", + "nicolas@yopmail.com:3.7.0", + "vine-order-helper@htmb.com:1.0.21", + "vine-order-helper@htmb.com:1.0.20", + "vine-order-helper@htmb.com:1.0.18", + "vine-order-helper@htmb.com:1.0.15", + "vine-order-helper@htmb.com:1.0.16", + "vine-order-helper@htmb.com:1.0.13", + "vine-order-helper@htmb.com:1.0.10", + "vine-order-helper@htmb.com:1.0.14", + "t@bccto.cc:1.0.2", + "{A17D40F7-C30F-6C39-F6B2-9E5B28E5A28D}:1.3", + "vine-order-helper@htmb.com:1.0.24", + "vine-order-helper@htmb.com:1.0.22", + "vine-order-helper@htmb.com:1.0.11", + "vine-order-helper@htmb.com:1.0.8", + "vine-order-helper@htmb.com:1.0.19", + "vine-order-helper@htmb.com:1.0.9", + "vine-order-helper@htmb.com:1.0.26", + "vine-order-helper@htmb.com:1.0.25", + "vine-order-helper@htmb.com:1.0.23", + "vine-order-helper@htmb.com:1.0.7", + "custom-newtab@bookmarkonthefly.com:0.2", + "vine-order-helper@htmb.com:1.0.28", + "vine-order-helper@htmb.com:1.0.27", + "vine-order-helper@htmb.com:1.0.29", + "{3f454b58-f6a4-4360-983d-66669da46059}:1.0", + "{a84387c8-bffa-4d27-aace-b57ad5d6a661}:1.0", + "aria2-dm@extension:1.0", + "vine-order-helper@htmb.com:1.0.32", + "vine-order-helper@htmb.com:1.0.31", + "aria2-integ@extension:1.0.0", + "{67490b6c-8b1f-4225-8f9e-de8936b95856}:1.0", + "cim-narrative@collegeofthedesert.edu:1.0.3", + "{913712da-ddb0-4a32-9e7b-dba522206c41}:1.0", + "{fc6295d1-740a-4f4c-9969-c87d27bec5eb}:1.0", + "{fc6295d1-740a-4f4c-9969-c87d27bec5eb}:1.0.4", + "{53802b9c-b3d2-4d2d-83ae-b66cd66c7a24}:1.0", + "{53802b9c-b3d2-4d2d-83ae-b66cd66c7a24}:1.0.4", + "{d34a50f2-2d4e-4683-a5e1-ac0ab1dedacc}:1.0", + "xelya-deploy-monitor@xelya.io:1.1.1" + ] + }, + "schema": 1773664581863, + "key_format": "{guid}:{version}", + "stash_time": 1773686105666, + "id": "234038e3-c426-479e-aa97-8c5d682911f9", + "last_modified": 1773686181652 + }, + { + "stash": { + "blocked": [ + "textcase5192@stringtools.dev:1.0.0", + "tab-manager-pro@example.com:1.0.0", + "tab-manager-pro@example.com:2.0.0", + "tab-manager-pro@example.com:3.0.0", + "tab-manager-pro@example.com:4.0.0", + "{1117a175-1e62-4c29-a8c5-1e12e3b18eb3}:2.0.1", + "{1117a175-1e62-4c29-a8c5-1e12e3b18eb3}:101.1", + "{47cb0db6-c91f-44f1-8d90-733801e86a4b}:1.1", + "{47cb0db6-c91f-44f1-8d90-733801e86a4b}:1091.1", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:1.2", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:1.5.3", + "{13b8253c-2304-4570-898b-4f71f2efb84c}:15.5.3", + "{e9bc8663-4aa8-4a00-906f-b2760ea43632}:1.0", + "{01a3b23d-6711-472e-9818-7578af750e4c}:1.0", + "{01a3b23d-6711-472e-9818-7578af750e4c}:1.2", + "{76babbe3-bed0-451d-b68d-83bbba9fd19d}:1.1", + "{76babbe3-bed0-451d-b68d-83bbba9fd19d}:101.1", + "{a0446b25-7f2f-445d-a6cc-4aa92161273c}:1.0", + "{a0446b25-7f2f-445d-a6cc-4aa92161273c}:102.0", + "{401b40d6-53a7-4840-8ece-fc6ccbb3d91c}:1.0", + "{401b40d6-53a7-4840-8ece-fc6ccbb3d91c}:105.0", + "linkcounter7320@pagetools.com:1.0.0", + "duptabs8374@tabmanager.org:1.0.0" + ], + "unblocked": [], + "softblocked": [ + "firefoxstore@textselect.click:1.0.0", + "firefoxstore@textselect.click:1.7.0", + "{c0f476ec-4757-47ed-977c-1e26bfad728d}:1.0", + "{c0f476ec-4757-47ed-977c-1e26bfad728d}:2.0", + "{ed6feef9-339c-48b8-8068-5e561d68e6f2}:1.0", + "{ed6feef9-339c-48b8-8068-5e561d68e6f2}:2.0", + "{b4c959cc-8bc2-4fd3-b454-3bf0f08be26d}:1.0", + "{b4c959cc-8bc2-4fd3-b454-3bf0f08be26d}:2.0", + "{33521b4a-6715-409b-ad02-a78c3cbb1a5b}:1.0", + "{33521b4a-6715-409b-ad02-a78c3cbb1a5b}:2.0", + "{5b8df169-23ce-46b0-81fc-7f166d1b8b2f}:1.1", + "mediacontroller-ff@yourdomain.com:2.0", + "ries-extension@ries.ai:3.1", + "{4dca1720-eceb-4d80-9a79-738fb0d9c10b}:1.0", + "n.hauska@bas-verkehr.de:0.1", + "tsyhanok-nuker-global@ahrefs.local:4.3", + "extension@tab-nine.xsfs.xyz:1.0.1", + "extension@tab-nine.xsfs.xyz:1.0.1.1", + "extension@tab-nine.xsfs.xyz:1.0.2", + "extension@tab-nine.xsfs.xyz:1.0.3", + "extension@tab-nine.xsfs.xyz:1.0.4", + "extension@tab-nine.xsfs.xyz:1.1.0", + "extension@tab-nine.xsfs.xyz:1.1.1", + "extension@tab-nine.xsfs.xyz:1.2.0", + "extension@tab-nine.xsfs.xyz:1.3.0", + "extension@tab-nine.xsfs.xyz:1.3.1", + "yt-whisper@localhost:1.2.0", + "yt-whisper@localhost:1.0.0", + "youtube-ad-placer@extension.local:1.0.5", + "youtube-ad-placer@extension.local:1.1.0", + "texto-padrao-service-desk@dataplace:1.0" + ] + }, + "schema": 1773642981009, + "key_format": "{guid}:{version}", + "stash_time": 1773664505389, + "id": "780fde37-1fd8-49de-9a94-2dbf09053312", + "last_modified": 1773664581768 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ "{1d7d94c1-bda7-4851-9f9f-8802d2145255}:1.0", "0196aafab5f143ffa24eee1274cef097@gmail.com:1.0", "{4bcff424-8601-494b-a1dc-527f835e049f}:4.0", @@ -2384,5 +7531,5 @@ "last_modified": 1772584766600 } ], - "timestamp": 1773642980627 + "timestamp": 1776062193033 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json thunderbird-140.10.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json --- thunderbird-140.9.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json 2026-04-21 14:53:01.000000000 +0000 @@ -2,309 +2,336 @@ "data": [ { "name": "WebView Android", - "schema": 1773446704289, + "schema": 1775865904693, "status": "planned", - "version": "149", + "version": "150", "browserid": "webview_android", - "id": "ed3ff7b7-dfb0-4141-a35d-85d16c22ed86", - "last_modified": 1773641281301 + "id": "1f7a5c82-8b4a-4eaf-97b6-19f24fe55272", + "last_modified": 1776062852042 }, { - "name": "Opera Android", - "schema": 1773446703952, - "status": "current", - "version": "96", - "browserid": "opera_android", - "id": "dc01df05-453f-4d2f-b7d2-337a2670e91a", - "last_modified": 1773641281298 + "name": "Opera", + "schema": 1775865904345, + "status": "nightly", + "version": "132", + "browserid": "opera", + "id": "46931762-b7ab-4c08-b5e6-8c898504cfa9", + "last_modified": 1776062852039 }, { - "name": "Quest Browser", - "schema": 1773446703816, + "name": "Opera", + "schema": 1775865904282, + "status": "beta", + "version": "131", + "browserid": "opera", + "id": "77898b2a-df6e-4e54-85a8-0301df45c2f0", + "last_modified": 1776062852036 + }, + { + "name": "Opera", + "schema": 1775865904214, "status": "current", - "version": "42.0", - "browserid": "oculus", - "id": "77a75ca3-9282-4e9d-8789-bb7d771ea350", - "last_modified": 1773641281295 + "version": "130", + "browserid": "opera", + "id": "d480fdbc-d8c7-4128-8864-307b15979f29", + "last_modified": 1776062852033 }, { "name": "Chrome Android", - "schema": 1773446703753, + "schema": 1775865903888, + "status": "planned", + "version": "150", + "browserid": "chrome_android", + "id": "525b02bb-1782-4be7-af3d-a871bd0dc689", + "last_modified": 1776062852030 + }, + { + "name": "Chrome", + "schema": 1775865903486, "status": "planned", + "version": "150", + "browserid": "chrome", + "id": "36357b2a-c063-4a43-a807-349cf909608b", + "last_modified": 1776062852027 + }, + { + "name": "WebView Android", + "schema": 1775865904624, + "status": "nightly", + "version": "149", + "browserid": "webview_android", + "id": "ed3ff7b7-dfb0-4141-a35d-85d16c22ed86", + "last_modified": 1776062852023 + }, + { + "name": "Chrome Android", + "schema": 1775865903806, + "status": "nightly", "version": "149", "browserid": "chrome_android", "id": "c583ee97-ecf9-4bd8-9f22-93d626c24fa0", - "last_modified": 1773641281293 + "last_modified": 1776062852021 }, { "name": "Chrome", - "schema": 1773446703422, - "status": "planned", + "schema": 1775865903408, + "status": "nightly", "version": "149", "browserid": "chrome", "id": "dff5f94c-b1be-416a-91e6-f0fa2dbffb45", - "last_modified": 1773641281290 + "last_modified": 1776062852019 }, { "name": "WebView Android", - "schema": 1773446704224, - "status": "nightly", + "schema": 1775865904555, + "status": "beta", "version": "148", "browserid": "webview_android", "id": "cbf9e9ca-4167-4f09-981c-186bfba8ed1e", - "last_modified": 1773641281285 + "last_modified": 1776062852016 }, { "name": "Chrome Android", - "schema": 1773446703690, - "status": "nightly", + "schema": 1775865903725, + "status": "beta", "version": "148", "browserid": "chrome_android", "id": "1dc1d001-8ed2-43a5-b41d-589130d0ac7d", - "last_modified": 1773641281283 + "last_modified": 1776062852014 }, { "name": "Chrome", - "schema": 1773446703354, - "status": "nightly", + "schema": 1775865903331, + "status": "beta", "version": "148", "browserid": "chrome", "id": "a57c427c-57e9-4856-9dae-f515117478d7", - "last_modified": 1773641281281 + "last_modified": 1776062852011 }, { "name": "Chrome", - "schema": 1773446703279, - "status": "beta", + "schema": 1775865903258, + "status": "current", "version": "147", "browserid": "chrome", "id": "cddd3506-4f9c-42cf-b551-ca28c2533e9a", - "last_modified": 1773641281277 + "last_modified": 1776062852009 }, { "name": "Chrome Android", - "schema": 1773446703623, - "status": "beta", + "schema": 1775865903646, + "status": "current", "version": "147", "browserid": "chrome_android", "id": "aa7ba8b7-3135-4450-ab5f-5f8d956f1f13", - "last_modified": 1773641281275 + "last_modified": 1776062852006 }, { "name": "WebView Android", - "schema": 1773446704085, + "schema": 1775865904485, "status": "current", - "version": "146", + "version": "147", "browserid": "webview_android", - "id": "620f087d-d5c6-4b67-80f4-02358d8298e7", - "last_modified": 1773641281273 + "id": "18d9eac7-8ed6-40c8-a888-315758fbd983", + "last_modified": 1776062852002 }, { - "name": "WebView Android", - "schema": 1773446704150, + "name": "Safari on iOS", + "schema": 1775261103550, "status": "beta", - "version": "147", - "browserid": "webview_android", - "id": "18d9eac7-8ed6-40c8-a888-315758fbd983", - "last_modified": 1773641281264 + "version": "26.5", + "browserid": "safari_ios", + "id": "37c52f59-c4bb-4707-bb06-d1cac9172203", + "last_modified": 1775555173744 }, { - "name": "Chrome Android", - "schema": 1773446703559, - "status": "current", - "version": "146", - "browserid": "chrome_android", - "id": "1b035778-10c7-4ea3-aeb4-3606fd3483e1", - "last_modified": 1773641281262 + "name": "Safari", + "schema": 1774915210779, + "status": "beta", + "version": "26.5", + "browserid": "safari", + "id": "310ab08d-64fb-4d47-a298-e35f262acf72", + "last_modified": 1775555173741 }, { - "name": "Chrome", - "schema": 1773446703216, - "status": "current", - "version": "146", - "browserid": "chrome", - "id": "b9100141-3b96-44f6-89b5-2dd19d6dfba6", - "last_modified": 1773641281259 + "name": "WebView on iOS", + "schema": 1775261103619, + "status": "beta", + "version": "26.5", + "browserid": "webview_ios", + "id": "c4306576-8892-4f28-adb6-39f0325e9be9", + "last_modified": 1775555173738 }, { "name": "Firefox", - "schema": 1772237104541, + "schema": 1774656303688, "status": "planned", - "version": "151", + "version": "152", "browserid": "firefox", - "id": "ca23dbaa-20c7-4027-9de8-63ec380b2f6e", - "last_modified": 1772548633069 + "id": "28f0d2ac-ebeb-4324-a581-bdc945184379", + "last_modified": 1775555173736 }, { - "name": "Bun", - "schema": 1772094719613, - "status": "current", - "version": "1.3.10", - "browserid": "bun", - "id": "8c8475b8-52f3-488b-857b-8b39325285d9", - "last_modified": 1772548633066 + "name": "Firefox for Android", + "schema": 1774656304005, + "status": "planned", + "version": "152", + "browserid": "firefox_android", + "id": "d4acf283-6f99-4aff-a937-827c0f6ba719", + "last_modified": 1775555173733 + }, + { + "name": "Firefox", + "schema": 1774656303627, + "status": "nightly", + "version": "151", + "browserid": "firefox", + "id": "ca23dbaa-20c7-4027-9de8-63ec380b2f6e", + "last_modified": 1775555173729 }, { "name": "Firefox for Android", - "schema": 1772237104669, - "status": "planned", + "schema": 1774656303946, + "status": "nightly", "version": "151", "browserid": "firefox_android", "id": "cded3e3a-4e7e-4627-80fb-fae915ebc9a0", - "last_modified": 1772548633064 + "last_modified": 1775555173727 }, { - "name": "Deno", - "schema": 1772064304810, + "name": "WebView on iOS", + "schema": 1774656304413, "status": "current", - "version": "2.7", - "browserid": "deno", - "id": "34c49207-86e7-4cda-af22-c005f1dc2847", - "last_modified": 1772094719547 + "version": "26.4", + "browserid": "webview_ios", + "id": "d3803d9b-d96b-4c3b-9ed9-1ef5d4639858", + "last_modified": 1775555173720 + }, + { + "name": "Safari", + "schema": 1774656304135, + "status": "current", + "version": "26.4", + "browserid": "safari", + "id": "79285f6d-a28c-459d-8265-7044f2066d5b", + "last_modified": 1775555173717 + }, + { + "name": "Safari on iOS", + "schema": 1774656304272, + "status": "current", + "version": "26.4", + "browserid": "safari_ios", + "id": "0b19a21d-8494-4a35-8875-bf1905f5893a", + "last_modified": 1775555173715 }, { "name": "Firefox for Android", - "schema": 1772064305400, - "status": "nightly", + "schema": 1774656303880, + "status": "beta", "version": "150", "browserid": "firefox_android", "id": "dc9812c3-bdb8-4dcc-880f-67b25f794628", - "last_modified": 1772094719545 + "last_modified": 1775555173712 }, { "name": "Firefox", - "schema": 1772064305105, - "status": "nightly", + "schema": 1774656303557, + "status": "beta", "version": "150", "browserid": "firefox", "id": "4f1039d1-5e0c-44de-9180-1f46dae6028c", - "last_modified": 1772094719543 + "last_modified": 1775555173710 }, { "name": "Firefox for Android", - "schema": 1772064305325, - "status": "beta", + "schema": 1774656303821, + "status": "current", "version": "149", "browserid": "firefox_android", "id": "78dc5472-36f7-465d-92c2-3d2ff5d7c323", - "last_modified": 1772094719541 + "last_modified": 1775555173708 }, { "name": "Firefox", - "schema": 1772064305036, - "status": "beta", + "schema": 1774656303492, + "status": "current", "version": "149", "browserid": "firefox", "id": "2154c26d-3d7d-4ddc-a6ec-de10aeaba65f", - "last_modified": 1772094719534 + "last_modified": 1775555173705 }, { - "name": "Firefox", - "schema": 1772064304967, - "status": "current", - "version": "148", - "browserid": "firefox", - "id": "4ebdb515-56c0-4aae-bf80-631df396b3c5", - "last_modified": 1772094719532 + "name": "Edge", + "schema": 1774051505179, + "status": "planned", + "version": "149", + "browserid": "edge", + "id": "ecc3ce4e-9c4f-49c9-aabd-ddb600ade94b", + "last_modified": 1774245712490 }, { - "name": "Firefox for Android", - "schema": 1772064305258, + "name": "Bun", + "schema": 1774051504876, "status": "current", - "version": "148", - "browserid": "firefox_android", - "id": "5e1afc2d-b301-49b8-9052-0d0ceed8d7a3", - "last_modified": 1772094719530 - }, - { - "name": "WebView on iOS", - "schema": 1771718703666, - "status": "beta", - "version": "26.4", - "browserid": "webview_ios", - "id": "d3803d9b-d96b-4c3b-9ed9-1ef5d4639858", - "last_modified": 1771946254834 - }, - { - "name": "Safari", - "schema": 1771718703538, - "status": "beta", - "version": "26.4", - "browserid": "safari", - "id": "79285f6d-a28c-459d-8265-7044f2066d5b", - "last_modified": 1771946254829 + "version": "1.3.11", + "browserid": "bun", + "id": "3de3e137-fe20-463e-8732-f39b6e0c1be1", + "last_modified": 1774245712488 }, { "name": "Edge", - "schema": 1771718703469, - "status": "planned", + "schema": 1774051505120, + "status": "nightly", "version": "148", "browserid": "edge", "id": "25d5ebbc-8734-46b8-881c-949b2912533e", - "last_modified": 1771946254825 - }, - { - "name": "Safari on iOS", - "schema": 1771718703606, - "status": "beta", - "version": "26.4", - "browserid": "safari_ios", - "id": "0b19a21d-8494-4a35-8875-bf1905f5893a", - "last_modified": 1771946254821 + "last_modified": 1774245712484 }, { "name": "Edge", - "schema": 1771718703401, - "status": "nightly", + "schema": 1774051505056, + "status": "beta", "version": "147", "browserid": "edge", "id": "08fe74cc-038a-4801-9f25-82fbd6468297", - "last_modified": 1771946254814 + "last_modified": 1774245712482 }, { "name": "Edge", - "schema": 1771718703328, - "status": "beta", + "schema": 1774051504999, + "status": "current", "version": "146", "browserid": "edge", "id": "71070e67-3067-4271-acef-cf0bd7a4f555", - "last_modified": 1771946254810 - }, - { - "name": "Edge", - "schema": 1771718703259, - "status": "current", - "version": "145", - "browserid": "edge", - "id": "40684037-f3dc-4106-b1f7-91bd4fa18a32", - "last_modified": 1771946254801 + "last_modified": 1774245712480 }, { - "name": "Safari", - "schema": 1771027506130, + "name": "Opera Android", + "schema": 1773446703952, "status": "current", - "version": "26.3", - "browserid": "safari", - "id": "f7f0e108-c839-4036-94f6-1d77b172c85a", - "last_modified": 1771325515122 + "version": "96", + "browserid": "opera_android", + "id": "dc01df05-453f-4d2f-b7d2-337a2670e91a", + "last_modified": 1773641281298 }, { - "name": "WebView on iOS", - "schema": 1771027506722, + "name": "Quest Browser", + "schema": 1773446703816, "status": "current", - "version": "26.3", - "browserid": "webview_ios", - "id": "8ac8569d-f6dc-41e4-b448-7c54f6923a36", - "last_modified": 1771325515117 + "version": "42.0", + "browserid": "oculus", + "id": "77a75ca3-9282-4e9d-8789-bb7d771ea350", + "last_modified": 1773641281295 }, { - "name": "Safari on iOS", - "schema": 1771027506270, + "name": "Deno", + "schema": 1772064304810, "status": "current", - "version": "26.3", - "browserid": "safari_ios", - "id": "916681bd-04e0-4dbe-9c02-965181db1356", - "last_modified": 1771325515111 + "version": "2.7", + "browserid": "deno", + "id": "34c49207-86e7-4cda-af22-c005f1dc2847", + "last_modified": 1772094719547 }, { "name": "Samsung Internet", @@ -325,33 +352,6 @@ "last_modified": 1764597259381 }, { - "name": "Opera", - "schema": 1761955503268, - "status": "nightly", - "version": "125", - "browserid": "opera", - "id": "5bdc65b2-ee44-4f2a-b776-54b9ffe1147f", - "last_modified": 1762424892963 - }, - { - "name": "Opera", - "schema": 1761955503193, - "status": "beta", - "version": "124", - "browserid": "opera", - "id": "b74063d3-65d7-45b2-afc1-d30123fc2999", - "last_modified": 1762424892950 - }, - { - "name": "Opera", - "schema": 1761955503117, - "status": "current", - "version": "123", - "browserid": "opera", - "id": "847fc43b-579e-4b26-a1fa-cb978ec0438b", - "last_modified": 1762424892945 - }, - { "name": "Firefox for Android", "schema": 1753574703338, "status": "esr", @@ -379,5 +379,5 @@ "last_modified": 1735832995466 } ], - "timestamp": 1773641281301 + "timestamp": 1776062852042 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/main/search-config-icons.json thunderbird-140.10.0esr/services/settings/dumps/main/search-config-icons.json --- thunderbird-140.9.0esr/services/settings/dumps/main/search-config-icons.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/main/search-config-icons.json 2026-04-21 14:52:59.000000000 +0000 @@ -1,6 +1,23 @@ { "data": [ { + "schema": 1773705608175, + "imageSize": 16, + "attachment": { + "hash": "b9aeff79e16d2db1b53574ceacae0149bc3c5b5d6b6dcd3542a1d7034ed64b70", + "size": 1717, + "filename": "startpage-16.svg", + "location": "main-workspace/search-config-icons/a2a88863-029c-4197-8a1c-fee311fc1aae.svg", + "mimetype": "image/svg+xml" + }, + "engineIdentifiers": [ + "startpage" + ], + "filter_expression": "env.appinfo.OS != \"iOS\"", + "id": "acae3d3c-b09e-47f0-a9e5-57980d21fc4a", + "last_modified": 1774879272191 + }, + { "schema": 1771977606099, "imageSize": 96, "attachment": { @@ -1190,5 +1207,5 @@ "last_modified": 1744118264825 } ], - "timestamp": 1772466505212 + "timestamp": 1774879272191 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/main/search-config-v2.json thunderbird-140.10.0esr/services/settings/dumps/main/search-config-v2.json --- thunderbird-140.9.0esr/services/settings/dumps/main/search-config-v2.json 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/main/search-config-v2.json 2026-04-21 14:53:00.000000000 +0000 @@ -2588,9 +2588,9 @@ }, "id": "7ace4aa1-e762-4f4b-87b9-b23b3c3a930b", "identifier": "google", - "last_modified": 1772114960790, + "last_modified": 1774874010729, "recordType": "engine", - "schema": 1772064008248, + "schema": 1774656007453, "variants": [ { "environment": { @@ -2644,9 +2644,7 @@ "environment": { "regions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "telemetrySuffix": "com-nocodes" @@ -2702,7 +2700,8 @@ ], "distributions": [ "dt-002", - "dt-003" + "dt-003", + "xiaomi-001" ] }, "partnerCode": "firefox-b-1-dt", @@ -2783,9 +2782,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-lm", @@ -2849,9 +2846,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-vv", @@ -2881,9 +2876,7 @@ ], "excludedRegions": [ "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-tf", @@ -2914,9 +2907,7 @@ "excludedRegions": [ "us", "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-ar", @@ -2943,14 +2934,13 @@ ], "distributions": [ "dt-002", - "dt-003" + "dt-003", + "xiaomi-001" ], "excludedRegions": [ "us", "ru", - "tr", - "by", - "kz" + "by" ] }, "partnerCode": "firefox-b-dt", @@ -8386,5 +8376,5 @@ "schema": 1707824831520 } ], - "timestamp": 1772114960790 + "timestamp": 1774874010729 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/main/search-telemetry-v2.json thunderbird-140.10.0esr/services/settings/dumps/main/search-telemetry-v2.json --- thunderbird-140.9.0esr/services/settings/dumps/main/search-telemetry-v2.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/main/search-telemetry-v2.json 2026-04-21 14:52:59.000000000 +0000 @@ -1,7 +1,236 @@ { "data": [ { - "schema": 1771804812409, + "schema": 1774280721627, + "subframes": [], + "components": [ + { + "type": "ad_carousel", + "included": { + "parent": { + "selector": ".adsMvCarousel" + }, + "related": { + "selector": ".cr" + }, + "children": [ + { + "selector": ".pa_item", + "countChildren": true + } + ] + } + }, + { + "type": "ad_link", + "excluded": { + "parent": { + "selector": "aside" + } + }, + "included": { + "parent": { + "selector": ".sb_adTA" + }, + "children": [ + { + "type": "ad_sitelink", + "selector": ".b_vlist2col" + } + ] + } + }, + { + "type": "ad_sidebar", + "included": { + "parent": { + "selector": "aside" + }, + "children": [ + { + "selector": ".pa_item, .sb_adTA", + "countChildren": true + } + ] + } + }, + { + "type": "incontent_searchbox", + "topDown": true, + "included": { + "parent": { + "selector": "form#sb_form" + }, + "related": { + "selector": "#sw_as" + }, + "children": [ + { + "selector": "input[name='q']" + } + ] + } + }, + { + "type": "cookie_banner", + "topDown": true, + "included": { + "parent": { + "selector": "div#bnp_cookie_banner" + }, + "children": [ + { + "selector": "button#bnp_btn_accept", + "eventListeners": [ + { + "action": "clicked_accept", + "eventType": "click" + } + ] + }, + { + "selector": "button#bnp_btn_reject", + "eventListeners": [ + { + "action": "clicked_reject", + "eventType": "click" + } + ] + }, + { + "selector": "a#bnp_btn_preference", + "eventListeners": [ + { + "action": "clicked_more_options", + "eventType": "click" + } + ] + } + ] + } + }, + { + "type": "ad_link", + "default": true + } + ], + "shoppingTab": { + "regexp": "^/shop?", + "selector": "#b-scopeListItem-shop a" + }, + "taggedCodes": [ + "MOZ2", + "MOZ4", + "MOZ5", + "MOZA", + "MOZB", + "MOZD", + "MOZE", + "MOZI", + "MOZL", + "MOZM", + "MOZO", + "MOZR", + "MOZT", + "MOZW", + "MOZX", + "MZABT", + "MZCP", + "MZTOF", + "MZSL01", + "MZSL02", + "MZSL03" + ], + "telemetryId": "bing", + "organicCodes": [], + "codeParamName": "pc", + "queryParamName": "q", + "followOnCookies": [ + { + "host": "www.bing.com", + "name": "_SS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "www.bing.com", + "name": "SRCHS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "cn.bing.com", + "name": "_SS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + }, + { + "host": "cn.bing.com", + "name": "SRCHS", + "codeParamName": "PC", + "extraCodePrefixes": [], + "extraCodeParamName": "" + } + ], + "queryParamNames": [ + "q" + ], + "domainExtraction": { + "ads": [ + { + "method": "textContent", + "selectors": "#b_results .b_ad .b_attribution cite, .adsMvCarousel cite, aside cite" + } + ], + "nonAds": [ + { + "method": "textContent", + "selectors": "#b_results .b_algo .b_attribution cite" + } + ] + }, + "searchPageRegexp": "^https://(?:cn|www)\\.bing\\.com/search", + "nonAdsLinkRegexps": [ + "^https://(?:cn|www).bing.com/ck/a" + ], + "searchPageMatches": [ + "https://(?:cn|www).bing.com/search*" + ], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "^/shop?" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "selector": "#b-scopeListItem-shop a", + "component": { + "type": "shopping_tab", + "countImpressions": true + } + } + }, + { + "key": "has_ai_summary", + "element": { + "selector": "#b_wpt_container_ml,.gs_aidisc,#copans_container" + } + } + ], + "extraAdServersRegexps": [ + "^https://(?:cn|www)\\.bing\\.com/acli?c?k" + ], + "id": "e1eec461-f1f3-40de-b94b-3b670b78108c", + "last_modified": 1774283138114 + }, + { + "schema": 1773964810753, "subframes": [], "components": [ { @@ -304,148 +533,43 @@ "ved", "ei" ], - "extraAdServersRegexps": [ - "^https?://www\\.google(?:adservices)?\\.com/(?:pagead/)?aclk" - ], - "nonAdsLinkQueryParamNames": [ - "url" - ], - "id": "635a3325-1995-42d6-be09-dbe4b2a95453", - "last_modified": 1772656186787 - }, - { - "isSPA": true, - "schema": 1756952145762, - "subframes": [], - "components": [ - { - "type": "ad_image_row", - "included": { - "parent": { - "selector": "[data-testid='pam.container']" - }, - "children": [ - { - "selector": "[data-slide-index]", - "countChildren": true - } - ] - } - }, + "impressionAttributes": [ { - "type": "ad_link", - "included": { - "parent": { - "selector": "[data-testid='adResult']" - } + "key": "is_shopping_page", + "url": { + "regexp": "&udm=28" } }, { - "type": "incontent_searchbox", - "topDown": true, - "included": { - "parent": { - "selector": "._1zdrb._1cR1n" + "key": "shopping_tab_displayed", + "element": { + "regexp": "&udm=28", + "selector": "div[role='navigation'] a", + "component": { + "type": "shopping_tab", + "countImpressions": true }, - "related": { - "selector": "#search-suggestions" - }, - "children": [ - { - "selector": "input[type='search']" - } - ] + "attributeName": "href" } }, { - "type": "ad_link", - "default": true - } - ], - "shoppingTab": { - "regexp": "t=shopping", - "selector": "[data-testid='shoppingNavItem']", - "inspectRegexpInSERP": true - }, - "taggedCodes": [ - "ff_android", - "ff_ios", - "brz-moz", - "firefoxqwant" - ], - "telemetryId": "qwant", - "organicCodes": [], - "codeParamName": "client", - "pageTypeParam": { - "keys": [ - "t" - ], - "pageTypes": [ - { - "name": "web", - "target": "default_tab", - "values": [ - "web" - ], - "enabled": true, - "isDefault": true - }, - { - "name": "images", - "values": [ - "images" - ], - "enabled": false - }, - { - "name": "videos", - "values": [ - "videos" - ], - "enabled": false - }, - { - "name": "news", - "values": [ - "news" - ], - "enabled": false - }, - { - "name": "shopping", - "target": "shopping_tab", - "values": [ - "shopping" - ], - "enabled": true + "key": "has_ai_summary", + "element": { + "selector": ".OZ9ddf.WAUd4" } - ], - "enableSPAHandling": true - }, - "queryParamName": "q", - "queryParamNames": [ - "q" - ], - "searchPageRegexp": "^https://www\\.qwant\\.com/", - "filter_expression": "env.version|versionCompare(\"124.0a1\")>=0", - "searchPageMatches": [ - "https://www.qwant.com/*" + } ], - "followOnParamNames": [], - "defaultPageQueryParam": { - "key": "t", - "value": "web" - }, "extraAdServersRegexps": [ - "^https://www\\.bing\\.com/acli?c?k", - "^https://api\\.qwant\\.com/v3/r/", - "^https://fdn\\.qwant\\.com/v3/r/" + "^https?://www\\.google(?:adservices)?\\.com/(?:pagead/)?aclk" ], - "id": "19c434a3-d173-4871-9743-290ac92a3f6b", - "last_modified": 1757010621729 + "nonAdsLinkQueryParamNames": [ + "url" + ], + "id": "635a3325-1995-42d6-be09-dbe4b2a95453", + "last_modified": 1774283138111 }, { - "schema": 1753236937989, + "schema": 1774280720537, "subframes": [], "components": [ { @@ -645,30 +769,52 @@ "hy", "hz" ], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "&ia=shopping&iax=shopping|&iax=shopping&ia=shopping" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "selector": "nav > ul > li > a[href*='ia=shopping']", + "component": { + "type": "shopping_tab", + "countImpressions": true + } + } + }, + { + "key": "has_ai_summary", + "element": { + "selector": ".zHmKXya03lRu_br7aWAj" + } + } + ], "extraAdServersRegexps": [ "^https://duckduckgo.com/y\\.js?.*ad_provider\\=", "^https://www\\.amazon\\.(?:[a-z.]{2,24}).*(?:tag=duckduckgo-)", "^https://links\\.duckduckgo\\.com/m\\.js\\?dsl=1" ], "id": "9dfd626b-26f2-4913-9d0a-27db6cb7d8ca", - "last_modified": 1753289524079 + "last_modified": 1774283138108 }, { - "schema": 1751854531997, + "isSPA": true, + "schema": 1774280719091, "subframes": [], "components": [ { - "type": "ad_carousel", + "type": "ad_image_row", "included": { "parent": { - "selector": ".adsMvCarousel" - }, - "related": { - "selector": ".cr" + "selector": "[data-testid='pam.container']" }, "children": [ { - "selector": ".pa_item", + "selector": "[data-slide-index]", "countChildren": true } ] @@ -676,35 +822,10 @@ }, { "type": "ad_link", - "excluded": { - "parent": { - "selector": "aside" - } - }, "included": { "parent": { - "selector": ".sb_adTA" - }, - "children": [ - { - "type": "ad_sitelink", - "selector": ".b_vlist2col" - } - ] - } - }, - { - "type": "ad_sidebar", - "included": { - "parent": { - "selector": "aside" - }, - "children": [ - { - "selector": ".pa_item, .sb_adTA", - "countChildren": true - } - ] + "selector": "[data-testid='adResult']" + } } }, { @@ -712,52 +833,14 @@ "topDown": true, "included": { "parent": { - "selector": "form#sb_form" + "selector": "._1zdrb._1cR1n" }, "related": { - "selector": "#sw_as" - }, - "children": [ - { - "selector": "input[name='q']" - } - ] - } - }, - { - "type": "cookie_banner", - "topDown": true, - "included": { - "parent": { - "selector": "div#bnp_cookie_banner" + "selector": "#search-suggestions" }, "children": [ { - "selector": "button#bnp_btn_accept", - "eventListeners": [ - { - "action": "clicked_accept", - "eventType": "click" - } - ] - }, - { - "selector": "button#bnp_btn_reject", - "eventListeners": [ - { - "action": "clicked_reject", - "eventType": "click" - } - ] - }, - { - "selector": "a#bnp_btn_preference", - "eventListeners": [ - { - "action": "clicked_more_options", - "eventType": "click" - } - ] + "selector": "input[type='search']" } ] } @@ -768,98 +851,147 @@ } ], "shoppingTab": { - "regexp": "^/shop?", - "selector": "#b-scopeListItem-shop a" + "regexp": "t=shopping", + "selector": "[data-testid='shoppingNavItem']", + "inspectRegexpInSERP": true }, "taggedCodes": [ - "MOZ2", - "MOZ4", - "MOZ5", - "MOZA", - "MOZB", - "MOZD", - "MOZE", - "MOZI", - "MOZL", - "MOZM", - "MOZO", - "MOZR", - "MOZT", - "MOZW", - "MOZX", - "MZABT", - "MZCP", - "MZTOF", - "MZSL01", - "MZSL02", - "MZSL03" + "ff_android", + "ff_ios", + "brz-moz", + "firefoxqwant" ], - "telemetryId": "bing", + "telemetryId": "qwant", "organicCodes": [], - "codeParamName": "pc", + "codeParamName": "client", + "pageTypeParam": { + "keys": [ + "t" + ], + "pageTypes": [ + { + "name": "web", + "target": "default_tab", + "values": [ + "web" + ], + "enabled": true, + "isDefault": true + }, + { + "name": "images", + "values": [ + "images" + ], + "enabled": false + }, + { + "name": "videos", + "values": [ + "videos" + ], + "enabled": false + }, + { + "name": "news", + "values": [ + "news" + ], + "enabled": false + }, + { + "name": "shopping", + "target": "shopping_tab", + "values": [ + "shopping" + ], + "enabled": true + } + ], + "enableSPAHandling": true + }, "queryParamName": "q", - "followOnCookies": [ - { - "host": "www.bing.com", - "name": "_SS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" - }, + "queryParamNames": [ + "q" + ], + "searchPageRegexp": "^https://www\\.qwant\\.com/", + "filter_expression": "env.version|versionCompare(\"124.0a1\")>=0", + "searchPageMatches": [ + "https://www.qwant.com/*" + ], + "followOnParamNames": [], + "impressionAttributes": [ { - "host": "www.bing.com", - "name": "SRCHS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "is_shopping_page", + "url": { + "regexp": "t=shopping" + } }, { - "host": "cn.bing.com", - "name": "_SS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "shopping_tab_displayed", + "element": { + "regexp": "t=shopping", + "selector": "[data-testid='shoppingNavItem']", + "component": { + "type": "shopping_tab", + "countImpressions": true + }, + "attributeName": "href" + } }, { - "host": "cn.bing.com", - "name": "SRCHS", - "codeParamName": "PC", - "extraCodePrefixes": [], - "extraCodeParamName": "" + "key": "has_ai_summary", + "value": "false" } ], - "queryParamNames": [ - "q" - ], - "domainExtraction": { - "ads": [ - { - "method": "textContent", - "selectors": "#b_results .b_ad .b_attribution cite, .adsMvCarousel cite, aside cite" - } - ], - "nonAds": [ - { - "method": "textContent", - "selectors": "#b_results .b_algo .b_attribution cite" - } - ] + "defaultPageQueryParam": { + "key": "t", + "value": "web" }, - "searchPageRegexp": "^https://(?:cn|www)\\.bing\\.com/search", - "nonAdsLinkRegexps": [ - "^https://(?:cn|www).bing.com/ck/a" + "extraAdServersRegexps": [ + "^https://www\\.bing\\.com/acli?c?k", + "^https://api\\.qwant\\.com/v3/r/", + "^https://fdn\\.qwant\\.com/v3/r/" ], + "id": "19c434a3-d173-4871-9743-290ac92a3f6b", + "last_modified": 1774283138106 + }, + { + "schema": 1774280723741, + "subframes": [], + "taggedCodes": [ + "monline_dg", + "monline_3_dg", + "monline_4_dg", + "monline_7_dg" + ], + "telemetryId": "baidu", + "organicCodes": [], + "codeParamName": "tn", + "queryParamName": "wd", + "queryParamNames": [ + "wd", + "word" + ], + "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", "searchPageMatches": [ - "https://(?:cn|www).bing.com/search*" + "https://m.baidu.com/s*", + "https://m.baidu.com/baidu*", + "https://www.baidu.com/s*", + "https://www.baidu.com/baidu*" + ], + "followOnParamNames": [ + "oq" ], + "impressionAttributes": [], "extraAdServersRegexps": [ - "^https://(?:cn|www)\\.bing\\.com/acli?c?k" + "^https?://www\\.baidu\\.com/baidu\\.php?" ], - "id": "e1eec461-f1f3-40de-b94b-3b670b78108c", - "last_modified": 1751891587705 + "id": "19c434a3-d173-4871-9743-290ac92a3f6a", + "last_modified": 1774283138103 }, { - "schema": 1750817732643, + "schema": 1774280722696, "subframes": [ { "regexp": "^https://syndicatedsearch\\.goog/afs/ads", @@ -943,47 +1075,38 @@ "https://www.ecosia.org/*" ], "expectedOrganicCodes": [], + "impressionAttributes": [ + { + "key": "is_shopping_page", + "url": { + "regexp": "/shopping?" + } + }, + { + "key": "shopping_tab_displayed", + "element": { + "regexp": "/shopping?", + "selector": "nav li[data-test-id='search-navigation-item-shopping'] a", + "component": { + "type": "shopping_tab", + "countImpressions": true + }, + "attributeName": "href" + } + }, + { + "key": "has_ai_summary", + "value": "false" + } + ], "extraAdServersRegexps": [ "^https://www\\.bing\\.com/acli?c?k", "^https://syndicatedsearch\\.goog/aclk\\?", "^https://www\\.googleadservices\\.com/pagead/aclk\\?" ], "id": "9a487171-3a06-4647-8866-36250ec84f3a", - "last_modified": 1750880107190 - }, - { - "schema": 1741189702306, - "subframes": [], - "taggedCodes": [ - "monline_dg", - "monline_3_dg", - "monline_4_dg", - "monline_7_dg" - ], - "telemetryId": "baidu", - "organicCodes": [], - "codeParamName": "tn", - "queryParamName": "wd", - "queryParamNames": [ - "wd", - "word" - ], - "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", - "searchPageMatches": [ - "https://m.baidu.com/s*", - "https://m.baidu.com/baidu*", - "https://www.baidu.com/s*", - "https://www.baidu.com/baidu*" - ], - "followOnParamNames": [ - "oq" - ], - "extraAdServersRegexps": [ - "^https?://www\\.baidu\\.com/baidu\\.php?" - ], - "id": "19c434a3-d173-4871-9743-290ac92a3f6a", - "last_modified": 1741781945955 + "last_modified": 1774283138101 } ], - "timestamp": 1772656186787 + "timestamp": 1774283138114 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json thunderbird-140.10.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json --- thunderbird-140.9.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json 2026-03-20 19:18:39.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/main/urlbar-persisted-search-terms.json 2026-04-21 14:53:01.000000000 +0000 @@ -1,6 +1,32 @@ { "data": [ { + "schema": 1774483206927, + "providerId": "google", + "excludeParams": [ + { + "key": "udm", + "values": [] + }, + { + "key": "tbm", + "values": [] + } + ], + "includeParams": [], + "searchPageRegexp": "^https://www\\.google\\.[^/]+/search\\b", + "filter_expression": "env.version|versionCompare(\"148.0a1\")>=0", + "id": "1a479a17-f8cf-4ce1-9086-41d1f3ef7b69", + "last_modified": 1775078290693 + }, + { + "schema": 1773705620356, + "providerId": "bing", + "searchPageRegexp": "^https://www\\.bing\\.com\\/search\\b", + "id": "eb97a1c7-112c-4d61-bcc0-07feaaac4643", + "last_modified": 1773858354866 + }, + { "schema": 1719398671127, "providerId": "qwant", "includeParams": [ @@ -44,5 +70,5 @@ "last_modified": 1719927826946 } ], - "timestamp": 1719927826949 + "timestamp": 1775078290693 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/security-state/intermediates.json thunderbird-140.10.0esr/services/settings/dumps/security-state/intermediates.json --- thunderbird-140.9.0esr/services/settings/dumps/security-state/intermediates.json 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/security-state/intermediates.json 2026-04-21 14:53:01.000000000 +0000 @@ -1,6 +1,435 @@ { "data": [ { + "schema": 1775833161373, + "derHash": "mhVw6CEd5xP86y3Ep3KKvhmUozpMpipPgdT3UR3p21A=", + "attachment": { + "hash": "09625147dcb554f09923cccede00578597175b9d1b8a2cbc6c94d5c7da65943f", + "size": 2068, + "filename": "_vcu3bLdrl-2pV1S4cenN7_yGMcAZ-qj1zlA9EwLUqw=.pem", + "location": "security-state-staging/intermediates/5db30d9b-ab7d-48c7-9559-d9769bf37286.pem", + "mimetype": "application/x-pem-file" + }, + "id": "8e4af3f4-07db-4bf7-9122-81486d9b2890", + "last_modified": 1775836622756 + }, + { + "schema": 1775012105575, + "derHash": "cgvU2iGvina571P9AerSJ2AflROzM43gbJl8pohJLTQ=", + "attachment": { + "hash": "5a3d49d4344eafa351f15b261301709d4a204955fb59385855783d159a8b3bcc", + "size": 1979, + "filename": "ape1HIIZ6T5d7GS61YBs3rD4NVvkfnVwELcCRW4Bqv0=.pem", + "location": "security-state-staging/intermediates/8aea17ab-2eaa-4046-8c0e-c145877f23a0.pem", + "mimetype": "application/x-pem-file" + }, + "id": "21f5a836-b455-4f4e-94c5-2b4241a3d72f", + "last_modified": 1775015828685 + }, + { + "schema": 1775012104722, + "derHash": "MUL5nTWNm1AOXN0t/49xmozOz1iWUjNISFIsyoB9CAc=", + "attachment": { + "hash": "9ce0a589d152892ad4eb37fcfce39ef460fca939530497544587e4346695c67b", + "size": 1183, + "filename": "oC-voZLIy4HLE0FVT5wFtxzKKokLDRKY1oNkfJYe-98=.pem", + "location": "security-state-staging/intermediates/2fda55d9-aab2-4ada-8729-2804f28b234f.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9c388e53-8bbf-4e58-bdad-06ed80b811e6", + "last_modified": 1775015828681 + }, + { + "schema": 1775012103853, + "derHash": "YMJmbaXiMyFw4dO/zZW/jJptTmNHPzqLu4z0Kz+fA4o=", + "attachment": { + "hash": "50e43d8c3f71ec3eee0a37984cf059a6262dd57ae9ff595c414fc337931245e2", + "size": 1983, + "filename": "ape1HIIZ6T5d7GS61YBs3rD4NVvkfnVwELcCRW4Bqv0=.pem", + "location": "security-state-staging/intermediates/9e73bcb6-ff56-4a97-b357-6bd34c72708d.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c2ba95d1-22a1-4d7e-9b1e-8cd25f4561a8", + "last_modified": 1775015828676 + }, + { + "schema": 1774839566079, + "derHash": "L+kVsTV132oKi+tQGLYhIHEWqRwd334zuUWR+sPyNiY=", + "attachment": { + "hash": "4f127c4233a9101689368449c0025753a357e2b30e495953dce748ac23bcb4e5", + "size": 1618, + "filename": "nTfkqYnqs4gtEWBS_ItYRGcCy1k3JuRgTDeVlAxxA-I=.pem", + "location": "security-state-staging/intermediates/1b0d4b91-04ad-4f01-879f-e367d736c812.pem", + "mimetype": "application/x-pem-file" + }, + "id": "b5253e0b-76dc-4f20-83c2-7c077b7fc8ab", + "last_modified": 1774843022513 + }, + { + "schema": 1774839565218, + "derHash": "JjwYSPEBxNxsHTD8R0RhAYG5VqTWJMMFBf6LLr7+rQs=", + "attachment": { + "hash": "3ba617943c0a0ac91ca02303c19f3553242e26eea65b6ec51205b4861a6ecbc2", + "size": 2203, + "filename": "51PN2fE0E8fKnNqCli-MDOXtE9FlcxKVSvUmfrLLfHk=.pem", + "location": "security-state-staging/intermediates/b710492b-1b40-4836-a5ee-73b38345f189.pem", + "mimetype": "application/x-pem-file" + }, + "id": "5086b037-baf3-47eb-b9c2-d0908b72906c", + "last_modified": 1774843022509 + }, + { + "schema": 1774839564338, + "derHash": "j/+4Ae+NIq44n3xYxVDj04n31FbrGyXAznqf5YSjiAQ=", + "attachment": { + "hash": "c11561e2d98806065b1037695b8fdbdae99bc7154d121e40f010e741bcd540c2", + "size": 2381, + "filename": "3LnPAebFSkQKRToZaB0Z4luRvWRpsFAPvCM0EYIXY-w=.pem", + "location": "security-state-staging/intermediates/dd30b12f-a521-463b-9ed0-d69dc19daf13.pem", + "mimetype": "application/x-pem-file" + }, + "id": "ac64c0c2-c266-40a2-8651-203f35766993", + "last_modified": 1774843022506 + }, + { + "schema": 1774839563494, + "derHash": "hUS7bnO8NySr4AMVCfFvvqSKQ7h+YSkdTbQJgxLoZho=", + "attachment": { + "hash": "3a0979157e0f63ad072da56ccd05629954ea12d199313f3c9c788f14dc0c45d5", + "size": 2381, + "filename": "qin3sUBfFTBdUOjWawJQDx3pdUx1ahG0DN5-alAiims=.pem", + "location": "security-state-staging/intermediates/34e7d2a7-768d-49c9-9688-37114c0be202.pem", + "mimetype": "application/x-pem-file" + }, + "id": "71c687be-a812-4538-bc91-712c082e9ad3", + "last_modified": 1774843022503 + }, + { + "schema": 1774839562514, + "derHash": "tBFXEXDkVysCDnx5m2+iYMISUSmNmg7KwS0Mrf5atGc=", + "attachment": { + "hash": "d199420190cbc02f3ad05b432136b23753c2c4f5c7477e3aa7997d96ce7d4caf", + "size": 2381, + "filename": "k-feF4mrx1LOTkxBk_pU2KcdD9TyVgG2TlSPKu1--Vs=.pem", + "location": "security-state-staging/intermediates/dc7f6474-4b57-4ef3-883b-dd3efacdc9e8.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9f8abdbe-48ee-4382-9cd3-c808c07df177", + "last_modified": 1774843022500 + }, + { + "schema": 1774537167635, + "derHash": "tWRizDsHfbNumebumJkvb3cSgOHyxwRod6K/tXX5gMM=", + "attachment": { + "hash": "e1ba9bde972d50841989cad6214a82407acac6723c48c680179081b3e8d13572", + "size": 1211, + "filename": "QmfmEZOKMCSNCo76MUoMqXBJELPzPieICN7H7Rt9_bY=.pem", + "location": "security-state-staging/intermediates/c32aaa01-41ef-4142-83cc-c93aa8234f11.pem", + "mimetype": "application/x-pem-file" + }, + "id": "68920eda-5e84-468b-9c49-ef3328c1435d", + "last_modified": 1774540622867 + }, + { + "schema": 1774537166747, + "derHash": "NH9DUQ3hU11Ybuhi0CmcqnVmL9VeNcvfjiMavhozenY=", + "attachment": { + "hash": "04919ea7a453d04e91d841ef11179afbfb794aecfd1d2371cfb52e514d15bb7d", + "size": 2227, + "filename": "uS-9acfZeG6v1Kc6KBPUyew1BpCmbecvayVHStbHPFM=.pem", + "location": "security-state-staging/intermediates/43a14661-831d-4240-b884-26a635eb41bd.pem", + "mimetype": "application/x-pem-file" + }, + "id": "4f8139a3-9ffa-4790-a159-3fdecf79535b", + "last_modified": 1774540622863 + }, + { + "schema": 1774537165900, + "derHash": "lJxZlpPDvl2yke7el61p4AxjK1tQVAghhcNg19bM5zc=", + "attachment": { + "hash": "4d009254753e30af8ee272de746a80f286a81abf0bee748e84e07e1b18af182e", + "size": 2223, + "filename": "XiSnrVCBUFzw-XzQ1O2q6Q3kzxZFNr839tx0M2NYr_M=.pem", + "location": "security-state-staging/intermediates/4b2ce371-2540-4622-909d-fc302fb3c2e5.pem", + "mimetype": "application/x-pem-file" + }, + "id": "9b01fe1f-5aa6-4934-be42-4885ce278369", + "last_modified": 1774540622860 + }, + { + "schema": 1774537165086, + "derHash": "j4wMWEZG+1Xh70K/HHiGwVdLSqJaqW5ha2oWvC7eH6E=", + "attachment": { + "hash": "f6c790d50f999e2ca788147e8fa04c81827bf045e2031dddc2873d836ce69abb", + "size": 2227, + "filename": "L8InkWngZ9c62OLXr4bIhLyKyaaxKsDNrhpCw5XHPog=.pem", + "location": "security-state-staging/intermediates/6b309c53-5001-4022-abb8-c62e2eb86f75.pem", + "mimetype": "application/x-pem-file" + }, + "id": "83d8b806-40eb-486a-9192-caa5b6864e59", + "last_modified": 1774540622857 + }, + { + "schema": 1774537164238, + "derHash": "LzyOy+IVftZ1bJNxhgLXTii9TqBDQNha5ry+tYQezik=", + "attachment": { + "hash": "b999fff58ad8a01f87303fdbf387ffe2e908ff2cbd6101ccb3ff664ad0a99471", + "size": 2223, + "filename": "q5VWj0cOvFCs9E4y24Khc0EPrjRq2NMM2AAcy7mZJnY=.pem", + "location": "security-state-staging/intermediates/0c69910a-1056-4b6e-a992-3200228c572d.pem", + "mimetype": "application/x-pem-file" + }, + "id": "0564262f-43b6-460f-9d54-8e66d608d31a", + "last_modified": 1774540622854 + }, + { + "schema": 1774537163404, + "derHash": "HA45AY4yj8i7/zX1mTKH0JNNxE70MR9EYirVvwc1GrQ=", + "attachment": { + "hash": "b615afaa1d2347e741aaff40532628f32fe6c6a45b3bde95bcaf380f3eb1f058", + "size": 1211, + "filename": "UmbWx5Q-xQ-XNQmthXd2WrdYe90ISOCFt1UVQHdQJc4=.pem", + "location": "security-state-staging/intermediates/ca406bbd-d08d-4228-bed2-e63252510b25.pem", + "mimetype": "application/x-pem-file" + }, + "id": "97722896-bd33-4951-9562-b3c0ed39a9b7", + "last_modified": 1774540622851 + }, + { + "schema": 1774537161581, + "derHash": "87Xe5gNU808RcfY2p2cVPE7CpAgooTGoTV+gxCuHmKQ=", + "attachment": { + "hash": "108ab348547297ebd08b76a3cd9618e37db6cd18504af2bba132caf2d62272da", + "size": 1211, + "filename": "n7hDO7kmTyPDfTRqy8j-iiSjDEOGIK3OwmTa3M6bPU8=.pem", + "location": "security-state-staging/intermediates/407e02b4-5ea5-4757-b17d-f1286eb6c893.pem", + "mimetype": "application/x-pem-file" + }, + "id": "127bfeb9-4043-4313-9eee-7e3897b482c1", + "last_modified": 1774540622848 + }, + { + "schema": 1774537160745, + "derHash": "nbmxe2RRY5b0PcwDEclQ67wL3F9sjGhU1wTOjDu/lTc=", + "attachment": { + "hash": "9a031995ae6edb03d9eddbefa345470e2ef4f73cd4d1cc5f6a1d6cae5e897e2c", + "size": 2223, + "filename": "D0Hbg52GdF5j948K84ufWwwyf2laKJFrVgN0v6w4qyc=.pem", + "location": "security-state-staging/intermediates/d1c5223d-b23b-40e9-a0fb-239c3ec8e2ed.pem", + "mimetype": "application/x-pem-file" + }, + "id": "d149d0fe-0927-4f3a-b3b1-cb4466af0ad8", + "last_modified": 1774540622844 + }, + { + "schema": 1774537159836, + "derHash": "CQ4tY5h7uqEIlFwDNkbGbo9JY/gCHLvQmyjtA8UY8V0=", + "attachment": { + "hash": "1fd0adafe3626c5552a1bd711a31e4771fcf6ba50465eaad2e09a5bd8e51d811", + "size": 2223, + "filename": "_afCgUksmMTJlpCQSN7g2Ztq92tr9vJMAGSd2u3c-2E=.pem", + "location": "security-state-staging/intermediates/f316e3de-7e92-4fd2-a8f2-48823166a67f.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7b6d604f-da64-4956-9ba8-ef320767a339", + "last_modified": 1774540622841 + }, + { + "schema": 1774537158981, + "derHash": "lvjBHSfReqMPYDkEmWL+emE3Ueys01vghURug+SmxxU=", + "attachment": { + "hash": "7c6b20589b3e35476c459adf74a221fb2d0241fd565422ff49e51c189f72ee2c", + "size": 1211, + "filename": "EHXD4myN-2MrM-IynQeU7_1jgYeeymnT6kYKTvpkbpU=.pem", + "location": "security-state-staging/intermediates/123bd016-e01b-472d-9236-fdef1003a048.pem", + "mimetype": "application/x-pem-file" + }, + "id": "5152ad1e-5355-488c-8984-f0efd5e78077", + "last_modified": 1774540622838 + }, + { + "schema": 1774537157978, + "derHash": "hGV0oPGqNYcyZ3iVv847kVZX4SsPRCg/zGuP9eExZnw=", + "attachment": { + "hash": "d919bf8e33589b8e40186d8f10404efa161c7abc8f53d6b9518aee79fa91f973", + "size": 1207, + "filename": "gTWJCRcyOA0K6tgUJ2Lrj6HVbcMFSbqwalwLhja789E=.pem", + "location": "security-state-staging/intermediates/ad3d9108-98b2-4f3f-a617-d79662451262.pem", + "mimetype": "application/x-pem-file" + }, + "id": "40d15d9c-194f-4733-a6c3-497ff71da925", + "last_modified": 1774540622835 + }, + { + "schema": 1774537162569, + "derHash": "qCdgfIh1VWlCwEYh4AsvT7vCTXLRuiFXMn6U21uIIuk=", + "attachment": { + "hash": "a7c60c40deb5ea433c5c7ebb5e4bdd06a47eec41d946a73fea7d2331fd22f39b", + "size": 1207, + "filename": "khm_-KphnPlXjmlGYOIskARrZpM8Wv4aciNlPkQqoU8=.pem", + "location": "security-state-staging/intermediates/26b06ae5-e167-4030-8ebc-5ca3e53932f5.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c184f4b5-f1c6-42a3-8751-9e8a8123c101", + "last_modified": 1774540622831 + }, + { + "schema": 1774407026782, + "derHash": "rSqtrKiX3qIriJ3bOBFDBJrZl1wIGbSTUNYhkBk1img=", + "attachment": { + "hash": "7be77c4f3a6cc94534290a06c3ae1d8a9f22ce5095d33688274eb4fe4edd3fcc", + "size": 1284, + "filename": "8HooqDIb6deYivaIrjMnbSVm5PnKzs4Mum9cD1-2Ntw=.pem", + "location": "security-state-staging/intermediates/29d315aa-8a9c-430e-b1e6-e9a5572ed701.pem", + "mimetype": "application/x-pem-file" + }, + "id": "3a9de97b-7cf0-4772-b306-320cb0e1680b", + "last_modified": 1774407422891 + }, + { + "schema": 1774407025946, + "derHash": "y7pa+7fkk8LR7fuzsWI5S/zsA0WmbcGhZ7ID1TT7wV8=", + "attachment": { + "hash": "86752cefd9de3fd54a98ff4f261081c6debb15d084dbe4d5c42373df0cfa15b8", + "size": 1293, + "filename": "BrDTQv-ioWNZeYFnvfqDY6CWpQ7tPtfBtFCPsRg8oYY=.pem", + "location": "security-state-staging/intermediates/d183a535-9322-4d15-99cd-6f53c256ac39.pem", + "mimetype": "application/x-pem-file" + }, + "id": "51ae5324-7cb5-4022-b86c-043c7f87f3cb", + "last_modified": 1774407422888 + }, + { + "schema": 1774407025123, + "derHash": "OZzG09QbgfWCE5JEtrXY8J6V5XEDCmJ3+PQFGy4Xr2Y=", + "attachment": { + "hash": "8e60682a9a574f1d0a0dabe96f711fa45d6d6016e7756e0910b1cde625bcb1a5", + "size": 2231, + "filename": "m_Imq6VCxWXMJpEVLT-9ogjW5uJ1aMCuHE4z1IoRiEU=.pem", + "location": "security-state-staging/intermediates/b7bdf584-9ff1-422c-811b-f043e7dd9f41.pem", + "mimetype": "application/x-pem-file" + }, + "id": "1b4d2c0e-b206-458d-8a88-d4937d94c07d", + "last_modified": 1774407422885 + }, + { + "schema": 1774407024250, + "derHash": "E2I9tZlclps7VabgrntutbiqwUUvZJSH80Tvkg/8ilo=", + "attachment": { + "hash": "13744fb9bdff4996f470d2a114595cd545ae2375059c952724b438530df06e0b", + "size": 2223, + "filename": "8n8ZPo-I2Z5L6S3BZ9izqIsRIWQMxNnHyN1-ni6rQHI=.pem", + "location": "security-state-staging/intermediates/ce0fdc77-55e9-49a7-9289-8ae811ec58c6.pem", + "mimetype": "application/x-pem-file" + }, + "id": "636a61c3-f9ec-4476-a211-a75bd63203e0", + "last_modified": 1774407422881 + }, + { + "schema": 1774407023409, + "derHash": "NTKM2p8U/rYqwMyu4bEBAf1vRK3YWlExHqF0/TYfRhM=", + "attachment": { + "hash": "09e6690e366888699b9f80cc1725cb1faaf65069be6e9032e0abb58d3a595242", + "size": 1508, + "filename": "R0h5AKG-ue4IzLwRFqjsVfRUtjiZQxnwUbmEAjztZCM=.pem", + "location": "security-state-staging/intermediates/c67cf489-4f63-4db7-8885-5d9a6cc4ee5b.pem", + "mimetype": "application/x-pem-file" + }, + "id": "7c9b4915-0290-44dc-a053-0be5cdd18711", + "last_modified": 1774407422878 + }, + { + "schema": 1774407022553, + "derHash": "V+c4UI+jsIIR/v8ejTUVCamNXJVf35c1k8fzwHUSXsA=", + "attachment": { + "hash": "b2e71f249b94efd07a8940e42fbc77ed9531c1065d3ae633939f704ad6de8873", + "size": 2223, + "filename": "bFHloLclSSUUIxBjXQqRVR91E9WcAO_iGbibOQ51bdw=.pem", + "location": "security-state-staging/intermediates/fbe09e70-b825-4f11-a3e9-b6c6d7cfb518.pem", + "mimetype": "application/x-pem-file" + }, + "id": "78d9eeb5-c11b-40ae-b3ef-e495db9c1299", + "last_modified": 1774407422875 + }, + { + "schema": 1774407021673, + "derHash": "JD9YYT4dH0XeSC/Xe/V7uhyS/3WWy8PgIEUEmVQfK9s=", + "attachment": { + "hash": "dcf1a61851c369c11ca2dbb606e5e639acd8fea1a25f385adff5edae49b7a4fb", + "size": 1284, + "filename": "g7Po5gl2edguSn1UNZLvQt_Ua-vBFH8qeWx8NfsPz-A=.pem", + "location": "security-state-staging/intermediates/df46379e-e1c9-42d3-87cd-36e67fa1fca6.pem", + "mimetype": "application/x-pem-file" + }, + "id": "c64f19a0-bd6e-4fd0-8662-d4f73af0ebb0", + "last_modified": 1774407422871 + }, + { + "schema": 1774321167312, + "derHash": "PnhD+fe1rbfYVy4+mtuQNh480OdmvMdAODD1vqDfJkM=", + "attachment": { + "hash": "626411fa1a1a96145370b856759aa04362d6b29227bf2a8bc1f1b270867c158a", + "size": 1333, + "filename": "ZcmQIw3T5sstVqoLKtlSp-iGIreyBs6HuHoKvalPSbw=.pem", + "location": "security-state-staging/intermediates/5c22466d-6c50-46d9-aeb5-8a49e5106d5b.pem", + "mimetype": "application/x-pem-file" + }, + "id": "e04d4e38-55e1-4185-9024-7c8a07e7f90f", + "last_modified": 1774324622561 + }, + { + "schema": 1774321166456, + "derHash": "x24j36ABS4habe2ObWTCla9Jkdx4csGviw/vUn4mOSk=", + "attachment": { + "hash": "f6bed434abd9cba4cb6c693afa5bc3610a074c2273836781b76d16121e42e2a3", + "size": 2483, + "filename": "DTHIAtHLOR6FmYnWT0BO8a7y7EPc0Efk6Xg5Q2TZgcQ=.pem", + "location": "security-state-staging/intermediates/4c021cd3-ee89-4bf0-aea7-1bae269d28c8.pem", + "mimetype": "application/x-pem-file" + }, + "id": "749cc566-3960-4751-99c3-38dd313dd8ed", + "last_modified": 1774324622559 + }, + { + "schema": 1774321165467, + "derHash": "IIK2QbStfyCozufx+4VXHqRhIi/pM9/y+yRu1ax+raI=", + "attachment": { + "hash": "8334eb6e646f5086918552fdc4c9e388fc154ba3a73f5ec6b734d151cdd4dcd1", + "size": 2483, + "filename": "A8ZEgZnEvlP5roifoh8jSSc6XIssihwe4GegJOQMMgc=.pem", + "location": "security-state-staging/intermediates/e82e926a-6890-44f9-bef0-bd26a51cba97.pem", + "mimetype": "application/x-pem-file" + }, + "id": "ea3b6bb6-b87f-4a32-af61-934b7372d338", + "last_modified": 1774324622556 + }, + { + "schema": 1774015158385, + "derHash": "YwbEkfnRzs7e9GQg4ChgGSLAEG3QtIphp0VPntOM1kk=", + "attachment": { + "hash": "89366bf6af4cebfb752560bbf9f7e1f2ca1f9153fcbd19fbc49b9816c121dd49", + "size": 2032, + "filename": "DgXpuyOGnraJ3FaDnc7EdaOudfprULxaSXg2DL5nMyM=.pem", + "location": "security-state-staging/intermediates/cebee1ae-3936-45a5-8ea0-fe7b583cf983.pem", + "mimetype": "application/x-pem-file" + }, + "id": "2146715a-52f4-4edb-94b4-057974931912", + "last_modified": 1774018622682 + }, + { + "schema": 1774015157426, + "derHash": "Tc5aAXuz2BrPgj6BWqvLg3Uq0+KIOzWd9Ck1371JcHU=", + "attachment": { + "hash": "5e009485a7b2968bb39bd0b751c8e4b621bdc23f8e1ec2064b7970c7e0e5835a", + "size": 1447, + "filename": "6rDeWkZBkBCwGy1VVT_BEaqCtD2Tle3-rqqMduatGZU=.pem", + "location": "security-state-staging/intermediates/b6f4b5cb-5485-435e-81a0-86517fe7cbdf.pem", + "mimetype": "application/x-pem-file" + }, + "id": "d4aa25dd-629d-4e5b-9980-52f0a4a3020e", + "last_modified": 1774018622678 + }, + { "schema": 1773367181131, "derHash": "O6M9yJ8SKjyt2VVQJiQFLjd88FnRwsUZgnD2lAB4aJE=", "attachment": { @@ -183,32 +612,6 @@ "last_modified": 1771772222955 }, { - "schema": 1771509557311, - "derHash": "wAO4yz8Ey2gNnidXfUl+PG/r4+KkALepKwml6zjJ+sc=", - "attachment": { - "hash": "bba6fee9c638fc0bb66f0aca6a04feb22f2437cc8810caafa472b61983865cc8", - "size": 2300, - "filename": "qEARbagEM4uxwIMf9T4As1lIb5Nh6EAgvw2YzeHYK7w=.pem", - "location": "security-state-staging/intermediates/cfc4f010-7021-4f72-bae1-e536cb9563a3.pem", - "mimetype": "application/x-pem-file" - }, - "id": "0dac995c-5c6c-4a1f-af61-1fa908290896", - "last_modified": 1771513022842 - }, - { - "schema": 1771509556805, - "derHash": "CDNRe9bX7gEhcyLLqHM8ETRoh/BlNATyTe0fjkhcK2s=", - "attachment": { - "hash": "0c4094f2c3726037de2909d5d0a0383023b486a974d1d9e84dabff44540c8754", - "size": 1772, - "filename": "9aRZ9FaploJqrFZWXeqoWgPs7XVI3lOweGuCzG9fKGQ=.pem", - "location": "security-state-staging/intermediates/ae47ea83-973b-4d3b-ab78-6537f2989259.pem", - "mimetype": "application/x-pem-file" - }, - "id": "276adda4-a8c0-4dd4-932d-9428d05875f5", - "last_modified": 1771513022838 - }, - { "schema": 1771379968391, "derHash": "WoTJQFTTQNZQopmF75e7OWNS4hWu1sCzPKf/3TvV0qI=", "attachment": { @@ -703,19 +1106,6 @@ "last_modified": 1771383422828 }, { - "schema": 1771379992866, - "derHash": "48hVL2s5Nmtartt2CKc+P9aNEAwTCcsVcYFD6oaD8lQ=", - "attachment": { - "hash": "20e9f9718ba6acec1bbe1e8b095d4b53b35c79efe52994dec2244c04b49fc187", - "size": 1366, - "filename": "xC5Mppf2n30ntcbkf0_mu7qM2c8gkAWweKnBTAo1aZw=.pem", - "location": "security-state-staging/intermediates/b412deb9-2345-420d-9286-e781b68cbf1a.pem", - "mimetype": "application/x-pem-file" - }, - "id": "3fd60854-54de-441c-ba8a-5d145fb317e7", - "last_modified": 1771383422825 - }, - { "schema": 1771379992530, "derHash": "ekrZ4bot+wj3UqEkAy9wWIaAYumEF4ViPrQTZ4OlP/w=", "attachment": { @@ -1496,19 +1886,6 @@ "last_modified": 1771383422635 }, { - "schema": 1771379971011, - "derHash": "kV1miBHRlcx8lhTcP4KN87KRs15hCrsua0SThi9N43k=", - "attachment": { - "hash": "d1dfcd3b3f42e41a05f041c27d4909d19c9a46c54f7fc371e001a9d7bd0d47d3", - "size": 2463, - "filename": "PXOyA0uXo2z7W15EJ48em_wITc8eGkDuyCeMIUj31FA=.pem", - "location": "security-state-staging/intermediates/598d4331-9fed-442a-8685-ac3f0326bc29.pem", - "mimetype": "application/x-pem-file" - }, - "id": "37a059d7-c2b2-4bbf-80d3-41162a374908", - "last_modified": 1771383422632 - }, - { "schema": 1771379973334, "derHash": "J7EivB2+EsiLGsvrwzAwvbzPTeck7I6CJmUT0Hl8CXo=", "attachment": { @@ -1769,19 +2146,6 @@ "last_modified": 1770821822832 }, { - "schema": 1770346696790, - "derHash": "HKjDKFVANU5XtJo9Xt9UD7syGPlfjQdjZQeta7Hb3Ao=", - "attachment": { - "hash": "77e57a7818d91fa0043b24cf70e7736927a80514f309fba7e97b0fd581466052", - "size": 1772, - "filename": "uu5PB-MS9L3_ffB_PuTG6A-WjsTtTaF52qqjrcHFXRU=.pem", - "location": "security-state-staging/intermediates/e99d8913-57e3-47fc-b420-e1bb140e1909.pem", - "mimetype": "application/x-pem-file" - }, - "id": "66a450eb-a71e-4989-9852-886030dc1083", - "last_modified": 1770350222829 - }, - { "schema": 1770260354511, "derHash": "LWUUTYqDMeioEuzfJHGVYVtr1Vtko/k5lWPI/LnWfKY=", "attachment": { @@ -2393,45 +2757,6 @@ "last_modified": 1770177422928 }, { - "schema": 1769741962634, - "derHash": "vm7uOzd+bSQV2DudjL4oBWGTUB+me76TV2EdSShRhfs=", - "attachment": { - "hash": "9cc57cfffeb2d4dfaa1de4d68bc6df09814a325e82ed7d143d30310367a9959a", - "size": 2292, - "filename": "hzeu34brK_Z0hDKN9XROAdUbOVWhDDdjwk1o0y60PD0=.pem", - "location": "security-state-staging/intermediates/c465f336-bed6-43aa-9841-3c74f30a7fbf.pem", - "mimetype": "application/x-pem-file" - }, - "id": "ac11130c-fe77-446a-a693-069011a3ff4b", - "last_modified": 1769745422772 - }, - { - "schema": 1769741961851, - "derHash": "j0IbhDUhh2lj8aCZ8ogVy9ed0dLH5BRoKpqo4OcmDkE=", - "attachment": { - "hash": "b1a9f9096d11efc3078f02a13e0707c747cf2d94ddd03bccaa1ca72472b49709", - "size": 2304, - "filename": "lGBlQRwFOcsG8uVhM7n4ddbxnH8BwrOV2iSLkMxtjiM=.pem", - "location": "security-state-staging/intermediates/3a073a49-5432-4cca-996d-4447939fee6d.pem", - "mimetype": "application/x-pem-file" - }, - "id": "9a0512f7-cc04-4768-ae1d-8274a5eb20b3", - "last_modified": 1769745422768 - }, - { - "schema": 1769741960777, - "derHash": "JXSMOtggRkJ1OD4W03sO0CbdDrt5LZxvfrwD41/T29Y=", - "attachment": { - "hash": "7ef602046af66442afba2f2c4c0e54ea53ccd3eaa59cd748c1b7b93dae7e9a6f", - "size": 1764, - "filename": "27XPDnbbH9xaiqJl0IvNKmRIPVcH6I5ORN0TMtFjFZk=.pem", - "location": "security-state-staging/intermediates/735dff5f-a936-4fbb-a6ef-bb8eeeb2b535.pem", - "mimetype": "application/x-pem-file" - }, - "id": "fb539b27-5e54-4354-b719-6fc773e3c30b", - "last_modified": 1769745422765 - }, - { "schema": 1769741962217, "derHash": "0bKOoPkz1vHGL4ojk8yx4JRtgg2mRdJhF6T+j/hOuWg=", "attachment": { @@ -17570,24 +17895,6 @@ "last_modified": 1666727873590 }, { - "schema": 1666727415821, - "derHash": "lW/5zJFIdNnK+WVbzLaWwb5Jolv5KNXEHA9TlaE12Lg=", - "subject": "CN=Telekom Security DV RSA CA 21,O=Deutsche Telekom Security GmbH,C=DE", - "subjectDN": "MF4xCzAJBgNVBAYTAkRFMScwJQYDVQQKDB5EZXV0c2NoZSBUZWxla29tIFNlY3VyaXR5IEdtYkgxJjAkBgNVBAMMHVRlbGVrb20gU2VjdXJpdHkgRFYgUlNBIENBIDIx", - "whitelist": false, - "attachment": { - "hash": "acb3894c8cbada20f584e21eba9807c60116c18b1ffb053f0d45638c7fbade05", - "size": 1752, - "filename": "xKFly8BVCDp0QQH2za-7ZzsqYFz305rqc0YqMPtU7Uw=.pem", - "location": "security-state-staging/intermediates/5cc07929-0f31-444c-9904-7e3f405702e3.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "xKFly8BVCDp0QQH2za+7ZzsqYFz305rqc0YqMPtU7Uw=", - "crlite_enrolled": false, - "id": "1c1cd633-821a-4775-9051-53aaf439c3b3", - "last_modified": 1666727873576 - }, - { "schema": 1666727372257, "derHash": "SB5YKiBqfXBAzNoXzyXTSXhaKrlO11UqslTc04sDLsA=", "subject": "CN=Microsoft RSA TLS Issuing AOC CA 01,O=Microsoft Corporation,C=US", @@ -32276,5 +32583,5 @@ "last_modified": 1559865884636 } ], - "timestamp": 1773460622721 + "timestamp": 1775836622756 } diff -Nru thunderbird-140.9.0esr/services/settings/dumps/security-state/onecrl.json thunderbird-140.10.0esr/services/settings/dumps/security-state/onecrl.json --- thunderbird-140.9.0esr/services/settings/dumps/security-state/onecrl.json 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/services/settings/dumps/security-state/onecrl.json 2026-04-21 14:52:59.000000000 +0000 @@ -1,6 +1,96 @@ { "data": [ { + "schema": 1773334942432, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "al735VviUH4QdUeyT9xDUA==", + "id": "6eea1b20-43fc-43a1-b2c7-c8aa04322194", + "last_modified": 1774556199388 + }, + { + "schema": 1773334942363, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "d1PLgIujvMDZUu8CSN8p1w==", + "id": "49be7e0c-8bdb-4892-b80f-c48e8930f6a5", + "last_modified": 1774556199385 + }, + { + "schema": 1773334942292, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "KwA3PBmKPkXTYMbiw/N+2Q==", + "id": "fbd21948-1fb9-42e2-a7cf-9dd3a9c66832", + "last_modified": 1774556199382 + }, + { + "schema": 1773334942222, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "QSesyhEsgEJJ7ytP0Grw4w==", + "id": "5aee5cda-d283-465d-9b63-d03824d9afef", + "last_modified": 1774556199379 + }, + { + "schema": 1773334942153, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBFQ0MgUm9vdCBDQSBSMg==", + "serialNumber": "X+CO4UV3HELJrdgoOeqoPg==", + "id": "1ea836d8-ae1a-4d4d-9ec8-c3ef4fd75011", + "last_modified": 1774556199375 + }, + { + "schema": 1773176482723, + "details": { + "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2022912", + "who": "", + "why": "", + "name": "", + "created": "" + }, + "enabled": false, + "issuerName": "ME0xCzAJBgNVBAYTAkNOMREwDwYDVQQKEwhVbmlUcnVzdDErMCkGA1UEAxMiVW5pVHJ1c3QgR2xvYmFsIFRMUyBSU0EgUm9vdCBDQSBSMQ==", + "serialNumber": "Rz7QaUBcRh0/yc2BLpIg6Q==", + "id": "1a8a8a84-806b-45d9-8da8-61cbb0f7429e", + "last_modified": 1774556199371 + }, + { "schema": 1772730084371, "details": { "bug": "https://bugzilla.mozilla.org/show_bug.cgi?id=2021383", @@ -26894,5 +26984,5 @@ "last_modified": 1480349158647 } ], - "timestamp": 1773176482130 + "timestamp": 1774556199388 } diff -Nru thunderbird-140.9.0esr/servo/components/style/values/specified/calc.rs thunderbird-140.10.0esr/servo/components/style/values/specified/calc.rs --- thunderbird-140.9.0esr/servo/components/style/values/specified/calc.rs 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/servo/components/style/values/specified/calc.rs 2026-04-21 14:53:01.000000000 +0000 @@ -456,6 +456,9 @@ (&Length(ref one), &Length(ref other)) => { return Ok(Leaf::Length(one.try_op(other, op)?)); }, + (&ColorComponent(..), &ColorComponent(..)) => { + return Err(()); + }, _ => { match *other { Number(..) | Percentage(..) | Angle(..) | Time(..) | Length(..) | diff -Nru thunderbird-140.9.0esr/sourcestamp.txt thunderbird-140.10.0esr/sourcestamp.txt --- thunderbird-140.9.0esr/sourcestamp.txt 2026-03-20 19:19:25.000000000 +0000 +++ thunderbird-140.10.0esr/sourcestamp.txt 2026-04-21 14:53:43.000000000 +0000 @@ -1,3 +1,3 @@ -20260320073352 -https://hg.mozilla.org/releases/comm-esr140/rev/8be9f2d3072c225a1e5f153745a18984c2babf8f -https://hg.mozilla.org/releases/mozilla-esr140/rev/ad4a5ceb5516151b4014e2af6c1565c68ab330cc +20260417012335 +https://hg.mozilla.org/releases/comm-esr140/rev/b23998b7b404ff8144a931ada5d315103d0cd932 +https://hg.mozilla.org/releases/mozilla-esr140/rev/a1c8c4081ea0e227dbde64c95ec6942fa71edb28 diff -Nru thunderbird-140.9.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js thunderbird-140.10.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js --- thunderbird-140.9.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/taskcluster/docker/periodic-updates/scripts/genHPKPStaticPins.js 2026-04-21 14:52:59.000000000 +0000 @@ -121,15 +121,7 @@ ); } - let resultDecoded; - try { - resultDecoded = atob(req.responseText); - } catch (e) { - throw new Error( - "ERROR: could not decode data as base64 from '" + filename + "': " + e - ); - } - return resultDecoded; + return req.responseText; } function downloadAsJson(filename) { diff -Nru thunderbird-140.9.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js thunderbird-140.10.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js --- thunderbird-140.9.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js 2026-04-21 14:52:59.000000000 +0000 @@ -17,7 +17,7 @@ ); const SOURCE = - "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/transport_security_state_static.json?format=TEXT"; + "https://raw.githubusercontent.com/chromium/chromium/main/net/http/transport_security_state_static.json"; const TOOL_SOURCE = "https://hg.mozilla.org/mozilla-central/file/default/taskcluster/docker/periodic-updates/scripts/getHSTSPreloadList.js"; const OUTPUT = "nsSTSPreloadList.inc"; @@ -52,17 +52,8 @@ } let text = await resp.text(); - let resultDecoded; - try { - resultDecoded = atob(text); - } catch (e) { - throw new Error( - "ERROR: could not decode data as base64 from '" + SOURCE + "': " + e - ); - } - // we have to filter out '//' comments, while not mangling the json - let result = resultDecoded.replace(/^(\s*)?\/\/[^\n]*\n/gm, ""); + let result = text.replace(/^(\s*)?\/\/[^\n]*\n/gm, ""); let data = null; try { data = JSON.parse(result); diff -Nru thunderbird-140.9.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html thunderbird-140.10.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html --- thunderbird-140.9.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html 2026-03-20 19:18:40.000000000 +0000 +++ thunderbird-140.10.0esr/testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html 2026-04-21 14:52:59.000000000 +0000 @@ -15,6 +15,7 @@
+ Some text
Before image 1
After image 1
diff -Nru thunderbird-140.9.0esr/testing/web-platform/meta/fedcm/lfedcm-identity.create-store-collect.tentative.sub.https.html.ini thunderbird-140.10.0esr/testing/web-platform/meta/fedcm/lfedcm-identity.create-store-collect.tentative.sub.https.html.ini --- thunderbird-140.9.0esr/testing/web-platform/meta/fedcm/lfedcm-identity.create-store-collect.tentative.sub.https.html.ini 2026-03-20 19:18:41.000000000 +0000 +++ thunderbird-140.10.0esr/testing/web-platform/meta/fedcm/lfedcm-identity.create-store-collect.tentative.sub.https.html.ini 2026-04-21 14:53:01.000000000 +0000 @@ -1,6 +1,7 @@ [lfedcm-identity.create-store-collect.tentative.sub.https.html] expected: if (os == "mac") and not debug: [OK, TIMEOUT] + if asan or tsan: TIMEOUT [Collecting from no providers yields a promise with null resolution] expected: FAIL @@ -10,7 +11,9 @@ [Credentials can be collected silently, but preventSilentAccess is respected] expected: if (os == "mac") and not debug: [PASS, NOTRUN] + if asan or tsan: NOTRUN [Cross-origin identity credential collection is correctly filtered when the type does not match] expected: if (os == "mac") and not debug: [PASS, TIMEOUT] + if asan or tsan: TIMEOUT diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/call/BUILD.gn thunderbird-140.10.0esr/third_party/libwebrtc/call/BUILD.gn --- thunderbird-140.9.0esr/third_party/libwebrtc/call/BUILD.gn 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/call/BUILD.gn 2026-04-21 14:53:07.000000000 +0000 @@ -590,6 +590,7 @@ "../api/video:video_codec_constants", "../api/video:video_frame", "../api/video:video_frame_type", + "../api/video:video_layers_allocation", "../api/video:video_rtp_headers", "../api/video_codecs:video_codecs_api", "../audio", diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/call/rtp_video_sender.cc thunderbird-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/call/rtp_video_sender.cc 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender.cc 2026-04-21 14:53:07.000000000 +0000 @@ -699,6 +699,11 @@ transport_queue_.PostTask( SafeTask(safety_.flag(), [this, sending = std::move(sending)] { RTC_DCHECK_RUN_ON(&transport_checker_); + // It's possible for another task to be scheduled on the transport + // checker ahead of this call that makes the sender not active. + if (!IsActive()) { + return; + } RTC_CHECK_EQ(sending.size(), rtp_streams_.size()); for (size_t i = 0; i < sending.size(); ++i) { SetModuleIsActive(sending[i], *rtp_streams_[i].rtp_rtcp); diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc thunderbird-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/call/rtp_video_sender_unittest.cc 2026-04-21 14:53:06.000000000 +0000 @@ -38,6 +38,7 @@ #include "api/video/encoded_image.h" #include "api/video/video_codec_type.h" #include "api/video/video_frame_type.h" +#include "api/video/video_layers_allocation.h" #include "api/video_codecs/video_encoder.h" #include "call/rtp_config.h" #include "call/rtp_transport_config.h" @@ -1670,4 +1671,73 @@ EXPECT_EQ(retransmitted_rtp_sequence_numbers, base_rtp_sequence_numbers); } +TEST(RtpVideoSenderTest, PostTaskRaceDoesNotLeadToDanglingPointer) { + NiceMock transport; + NiceMock encoder_feedback; + + GlobalSimulatedTimeController time_controller(Timestamp::Millis(1000000)); + Environment env = CreateEnvironment(time_controller.GetClock(), + time_controller.CreateTaskQueueFactory()); + + VideoSendStream::Config config(&transport); + config.rtp.ssrcs = {kSsrc1}; + + SendStatisticsProxy stats_proxy( + time_controller.GetClock(), config, + VideoEncoderConfig::ContentType::kRealtimeVideo, env.field_trials()); + + BitrateConstraints bitrate_config = GetBitrateConfig(); + RtpTransportConfig transport_config{.env = env, + .bitrate_config = bitrate_config}; + RtpTransportControllerSend transport_controller(transport_config); + transport_controller.EnsureStarted(); + + RateLimiter retransmission_rate_limiter(time_controller.GetClock(), + kRetransmitWindowSizeMs); + + std::map suspended_ssrcs; + std::map suspended_payload_states; + + auto router = std::make_unique( + env, time_controller.GetMainThread(), suspended_ssrcs, + suspended_payload_states, config.rtp, config.rtcp_report_interval_ms, + &transport, + CreateObservers(&encoder_feedback, &stats_proxy, &stats_proxy, + &stats_proxy, nullptr, &stats_proxy), + &transport_controller, &retransmission_rate_limiter, + std::make_unique(env), nullptr, CryptoOptions{}, + nullptr); + + router->SetSending(true); + // Verify it's registered + EXPECT_TRUE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); + + // Trigger race: + // 1. OnVideoLayersAllocationUpdated posts a task to re-register modules + // because it sees active_ is true. + VideoLayersAllocation allocation; + allocation.active_spatial_layers.push_back({.rtp_stream_index = 0}); + router->OnVideoLayersAllocationUpdated(allocation); + + // 2. Immediately set active_ to false. This happens BEFORE the posted task + // runs. + router->SetSending(false); + + // 3. Let the posted task run. With the fix, it should return early and not + // re-register the module because active_ is now false. + time_controller.AdvanceTime(TimeDelta::Zero()); + + // 4. Verify that PacketRouter does NOT have a sender. + EXPECT_FALSE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); + + // 5. Destroy the router. + router.reset(); + + // 6. Verify that PacketRouter still does not have a sender. + EXPECT_FALSE( + transport_controller.packet_router()->SsrcOfFirstSender().has_value()); +} + } // namespace webrtc diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc thunderbird-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.cc 2026-04-21 14:53:07.000000000 +0000 @@ -230,14 +230,21 @@ RTC_DCHECK_EQ(padding_size_, 0); RTC_DCHECK_LE(csrcs.size(), 0x0fu); RTC_DCHECK_LE(kFixedHeaderSize + 4 * csrcs.size(), capacity()); + + if (csrcs.size() > kMaxCsrcs) { + RTC_LOG(LS_WARNING) << "Truncating CSRC list to spec length " << kMaxCsrcs + << " from " << csrcs.size(); + csrcs = csrcs.subview(0, kMaxCsrcs); + } + payload_offset_ = kFixedHeaderSize + 4 * csrcs.size(); + buffer_.SetSize(payload_offset_); WriteAt(0, (data()[0] & 0xF0) | dchecked_cast(csrcs.size())); size_t offset = kFixedHeaderSize; for (uint32_t csrc : csrcs) { ByteWriter::WriteBigEndian(WriteAt(offset), csrc); offset += 4; } - buffer_.SetSize(payload_offset_); } rtc::ArrayView RtpPacket::AllocateRawExtension(int id, size_t length) { diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h thunderbird-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h --- thunderbird-140.9.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_packet.h 2026-04-21 14:53:07.000000000 +0000 @@ -27,6 +27,12 @@ using ExtensionType = RTPExtensionType; using ExtensionManager = RtpHeaderExtensionMap; + // Maximum number of CSRCs in an RTP packet as specified in section + // "5.1 RTP Fixed Header Fields" of RFC 3550. + // Note: This is a different limit than the one that applies to RTCP packets + // (which is specified in section 6.1). + static constexpr size_t kMaxCsrcs = 15; + // `extensions` required for SetExtension/ReserveExtension functions during // packet creating and used if available in Parse function. // Adding and getting extensions will fail until `extensions` is diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc thunderbird-140.10.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/modules/video_coding/codecs/av1/dav1d_decoder.cc 2026-04-21 14:53:07.000000000 +0000 @@ -71,9 +71,6 @@ constexpr char kDav1dName[] = "dav1d"; -// Calling `dav1d_data_wrap` requires a `free_callback` to be registered. -void NullFreeCallback(const uint8_t* /* buffer */, void* /* opaque */) {} - Dav1dDecoder::Dav1dDecoder() = default; Dav1dDecoder::~Dav1dDecoder() { @@ -127,9 +124,25 @@ ScopedDav1dData scoped_dav1d_data; Dav1dData& dav1d_data = scoped_dav1d_data.Data(); - dav1d_data_wrap(&dav1d_data, encoded_image.data(), encoded_image.size(), - /*free_callback=*/&NullFreeCallback, - /*user_data=*/nullptr); + + // Calling GetEncodedData will create a new `scoped_refptr` and increment the + // ref count. By simply releasing we are now responsible for decrementing + // the ref count when appropriate, which is when dav1d calls the + // `free_callback` to indicate that the buffer is no longer needed. + EncodedImageBufferInterface* bitstream_buffer = + encoded_image.GetEncodedData().release(); + + // Note that the `bitstream_buffer` can have a higher capacity than what is + // actually being used, so `encoded_image.size()` should be used to get the + // actual size of the bitstream. + dav1d_data_wrap( + &dav1d_data, encoded_image.data(), encoded_image.size(), + /*free_callback=*/ + [](const uint8_t* /* buffer */, void* user_data) { + auto* bb = static_cast(user_data); + bb->Release(); + }, + /*user_data=*/bitstream_buffer); if (int decode_res = dav1d_send_data(context_, &dav1d_data)) { RTC_LOG(LS_WARNING) diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg thunderbird-140.10.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg --- thunderbird-140.9.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/moz-patch-stack/77d265670f.no-op-cherry-pick-msg 2026-04-21 14:53:07.000000000 +0000 @@ -0,0 +1 @@ +We cherry-picked this in bug 2029776 diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc 2026-03-20 19:18:46.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.cc 2026-04-21 14:53:07.000000000 +0000 @@ -133,6 +133,9 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery) { + bool cumulative_tsn_ack_advanced = + cumulative_tsn_ack > last_cumulative_tsn_ack_; + OutstandingData::AckInfo ack_info(cumulative_tsn_ack); // Erase all items up to cumulative_tsn_ack. RemoveAcked(cumulative_tsn_ack, ack_info); @@ -142,7 +145,7 @@ // NACK and possibly mark for retransmit chunks that weren't acked. NackBetweenAckBlocks(cumulative_tsn_ack, gap_ack_blocks, is_in_fast_recovery, - ack_info); + cumulative_tsn_ack_advanced, ack_info); RTC_DCHECK(IsConsistent()); return ack_info; @@ -215,6 +218,7 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery, + bool cumulative_tsn_acked_advanced, OutstandingData::AckInfo& ack_info) { // Mark everything between the blocks as NACKED/TO_BE_RETRANSMITTED. // https://tools.ietf.org/html/rfc4960#section-7.2.4 @@ -227,7 +231,7 @@ // in-flight and between gaps should be nacked. This means that SCTP relies on // the T3-RTX-timer to re-send packets otherwise. UnwrappedTSN max_tsn_to_nack = ack_info.highest_tsn_acked; - if (is_in_fast_recovery && cumulative_tsn_ack > last_cumulative_tsn_ack_) { + if (is_in_fast_recovery && cumulative_tsn_acked_advanced) { // https://tools.ietf.org/html/rfc4960#section-7.2.4 // "If an endpoint is in Fast Recovery and a SACK arrives that advances // the Cumulative TSN Ack Point, the miss indications are incremented for @@ -242,7 +246,8 @@ UnwrappedTSN cur_block_first_acked = UnwrappedTSN::AddTo(cumulative_tsn_ack, block.start); for (UnwrappedTSN tsn = prev_block_last_acked.next_value(); - tsn < cur_block_first_acked && tsn <= max_tsn_to_nack; + tsn < cur_block_first_acked && tsn <= max_tsn_to_nack && + tsn < next_tsn(); tsn = tsn.next_value()) { ack_info.has_packet_loss |= NackItem(tsn, /*retransmit_now=*/false, diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h --- thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/outstanding_data.h 2026-04-21 14:53:07.000000000 +0000 @@ -320,6 +320,7 @@ UnwrappedTSN cumulative_tsn_ack, rtc::ArrayView gap_ack_blocks, bool is_in_fast_recovery, + bool cumulative_tsn_acked_advanced, OutstandingData::AckInfo& ack_info); // Process the acknowledgement of the chunk referenced by `iter` and updates diff -Nru thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc --- thunderbird-140.9.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc 2026-03-20 19:18:47.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/libwebrtc/net/dcsctp/tx/retransmission_queue.cc 2026-04-21 14:53:06.000000000 +0000 @@ -252,6 +252,14 @@ } else if (cumulative_tsn_ack > outstanding_data_.highest_outstanding_tsn()) { return false; } + + for (const auto& block : sack.gap_ack_blocks()) { + if (UnwrappedTSN::AddTo(cumulative_tsn_ack, block.end) > + outstanding_data_.highest_outstanding_tsn()) { + return false; + } + } + return true; } diff -Nru thunderbird-140.9.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json thunderbird-140.10.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json --- thunderbird-140.9.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/rust/cubeb-coreaudio/.cargo-checksum.json 2026-04-21 14:53:07.000000000 +0000 @@ -1 +1 @@ -{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"f408ea934a20f5a24372fdcaa3bbc113713239fdb32323de0fd6334034c25e46","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file +{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"63b221c28d209afb8dfc53191b61f7ba9d3faa1591fddb5547e4c400301a8138","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"967448b6cd46a8e60d465d56be0b1e6794a18110592a30939d2cb0650c4e5bc6","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"3e2b5d1fa24130a9b14d6761b443fc7d1ed2f7884c545013ed2d048a1de2c3e6","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"6f38a9e3d5b8864e9f921a47fa7655d9322ecf8789a63560fb2f5fcc63076d33","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"bb4f7df992d915723222f62a4f995896cce861821c73351d831cb01a34cef0c4","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"e388a37edd5f53cda04fe1ac8bf033e423c6604014792177c623c8456fe5d257","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/sync_callback.rs":"20e7ba57714c0d2bff3bc8d3a912f17fdab293737bc729eae1684070b90b72c4","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"9f4f486b3d59081747785dae4828ec22a4ecbab755ac4c09ff2c0c065865a358","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"be88c967e470bf6c120f3e42f7155fe89a4718f56a35524ea4c17181856757d5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file diff -Nru thunderbird-140.9.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs thunderbird-140.10.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs --- thunderbird-140.9.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/third_party/rust/cubeb-coreaudio/src/backend/aggregate_device.rs 2026-04-21 14:53:07.000000000 +0000 @@ -334,17 +334,19 @@ return Err(Error::from(status)); } - let cleanup = || { + let _teardown = finally(|| { let status = audio_object_remove_property_listener( device_id, &address, devices_changed_callback, data_ptr as *mut c_void, ); + // kAudioHardwareBadObjectError implies device_id is somehow dead, + // so its listener should receive nothing. + assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); sync_callback_registry_unregister(data_ptr as usize); unsafe { drop(Box::from_raw(data_ptr)) }; - status - }; + }); Self::set_sub_devices(device_id, input_id, output_id)?; @@ -362,10 +364,6 @@ ); } if *dev != device_id { - let status = cleanup(); - // If the error is kAudioHardwareBadObjectError, it implies `device_id` is somehow - // dead, so its listener should receive nothing. It's ok to leave here. - assert!(status == NO_ERR || status == (kAudioHardwareBadObjectError as OSStatus)); return Err(Error::from(waiting_time)); } } @@ -386,8 +384,6 @@ NO_ERR } - let status = cleanup(); - assert_eq!(status, NO_ERR); Ok(()) } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/af/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/af/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/af/manifest.json 2026-03-24 16:59:39.675541600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/af/manifest.json 2026-04-23 05:16:28.771449800 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Afrikaans", "description": "Thunderbird Language Pack for Afrikaans (af)", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "af": { - "version": "20260320084329", + "version": "20260417022705", "chrome_resources": { "alerts": "chrome/af/locale/af/alerts/", "autoconfig": "chrome/af/locale/af/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ar/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ar/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ar/manifest.json 2026-03-24 16:59:39.732164400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ar/manifest.json 2026-04-23 05:16:28.826432700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: العربية (Arabic)", "description": "Thunderbird Language Pack for العربية (ar) – Arabic", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ar": { - "version": "20260320084541", + "version": "20260417022922", "chrome_resources": { "alerts": "chrome/ar/locale/ar/alerts/", "autoconfig": "chrome/ar/locale/ar/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ast/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ast/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ast/manifest.json 2026-03-24 16:59:39.785835000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ast/manifest.json 2026-04-23 05:16:28.875102300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Asturianu (Asturian)", "description": "Thunderbird Language Pack for Asturianu (ast) – Asturian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ast": { - "version": "20260320084734", + "version": "20260417023121", "chrome_resources": { "alerts": "chrome/ast/locale/ast/alerts/", "autoconfig": "chrome/ast/locale/ast/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/addressbook/pref-directory-add.dtd thunderbird-140.10.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/addressbook/pref-directory-add.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/addressbook/pref-directory-add.dtd 2026-03-24 16:59:39.801162500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/addressbook/pref-directory-add.dtd 2026-04-23 05:16:28.889559700 +0000 @@ -26,7 +26,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/imapMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/imapMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/imapMsgs.properties 2026-03-24 16:59:39.805383700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/be/chrome/be/locale/be/messenger/imapMsgs.properties 2026-04-23 05:16:28.893824000 +0000 @@ -19,7 +19,7 @@ imapGettingMailboxInfo = Атрыманне інфармацыі пра канфігурацыю паштовай скрынкі… imapEmptyMimePart = Гэта частка цела будзе спампоўвацца па патрабаванні. imapReceivingMessageHeaders3 = Спампоўка загалоўка паведамлення %1$S з %2$S у %3$S… -imapReceivingMessageFlags3 = Downloading message flag %1$S of %2$S in %3$S… +imapReceivingMessageFlags3 = Сцягванне флагу паведамлення %1$S з %2$S у %3$S… imapDeletingMessages = Выдаленне паведамленняў… imapDeletingMessage = Выдаленне паведамлення… imapMovingMessages = Перамяшчэнне паведамленняў у %S… diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/be/localization/be/messenger/preferences/languages.ftl thunderbird-140.10.0esr/thunderbird-l10n/be/localization/be/messenger/preferences/languages.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/be/localization/be/messenger/preferences/languages.ftl 2026-03-24 16:59:39.830823400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/be/localization/be/messenger/preferences/languages.ftl 2026-04-23 05:16:28.916784500 +0000 @@ -0,0 +1,18 @@ +languages-customize-remove = + .label = Выдаліць + .accesskey = В +languages-customize-select-language = + .placeholder = Выбраць мову для дадання… +languages-customize-add = + .label = Дадаць + .accesskey = Д +messenger-languages-dialog-title = Налады мовы { -brand-short-name } +messenger-languages-description = { -brand-short-name } тыпова будзе паказваць старонкі першай мовай у спісе, а іншыя мовы, калі спатрэбіцца, у азначаным парадку. +messenger-languages-search = Пошук іншых моў ... +messenger-languages-searching = + .label = Пошук моў ... +messenger-languages-downloading = + .label = Сцягванне… +messenger-languages-installed-label = Усталяваныя мовы +messenger-languages-available-label = Даступныя мовы +messenger-languages-error = { -brand-short-name } не можа абнавіць вашы мовы прама зараз. Праверце сваё злучэнне з інтэрнэтам або паспрабуйце ізноў. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/be/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/be/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/be/manifest.json 2026-03-24 16:59:39.842328800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/be/manifest.json 2026-04-23 05:16:28.927821400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Беларуская (Belarusian)", "description": "Thunderbird Language Pack for Беларуская (be) – Belarusian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "be": { - "version": "20260320084930", + "version": "20260417023323", "chrome_resources": { "alerts": "chrome/be/locale/be/alerts/", "autoconfig": "chrome/be/locale/be/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/bg/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/bg/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/bg/manifest.json 2026-03-24 16:59:39.901784000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/bg/manifest.json 2026-04-23 05:16:28.982705000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Български (Bulgarian)", "description": "Thunderbird Language Pack for Български (bg) – Bulgarian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "bg": { - "version": "20260320085126", + "version": "20260417023526", "chrome_resources": { "alerts": "chrome/bg/locale/bg/alerts/", "autoconfig": "chrome/bg/locale/bg/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/br/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/br/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/br/manifest.json 2026-03-24 16:59:39.956821000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/br/manifest.json 2026-04-23 05:16:29.032544900 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Brezhoneg (Breton)", "description": "Thunderbird Language Pack for Brezhoneg (br) – Breton", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "br": { - "version": "20260320083926", + "version": "20260417023012", "chrome_resources": { "alerts": "chrome/br/locale/br/alerts/", "autoconfig": "chrome/br/locale/br/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ca/localization/ca/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/ca/localization/ca/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ca/localization/ca/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:39.998084800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ca/localization/ca/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:29.072703100 +0000 @@ -14,6 +14,7 @@ openpgp-passphrase-instruction-user-passphrase = Desbloca aquesta clau per canviar-ne la protecció. openpgp-passphrase-unlocked = La clau s'ha desblocat correctament. key-type-primary = clau principal +need-online = La funció que has seleccionat no està disponible en mode fora de línia. Connecteu-vos a Internet i torneu-ho a provar. passphrase-prompt2 = Introduïu la contrasenya per desblocar la clau secreta amb l'identificador { $key }, creat { $date }, { $username_and_email } passphrase-prompt2-sub = Introduïu la contrasenya per desblocar la clau secreta amb l'identificador { $subkey }, que és una subclau de l'identificador de clau { $key }, creat { $date }, { $username_and_email } do-import-multiple = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ca/localization/ca/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/ca/localization/ca/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ca/localization/ca/messenger/preferences/preferences.ftl 2026-03-24 16:59:40.000460000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ca/localization/ca/messenger/preferences/preferences.ftl 2026-04-23 05:16:29.075098300 +0000 @@ -37,7 +37,7 @@ privacy-passwords-header = Contrasenyes privacy-junk-header = Correu brossa collection-header = Ús i recollida de dades i del { -brand-short-name } -collection-description = Ens esforcem per oferir-vos opcions i recollir només allò que necessitem per proporcionar i millorar el { -brand-short-name } per a tothom. Sempre demanem permís abans de rebre informació personal. +collection-description = Ens esforcem per oferir-vos opcions i només recollim allò que necessitem per proporcionar i millorar el { -brand-short-name } per a tothom. Sempre demanem permís abans de rebre informació personal. collection-privacy-notice = Avís de privadesa collection-health-report-telemetry-disabled = Ja no permeteu a { -vendor-short-name } capturar dades tècniques i d'interacció. Totes les dades antigues se suprimiran d'aquí a 30 dies. collection-health-report-telemetry-disabled-link = Més informació diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ca/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ca/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ca/manifest.json 2026-03-24 16:59:40.010373600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ca/manifest.json 2026-04-23 05:16:29.085002200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Català (Catalan)", "description": "Thunderbird Language Pack for Català (ca) – Catalan", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ca": { - "version": "20260320084141", + "version": "20260417023235", "chrome_resources": { "alerts": "chrome/ca/locale/ca/alerts/", "autoconfig": "chrome/ca/locale/ca/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cak/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/cak/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/cak/manifest.json 2026-03-24 16:59:40.061430000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cak/manifest.json 2026-04-23 05:16:29.135573000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Kaqchikel", "description": "Thunderbird Language Pack for Kaqchikel (cak)", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "cak": { - "version": "20260320084341", + "version": "20260417023443", "chrome_resources": { "alerts": "chrome/cak/locale/cak/alerts/", "autoconfig": "chrome/cak/locale/cak/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/calendar/calendar.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/calendar/calendar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/calendar/calendar.ftl 2026-03-24 16:59:40.092401000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/calendar/calendar.ftl 2026-04-23 05:16:29.167246300 +0000 @@ -124,7 +124,7 @@ cal-dav-request-status-code-string-409 = Konflikt zdrojů. cal-dav-request-status-code-string-412 = Chyba v předpokladech. cal-dav-request-status-code-string-500 = Vnitřní chyba serveru. -cal-dav-request-status-code-string-502 = Chybná brána (pravděpodobně chybná konfigurace proxy). +cal-dav-request-status-code-string-502 = Špatná brána (pravděpodobně chybná konfigurace proxy serveru). cal-dav-request-status-code-string-503 = Vnitřní chyba serveru (pravděpodobně je server přetížen). cal-dav-redirect-title = Aktualizovat umístění pro kalendář { $name }? cal-dav-redirect-text = Požadavky pro { $name } byly přesměrovány do nového umístění. Chcete změnit umístění následující hodnoty? diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/about3Pane.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/about3Pane.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/about3Pane.ftl 2026-03-24 16:59:40.096382600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/about3Pane.ftl 2026-04-23 05:16:29.173233000 +0000 @@ -22,7 +22,7 @@ thread-pane-header-context-cards-view = .label = Zobrazení karet thread-pane-header-context-hide = - .label = Skrýt hlavičku seznamu zpráv + .label = Skrýt záhlaví seznamu zpráv quick-filter-bar-sticky = .title = Při změně složky ponechat zvolený filtr quick-filter-bar-dropdown = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/aboutSupportMail.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/aboutSupportMail.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/aboutSupportMail.ftl 2026-03-24 16:59:40.097224200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/aboutSupportMail.ftl 2026-04-23 05:16:29.174081300 +0000 @@ -11,7 +11,7 @@ accounts-default = Výchozí? identity-name = Identita send-via-email = Odeslat emailem -app-basics-telemetry = Telemetrická data +app-basics-telemetry = Telemetrické údaje app-basics-glean = Údaje Glean app-basics-cache-use = Užití mezipaměti mail-libs-title = Knihovny diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/accountcreation/accountHub.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/accountcreation/accountHub.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/accountcreation/accountHub.ftl 2026-03-24 16:59:40.097642400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/accountcreation/accountHub.ftl 2026-04-23 05:16:29.174544000 +0000 @@ -1,6 +1,6 @@ account-hub-brand = { -brand-full-name } account-hub-welcome-line = Vítá vás { -brand-full-name } -account-hub-title = Účty +account-hub-title = Centrum účtů account-hub-release-notes = Poznámky k vydání account-hub-support = Podpora account-hub-donate = Přispějte @@ -122,7 +122,7 @@ account-hub-addon-error = Instalace doplňku se nezdařila. Zkuste to prosím znovu nebo se obraťte na autora doplňku. account-hub-security-warning = Varování: Zjištěn nezabezpečený poštovní server. Tento server postrádá šifrování, v důsledku toho může být vyzrazeno vaše heslo a data. Pro zabezpečení připojení kontaktujte správce nebo pokračujte na vlastní nebezpečí. Další informace najdete v často kladených otázkách. account-hub-account-authentication-error = Chyba autentizace. -account-hub-add-address-book = Přidat složku kontaktů +account-hub-add-address-book = Přidání složky kontaktů address-book-sync-existing-icon = .alt = Synchronizace adresáře z existujícího účtu address-book-sync-existing = Synchronizace z existujícího účtu diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/appmenu.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/appmenu.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/appmenu.ftl 2026-03-24 16:59:40.098446100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/appmenu.ftl 2026-04-23 05:16:29.175397900 +0000 @@ -88,7 +88,7 @@ .label = Zobrazit .accesskey = Z appmenuitem-toggle-thread-pane-header = - .label = Hlavička seznamu zpráv + .label = Záhlaví seznamu zpráv appmenu-font-size-value = Velikost písma appmenu-mail-uidensity-value = Hustota appmenu-uidensity-compact = @@ -116,8 +116,8 @@ .label = Exportovat .accesskey = E appmenu-export-for-mobile = - .label = Exportovat pro mobily - .accesskey = E + .label = Exportovat do mobilu + .accesskey = m appmenu-tools-message-search = .label = Hledat ve zprávách .accesskey = H diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/menubar.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/menubar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/menubar.ftl 2026-03-24 16:59:40.099762400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/menubar.ftl 2026-04-23 05:16:29.176891600 +0000 @@ -8,8 +8,8 @@ .label = Doplňky a vzhledy .accesskey = a menu-export-for-mobile = - .label = Exportovat pro mobily… - .accesskey = E + .label = Exportovat do mobilu… + .accesskey = m menu-help-help-title = .label = Nápověda .accesskey = N @@ -83,8 +83,8 @@ .label = Záhlaví podokna složek .accesskey = Z menu-view-toggle-thread-pane-header = - .label = Hlavička seznamu zpráv - .accesskey = H + .label = Záhlaví seznamu zpráv + .accesskey = h menu-font-size-label = .label = Velikost písma .accesskey = o diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp-frontend.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp-frontend.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp-frontend.ftl 2026-03-24 16:59:40.101372200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp-frontend.ftl 2026-04-23 05:16:29.178561400 +0000 @@ -1,6 +1,6 @@ openpgp-manage-keys-openpgp-cmd = .label = Správce klíčů OpenPGP - .accesskey = S + .accesskey = k openpgp-ctx-decrypt-open = .label = Dešifrovat a otevřít .accesskey = o diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:40.101604200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:29.178833000 +0000 @@ -503,7 +503,7 @@ fail-key-import = Chyba: Importování klíče selhalo file-write-failed = Zápis do souboru { $output } selhal no-pgp-block = Chyba: Nenalezen platný blok dat OpenPGP -imported-secret-with-unsupported-features = Některé z importovaných tajných klíčů propagují nepodporovanou funkci. Pokud takový klíč použijete jako svůj osobní klíč, mohou vám korespondenti posílat e-maily nebo veřejné klíče v nekompatibilním formátu. To se týká importovaných tajných klíčů s následujícími otisky prstů: { $fingerprints }. +imported-secret-with-unsupported-features = Některé z importovaných tajných klíčů obsahují nepodporovanou funkci. Pokud takový klíč použijete jako svůj osobní klíč, mohou vám korespondenti zasílat e-maily nebo veřejné klíče v nekompatibilním formátu. To se týká importovaných tajných klíčů s následujícími otisky: { $fingerprints }. help-button = Nápověda key-valid-unknown = není známo key-valid-invalid = vadný diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/cs/localization/cs/messenger/preferences/preferences.ftl 2026-03-24 16:59:40.104153900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/localization/cs/messenger/preferences/preferences.ftl 2026-04-23 05:16:29.181770000 +0000 @@ -24,9 +24,9 @@ pane-sync-title = Synchronizace category-sync = .tooltiptext = Synchronizace -pane-qr-export-title = Export pro mobily +pane-qr-export-title = Export do mobilu category-qr-export = - .tooltiptext = Exportovat pro mobily + .tooltiptext = Exportovat do mobilu general-language-and-fonts-header = Jazyk a písma general-incoming-mail-header = Příchozí pošta general-files-and-attachment-header = Soubory a přílohy @@ -45,8 +45,8 @@ privacy-junk-header = Nevyžádaná collection-header = { -brand-short-name.case-status -> - [with-cases] Sběr a použití údajů ve { -brand-short-name(case: "loc") } - *[no-cases] Sběr a použití údajů v aplikaci { -brand-short-name } + [with-cases] Sběr a použití údajů o { -brand-short-name(case: "loc") } + *[no-cases] Sběr a použití údajů o aplikaci { -brand-short-name } } collection-description = { -brand-short-name.case-status -> @@ -826,7 +826,7 @@ qr-export-description = Rychle přeneste nastavení účtu z počítače do mobilu vygenerováním QR kódu. Vyberte, které účty chcete zahrnout, rozhodněte, zda chcete přenést heslo, a naskenujte kód pomocí mobilního zařízení. Rychlé, bezpečné a jednoduché. qr-export-get-app = Ještě nemáte { -brand-product-name } v mobilu? Stáhněte si ji z Google Play qr-export-create = Vytvoření QR kódu pro export účtů -qr-export-select-accounts = Vyberte, které účty chcete exportovat: +qr-export-select-accounts = Vyberte, které účty se mají exportovat: qr-export-no-accounts = Nevidíte všechny své účty? Některé účty mohou být zakázány, protože je { -brand-product-name } pro Android nepodporuje. Podpora qr-export-accounts-legend = E-mailové účty qr-export-select-all-accounts = Vybrat vše @@ -834,7 +834,7 @@ qr-export-include-passwords = Zahrnout hesla všech účtů qr-export-oauth-warning = Některé vaše účty používají metodu ověřování, která může vyžadovat opětovné ověření na vašem mobilním zařízení. Během tohoto procesu může být nutné znovu zadat hesla. qr-export-security-hint = Naskenováním následujících QR kódů se bezpečně přenesou nastavení vašeho účtu včetně e-mailu a hesla. Během tohoto procesu neshromažďujeme, neukládáme ani nesdílíme žádné z těchto údajů. Přenos probíhá přímo mezi vašimi zařízeními. -qr-export-security-warning = V zájmu své bezpečnosti se ujistěte, že jste v soukromí, a skenujte pouze QR kódy z důvěryhodných zdrojů. +qr-export-security-warning = V zájmu své bezpečnosti se ujistěte, že máte soukromí, přičemž skenujte pouze QR kódy pocházející z důvěryhodných zdrojů. qr-export-start-export = Exportovat qr-export-scan-progress = { $count -> diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cs/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/cs/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/cs/manifest.json 2026-03-24 16:59:40.114390900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cs/manifest.json 2026-04-23 05:16:29.192350100 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Čeština (Czech)", "description": "Thunderbird Language Pack for Čeština (cs) – Czech", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "cs": { - "version": "20260320084542", + "version": "20260417023657", "chrome_resources": { "alerts": "chrome/cs/locale/cs/alerts/", "autoconfig": "chrome/cs/locale/cs/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/cy/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/cy/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/cy/manifest.json 2026-03-24 16:59:40.166074800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/cy/manifest.json 2026-04-23 05:16:29.245530400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Cymraeg (Welsh)", "description": "Thunderbird Language Pack for Cymraeg (cy) – Welsh", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "cy": { - "version": "20260320084742", + "version": "20260417023909", "chrome_resources": { "alerts": "chrome/cy/locale/cy/alerts/", "autoconfig": "chrome/cy/locale/cy/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/da/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/da/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/da/manifest.json 2026-03-24 16:59:40.217594400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/da/manifest.json 2026-04-23 05:16:29.299006700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Dansk (Danish)", "description": "Thunderbird Language Pack for Dansk (da) – Danish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "da": { - "version": "20260320083844", + "version": "20260417023016", "chrome_resources": { "alerts": "chrome/da/locale/da/alerts/", "autoconfig": "chrome/da/locale/da/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/de/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/de/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/de/manifest.json 2026-03-24 16:59:40.269448800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/de/manifest.json 2026-04-23 05:16:29.351820500 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Deutsch (German)", "description": "Thunderbird Language Pack for Deutsch (de) – German", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "de": { - "version": "20260320084125", + "version": "20260417023249", "chrome_resources": { "alerts": "chrome/de/locale/de/alerts/", "autoconfig": "chrome/de/locale/de/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/dsb/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/dsb/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/dsb/manifest.json 2026-03-24 16:59:40.321418000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/dsb/manifest.json 2026-04-23 05:16:29.406121000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Dolnoserbšćina (Lower Sorbian)", "description": "Thunderbird Language Pack for Dolnoserbšćina (dsb) – Lower Sorbian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "dsb": { - "version": "20260320084354", + "version": "20260417023522", "chrome_resources": { "alerts": "chrome/dsb/locale/dsb/alerts/", "autoconfig": "chrome/dsb/locale/dsb/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/el/localization/el/messenger/preferences/languages.ftl thunderbird-140.10.0esr/thunderbird-l10n/el/localization/el/messenger/preferences/languages.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/el/localization/el/messenger/preferences/languages.ftl 2026-03-24 16:59:40.364480500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/el/localization/el/messenger/preferences/languages.ftl 2026-04-23 05:16:29.449996700 +0000 @@ -14,7 +14,7 @@ .accesskey = Π messenger-languages-dialog-title = Ρυθμίσεις γλώσσας του { -brand-short-name } messenger-languages-description = Το { -brand-short-name } θα εμφανίζει την πρώτη γλώσσα ως την προεπιλεγμένη και θα προβάλει εναλλακτικές γλώσσες με τη σειρά που φαίνονται, αν είναι απαραίτητο. -messenger-languages-search = Αναζήτηση για περισσότερες γλώσσες… +messenger-languages-search = Αναζήτηση περισσότερων γλωσσών… messenger-languages-searching = .label = Αναζήτηση για γλώσσες… messenger-languages-downloading = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/el/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/el/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/el/manifest.json 2026-03-24 16:59:40.375577400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/el/manifest.json 2026-04-23 05:16:29.461453700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Ελληνικά (Greek)", "description": "Thunderbird Language Pack for Ελληνικά (el) – Greek", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "el": { - "version": "20260320084621", + "version": "20260417023741", "chrome_resources": { "alerts": "chrome/el/locale/el/alerts/", "autoconfig": "chrome/el/locale/el/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/en-CA/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/en-CA/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/en-CA/manifest.json 2026-03-24 16:59:40.426369200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/en-CA/manifest.json 2026-04-23 05:16:29.514862800 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: English (CA)", "description": "Thunderbird Language Pack for English (CA) (en-CA)", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "en-CA": { - "version": "20260320084848", + "version": "20260417023953", "chrome_resources": { "alerts": "chrome/en-CA/locale/en-CA/alerts/", "autoconfig": "chrome/en-CA/locale/en-CA/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/en-GB/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/en-GB/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/en-GB/manifest.json 2026-03-24 16:59:40.477330000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/en-GB/manifest.json 2026-04-23 05:16:29.567067400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: English (GB)", "description": "Thunderbird Language Pack for English (GB) (en-GB)", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "en-GB": { - "version": "20260320083841", + "version": "20260417023011", "chrome_resources": { "alerts": "chrome/en-GB/locale/en-GB/alerts/", "autoconfig": "chrome/en-GB/locale/en-GB/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/es-AR/localization/es-AR/messenger/preferences/connection.ftl thunderbird-140.10.0esr/thunderbird-l10n/es-AR/localization/es-AR/messenger/preferences/connection.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/es-AR/localization/es-AR/messenger/preferences/connection.ftl 2026-03-24 16:59:40.518140600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/es-AR/localization/es-AR/messenger/preferences/connection.ftl 2026-04-23 05:16:29.610031600 +0000 @@ -70,5 +70,5 @@ .label = Proxy DNS al usar SOCKS v5 .accesskey = d proxy-enable-doh = - .label = Habilitar DNS por sobre HTTPS + .label = Habilitar DNS sobre HTTPS .accesskey = b diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/es-AR/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/es-AR/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/es-AR/manifest.json 2026-03-24 16:59:40.529023600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/es-AR/manifest.json 2026-04-23 05:16:29.621281000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Español (AR) (Spanish, Argentina)", "description": "Thunderbird Language Pack for Español (AR) (es-AR) – Spanish, Argentina", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "es-AR": { - "version": "20260320084050", + "version": "20260417023224", "chrome_resources": { "alerts": "chrome/es-AR/locale/es-AR/alerts/", "autoconfig": "chrome/es-AR/locale/es-AR/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/es-ES/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/es-ES/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/es-ES/manifest.json 2026-03-24 16:59:40.583158300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/es-ES/manifest.json 2026-04-23 05:16:29.675366400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Español (ES) (Spanish, Spain)", "description": "Thunderbird Language Pack for Español (ES) (es-ES) – Spanish, Spain", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "es-ES": { - "version": "20260320084244", + "version": "20260417023424", "chrome_resources": { "alerts": "chrome/es-ES/locale/es-ES/alerts/", "autoconfig": "chrome/es-ES/locale/es-ES/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/es-MX/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/es-MX/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/es-MX/manifest.json 2026-03-24 16:59:40.635344000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/es-MX/manifest.json 2026-04-23 05:16:29.728685600 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Español (MX) (Spanish, Mexico)", "description": "Thunderbird Language Pack for Español (MX) (es-MX) – Spanish, Mexico", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "es-MX": { - "version": "20260320084438", + "version": "20260417023630", "chrome_resources": { "alerts": "chrome/es-MX/locale/es-MX/alerts/", "autoconfig": "chrome/es-MX/locale/es-MX/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/et/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/et/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/et/manifest.json 2026-03-24 16:59:40.686645300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/et/manifest.json 2026-04-23 05:16:29.781139100 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Eesti (Estonian)", "description": "Thunderbird Language Pack for Eesti (et) – Estonian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "et": { - "version": "20260320084632", + "version": "20260417023836", "chrome_resources": { "alerts": "chrome/et/locale/et/alerts/", "autoconfig": "chrome/et/locale/et/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/eu/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/eu/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/eu/manifest.json 2026-03-24 16:59:40.740095900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/eu/manifest.json 2026-04-23 05:16:29.833452000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Euskara (Basque)", "description": "Thunderbird Language Pack for Euskara (eu) – Basque", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "eu": { - "version": "20260320084026", + "version": "20260417023015", "chrome_resources": { "alerts": "chrome/eu/locale/eu/alerts/", "autoconfig": "chrome/eu/locale/eu/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/fi/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/fi/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/fi/manifest.json 2026-03-24 16:59:40.791780000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/fi/manifest.json 2026-04-23 05:16:29.886813600 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Suomi (Finnish)", "description": "Thunderbird Language Pack for Suomi (fi) – Finnish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "fi": { - "version": "20260320084308", + "version": "20260417023236", "chrome_resources": { "alerts": "chrome/fi/locale/fi/alerts/", "autoconfig": "chrome/fi/locale/fi/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/fr/localization/fr/messenger/about3Pane.ftl thunderbird-140.10.0esr/thunderbird-l10n/fr/localization/fr/messenger/about3Pane.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/fr/localization/fr/messenger/about3Pane.ftl 2026-03-24 16:59:40.826428400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/fr/localization/fr/messenger/about3Pane.ftl 2026-04-23 05:16:29.921798700 +0000 @@ -115,12 +115,12 @@ .label = Déplacer vers le bas folder-pane-unread-aria-label = { $count -> - [one] 1 message non lu + [one] { $count } message non lu *[other] { $count } messages non lus } folder-pane-total-aria-label = { $count -> - [one] 1 message au total + [one] { $count } message au total *[other] { $count } messages au total } threadpane-column-header-select = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/fr/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/fr/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/fr/manifest.json 2026-03-24 16:59:40.844059700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/fr/manifest.json 2026-04-23 05:16:29.939924200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Français (French)", "description": "Thunderbird Language Pack for Français (fr) – French", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "fr": { - "version": "20260320084523", + "version": "20260417023444", "chrome_resources": { "alerts": "chrome/fr/locale/fr/alerts/", "autoconfig": "chrome/fr/locale/fr/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/fy-NL/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/fy-NL/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/fy-NL/manifest.json 2026-03-24 16:59:40.896133000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/fy-NL/manifest.json 2026-04-23 05:16:29.993695700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Frysk (Frisian)", "description": "Thunderbird Language Pack for Frysk (fy-NL) – Frisian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "fy-NL": { - "version": "20260320084759", + "version": "20260417023651", "chrome_resources": { "alerts": "chrome/fy-NL/locale/fy-NL/alerts/", "autoconfig": "chrome/fy-NL/locale/fy-NL/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ga-IE/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ga-IE/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ga-IE/manifest.json 2026-03-24 16:59:40.943577300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ga-IE/manifest.json 2026-04-23 05:16:30.041768800 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Gaeilge (Irish)", "description": "Thunderbird Language Pack for Gaeilge (ga-IE) – Irish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ga-IE": { - "version": "20260320085015", + "version": "20260417023856", "chrome_resources": { "alerts": "chrome/ga-IE/locale/ga-IE/alerts/", "autoconfig": "chrome/ga-IE/locale/ga-IE/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/gd/localization/gd/calendar/calendar-event-listing.ftl thunderbird-140.10.0esr/thunderbird-l10n/gd/localization/gd/calendar/calendar-event-listing.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/gd/localization/gd/calendar/calendar-event-listing.ftl 2026-03-24 16:59:40.973237000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/gd/localization/gd/calendar/calendar-event-listing.ftl 2026-04-23 05:16:30.073298200 +0000 @@ -55,6 +55,8 @@ .label = Tachartasan sna 6 mìosan seo tighinn calendar-event-listing-interval-next-12-months = .label = Tachartasan san 12 mhìos seo tighinn +calendar-event-listing-interval-future = + .label = Gach tachartas san àm ri teachd calendar-event-listing-interval-all = .label = Gach tachartas calendar-event-listing-interval-selected-day = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/gd/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/gd/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/gd/manifest.json 2026-03-24 16:59:40.994334500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/gd/manifest.json 2026-04-23 05:16:30.095570600 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Gàidhlig (Scottish Gaelic)", "description": "Thunderbird Language Pack for Gàidhlig (gd) – Scottish Gaelic", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "gd": { - "version": "20260320084321", + "version": "20260417022646", "chrome_resources": { "alerts": "chrome/gd/locale/gd/alerts/", "autoconfig": "chrome/gd/locale/gd/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/gl/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/gl/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/gl/manifest.json 2026-03-24 16:59:41.046996000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/gl/manifest.json 2026-04-23 05:16:30.148294000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Galego (Galician)", "description": "Thunderbird Language Pack for Galego (gl) – Galician", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "gl": { - "version": "20260320084533", + "version": "20260417022919", "chrome_resources": { "alerts": "chrome/gl/locale/gl/alerts/", "autoconfig": "chrome/gl/locale/gl/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/pref-directory.dtd thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/pref-directory.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/pref-directory.dtd 2026-03-24 16:59:41.061193200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/pref-directory.dtd 2026-04-23 05:16:30.162238400 +0000 @@ -1,7 +1,7 @@ - - - - + + + + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/replicationProgress.properties thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/replicationProgress.properties --- thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/replicationProgress.properties 2026-03-24 16:59:41.061303600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/addressbook/replicationProgress.properties 2026-04-23 05:16:30.162320000 +0000 @@ -3,7 +3,7 @@ replicationSucceeded = השכפול הצליח replicationFailed = השכפול נכשל replicationCancelled = השכפול בוטל -currentCount = Replicating directory entry: %S +currentCount = משכפל רשומת ספרייה: %S downloadButton = הורדה כעת downloadButton.accesskey = ה cancelDownloadButton = ביטול הורדה diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/am-addressing.dtd thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/am-addressing.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/am-addressing.dtd 2026-03-24 16:59:41.061414000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/chrome/he/locale/he/messenger/am-addressing.dtd 2026-04-23 05:16:30.162415500 +0000 @@ -3,7 +3,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/branding/brand.ftl thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/branding/brand.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/branding/brand.ftl 2026-03-24 16:59:41.076628700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/branding/brand.ftl 2026-04-23 05:16:30.180115500 +0000 @@ -3,3 +3,4 @@ -brand-full-name = Mozilla Thunderbird -brand-product-name = Thunderbird -vendor-short-name = Mozilla +trademarkInfo = ‏Mozilla Thunderbird והסמלים של Thunderbird הם סימנים מסחריים של קרן Mozilla. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/calendar/calendar-event-listing.ftl thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/calendar/calendar-event-listing.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/calendar/calendar-event-listing.ftl 2026-03-24 16:59:41.077484600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/calendar/calendar-event-listing.ftl 2026-04-23 05:16:30.181097700 +0000 @@ -39,6 +39,8 @@ calendar-event-listing-column-title = .label = כותרת .tooltiptext = מיון לפי כותרת +calendar-event-listing-interval-past = + .label = אירועים מהעבר calendar-event-listing-interval-calendar-month = .label = אירועים בחודש זה calendar-event-listing-interval-current-view = @@ -53,6 +55,10 @@ .label = אירועים ב־6 החודשים הבאים calendar-event-listing-interval-next-12-months = .label = אירועים ב־12 החודשים הבאים +calendar-event-listing-interval-future = + .label = כל האירועים העתידיים +calendar-event-listing-interval-all = + .label = כל האירועים calendar-event-listing-interval-selected-day = .label = היום המסומן הנוכחי calendar-event-listing-interval-today = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/chat/matrix.ftl thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/chat/matrix.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/chat/matrix.ftl 2026-03-24 16:59:41.079686000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/chat/matrix.ftl 2026-04-23 05:16:30.183633600 +0000 @@ -1 +1,2 @@ +room-name-empty = דיון ריק room-name-empty-had-name = דיון ריק (היה { $oldName }) diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/messenger/syncAccounts.ftl thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/messenger/syncAccounts.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/he/localization/he/messenger/syncAccounts.ftl 2026-03-24 16:59:41.088597500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/localization/he/messenger/syncAccounts.ftl 2026-04-23 05:16:30.193203400 +0000 @@ -0,0 +1,8 @@ +sync-verification-sent-body = קישור האימות נשלח אל { $userEmail }. +sync-verification-not-sent-title = לא ניתן לשלוח קישור אימות +sync-signout-dialog-title = להתנתק מהחשבון? +sync-signout-dialog-body = נתונים מסונכרנים יישארו בחשבון שלך. +sync-signout-dialog-button = התנתקות +sync-disconnect-dialog-title = להתנתק? +sync-disconnect-dialog-body = { -brand-product-name } יפסיק להסתנכרן אבל לא ימחק את הנתונים שלך ממכשיר זה. +sync-disconnect-dialog-button = התנתקות diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/he/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/he/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/he/manifest.json 2026-03-24 16:59:41.097867700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/he/manifest.json 2026-04-23 05:16:30.202832700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: עברית (Hebrew)", "description": "Thunderbird Language Pack for עברית (he) – Hebrew", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "he": { - "version": "20260320084727", + "version": "20260417023134", "chrome_resources": { "alerts": "chrome/he/locale/he/alerts/", "autoconfig": "chrome/he/locale/he/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hr/localization/hr/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/hr/localization/hr/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hr/localization/hr/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:41.137909400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hr/localization/hr/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:30.242792000 +0000 @@ -38,11 +38,84 @@ openpgp-key-man-keyserver-menu = .label = Server ključeva .accesskey = S +openpgp-key-copy-key = + .label = Kopiraj javni ključ + .accesskey = K +openpgp-key-export-key = + .label = Izvezi javni ključa u datoteku + .accesskey = I +openpgp-key-backup-key = + .label = Spremi sigurnosnu kopiju tajnog ključa u datoteku + .accesskey = S +openpgp-key-send-key = + .label = Pošalji javni ključ putem e-pošte + .accesskey = P +openpgp-key-man-copy-key-ids = + .label = + { $count -> + [one] Kopiraj ID ključa u međuspremnik + [few] Kopiraj ID-ove ključeva u međuspremnik + *[other] Kopiraj ID-ove ključeva u međuspremnik + } + .accesskey = I +openpgp-key-man-copy-fprs = + .label = + { $count -> + [one] Kopiraj otisak prsta u međuspremnik + [few] Kopiraj otiske prstiju u međuspremnik + *[other] Kopiraj otiske prstiju u međuspremnik + } + .accesskey = o +openpgp-key-man-copy-to-clipboard = + .label = + { $count -> + [one] Kopiraj javni ključ u međuspremnik + [few] Kopiraj javne ključeve u međuspremnik + *[other] Kopiraj javne ključeve u međuspremnik + } + .accesskey = m openpgp-key-man-ctx-copy = .label = Kopiraj .accesskey = K +openpgp-key-man-ctx-copy-fprs = + .label = + { $count -> + [one] Otisak prsta + [few] Otiska prsta + *[other] Otiska prstiju + } + .accesskey = O +openpgp-key-man-ctx-copy-key-ids = + .label = + { $count -> + [one] ID ključa + [few] ID-eva ključeva + *[other] ID-eva ključeva + } + .accesskey = k +openpgp-key-man-ctx-copy-public-keys = + .label = + { $count -> + [one] Javni ključ + [few] Javna ključa + *[other] Javnih ključeva + } + .accesskey = k +openpgp-key-man-close = + .label = Zatvori +openpgp-key-man-reload = + .label = Ponovo učitaj predmemoriju ključeva + .accesskey = u openpgp-key-man-filter-label = .placeholder = Traži ključeve +openpgp-key-details-doc-title = Svojstva ključa +openpgp-key-details-signatures-tab = + .label = Certificiranja +openpgp-key-details-structure-tab = + .label = Struktura +openpgp-key-details-id-label = + .label = ID +openpgp-key-details-key-type-label = Vrsta openpgp-key-details-algorithm-label = .label = Algoritam openpgp-key-details-size-label = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hr/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/hr/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/hr/manifest.json 2026-03-24 16:59:41.150627900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hr/manifest.json 2026-04-23 05:16:30.255300000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Hrvatski (Croatian)", "description": "Thunderbird Language Pack for Hrvatski (hr) – Croatian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "hr": { - "version": "20260320084921", + "version": "20260417023351", "chrome_resources": { "alerts": "chrome/hr/locale/hr/alerts/", "autoconfig": "chrome/hr/locale/hr/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hsb/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/hsb/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/hsb/manifest.json 2026-03-24 16:59:41.203924400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hsb/manifest.json 2026-04-23 05:16:30.309874300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Hornjoserbšćina (Upper Sorbian)", "description": "Thunderbird Language Pack for Hornjoserbšćina (hsb) – Upper Sorbian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "hsb": { - "version": "20260320085116", + "version": "20260417023606", "chrome_resources": { "alerts": "chrome/hsb/locale/hsb/alerts/", "autoconfig": "chrome/hsb/locale/hsb/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hu/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/hu/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/hu/manifest.json 2026-03-24 16:59:41.256447000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hu/manifest.json 2026-04-23 05:16:30.362358000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Magyar (Hungarian)", "description": "Thunderbird Language Pack for Magyar (hu) – Hungarian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "hu": { - "version": "20260320084302", + "version": "20260417023030", "chrome_resources": { "alerts": "chrome/hu/locale/hu/alerts/", "autoconfig": "chrome/hu/locale/hu/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/calendar.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/calendar.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/calendar.dtd 2026-03-24 16:59:41.259576300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/calendar.dtd 2026-04-23 05:16:30.365435400 +0000 @@ -158,7 +158,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/menuOverlay.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/menuOverlay.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/menuOverlay.dtd 2026-03-24 16:59:41.260142000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/calendar/menuOverlay.dtd 2026-04-23 05:16:30.366069300 +0000 @@ -4,7 +4,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/SearchDialog.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/SearchDialog.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/SearchDialog.dtd 2026-03-24 16:59:41.269174600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/SearchDialog.dtd 2026-04-23 05:16:30.376048800 +0000 @@ -17,7 +17,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/accountCreationModel.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/accountCreationModel.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/accountCreationModel.properties 2026-03-24 16:59:41.269498800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/accountCreationModel.properties 2026-04-23 05:16:30.376442200 +0000 @@ -1,5 +1,5 @@ no_emailProvider.error = Կարգավորման XML ֆայլը չի պարունակում փոստարկղի կարգավորումներ։ outgoing_not_smtp.error = Ելքային սպասարկիչը պետք է լինի SMTP -cannot_login.error = Սպասարկիչին կապակցելու սխալ։ Ստուգեք կարգավորումները, անունը և գաղտնաբառը։ +cannot_login.error = Սպասարկիչին կապակցվելու սխալ։ Ստուգեք կարգավորումները, օգտվողի անունը և գաղտնաբառը։ cannot_find_server.error = Սպասարկիչը չի գտնվել no_autodiscover.error = Փոխանակման AutoDiscover XML- ը անվավեր է: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/activity.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/activity.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/activity.properties 2026-03-24 16:59:41.269759400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/activity.properties 2026-04-23 05:16:30.376709200 +0000 @@ -32,10 +32,10 @@ fromServerToServer = #1-ից #2-ը deletedFolder = #1 ջնջված թղթապանակ emptiedTrash = Դատարկվում է Աղբարկղը -movedFolder = Տեղափոխված թղթ. #1-ից #2 -movedFolderToTrash = Աղբարկղ տեղափոխված թղթ. #1\u0020 -copiedFolder = Պատճենված թղթ. #1 #2-ում -renamedFolder = Անվանափոխված թղթ.՝ #1-ը #2-ի +movedFolder = Տեղափոխված թղթապանակ #1-ից #2 +movedFolderToTrash = Աղբարկղ տեղափոխված թղթապանակ #1\u0020 +copiedFolder = Պատճենված թղթապանակ #1 #2-ում +renamedFolder = Անվանափոխված թղթապանակ՝ #1-ը #2-ի indexing = Նամակների ցուցակագրում indexingFolder = Նամակների ցուցակագրում #1-ում indexingStatusVague = Որոշել նամակների ցուցակագրումը diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/addressBook.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/addressBook.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/addressBook.properties 2026-03-24 16:59:41.270403600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/addressBook.properties 2026-04-23 05:16:30.377366500 +0000 @@ -69,8 +69,8 @@ VCFFiles = vCard SupportedABFiles = Հասցեագրքի ապահովված նիշքեր failedToExportTitle = Արտածումը ձախողվեց -failedToExportMessageNoDeviceSpace = Հնարավոր չեղավ արտածել հասցեագիրքը, տեղ չկա։ -failedToExportMessageFileAccessDenied = Հնարավոր չեղավ արտածել հասցեագիրքը, մուտք չկա ֆայլին։ +failedToExportMessageNoDeviceSpace = Հնարավոր չեղավ արտահանել հասցեագիրքը, տեղ չկա։ +failedToExportMessageFileAccessDenied = Հնարավոր չեղավ արտահանել հասցեագիրքը, մուտք չկա ֆայլին։ AuthDlgTitle = Հասցեագրքի LDAP թողարկում AuthDlgDesc = Սպասարկիչ մուտք գործելու գործելու համար նշեք Ձեր անունը և գաղտնաբառը joinMeInThisChat = Ցանկանում եմ+միանալ+այս+զրույցին։ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/ldapAutoCompErrs.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/ldapAutoCompErrs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/ldapAutoCompErrs.properties 2026-03-24 16:59:41.270497800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/addressbook/ldapAutoCompErrs.properties 2026-04-23 05:16:30.377462900 +0000 @@ -1,6 +1,6 @@ 0 = LDAP որոշման խնդիր 1 = LDAP սպասարակիչին կապակցելու ձախողում -2 = LDAP սպասարկիչին կապակցելու ձախողում +2 = LDAP սպասարկիչին կապակցման ձախողում 3 = LDAP սպասարկիչի կապի խնդիր 4 = LDAP սպասարկիչի փնտրման խնդիր errorAlertFormat = Սխալի կոդը %1$S. %2$S\n\n %3$S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/gloda.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/gloda.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/gloda.properties 2026-03-24 16:59:41.274122500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/gloda.properties 2026-04-23 05:16:30.381254700 +0000 @@ -1,4 +1,4 @@ -gloda.message.attr.account.facetNameLabel = Հաշիվ +gloda.message.attr.account.facetNameLabel = Փոստարկղ gloda.message.attr.account.includeLabel = պահվում է որևէ մեկում՝ gloda.message.attr.account.excludeLabel = չի պահվում՝ gloda.message.attr.account.remainderLabel = այլ հաշիվներ: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/imapMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/imapMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/imapMsgs.properties 2026-03-24 16:59:41.274682300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/imapMsgs.properties 2026-04-23 05:16:30.381817300 +0000 @@ -35,7 +35,7 @@ imapUnknownHostError = Հնարավոր չէ կապակցել %S սպասարկիչին։ imapOAuth2Error = Նույնականացման ձախողում %S սպասարկչին միանալու ժամանակ: imapConnectionRefusedError = Հնարավոր չեղավ կապակցել %S սպասարկիչին: Կապակցումը մերժվել է։ -imapNetTimeoutError = %S սպասարկիչին կապակցելու ժամանակը լրացել է։ +imapNetTimeoutError = %S սպասարկիչին կապակցման ժամանակը լրացել է։ imapTlsError = Non-overridable TLS error occurred. Handshake error or probably the TLS version or certificate used by server %S is incompatible. imapNoNewMessages = Նամակներ չկան այս սպասարկիչում։ imapDefaultAccountName = Նամակ %S-ի համար diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.dtd 2026-03-24 16:59:41.275766000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.dtd 2026-04-23 05:16:30.382956000 +0000 @@ -93,7 +93,7 @@ - + @@ -568,7 +568,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.properties 2026-03-24 16:59:41.275975500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messenger.properties 2026-04-23 05:16:30.383174400 +0000 @@ -213,7 +213,7 @@ unknownHostError = Հնարավոր չէ կապակցել %S սպասարկիչին։ oAuth2Error = Նույնականացման ձախողում %S սպասարկչին միանալու ժամանակ: connectionRefusedError = Հնարավոր չեղավ կապակցել %S սպասարկիչին, կապակցումը մերժվել է։ -netTimeoutError = %S սպասարկիչին կապակցելու ժամանակը լրացել է։ +netTimeoutError = %S սպասարկիչին կապակցման ժամանակը լրացել է։ netResetError = %S սպասարկիչին կապակումը վերականգնվել է։ netInterruptError = %S սպասարկիչին կապակցումը ընդհատված է։ recipientSearchCriteria = Վերնագիրը կամ Ստացողը՝ @@ -223,7 +223,7 @@ newMailNotification_message = %1$S՝ %2$S նոր նամակ newMailNotification_messages = %1$S՝ %2$S նոր նամակ newMailNotification_messagetitle = %1$S-ը %2$S-ից -newMailAlert_message = #1 ստացավ #2 նոր հաղորդագրություն; #1 ստացան #2 նոր հաղորդագրություններ +newMailAlert_message = #1-ը ստացավ #2 նոր նամակ; #1ստացավ #2 նոր նամակներ confirmViewDeleteTitle = Հաստատել confirmViewDeleteMessage = Ջնջե՞լ այս տեսքը։ confirmSavedSearchTitle = Հաստատեք ջնջումը diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messengercompose/messengercompose.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messengercompose/messengercompose.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messengercompose/messengercompose.dtd 2026-03-24 16:59:41.278301700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger/messengercompose/messengercompose.dtd 2026-04-23 05:16:30.385613400 +0000 @@ -88,7 +88,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/feed-subscriptions.dtd thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/feed-subscriptions.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/feed-subscriptions.dtd 2026-03-24 16:59:41.283151600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/feed-subscriptions.dtd 2026-04-23 05:16:30.390520300 +0000 @@ -33,7 +33,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/newsblog.properties thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/newsblog.properties --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/newsblog.properties 2026-03-24 16:59:41.283249100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/messenger-newsblog/newsblog.properties 2026-04-23 05:16:30.390631200 +0000 @@ -14,8 +14,8 @@ subscribe-noAuthError = Շղթայի URL-ն թույլատրված չէ: subscribe-loading = Բացվում է, սպասեք... subscribe-OPMLImportTitle = Ընտրեք OPML ֆայլը ներմուծելու համար -subscribe-OPMLExportTitleList = Արտածել %S-ը որպես OPML ֆայլ - Շղթաների ցանկ -subscribe-OPMLExportTitleStruct = Արտածել %S-ը որպես OPML ֆայլ - Շղթաների ցանկը ըստ կառուցվածքի +subscribe-OPMLExportTitleList = Արտահանել %S-ը որպես OPML ֆայլ - Շղթաների ցանկԱրտահանել +subscribe-OPMLExportTitleStruct = Արտահանել %S-ը որպես OPML ֆայլ - Շղթաների ցանկը ըստ կառուցվածքի subscribe-OPMLExportFileDialogTitle = %1$S OPML արտածում - %2$S subscribe-OPMLExportDefaultFileName = Իմ%1$SFeeds-%2$S.opml subscribe-OPMLImportInvalidFile = %S ֆայլը ճիշտ OPML ֆայլ չէ։ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/calendar/calendar.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/calendar/calendar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/calendar/calendar.ftl 2026-03-24 16:59:41.287691600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/calendar/calendar.ftl 2026-04-23 05:16:30.395182000 +0000 @@ -23,7 +23,7 @@ normal-priority = Միջին low-priority = Ցածր import-prompt = Ո՞ր օրացույցում եք ցանկանում ներածել այս տարրերը։ -export-prompt = Ո՞ր օրացույցից եք ցանկանում արտածել։ +export-prompt = Ո՞ր օրացույցից եք ցանկանում արտահանել։ paste-prompt = Ձեր ներկա գրվող օրացույցերից ո՞ր մեկում ներմուծել։ publish-prompt = Ո՞ր օրացույցն եք ուզում հրապարակել: paste-event-also = Ձեր ներմուծումը ներառում է հանդիպում @@ -83,7 +83,7 @@ calendar-new = Նոր calendar-open = Բացել filepicker-title-import = Ներածել -filepicker-title-export = Արտածել +filepicker-title-export = Արտահանել filter-ics = iCalendar ({ $wildmat }) filter-html = Վեբ էջ ({ $wildmat }) generic-error-title = Հայտնաբերվեց սխալ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountManager.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountManager.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountManager.ftl 2026-03-24 16:59:41.292491200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountManager.ftl 2026-04-23 05:16:30.400116700 +0000 @@ -1,3 +1,4 @@ +open-preferences-sidebar-button2 = { -brand-short-name }-ի կարգավորումներ open-addons-sidebar-button = Հավելումներ և ոճեր edit-vcard-dialog-accept-button = Պահել .accesskey = S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountHub.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountHub.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountHub.ftl 2026-03-24 16:59:41.292692200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountHub.ftl 2026-04-23 05:16:30.400360300 +0000 @@ -58,13 +58,18 @@ account-hub-name-label = Անուն, ազգանուն .accesskey = n account-hub-adding-account-title = Հաշվի ավելացում +account-hub-lookup-email-configuration-title = Փնտրվում է կազմաձև… account-hub-notification-show-more = Ցուցադրել ավելին account-hub-notification-show-less = Ցուցադրել ավելի քիչ +account-hub-email-setup-incoming = Մտից սպասարկիչի կարգավորումներ account-hub-test-configuration = Փորձարկել +account-hub-result-imap-description = Պահպանեք ձեր պանակներն ու էլ. փոստերը համաժամեցված ձեր սպասարկիչում +account-hub-result-pop-description = Պահպանեք ձեր պանակներն ու էլ. փոստերը համաժամեցված ձեր սպասարկիչում account-hub-result-ews-shortname = Փոխանակել account-hub-result-ews-text = Սպասարկիչ account-hub-result-recommended-label = Խորհուրդ է տրվում՝ account-hub-edit-configuration = Խմբագրել կազմաձևը +account-hub-config-success = Կազմաձևը գտնվել է Mozilla ISPDB-ում account-hub-select-all = Նշել բոլորը account-hub-deselect-all = Ապանշել բոլորը account-hub-sync-accounts-selected = @@ -77,4 +82,6 @@ account-hub-email-added-success-links-title = Անվտանգության և անհատականացման տարբերակների ուսումնասիրություն՝ account-hub-signature-link = Էլ. փոստի ստորագրություն account-hub-name-error-text = Նշեք Ձեր անունը։ +account-hub-username-error-text = Օգտվողի անունը պարտադիր է + .title = Օգտվողի անունը պարտադիր է account-hub-account-authentication-error = Իսկորոշման սխալ: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountSetup.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountSetup.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountSetup.ftl 2026-03-24 16:59:41.292808800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/accountcreation/accountSetup.ftl 2026-04-23 05:16:30.400502200 +0000 @@ -1,7 +1,10 @@ account-setup-tab-title = Հաշվի տեղակայում account-setup-title = Տեղակայել ձեր առկա էլ. փոստը account-setup-description = Ձեր գործող էլ. փոստի հասցեն օգտագործելու համար լրացրեք ձեր տվյալները: -account-setup-success-title = Հաշիվը հաջողությամբ ստեղծվեց +account-setup-secondary-description = { -brand-product-name }-ն ինքնաշխատ կփնտրի աշխատող և հանձնարարելի սպասարկիչի կազմաձևը: +account-setup-success-title = Փոստարկղը հաջողությամբ ստեղծվեց +account-setup-success-description = Դուք այժմ կարող եք օգտագործել այս հաշիվը { -brand-short-name }-ի հետ։ +account-setup-success-secondary-description = Դուք կարող եք բարելավել փորձը՝ միացնելով հարակից ծառայությունները և կարգավորելով հաշվի լրացուցիչ կարգավորումները։ account-setup-name-label = Ձեր անունը. .accesskey = n account-setup-name-input = @@ -45,8 +48,15 @@ .accesskey = C account-setup-button-done = Պատրաստ է .accesskey = D +account-setup-looking-up-settings = Փնտրվում է կազմաձև… +account-setup-looking-up-settings-half-manual = Կարգավորումների որոնում. Սպասարկիչի ստուգում… +account-setup-looking-up-mx = Կազմաձևի որոնում. Մտից փոստի տիրույթ… account-setup-checking-password = Ստուգվում է գաղտնաբառը... +account-setup-success-half-manual = Հետևյալ կարգավորումները գտնվել են տվյալ սպասարկիչի փորձարկման միջոցով՝ +account-setup-success-guess = Կազմաձևը գտնվել է տարածված սպասարկիչների անունները փորձելով։ account-setup-success-password = Գաղտնաբառը ճիշտ է +account-setup-success-settings-db = Կազմաձևը գտնվել է Mozilla ISP տվյալների շտեմարանում։ +account-setup-success-settings-disk = Կազմաձևը գտնվել է { -brand-short-name }-ի տեղադրման ժամանակ ։ account-setup-step1-image = .title = Սկզբնական տեղակայում account-setup-step2-image = @@ -64,6 +74,13 @@ account-setup-forum-help = Աջակցման ֆորում account-setup-privacy-help = Գաղտնիության դրույթներ account-setup-getting-started = Մեկնարկում +account-setup-results-area-title = + { $count -> + [one] Հասանելի կազմաձև + *[other] Հասանելի կազմաձևեր + } +account-setup-result-imap-description = Պահպանեք ձեր պանակներն ու էլ. փոստերը համաժամեցված ձեր սպասարկիչում +account-setup-result-pop-description = Պահպանեք ձեր պանակներն ու էլ. փոստերը համաժամեցված ձեր սպասարկիչում account-setup-incoming-title = Մտից account-setup-outgoing-title = Ելքային account-setup-username-title = Օգտվողի անուն @@ -71,6 +88,7 @@ account-setup-result-no-encryption = Չկա կոդավորում account-setup-result-ssl = SSL/TLS account-setup-result-starttls = STARTTLS +account-setup-result-username-different = Մտից՝ { $incoming }, Ելից՝ { $outgoing } account-setup-find-settings-failed = { -brand-short-name }-ին չհաջողվեց գտնել կարգավորումներ ձեր էլ. փոստի հաշվի համար account-setup-manual-config-title = Ձեռքով կազմաձևում account-setup-incoming-server-legend = Մուտքային սպասարկիչ @@ -110,8 +128,12 @@ account-setup-addon-install-title = Տեղադրել account-setup-addon-install-intro = Երրորդ կողմի հավելումը կարող է թույլ տալ մուտք գործել ձեր էլ․ փոստի հաշիվ այս սպասարկչի վրա. account-setup-settings-button = Հաշվի կարգավորումներ +account-setup-encryption-button = Վերջավոր գաղտնագրում account-setup-signature-button = Ավելացնել ստորագրություն account-setup-dictionaries-button = Ներբեռնել բառարաններ +account-setup-calendar-button = Կապակցեք հեռակա օրացույցի +account-setup-linked-services-title = Միացրեք ձեր կապված ծառայությունները +account-setup-no-linked-description = Կարգավորեք այլ ծառայություններ՝ ձեր { -brand-short-name }-ի փորձառությունից առավելագույնս օգտվելու համար։ account-setup-button-finish = Պատրաստ է .accesskey = F account-setup-looking-up-address-books = Հասցեագրքերի որոնում… diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/addressbook/aboutAddressBook.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/addressbook/aboutAddressBook.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/addressbook/aboutAddressBook.ftl 2026-03-24 16:59:41.293231700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/addressbook/aboutAddressBook.ftl 2026-04-23 05:16:30.400937800 +0000 @@ -1,6 +1,8 @@ about-addressbook-title = Հասցեագիրք about-addressbook-toolbar-add-carddav-address-book = .label = Հավելել CardDAV Հասցեագիրք +books-pane-import-button = Ներմուծել + .title = Ներմուծել Հասցեագիրք all-address-books-row = .title = Բոլոր Հասցեագրքերը all-address-books = Բոլոր Հասցեագրքերը @@ -26,6 +28,9 @@ .label = Լռելյայն ինքնամեկնարկի գրացուցակ about-addressbook-confirm-delete-book-title = Ջնջել Հասցեագիրքը about-addressbook-confirm-remove-remote-book-title = Հեռացնել Հասցեագիրքը +about-addressbook-search-all2 = + .label = Որոնել բոլոր Հասցեագրքերում + .placeholder = Որոնել բոլոր Հասցեագրքերում… about-addressbook-name-format-display = .label = Ցուցադրվող անունը about-addressbook-name-format-firstlast = @@ -42,6 +47,8 @@ .label = Տեսակավորել ըստ էլ. փոստի (Ֆ > Ա) about-addressbook-table-layout = .label = Աղյուսակի դասավորություն +about-addressbook-column-label-addrbook2 = + .label = Հասցեագիրք about-addressbook-cards-context-write = .label = Գրել about-addressbook-placeholder-searching = Որոնում… diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/appmenu.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/appmenu.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/appmenu.ftl 2026-03-24 16:59:41.293403400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/appmenu.ftl 2026-04-23 05:16:30.401119200 +0000 @@ -1,9 +1,18 @@ appmenu-sync-panel-title = .title = Համաժամեցում appmenu-new-account-panel-title = - .title = Նոր հաշիվ + .title = Նոր փոստարկղ appmenu-new-chat-account = .label = Զրույց .accesskey = h appmenu-create-panel-title = .title = Ստեղծել +appmenu-help-enter-troubleshoot-mode2 = + .label = Խափանաշտկման կերպ… + .accesskey = M +appmenu-help-exit-troubleshoot-mode2 = + .label = Անջատեք Խափանաշտկման կերպը + .accesskey = M +appmenu-help-troubleshooting-info = + .label = Խափանաշտկման տեղեկություններ + .accesskey = T diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionPermissions.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionPermissions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionPermissions.ftl 2026-03-24 16:59:41.293873500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionPermissions.ftl 2026-04-23 05:16:30.401594400 +0000 @@ -1,4 +1,5 @@ webext-perms-description-accountsFolders = Ստեղծեք, վերանվանեք կամ ջնջեք ձեր փոստի հաշվի պանակները webext-perms-description-addressBooks = Կարդացեք և փոփոխեք ձեր հասցեի գրքերը և կոնտակտները webext-perms-description-compose = Կարդացեք և փոփոխեք ձեր էլ. նամակները, երբ կազմեք և ուղարկեք դրանք +webext-perms-description-experiment-access = Այս հավելումը կունենա { -brand-short-name }-ին և ձեր համակարգչին լիարժեք, անսահմանափակ մուտքի իրավունք։ webext-perms-description-messagesImport = Ներմուծեք հաղորդագրություններ Thunderbird-ում diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionsUI.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionsUI.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionsUI.ftl 2026-03-24 16:59:41.294048800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/extensionsUI.ftl 2026-04-23 05:16:30.401772500 +0000 @@ -1,2 +1,3 @@ webext-experiment-warning = Զգուշացում. Այս հավելումը վավերացված չէ: Վնասագիր հավելումները կարող են գողանալ ձեր անձնական տեղեկությունները կամ վնասեն ձեր համակարգիչը: Տեղադրեք այն, եթե միայն վստահում եք աղբյուրին: webext-perms-learn-more = Իմանալ ավելին +addon-post-install-message = { $addonName }-ն ավելացվել է; diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/menubar.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/menubar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/menubar.ftl 2026-03-24 16:59:41.294422100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/menubar.ftl 2026-04-23 05:16:30.402155200 +0000 @@ -1,6 +1,21 @@ +toolbar-context-menu-menu-bar = + .toolbarname = Ցանկ գոտի + .accesskey = M +menu-tools-settings = + .label = Կարգավորումներ + .accesskey = e menu-addons-and-themes = .label = Հավելումներ և ոճեր .accesskey = A +menu-help-enter-troubleshoot-mode = + .label = Խափանաշտկման կերպ… + .accesskey = M +menu-help-exit-troubleshoot-mode = + .label = Անջատեք խնդիրների լուծման ռեժիմը + .accesskey = M +menu-help-troubleshooting-info = + .label = Խափանաշտկման տեղեկություններ + .accesskey = T mail-uidensity-default = .label = Սկզբնադիր .accesskey = D diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messageheader/headerFields.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messageheader/headerFields.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messageheader/headerFields.ftl 2026-03-24 16:59:41.294500800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messageheader/headerFields.ftl 2026-04-23 05:16:30.402300600 +0000 @@ -0,0 +1,3 @@ +message-header-to-list-name = Ում +message-header-address-not-in-address-book-button = + .title = Պահել այս հասցեն Հասցեագրքում diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messenger.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messenger.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messenger.ftl 2026-03-24 16:59:41.294591000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messenger.ftl 2026-04-23 05:16:30.402397400 +0000 @@ -1,4 +1,4 @@ -about-rights-notification-text = { -brand-short-name }-ը անվճար և բաց կոդով ծրագրակազմ է, որը կառուցվել է աշխարհի տարբեր երկրների հազարավորների համայնքի կողմից: +about-rights-notification-text = { -brand-short-name }-ը անվճար և բաց կոդով ծրագրաշար է, որը կառուցվել է աշխարհի տարբեր երկրների հազարավորների համայնքի կողմից: content-tab-security-high-icon = .alt = Կապակցումն անվտանգ է content-tab-security-broken-icon = @@ -6,6 +6,14 @@ addons-and-themes-toolbarbutton = .label = Հավելումներ և ոճեր .tooltiptext = Կառավարել հավելումները +quick-filter-toolbarbutton = + .label = Արագ զտիչ + .tooltiptext = Զտել նամակները +folder-pane-toolbar = + .toolbarname = Թղթապանակի վահանակի գործիքագոտի + .accesskey = F +folder-pane-toolbar-options-button = + .tooltiptext = Թղթապանակի վահանակի ընտրանքներ show-tags-folders-label = .label = Պիտակներ .accesskey = T @@ -30,16 +38,30 @@ .label = Հատկություններ... .accesskey = o menu-edit-folder-properties = - .label = Թղթ. հատկությունները + .label = Թղթապանակի հատկությունները .accesskey = o menu-edit-newsgroup-properties = .label = Լուրախմբերի հատկությունը .accesskey = o +appmenu-settings = + .label = Կարգավորումներ appmenu-addons-and-themes = .label = Հավելումներ և ոճեր mail-context-menu-forward-forward = .label = Փոխանցել .accesskey = F +toolbar-context-menu-manage-extension = + .label = Կառավարել ընդլայնումը + .accesskey = E +toolbar-context-menu-remove-extension = + .label = Հեռացնել ընդլայնումը + .accesskey = v +spaces-toolbar-button-settings2 = + .title = Կարգավորումներ +settings-context-open-settings-item2 = + .label = Կարգավորումներ +settings-context-open-account-settings-item2 = + .label = Փոստարկղի կարգավորումներ quick-filter-bar-toggle = .label = Արագ զտիչի վահանակ .accesskey = Ա diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messengercompose/messengercompose.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messengercompose/messengercompose.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messengercompose/messengercompose.ftl 2026-03-24 16:59:41.294764500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/messengercompose/messengercompose.ftl 2026-04-23 05:16:30.402528000 +0000 @@ -49,3 +49,6 @@ .label = Ստացական .tooltiptext = Հետադարձ ստացական հայցել նամակի համար many-public-recipients-prompt-cancel = Չեղարկել ուղարկումը +spell-add-dictionaries = + .label = Ավելացնել Բառարաններ... + .accesskey = A diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/policies/policies-descriptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/policies/policies-descriptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/policies/policies-descriptions.ftl 2026-03-24 16:59:41.296581000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/policies/policies-descriptions.ftl 2026-04-23 05:16:30.404397000 +0000 @@ -24,7 +24,7 @@ policy-DisableSecurityBypass = Կանխել օգտատիրոջը` շրջանցելով անվտանգության որոշ նախազգուշացումներ: policy-DisableSystemAddonUpdate = Կանխել { -brand-short-name } համակարգի լրացումների տեղաակայումը և թարմեցումը: policy-DisableTelemetry = Անջատել հեռաչափությունը: -policy-DisplayMenuBar = Ցուցադրել ցանկագոտին լռելյայն: +policy-DisplayMenuBar = Ցուցադրել Ցանկ գոտին սկզբնադիր: policy-DNSOverHTTPS = Կազմաձևել DNS- ը HTTPS- ի վերաբերյալ: policy-DontCheckDefaultClient = Անջատել ստուգումը երբ գործարկում է լռելյայն հաճախորդ։ policy-DownloadDirectory = Կարգավորել և փակել բեռնման գրացուցակը: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/am-archiveoptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/am-archiveoptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/am-archiveoptions.ftl 2026-03-24 16:59:41.296709000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/am-archiveoptions.ftl 2026-04-23 05:16:30.404532000 +0000 @@ -4,13 +4,13 @@ .label = Թղթապանակում .accesskey = s archive-yearly = - .label = Տարեկան արխիվացված թղթ. + .label = Տարեկան արխիվացված թղթապանակ .accesskey = Y archive-monthly = - .label = Ամսեկան արխիվացված թղթ. + .label = Ամսեկան արխիվացված թղթապանակ .accesskey = M keep-folder-structure = - .label = Պահել արխիվացված նամակների թղթ. կառուցվածքը + .label = Պահել արխիվացված նամակների թղթապանակի կառուցվածքը .accesskey = K archive-example-label = Օրինակ archive-folder-name = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/connection.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/connection.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/connection.ftl 2026-03-24 16:59:41.297030000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/connection.ftl 2026-04-23 05:16:30.404854000 +0000 @@ -8,6 +8,8 @@ .accesskey = C .tooltiptext = Մուտքագրեք Ձեր նախընտրված URL-ը DNS-ը HTTPS-ի վրա լուծելու համար connection-dns-over-https-custom-label = Ընտրովի +disable-extension-button = Անջատել ընդլայնումը +proxy-settings-controlled-by-extension = { $name }-ը ընդլայնումը կարգավորում է, թե ինչպես է { -brand-short-name }-ը կապակցվում համացանցին: connection-proxy-legend = Կարգավորել պրոքսին proxy-type-no = .label = Առանց պրոքսի diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/preferences.ftl 2026-03-24 16:59:41.297900200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/preferences.ftl 2026-04-23 05:16:30.405727600 +0000 @@ -1,5 +1,6 @@ close-button = .aria-label = Փակել +preferences-doc-title2 = Կարգավորումներ pane-general-title = Գլխավոր category-general = .tooltiptext = { pane-general-title } @@ -64,6 +65,7 @@ update-in-progress-message = Ցանկանո՞ւմ եք, որ { -brand-short-name } -ը շարունակի այս թարմեցումով: update-in-progress-ok-button = &Հրաժարվել update-in-progress-cancel-button = &Շարունակել +account-button = Փոստարկղի կարգավորումներ open-addons-sidebar-button = Հավելումներ և ոճեր master-password-os-auth-dialog-caption = { -brand-full-name } focus-search-shortcut = @@ -81,6 +83,9 @@ .label = Վերականգնել հիմնականը .accesskey = R default-search-engine = Հիմնական որոնիչ +add-web-search-engine = + .label = Ավելացնել... + .accesskey = A remove-search-engine = .label = Հեռացնել .accesskey = v @@ -534,3 +539,5 @@ .accesskey = V search-results-header = Որոնման արդյունքներ search-results-help-link = Օգնությո՞ւն է պետք: Այցելեք { -brand-short-name }-ի աջակցում +show-synced-item-address = Հասցեագրքեր +qr-export-scan-step2 = Անցնել Կարգավորումներին diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/system-integration.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/system-integration.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/system-integration.ftl 2026-03-24 16:59:41.298231600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/preferences/system-integration.ftl 2026-04-23 05:16:30.406071000 +0000 @@ -1,9 +1,9 @@ system-integration-dialog-title = Համակարգային ինտեգրում system-integration-dialog = - .buttonlabelaccept = Նշել որպես հիմնական - .buttonlabelcancel = Բաց թողնել ինտեգրացիան + .buttonlabelaccept = Նշել որպես սկզբնադիր + .buttonlabelcancel = Բաց թողնել ինտեգրումը .buttonlabelcancel2 = Չեղարկել -default-client-intro = Օգտ. { -brand-short-name }-ը որպես հիմնական ծրագիր՝ +default-client-intro = Օգտագործել { -brand-short-name }-ը որպես սկզբնադիր ծրագիր՝ unset-default-tooltip = It is not possible to unset { -brand-short-name } as the default client within { -brand-short-name }. To make another application the default you must use its 'Set as default' dialog. checkbox-email-label = .label = Էլ. նամակ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/troubleshootMode.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/troubleshootMode.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/troubleshootMode.ftl 2026-03-24 16:59:41.298546600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/troubleshootMode.ftl 2026-04-23 05:16:30.406482700 +0000 @@ -0,0 +1,4 @@ +troubleshoot-mode-dialog-title = { -brand-short-name }-ի Խափանաշտկման կերպ +troubleshoot-mode-continue = + .label = Շարունակել Խափանաշտկման կերպում + .accesskey = C diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbar.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbar.ftl 2026-03-24 16:59:41.298678900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbar.ftl 2026-04-23 05:16:30.406559700 +0000 @@ -3,5 +3,11 @@ toolbar-get-all-messages-menuitem = .label = Ստանալ բոլոր նոր նամակները .accesskey = G +customize-space-tab-addressbook = Հասցեագիրք + .title = Հասցեագիրք +customize-space-tab-settings = Կարգավորումներ + .title = Կարգավորումներ customize-restore-default = Վերականգնել սկզբնադիրը customize-button-style-icons-beside-text-option = Պատկերակ գրույթի կողքին +customize-palette-add-to = + .label = Ավելացնել { $target }-ին diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbarItems.ftl thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbarItems.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbarItems.ftl 2026-03-24 16:59:41.298761000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/localization/hy-AM/messenger/unifiedToolbarItems.ftl 2026-04-23 05:16:30.406644800 +0000 @@ -58,6 +58,7 @@ toolbar-mark-as-label = Նշել toolbar-mark-as = .title = Նշել նամակներ +toolbar-address-book-label = Հասցեագիրք toolbar-address-book = .title = Անցնել Հասցեագրքին toolbar-chat-label = Զրույց @@ -75,6 +76,7 @@ toolbar-print-label = Տպել toolbar-print = .title = Տպել այս նամակը +toolbar-quick-filter-bar-label = Արագ զտիչ toolbar-synchronize-label = Համաժամել toolbar-synchronize = .title = Վերբեռնել օրացույցերը և համաժամեցնել փոփոխությունները @@ -105,3 +107,12 @@ toolbar-throbber-label = Ակտիվության ինդիկատոր toolbar-throbber = .title = Ակտիվության ինդիկատոր +toolbar-create-address-book-label = Նոր Հասցեագիրք +toolbar-create-address-book = + .title = Ստեղծել նոր հասցեագիրք +toolbar-new-address-book-popup-add-js-address-book = + .label = Հավելել տեղային Հասցեագիրք +toolbar-new-address-book-popup-add-carddav-address-book = + .label = Հավելել CardDAV Հասցեագիրք +toolbar-new-address-book-popup-add-ldap-address-book = + .label = Հավելել LDAP Հասցեագիրք diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/hy-AM/manifest.json 2026-03-24 16:59:41.307598000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/hy-AM/manifest.json 2026-04-23 05:16:30.415599800 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: հայերեն (Armenian)", "description": "Thunderbird Language Pack for հայերեն (hy-AM) – Armenian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "hy-AM": { - "version": "20260320084526", + "version": "20260417023254", "chrome_resources": { "alerts": "chrome/hy-AM/locale/hy-AM/alerts/", "autoconfig": "chrome/hy-AM/locale/hy-AM/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/id/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/id/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/id/manifest.json 2026-03-24 16:59:41.358727500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/id/manifest.json 2026-04-23 05:16:30.467483000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Indonesia (Indonesian)", "description": "Thunderbird Language Pack for Indonesia (id) – Indonesian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "id": { - "version": "20260320084733", + "version": "20260417023512", "chrome_resources": { "alerts": "chrome/id/locale/id/alerts/", "autoconfig": "chrome/id/locale/id/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/is/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/is/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/is/manifest.json 2026-03-24 16:59:41.409800300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/is/manifest.json 2026-04-23 05:16:30.522585200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Islenska (Icelandic)", "description": "Thunderbird Language Pack for Islenska (is) – Icelandic", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "is": { - "version": "20260320084940", + "version": "20260417023738", "chrome_resources": { "alerts": "chrome/is/locale/is/alerts/", "autoconfig": "chrome/is/locale/is/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar-event-dialog.properties thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar-event-dialog.properties --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar-event-dialog.properties 2026-03-24 16:59:41.412442700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar-event-dialog.properties 2026-04-23 05:16:30.525283300 +0000 @@ -77,7 +77,7 @@ repeatDetailsDay7Plural = sabati eventRecurrenceForeverLabel = Per sempre counterSummaryAccepted = %1$S ha accettato l’invito ma ha fatto una controproposta: -counterSummaryDeclined = %1$S ha declinato l’invito ma ha fatto una controproposta: +counterSummaryDeclined = %1$S ha rifiutato l’invito ma ha proposto un orario alternativo: counterSummaryDelegated = %1$S ha delegato l’invito ma ha fatto una controproposta: counterSummaryNeedsAction = %1$S non ha ancora deciso se partecipare e ha fatto una controproposta: counterSummaryTentative = %1$S deve ancora confermare la partecipazione e ha fatto una controproposta: @@ -85,12 +85,12 @@ counterOnCounterDisallowedNotification = Le controproposte sono state disattivate quando è stato spedito l’evento. eventAccepted = Questo invito è stato accettato eventTentative = Questo invito è stato accettato come in forse -eventDeclined = Questo invito è stato declinato +eventDeclined = Questo invito è stato rifiutato eventDelegated = Questo invito è stato delegato eventNeedsAction = Non si è ancora risposto a questo invito taskAccepted = Si è accettato di lavorare a questa attività taskTentative = Si è accettato come in forse di lavorare a questa attività -taskDeclined = Si è declinato il lavoro a questa attività +taskDeclined = Hai rifiutato di lavorare a questa attività taskDelegated = Si è delegato il lavoro a questa attività taskNeedsAction = Non si è ancora risposto all’assegnazione di questa attività taskInProgress = Il lavoro su questa attività assegnata è stato iniziato diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar.dtd thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar.dtd 2026-03-24 16:59:41.412838000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/calendar/calendar.dtd 2026-04-23 05:16:30.525679800 +0000 @@ -87,7 +87,7 @@ - + @@ -101,7 +101,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/lightning/lightning.properties thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/lightning/lightning.properties --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/lightning/lightning.properties 2026-03-24 16:59:41.421435600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/lightning/lightning.properties 2026-04-23 05:16:30.538350800 +0000 @@ -22,7 +22,7 @@ imipHtml.attendeeRole2.OPT-PARTICIPANT = %1$S è un partecipante non fondamentale. imipHtml.attendeeRole2.REQ-PARTICIPANT = %1$S è un partecipante fondamentale. imipHtml.attendeePartStat2.ACCEPTED = %1$S ha confermato la partecipazione. -imipHtml.attendeePartStat2.DECLINED = %1$S ha confermato la non partecipazione. +imipHtml.attendeePartStat2.DECLINED = %1$S ha deciso di non partecipare. imipHtml.attendeePartStat2.DELEGATED = %1$S ha delegato la partecipazione a %2$S. imipHtml.attendeePartStat2.NEEDS-ACTION = %1$S deve ancora rispondere. imipHtml.attendeePartStat2.TENTATIVE = %1$S tenterà di partecipare. @@ -65,9 +65,9 @@ imipNoCalendarAvailable = Non sono disponibili calendari con permessi di scrittura. itipReplySubject2 = Risposta all’invito: %1$S itipReplyBodyAccept = %1$S ha accettato l’invito al proprio evento. -itipReplyBodyDecline = %1$S ha declinato l’invito al proprio evento. +itipReplyBodyDecline = %1$S ha rifiutato l’invito all’evento. itipReplySubjectAccept2 = Accettato: %1$S -itipReplySubjectDecline2 = Invito declinato: %1$S +itipReplySubjectDecline2 = Invito rifiutato: %1$S itipReplySubjectTentative2 = Da confermare: %1$S itipRequestSubject2 = Invito: %1$S itipRequestUpdatedSubject2 = Aggiornato: %1$S @@ -75,8 +75,8 @@ itipCancelSubject2 = Cancellato: %1$S itipCancelBody = %1$S ha cancellato questo evento: %2$S itipCounterBody = %1$S ha fatto una controproposta per “%2$S”: -itipDeclineCounterBody = %1$S ha declinato la controproposta per “%2$S”. -itipDeclineCounterSubject = Controproposta declinata: %1$S +itipDeclineCounterBody = %1$S ha rifiutato il nuovo orario proposto per “%2$S”. +itipDeclineCounterSubject = Nuovo orario rifiutato: %1$S confirmProcessInvitation = Questo elemento è stato eliminato di recente, si è sicuri di voler gestire questo invito? confirmProcessInvitationTitle = Gestire invito? invitationsLink.label = Inviti: %1$S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/FilterEditor.dtd thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/FilterEditor.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/FilterEditor.dtd 2026-03-24 16:59:41.421820900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/FilterEditor.dtd 2026-04-23 05:16:30.538748300 +0000 @@ -38,7 +38,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/filter.properties thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/filter.properties --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/filter.properties 2026-03-24 16:59:41.426439500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/filter.properties 2026-04-23 05:16:30.543493300 +0000 @@ -55,6 +55,6 @@ filterAction15 = scaricato il corpo dal server POP3 filterAction16 = copiato nella cartella filterAction17 = etichettato -filterAction18 = ignora le sotto discussioni +filterAction18 = ignora sottodiscussione filterAction19 = segnato come non letto filterAutoNameStr = %1$S %2$S: %3$S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd 2026-03-24 16:59:41.428402000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd 2026-04-23 05:16:30.545561300 +0000 @@ -333,7 +333,7 @@ - + @@ -660,7 +660,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.properties thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.properties --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.properties 2026-03-24 16:59:41.428598000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.properties 2026-04-23 05:16:30.545761000 +0000 @@ -339,12 +339,12 @@ learnMoreAboutIgnoreThreadAccessKey = i undoIgnoreThread = Annulla Ignora argomento undoIgnoreThreadAccessKey = A -undoIgnoreSubthread = Annulla Ignora i sotto argomenti +undoIgnoreSubthread = Annulla Ignora sottodiscussione undoIgnoreSubthreadAccessKey = n ignoredThreadFeedback = Le risposte all’argomento “#1” non saranno visualizzate. -ignoredSubthreadFeedback = Le risposte al sotto-argomento “#1” non saranno visualizzate. +ignoredSubthreadFeedback = Le risposte alla sottodiscussione “#1” non saranno visualizzate. ignoredThreadsFeedback = Le risposte all’argomento selezionato non saranno visualizzate.;Le risposte ai #1 argomenti selezionati non saranno visualizzate. -ignoredSubthreadsFeedback = Le risposte al sotto-argomento selezionato non saranno visualizzate.;Le risposte ai #1 sotto-argomenti selezionati non saranno visualizzate. +ignoredSubthreadsFeedback = Le risposte alla sottodiscussione selezionata non saranno visualizzate.;Le risposte alle #1 sottodiscussioni selezionate non saranno visualizzate. saveAsType = file %S openSearch.label = Cerca “%2$S” in %1$S openSearch.label.truncated = Cerca “%2$S…” in %1$S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messengercompose/composeMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messengercompose/composeMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messengercompose/composeMsgs.properties 2026-03-24 16:59:41.430381300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/chrome/it/locale/it/messenger/messengercompose/composeMsgs.properties 2026-04-23 05:16:30.547643000 +0000 @@ -11,7 +11,7 @@ smtpServerError = Si è verificato un errore durante l’invio della posta: errore nel server posta in uscita (SMTP). Il server ha risposto: %s. unableToSendLater = Siamo spiacenti, non è stato possibile salvare il messaggio per l’invio differito. dontShowAlert = Questo è solo un segnaposto. Non si dovrebbe mai vedere questo messaggio. -failedCopyOperation = Il messaggio è stato inviato con successo, ma non è stato possibile copiarlo nella cartella Posta inviata. +failedCopyOperation = Il messaggio è stato inviato correttamente, ma non è stato possibile copiarlo nella cartella Posta inviata. msgCancelling = Annullamento in corso… sendFailedButNntpOk = Il messaggio è stato inviato al gruppo di discussione, ma non è stato inviato agli altri destinatari. followupToSenderMessage = L’autore di questo messaggio ha chiesto che le risposte siano indirizzate solo a lui. Se si desidera rispondere al gruppo di discussione aggiungere un nuovo campo nell’area degli indirizzi, scegliere Gruppo di discussione dalla lista dei destinatari e inserire il nome del gruppo. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/localization/it/messenger/accountcreation/accountSetup.ftl thunderbird-140.10.0esr/thunderbird-l10n/it/localization/it/messenger/accountcreation/accountSetup.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/it/localization/it/messenger/accountcreation/accountSetup.ftl 2026-03-24 16:59:41.445454100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/localization/it/messenger/accountcreation/accountSetup.ftl 2026-04-23 05:16:30.562923000 +0000 @@ -58,11 +58,11 @@ account-setup-looking-up-exchange = Ricerca configurazione: server Exchange... account-setup-checking-password = Controllo password… account-setup-installing-addon = Download e installazione del componente aggiuntivo… -account-setup-success-half-manual = Sono state trovate le seguenti impostazioni interrogando il server impostato: +account-setup-success-half-manual = Sono state rilevate le seguenti impostazioni dal server indicato: account-setup-success-guess = Configurazione rilevata cercando tra i nomi dei server più comuni. account-setup-success-guess-offline = La connessione non è attiva. Abbiamo cercato di indovinare alcune impostazioni ma sarà necessario inserire le impostazioni corrette. account-setup-success-password = La password è corretta -account-setup-success-addon = Componente aggiuntivo installato con successo +account-setup-success-addon = Componente aggiuntivo installato correttamente account-setup-success-settings-db = Configurazione rilevata nell’archivio provider di Mozilla. account-setup-success-settings-disk = Configurazione rilevata durante l’installazione di { -brand-short-name }. account-setup-success-settings-isp = Configurazione rilevata dal fornitore di posta elettronica. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/it/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/it/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/it/manifest.json 2026-03-24 16:59:41.461878500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/it/manifest.json 2026-04-23 05:16:30.580242600 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Italiano (Italian)", "description": "Thunderbird Language Pack for Italiano (it) – Italian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "it": { - "version": "20260320085147", + "version": "20260417023959", "chrome_resources": { "alerts": "chrome/it/locale/it/alerts/", "autoconfig": "chrome/it/locale/it/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/preferences.properties thunderbird-140.10.0esr/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/preferences.properties --- thunderbird-140.9.0esr/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/preferences.properties 2026-03-24 16:59:41.485191300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/preferences.properties 2026-04-23 05:16:30.604403300 +0000 @@ -30,7 +30,7 @@ noCookieSelected = cookiesAll = 以下の Cookie が保存されています: cookiesFiltered = 以下の Cookie が検索にマッチしました: -removeSelectedCookies = 選択した Cookie を削除 +removeSelectedCookies = 選択した #1 個の Cookie を削除 defaultUserContextLabel = なし actualDiskCacheSize = キャッシュはディスク領域の %1$S %2$S を使用しています actualDiskCacheSizeCalculated = キャッシュサイズを計算しています... diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ja/localization/ja/messenger/calendarDialog.ftl thunderbird-140.10.0esr/thunderbird-l10n/ja/localization/ja/messenger/calendarDialog.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ja/localization/ja/messenger/calendarDialog.ftl 2026-03-24 16:59:41.498195400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ja/localization/ja/messenger/calendarDialog.ftl 2026-04-23 05:16:30.617905100 +0000 @@ -14,7 +14,7 @@ .alt = 詳細 calendar-dialog-description-label = 詳細 calendar-dialog-description-expand-icon = - .alt = 詳細をすべて表示します + .alt = 詳細をすべて表示 calendar-dialog-more-categories = { $additionalCategories -> *[other] とその他 { $additionalCategories } 個 diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ja/localization/ja/messenger/messengercompose/messengercompose.ftl thunderbird-140.10.0esr/thunderbird-l10n/ja/localization/ja/messenger/messengercompose/messengercompose.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ja/localization/ja/messenger/messengercompose/messengercompose.ftl 2026-03-24 16:59:41.499936000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ja/localization/ja/messenger/messengercompose/messengercompose.ftl 2026-04-23 05:16:30.619633000 +0000 @@ -220,11 +220,7 @@ cloud-file-unknown-account-tooltip = 未知の Filelink アカウントにアップロードされました。 cloud-file-placeholder-title = { $filename } - Filelink 添付 cloud-file-placeholder-intro = { $filename } のファイルが Filelink として添付されました。以下のリンクからダウンロードできます。 -cloud-file-count-header = - { $count -> - [one] { $count } 個のファイルをこのメールにリンクしました: - *[other] { $count } 個のファイルをこのメールにリンクしました: - } +cloud-file-count-header = { $count } 個のファイルをこのメールにリンクしました: cloud-file-service-provider-footer-single = { $link } についての詳細。 cloud-file-service-provider-footer-multiple = { $firstLinks } および { $lastLink } についての詳細。 cloud-file-tooltip-password-protected-link = リンク先がパスワードで保護されています diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ja/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ja/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ja/manifest.json 2026-03-24 16:59:41.514234800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ja/manifest.json 2026-04-23 05:16:30.633949300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: 日本語 (Japanese)", "description": "Thunderbird Language Pack for 日本語 (ja) – Japanese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ja": { - "version": "20260320084310", + "version": "20260417023022", "chrome_resources": { "alerts": "chrome/ja/locale/ja/alerts/", "autoconfig": "chrome/ja/locale/ja/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ka/localization/ka/messenger/messenger.ftl thunderbird-140.10.0esr/thunderbird-l10n/ka/localization/ka/messenger/messenger.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ka/localization/ka/messenger/messenger.ftl 2026-03-24 16:59:41.555595900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ka/localization/ka/messenger/messenger.ftl 2026-04-23 05:16:30.674129000 +0000 @@ -250,7 +250,7 @@ addon-removal-confirmation-button = მოცილება addon-removal-confirmation-message = მოცილდეს { $name } და გასუფთავდეს { -brand-short-name } მისი პარამეტრებისგან? caret-browsing-prompt-title = მაჩვენებლით გადაადგილება -caret-browsing-prompt-text = F7 ღილაკით ჩაირთვება ტექსტში მაჩვენებლის გამოყენების შესაძლებლობა. შედეგად, სხვადასხვა ტექსტში გამოჩნდება მოციმციმე მაჩვენებელი, რომ შეიძლებოდეს კლავიატურით მონიშვნა. გსურთ, ტექსტებში მაჩვენებლის გამოყენება? +caret-browsing-prompt-text = ღილაკით F7 ირთვება ნაწერში მაჩვენებლის გამოყენების შესაძლებლობა. შედეგად, გარკვეულ მასალათა წარწერებში შეიძლება განთავსდეს მოციმციმე მაჩვენებელი, თუნდაც კლავიატურით მონიშვნისთვის. გსურთ, ნაწერებში მაჩვენებლის გამოყენება? caret-browsing-prompt-check-text = შეკითხვის გარეშე. repair-text-encoding-button = .label = ტექსტის კოდირების გასწორება diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ka/localization/ka/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/ka/localization/ka/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ka/localization/ka/messenger/preferences/preferences.ftl 2026-03-24 16:59:41.559898400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ka/localization/ka/messenger/preferences/preferences.ftl 2026-04-23 05:16:30.678714300 +0000 @@ -52,7 +52,7 @@ .label = ნებართვა, რომ { -brand-short-name } შეძლებს გადაუგზავნოს ტექნიკური და გამოყენების მონაცემები { -vendor-short-name }-ს .accesskey = ტ collection-health-report-link = ვრცლად -collection-health-report-disabled = მოხსენებები გამორთულია ანაწყობის ამ კონფიგურაციისთვის +collection-health-report-disabled = მონაცემთა მოხსენება გათიშულია ამ გამართვის ანაწყობზე. collection-backlogged-crash-reports = .label = ნებართვა, რომ { -brand-short-name } თავადვე გაგზავნის უეცარი გათიშვების მოხსენებებს .accesskey = უ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ka/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ka/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ka/manifest.json 2026-03-24 16:59:41.571128600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ka/manifest.json 2026-04-23 05:16:30.689925200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: ქართული (Georgian)", "description": "Thunderbird Language Pack for ქართული (ka) – Georgian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ka": { - "version": "20260320084531", + "version": "20260417023241", "chrome_resources": { "alerts": "chrome/ka/locale/ka/alerts/", "autoconfig": "chrome/ka/locale/ka/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/kab/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/kab/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/kab/manifest.json 2026-03-24 16:59:41.622635100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/kab/manifest.json 2026-04-23 05:16:30.742758500 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Taqbaylit (Kabyle)", "description": "Thunderbird Language Pack for Taqbaylit (kab) – Kabyle", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "kab": { - "version": "20260320084738", + "version": "20260417023443", "chrome_resources": { "alerts": "chrome/kab/locale/kab/alerts/", "autoconfig": "chrome/kab/locale/kab/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/kk/localization/kk/messenger/accountcreation/accountHub.ftl thunderbird-140.10.0esr/thunderbird-l10n/kk/localization/kk/messenger/accountcreation/accountHub.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/kk/localization/kk/messenger/accountcreation/accountHub.ftl 2026-03-24 16:59:41.669470000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/kk/localization/kk/messenger/accountcreation/accountHub.ftl 2026-04-23 05:16:30.780774000 +0000 @@ -114,7 +114,7 @@ account-hub-oauth-pending = Жүйеге кіру қалқымалы терезесіндегі авторизация күтілуде… account-hub-addon-install-needed = { -brand-short-name } бұл серверді қолдамайды. Exchange электрондық поштасына кіру үшін Owl (ақылы) сияқты үшінші жақты қосымшасын орнатыңыз. account-hub-addon-error = Қосымшаны орнату сәтсіз аяқталды. Қайталап көріңіз немесе көмек алу үшін қосымша авторына хабарласыңыз. -account-hub-security-warning = Ескерту: Қауіпсіз пошта сервері анықталды. Бұл серверде шифрлеу жоқ, бұл сіздің пароліңізді және деректеріңізді ашып көрсетеді. Байланысты қауіпсіздендіру үшін әкімшіге хабарласыңыз немесе өз тәуекеліңізге жалғастырыңыз. Қосымша ақпарат алу үшін Жиі қойылатын сұрақтар бөлімін қараңыз. +account-hub-security-warning = Ескерту: Қауіпсіз емес пошта сервері анықталды. Бұл серверде шифрлеу жоқ, бұл сіздің пароліңізді және деректеріңізді ашып көрсетеді. Байланысты қауіпсіздендіру үшін әкімшіге хабарласыңыз немесе өз тәуекеліңізге жалғастырыңыз. Қосымша ақпарат алу үшін Жиі қойылатын сұрақтар бөлімін қараңыз. account-hub-account-authentication-error = Аутентификация қатесі. account-hub-add-address-book = Адрестік кітапшаны қосу address-book-sync-existing-icon = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/kk/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/kk/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/kk/manifest.json 2026-03-24 16:59:41.688075500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/kk/manifest.json 2026-04-23 05:16:30.798363700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: қазақ тілі (Kazakh)", "description": "Thunderbird Language Pack for қазақ тілі (kk) – Kazakh", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "kk": { - "version": "20260320084933", + "version": "20260417023647", "chrome_resources": { "alerts": "chrome/kk/locale/kk/alerts/", "autoconfig": "chrome/kk/locale/kk/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ko/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ko/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ko/manifest.json 2026-03-24 16:59:41.743057300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ko/manifest.json 2026-04-23 05:16:30.851062500 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: 한국어 (Korean)", "description": "Thunderbird Language Pack for 한국어 (ko) – Korean", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ko": { - "version": "20260320085127", + "version": "20260417023851", "chrome_resources": { "alerts": "chrome/ko/locale/ko/alerts/", "autoconfig": "chrome/ko/locale/ko/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/lt/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/lt/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/lt/manifest.json 2026-03-24 16:59:41.794825000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/lt/manifest.json 2026-04-23 05:16:30.903665300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Lietuvių (Lithuanian)", "description": "Thunderbird Language Pack for Lietuvių (lt) – Lithuanian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "lt": { - "version": "20260320084307", + "version": "20260417023017", "chrome_resources": { "alerts": "chrome/lt/locale/lt/alerts/", "autoconfig": "chrome/lt/locale/lt/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/lv/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/lv/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/lv/manifest.json 2026-03-24 16:59:41.845979500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/lv/manifest.json 2026-04-23 05:16:30.952651000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Latviešu (Latvian)", "description": "Thunderbird Language Pack for Latviešu (lv) – Latvian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "lv": { - "version": "20260320084514", + "version": "20260417023228", "chrome_resources": { "alerts": "chrome/lv/locale/lv/alerts/", "autoconfig": "chrome/lv/locale/lv/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ms/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ms/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ms/manifest.json 2026-03-24 16:59:41.894104200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ms/manifest.json 2026-04-23 05:16:31.001345900 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Melayu (Malay)", "description": "Thunderbird Language Pack for Melayu (ms) – Malay", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ms": { - "version": "20260320084707", + "version": "20260417023425", "chrome_resources": { "alerts": "chrome/ms/locale/ms/alerts/", "autoconfig": "chrome/ms/locale/ms/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/policies/policies-descriptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/policies/policies-descriptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/policies/policies-descriptions.ftl 2026-03-24 16:59:41.934568000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/policies/policies-descriptions.ftl 2026-04-23 05:16:31.042179800 +0000 @@ -28,7 +28,7 @@ policy-DisableSystemAddonUpdate = Forhindre at { -brand-short-name } installerer og oppdaterer system-utvidelser. policy-DisableTelemetry = Slå av av telemetri. policy-DisplayMenuBar = Vise menylinjen som standard. -policy-DNSOverHTTPS = Konfigurer DNS-oppslag over HTTPS. +policy-DNSOverHTTPS = Konfigurer DNS-over-HTTPS. policy-DontCheckDefaultClient = Deaktiver sjekk om standard-klient ved oppstart. policy-DownloadDirectory = Angi og lås netlastingskatalogen. policy-EnableTrackingProtection = Aktiver eller deaktiver innholdsblokkering med mulighet til å låse valget. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/preferences/connection.ftl thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/preferences/connection.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/preferences/connection.ftl 2026-03-24 16:59:41.935118000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/localization/nb-NO/messenger/preferences/connection.ftl 2026-04-23 05:16:31.042733000 +0000 @@ -2,11 +2,11 @@ .accesskey = r connection-dns-over-https-url-item-default = .label = { $name } (standard) - .tooltiptext = Bruk standardadressen for DNS-oppslag over HTTPS + .tooltiptext = Bruk standardadressen for DNS-over-HTTPS connection-dns-over-https-url-custom = .label = Tilpasset .accesskey = T - .tooltiptext = Angi din foretrukne nettadresse for DNS-oppslag over HTTPS + .tooltiptext = Angi din foretrukne nettadresse for DNS-over-HTTPS connection-dns-over-https-custom-label = Tilpasset connection-dialog-title = Tilkoblingsinnstillinger disable-extension-button = Slå av utvidelse diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/nb-NO/manifest.json 2026-03-24 16:59:41.946051100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nb-NO/manifest.json 2026-04-23 05:16:31.053806000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Norsk Bokmål (Norwegian Bokmål)", "description": "Thunderbird Language Pack for Norsk Bokmål (nb-NO) – Norwegian Bokmål", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "nb-NO": { - "version": "20260320084901", + "version": "20260417023622", "chrome_resources": { "alerts": "chrome/nb-NO/locale/nb-NO/alerts/", "autoconfig": "chrome/nb-NO/locale/nb-NO/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nl/localization/nl/messenger/policies/policies-descriptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/nl/localization/nl/messenger/policies/policies-descriptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/nl/localization/nl/messenger/policies/policies-descriptions.ftl 2026-03-24 16:59:41.986285700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nl/localization/nl/messenger/policies/policies-descriptions.ftl 2026-04-23 05:16:31.095705300 +0000 @@ -52,7 +52,7 @@ policy-OverridePostUpdatePage = De pagina ‘Wat is er nieuw’ na een update vervangen. Stel deze beleidsregel in op leeg als u de betreffende pagina wilt uitschakelen. policy-PasswordManagerEnabled = Opslaan van wachtwoorden in de wachtwoordenbeheerder inschakelen. policy-PDFjs = PDF.js, de in { -brand-short-name } ingebouwde PDF-lezer, uitschakelen of instellen. -policy-Permissions2 = Toestemmingen voor camera, microfoon, locatie, notificaties en automatisch afspelen configureren. +policy-Permissions2 = Toestemmingen voor camera, microfoon, locatie, meldingen en automatisch afspelen configureren. policy-Preferences = De waarde voor een subset van voorkeuren instellen en vergrendelen. policy-PrimaryPassword = Een hoofdwachtwoord vereisen of voorkomen. policy-PromptForDownloadLocation = Vragen waar gedownloade bestanden moeten worden opgeslagen. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nl/localization/nl/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/nl/localization/nl/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/nl/localization/nl/messenger/preferences/preferences.ftl 2026-03-24 16:59:41.987808000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nl/localization/nl/messenger/preferences/preferences.ftl 2026-04-23 05:16:31.097301700 +0000 @@ -63,9 +63,9 @@ privacy-certificates-title = Certificaten chat-pane-header = Chat chat-status-title = Status -chat-notifications-title = Notificaties +chat-notifications-title = Meldingen chat-pane-styling-header = Vormgeving -choose-messenger-language-description = Kies de talen die worden gebruikt voor het weergeven van menu’s, berichten en notificaties van { -brand-short-name }. +choose-messenger-language-description = Kies de talen die worden gebruikt voor het weergeven van menu’s, berichten en meldingen van { -brand-short-name }. manage-messenger-languages-button = .label = Alternatieven instellen… .accesskey = l diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nl/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/nl/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/nl/manifest.json 2026-03-24 16:59:41.997678000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nl/manifest.json 2026-04-23 05:16:31.107416900 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Nederlands (Dutch)", "description": "Thunderbird Language Pack for Nederlands (nl) – Dutch", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "nl": { - "version": "20260320085056", + "version": "20260417023818", "chrome_resources": { "alerts": "chrome/nl/locale/nl/alerts/", "autoconfig": "chrome/nl/locale/nl/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/imapMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/imapMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/imapMsgs.properties 2026-03-24 16:59:42.015141000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/imapMsgs.properties 2026-04-23 05:16:31.125367200 +0000 @@ -35,7 +35,7 @@ imapUnknownHostError = Klarte ikkje å kopla serveren %S. imapOAuth2Error = Autentiseringsfeil ved tilkopling til server %S. imapConnectionRefusedError = Klarte ikkje å kople til e-postserveren %S; tilkoplinga vart avvist. -imapNetTimeoutError = Tilkopling til sørvnar %S fekk tidsavbrot. +imapNetTimeoutError = Tilkopling til serveren %S fekk tidsavbrot. imapTlsError = Det oppstod ein TLS-feil som ikkje kan overstyrast. Handhelsing-feil, eller så er sannsynlegvis TLS-versjonen eller sertifikatet som vert brukt av serveren %S ikkje-kompatible. imapNoNewMessages = Det er ingen nye meldingar på serveren. imapDefaultAccountName = E-post for %S diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/EditorSpellCheck.dtd thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/EditorSpellCheck.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/EditorSpellCheck.dtd 2026-03-24 16:59:42.017938100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/EditorSpellCheck.dtd 2026-04-23 05:16:31.128222500 +0000 @@ -17,7 +17,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/messenger/accountcreation/accountSetup.ftl thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/messenger/accountcreation/accountSetup.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/messenger/accountcreation/accountSetup.ftl 2026-03-24 16:59:42.033179800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/localization/nn-NO/messenger/accountcreation/accountSetup.ftl 2026-04-23 05:16:31.143537000 +0000 @@ -157,7 +157,7 @@ account-setup-settings-button = Kontoinnstillingar account-setup-encryption-button = Ende-til-ende-kryptering account-setup-signature-button = Legg til ein signatur -account-setup-dictionaries-button = Last ned ordlister +account-setup-dictionaries-button = Last ned ordbøker account-setup-address-book-carddav-button = Kople til ei CardDAV-adressebok account-setup-address-book-ldap-button = Kople til ei LDAP-adressebok account-setup-calendar-button = Kople til ein ekstern kalender diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/nn-NO/manifest.json 2026-03-24 16:59:42.049929900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/nn-NO/manifest.json 2026-04-23 05:16:31.160041600 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Nynorsk (Norwegian Nynorsk)", "description": "Thunderbird Language Pack for Nynorsk (nn-NO) – Norwegian Nynorsk", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "nn-NO": { - "version": "20260320083843", + "version": "20260417023021", "chrome_resources": { "alerts": "chrome/nn-NO/locale/nn-NO/alerts/", "autoconfig": "chrome/nn-NO/locale/nn-NO/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/calendar/calendar-alarms.ftl thunderbird-140.10.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/calendar/calendar-alarms.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/calendar/calendar-alarms.ftl 2026-03-24 16:59:42.079100000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pa-IN/localization/pa-IN/calendar/calendar-alarms.ftl 2026-04-23 05:16:31.193302900 +0000 @@ -1,16 +1,14 @@ reminder-custom-title = { $unit } { $reminderCustomOrigin } -reminder-title-at-start-event = The moment the event starts -reminder-title-at-start-task = The moment the task starts -reminder-title-at-end-event = The moment the event ends -reminder-title-at-end-task = The moment the task ends -reminder-custom-origin-begin-before-event = before the event starts -reminder-custom-origin-begin-after-event = after the event starts -reminder-custom-origin-end-before-event = before the event ends -reminder-custom-origin-end-after-event = after the event ends -reminder-custom-origin-begin-before-task = before the task starts -reminder-custom-origin-begin-after-task = after the task starts -reminder-custom-origin-end-before-task = before the task ends -reminder-custom-origin-end-after-task = after the task ends +reminder-title-at-start-task = ਜਦੋਂ ਕਾਰਜ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ +reminder-title-at-end-task = ਜਦੋਂ ਕਾਰਜ ਸਮਾਪਤ ਹੁੰਦਾ ਹੈ +reminder-custom-origin-begin-before-event = ਕਾਰਜ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ +reminder-custom-origin-begin-after-event = ਕਾਰਜ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਬਾਅਦ +reminder-custom-origin-end-before-event = ਕਾਰਜ ਸਮਾਪਤ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ +reminder-custom-origin-end-after-event = ਕਾਰਜ ਸਮਾਪਤ ਹੋਣ ਤੋਂ ਬਾਅਦ +reminder-custom-origin-begin-before-task = ਕਾਰਜ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ +reminder-custom-origin-begin-after-task = ਕਾਰਜ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਬਾਅਦ +reminder-custom-origin-end-before-task = ਕਾਰਜ ਸਮਾਪਤ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ +reminder-custom-origin-end-after-task = ਕਾਰਜ ਸਮਾਪਤ ਹੋਣ ਤੋਂ ਬਾਅਦ reminder-custom-origin-begin-before-event-dom = .label = { reminder-custom-origin-begin-before-event } reminder-custom-origin-begin-after-event-dom = @@ -37,3 +35,6 @@ [one] The selected calendar has a limitation of { $count } reminder per task. *[other] The selected calendar has a limitation of { $count } reminders per task. } +reminder-readonly-notification = ਕੇਵਲ ਪੜ੍ਹਨ-ਯੋਗ ਕੈਲੰਡਰਾਂ ਲਈ ਯਾਦ ਦਿਵਾਉਣਾਂ ਨੂੰ ਇਸ ਵੇਲੇ ਟਾਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਸਿਰਫ਼ ਰੱਦ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ — '{ $label }' ਬਟਨ ਕੇਵਲ ਲਿਖਣ-ਯੋਗ ਕੈਲੰਡਰਾਂ ਲਈ ਹੀ ਯਾਦ ਦਿਵਾਉਣਾਂ ਨੂੰ ਟਾਲੇਗਾ। +reminder-disabled-snooze-button-tooltip = + .tooltiptext = ਕੇਵਲ ਪੜ੍ਹਨ-ਯੋਗ ਕੈਲੰਡਰਾਂ ਲਈ ਯਾਦ ਦਿਵਾਉਣ ਨੂੰ ਟਾਲਣਾ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ। diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pa-IN/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/pa-IN/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/pa-IN/manifest.json 2026-03-24 16:59:42.098796800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pa-IN/manifest.json 2026-04-23 05:16:31.213989300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: ਪੰਜਾਬੀ (Punjabi)", "description": "Thunderbird Language Pack for ਪੰਜਾਬੀ (pa-IN) – Punjabi", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "pa-IN": { - "version": "20260320084107", + "version": "20260417023245", "chrome_resources": { "alerts": "chrome/pa-IN/locale/pa-IN/alerts/", "autoconfig": "chrome/pa-IN/locale/pa-IN/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pl/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/pl/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/pl/manifest.json 2026-03-24 16:59:42.151510500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pl/manifest.json 2026-04-23 05:16:31.267445300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Polski (Polish)", "description": "Thunderbird Language Pack for Polski (pl) – Polish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "pl": { - "version": "20260320084322", + "version": "20260417023455", "chrome_resources": { "alerts": "chrome/pl/locale/pl/alerts/", "autoconfig": "chrome/pl/locale/pl/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-BR/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/pt-BR/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/pt-BR/manifest.json 2026-03-24 16:59:42.203482900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-BR/manifest.json 2026-04-23 05:16:31.321533400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Português (BR)", "description": "Thunderbird Language Pack for Português (BR) (pt-BR) – Brazilian Portuguese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "pt-BR": { - "version": "20260320084547", + "version": "20260417023706", "chrome_resources": { "alerts": "chrome/pt-BR/locale/pt-BR/alerts/", "autoconfig": "chrome/pt-BR/locale/pt-BR/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:42.242808000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:31.361696200 +0000 @@ -1,11 +1,16 @@ e2e-intro-description = Para enviar mensagens encriptadas ou assinadas digitalmente, tem de configurar uma tecnologia de encriptação, OpenPGP ou S/MIME. e2e-intro-description-more = Selecione a sua chave pessoal para ativar a utilização do OpenPGP, ou o seu certificado pessoal para ativar a utilização do S/MIME. Para uma chave ou certificado pessoal, você possui a respetiva chave secreta. +e2e-csr-intro = Para obter um novo certificado pessoal S/MIME, crie um Pedido de Assinatura de Certificado (CSR) e envie-o a uma Autoridade Certificadora (CA) +e2e-csr-intro-info = Selecione um diretório local e um nome de ficheiro para o seu ficheiro CSR e responda às seguintes perguntas para definir o algoritmo e a robustez. e2e-csr-title = Gerar CSR e2e-csr-continue = Continuar e2e-csr-back = Retroceder e2e-csr-button = .label = Gerar e guardar um ficheiro CSR como… e2e-csr-select-title = Algoritmo de CSR +e2e-csr-select-alg = Escolha entre RSA (recomendado) ou ECC como o seu algoritmo criptográfico para o novo certificado S/MIME. +e2e-csr-select-strength = Escolha a robustez criptográfica pretendida (mais rápida com números inferiores ou melhor segurança com números superiores) para o novo certificado S/MIME, ou mantenha a definição predefinida. +e2e-csr-summary = Será gerada uma nova chave secreta { $type } { $strength } nas definições do { -brand-short-name }. Este processo poderá demorar algum tempo e causar uma falta de responsividade temporária; por favor, aguarde pacientemente durante este passo. O ficheiro de Pedido de Assinatura de Certificado (CSR), guardado como { $file }, será entretanto criado. e2e-csr-include-email = Incluir o endereço de e-mail ({ $email }) no CSR (recomendado) e2e-csr-success = O CSR foi guardado com sucesso em { $file } e2e-csr-failure = Não foi possível guardar o CSR no ficheiro { $file } @@ -289,6 +294,11 @@ openpgp-copy-cmd-label = .label = Copiar openpgp-description-no-key = O { -brand-short-name } não tem uma chave OpenPGP pessoal para { $identity } +openpgp-description-has-keys = + { $count -> + [one] O { -brand-short-name } encontrou { $count } chave OpenPGP pessoal associada a { $identity } + *[other] O { -brand-short-name } encontrou { $count } chaves OpenPGP pessoais associadas a { $identity } + } openpgp-selection-status-have-key = A sua configuração atual utiliza a chave com o ID { $key } openpgp-selection-status-error = A sua configuração atual utiliza a chave { $key }, que expirou. openpgp-add-key-button = @@ -463,6 +473,7 @@ fail-key-import = Erro - a importação da chave falhou file-write-failed = Falha ao escrever no ficheiro { $output } no-pgp-block = Erro - não foi encontrado nenhum bloco de dados OpenPGP blindado válido +imported-secret-with-unsupported-features = Algumas das chaves secretas importadas anunciam uma funcionalidade não suportada. Se utilizar uma dessas chaves como a sua chave pessoal, os correspondentes poderão enviar-lhe e-mails ou chaves públicas num formato incompatível. Isto afeta as chaves secretas importadas com as seguintes impressões digitais: { $fingerprints }. help-button = Ajuda key-valid-unknown = desconhecida key-valid-invalid = inválida diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/otr/am-im-otr.ftl thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/otr/am-im-otr.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/otr/am-im-otr.ftl 2026-03-24 16:59:42.243031000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/otr/am-im-otr.ftl 2026-04-23 05:16:31.361928700 +0000 @@ -1,6 +1,7 @@ account-encryption = .label = Encriptação ponto a ponto account-otr-label = Mensagens fora de registo (OTR) +account-otr-description2 = O { -brand-short-name } suporta encriptação de ponta a ponta de conversas individuais baseada em OTR. Isto impede que terceiros escutem uma conversa. Este tipo de encriptação de ponta a ponta só pode ser utilizada quando a outra pessoa também utiliza software que suporta OTR. otr-encryption-title = Encriptação confirmada otr-encryption-caption = Para permitir que outras pessoas confirmem a sua identidade em conversas OTR, partilhe o seu próprio identificador OTR utilizando um canal de comunicação externo (fora da banda). otr-fingerprint-label = O seu identificador digital: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/am-archiveoptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/am-archiveoptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/am-archiveoptions.ftl 2026-03-24 16:59:42.243909100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/am-archiveoptions.ftl 2026-04-23 05:16:31.362846000 +0000 @@ -22,3 +22,5 @@ .label = Caixa de entrada child-folder-name = .label = Sub-pasta da caixa de entrada +sibling-folder-name = + .label = Ao mesmo nível da Caixa de entrada diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/notifications.ftl thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/notifications.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/notifications.ftl 2026-03-24 16:59:42.244816800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/notifications.ftl 2026-04-23 05:16:31.363791200 +0000 @@ -9,6 +9,7 @@ sender-checkbox = .label = Remetente .accesskey = e +enabled-actions-description = Ações de mensagem: open-time-label-before = .value = Mostrar alerta de novas mensagens durante .accesskey = n diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/preferences.ftl 2026-03-24 16:59:42.245296200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/preferences/preferences.ftl 2026-04-23 05:16:31.364287000 +0000 @@ -27,6 +27,7 @@ pane-qr-export-title = Exportar para dispositivo móvel category-qr-export = .tooltiptext = Exportar para dispositivo móvel +general-language-and-fonts-header = Idioma e tipos de letra general-incoming-mail-header = Mensagens a receber general-files-and-attachment-header = Ficheiros e anexos general-tags-header = Etiquetas @@ -106,6 +107,9 @@ .label = Remover .accesskey = v add-opensearch-provider-title = Adicionar fornecedor OpenSearch +add-opensearch-provider-text = Introduza o URL do fornecedor de OpenSearch a adicionar. Utilize o URL direto do ficheiro de descrição OpenSearch ou um URL onde este possa ser detetado automaticamente. +adding-opensearch-provider-failed-title = Falha ao adicionar fornecedor de OpenSearch +adding-opensearch-provider-failed-text = Não foi possível adicionar o fornecedor de OpenSearch para { $url }. minimize-to-tray-label = .label = Quando o { -brand-short-name } for minimizado, movê-lo para a bandeja .accesskey = m @@ -603,12 +607,18 @@ account-settings = Definições da Conta email-e2ee-enable-info = Configurar contas de e-mail e identidades para a encriptação ponto a ponto nas Definições de conta. email-e2ee-automatism = Utilização automática de encriptação +email-e2ee-automatism-pre = + O { -brand-short-name } pode ajudar ativando ou desativando automaticamente a encriptação ao escrever um e-mail. + A ativação/desativação automática é baseada na disponibilidade de chaves ou certificados correspondentes válidos e aceites. email-e2ee-auto-on = .label = Quando possível, ativar automaticamente a encriptação email-e2ee-auto-off = .label = Desativar automaticamente a encriptação quando os destinatários forem alterados e a encriptação já não for possível email-e2ee-auto-off-notify = .label = Mostrar uma notificação quando a encriptação é desativada automaticamente +email-e2ee-automatism-post = + Decisões automáticas podem ser substituídas ao ativar ou desativar manualmente a encriptação ao compor uma mensagem. + Nota: a encriptação é sempre ativada automaticamente ao responder a uma mensagem encriptada. startup-label = .value = Ao iniciar o { -brand-short-name }: .accesskey = c @@ -726,23 +736,37 @@ sync-disconnected-text = Sincronize as suas contas de correio eletrónico, livros de endereço, calendários e identidades entre todos os seus dispositivos. sync-disconnected-turn-on-sync = Ativar a sincronização… qr-export-pane-header = Exportar as contas para o { -brand-product-name } para dispositivos móveis +qr-export-description = Transfira rapidamente as definições da sua conta do computador para o dispositivo móvel ao gerar um código QR. Selecione as contas a incluir, decida se pretende transferir a sua palavra-passe e digitalize o código com o seu dispositivo móvel. Rápido, seguro e simples. qr-export-get-app = Ainda não tem o { -brand-product-name } para dispositivos móveis? Obtenha-o no Google Play qr-export-create = Crie um código QR para exportar as suas contas qr-export-select-accounts = Selecione as contas a exportar: +qr-export-no-accounts = Não está a ver todas as suas contas? Algumas contas podem estar desativadas por não serem suportadas pela { -brand-product-name } para Android. Apoio qr-export-accounts-legend = Contas de correio eletrónico qr-export-select-all-accounts = Selecionar tudo qr-export-security-legend = Segurança qr-export-include-passwords = Incluir todas as palavras-passe das contas +qr-export-oauth-warning = Algumas das suas contas utilizam um método de autenticação que pode requerer uma reautenticação no seu dispositivo móvel. Pode necessitar de introduzir novamente as suas palavras-passe durante este processo. +qr-export-security-hint = Ao digitalizar os seguintes códigos QR, as suas definições de conta — incluindo o seu e-mail e palavra-passe — serão transferidas com segurança. Não recolhemos, armazenamos nem partilhamos nenhum destes dados durante o processo. A transferência ocorre diretamente entre os seus dispositivos. +qr-export-security-warning = Para a sua segurança, verifique se está num ambiente privado e digitalize apenas códigos QR de fontes fidedignas. qr-export-start-export = Exportar qr-export-scan-progress = { $count -> [one] { $step } de { $count } código QR *[other] { $step } de { $count } códigos QR } +qr-export-scan-description = + { $count -> + [one] Digitalize o código QR com o { -brand-product-name } no seu dispositivo móvel + *[other] Digitalize os códigos QR com o { -brand-product-name } no seu dispositivo móvel + } +qr-export-scan-step1 = Abra o { -brand-product-name } no seu dispositivo móvel qr-export-scan-step2 = Ir para as definições +qr-export-scan-step3 = Selecione Importar definições +qr-export-scan-step4-revision = Toque em Digitalizar código QR e mantenha o seu telemóvel sobre este código qr-export-back = Retroceder qr-export-next = Seguinte qr-export-done = Concluído +qr-export-summary-description = Contas exportadas. Continue no seu dispositivo móvel. qr-export-summary-title = Resumo da exportação: qr-export-summary-qr-count = { $count -> @@ -774,6 +798,7 @@ appearance-card-style-2 = .label = 2 linhas default-message-list-sorting-legend = Ordenação e agrupamento +default-message-list-description = Definir as opções predefinidas de ordenação e discussões para as novas pastas. default-flag-label = .value = Agrupamento predefinido: default-flag-unthreaded = @@ -826,6 +851,7 @@ default-sort-descending = .label = Descendente default-sort-descending-description = Novas mensagens no topo +apply-thread-sort-label = Propagar definições de discussões e ordenação a: apply-sort-to-all-button = .label = Todas as pastas existentes .accesskey = a @@ -838,3 +864,7 @@ .label = Pasta e os seus filhos... apply-changes-prompt-title = Aplicar alterações? apply-changes-prompt-message = Aplicar as definições de agrupamento e de ordenação atuais a todas as pastas? +apply-changes-prompt-folder-message = Aplicar as definições atuais de discussões e ordenação a “{ $name }”? +apply-changes-prompt-folder-children-message = Aplicar as definições atuais de discussões e ordenação a “{ $name }” e respetivas sub-pastas? +apply-current-view-error = Não foi possível aplicar as definições da vista atual +apply-current-view-success = As definições da vista atual foram aplicadas com sucesso diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/pt-PT/manifest.json 2026-03-24 16:59:42.255187500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/pt-PT/manifest.json 2026-04-23 05:16:31.375684700 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Português (PT) (Portuguese)", "description": "Thunderbird Language Pack for Português (PT) (pt-PT) – Portuguese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "pt-PT": { - "version": "20260320084820", + "version": "20260417023917", "chrome_resources": { "alerts": "chrome/pt-PT/locale/pt-PT/alerts/", "autoconfig": "chrome/pt-PT/locale/pt-PT/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/rm/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/rm/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/rm/manifest.json 2026-03-24 16:59:42.306913000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/rm/manifest.json 2026-04-23 05:16:31.433505300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Rumantsch (Romansh)", "description": "Thunderbird Language Pack for Rumantsch (rm) – Romansh", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "rm": { - "version": "20260320083948", + "version": "20260417023023", "chrome_resources": { "alerts": "chrome/rm/locale/rm/alerts/", "autoconfig": "chrome/rm/locale/rm/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/glodaFacetView.properties thunderbird-140.10.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/glodaFacetView.properties --- thunderbird-140.9.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/glodaFacetView.properties 2026-03-24 16:59:42.324172000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/glodaFacetView.properties 2026-04-23 05:16:31.451150000 +0000 @@ -7,7 +7,7 @@ glodaFacetView.constraints.query.initial = Se caută mesaje glodaFacetView.constraints.query.involves.label = implică #1 glodaFacetView.constraints.query.tagged.label = etichetate: -glodaFacetView.facets.mode.top.listAllLabel = Printează #1;Printează-le pe toate #1;Printează-le pe toate #1 +glodaFacetView.facets.mode.top.listAllLabel = Afișează #1;Afișează-le pe toate #1;Afișează-le pe toate #1 glodaFacetView.facets.included.fallbackLabel = inclusiv oricare din: glodaFacetView.facets.excluded.fallbackLabel = excludere: glodaFacetView.facets.remainder.fallbackLabel = altele: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ro/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ro/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ro/manifest.json 2026-03-24 16:59:42.358641900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ro/manifest.json 2026-04-23 05:16:31.487209000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Română (Romanian)", "description": "Thunderbird Language Pack for Română (ro) – Romanian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ro": { - "version": "20260320084214", + "version": "20260417023245", "chrome_resources": { "alerts": "chrome/ro/locale/ro/alerts/", "autoconfig": "chrome/ro/locale/ro/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/chat.properties thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/chat.properties --- thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/chat.properties 2026-03-24 16:59:42.374983800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/chat.properties 2026-04-23 05:16:31.504146600 +0000 @@ -12,7 +12,7 @@ buddy.verificationRequest.allow.accesskey = Н buddy.verificationRequest.deny.label = Отклонить buddy.verificationRequest.deny.accesskey = к -buddy.deletePrompt.title = Удалить %S? +buddy.deletePrompt.title = Удалить: %S? buddy.deletePrompt.message = Если вы продолжите, %1$S будет навсегда удален из вашего списка собеседников %2$S. buddy.deletePrompt.displayName = %1$S (%2$S) buddy.deletePrompt.button = &Удалить diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.properties thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.properties --- thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.properties 2026-03-24 16:59:42.378099200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.properties 2026-04-23 05:16:31.507335400 +0000 @@ -64,8 +64,8 @@ messageHasFlag = Отмечено звёздочкой messageHasAttachment = С вложением messageJunk = Спам -messageExpanded = Развернута -messageCollapsed = Свернута +messageExpanded = Развёрнута +messageCollapsed = Свёрнута smtpServerList-NotSpecified = <не указано> smtpServer-ConnectionSecurityType-0 = Нет smtpServer-ConnectionSecurityType-1 = STARTTLS, если доступно diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/sanitize.dtd thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/sanitize.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/sanitize.dtd 2026-03-24 16:59:42.383113400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/sanitize.dtd 2026-04-23 05:16:31.512497200 +0000 @@ -1,5 +1,5 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/mozldap/ldap.properties thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/mozldap/ldap.properties --- thunderbird-140.9.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/mozldap/ldap.properties 2026-03-24 16:59:42.386747100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/chrome/ru/locale/ru/mozldap/ldap.properties 2026-04-23 05:16:31.516199400 +0000 @@ -34,7 +34,7 @@ 54 = Обнаружен цикл 60 = Нет условия сортировки 61 = Количество результатов поиска превысило диапазон, указанный изначально -64 = Нарушение присваивания имен +64 = Нарушение присваивания имён 65 = Нарушение класса объектов 66 = Операция не допустима на объекте, не являющемся листом 67 = Операция недопустима на относительном отличительном имени diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/chat/irc.ftl thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/chat/irc.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/chat/irc.ftl 2026-03-24 16:59:42.390835800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/chat/irc.ftl 2026-04-23 05:16:31.520420000 +0000 @@ -93,7 +93,7 @@ error-unavailable = { $name } временно недоступен. error-channel-banned = Вам был запрещён вход на { $name }. error-cannot-send-to-channel = Вы не можете отправлять сообщения { $name }. -error-channel-full = Достигнут лимит подключений к каналу { $name }. +error-channel-full = Достигнут лимит подключений к каналу «{ $name }». error-invite-only = Для присоединения к { $name } вам необходимо приглашение. error-non-unique-target = { $name } не является уникальным сочетанием user@host или уникальным коротким именем или же вы пытались зайти одновременно на слишком много каналов. error-not-channel-op = Вы не являетесь оператором канала на { $name }. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/aboutImport.ftl thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/aboutImport.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/aboutImport.ftl 2026-03-24 16:59:42.394196300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/aboutImport.ftl 2026-04-23 05:16:31.523792300 +0000 @@ -63,7 +63,7 @@ addr-book-sqlite-file = Файл базы данных SQLite (.sqlite) addr-book-mab-file = Файл базы данных Mork (.mab) addr-book-file-picker = Выберите файл адресной книги -addr-book-csv-field-map-title = Сопоставление имен полей +addr-book-csv-field-map-title = Сопоставление имён полей addr-book-csv-field-map-desc = Выберите поля адресной книги, соответствующие полям источника. Снимите флажки с полей, которые не хотите импортировать. addr-book-directories-title = Выберите, куда импортировать выбранные данные addr-book-directories-pane-source = Исходный файл: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/addonNotifications.ftl thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/addonNotifications.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/addonNotifications.ftl 2026-03-24 16:59:42.395378800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/addonNotifications.ftl 2026-04-23 05:16:31.525029700 +0000 @@ -27,8 +27,8 @@ addon-install-full-screen-blocked = Установка дополнений не разрешена во время или перед входом в полноэкранный режим. webext-perms-sideload-menu-item = «{ $addonName }» добавлено в { -brand-short-name } webext-perms-update-menu-item = «{ $addonName }» запрашивает новые права -addon-removal-title = Удалить { $name }? -addon-removal-message = Удалить { $name } из { -brand-shorter-name }? +addon-removal-title = Удалить «{ $name }»? +addon-removal-message = Удалить «{ $name }» из { -brand-shorter-name }? addon-removal-button = Удалить addon-removal-abuse-report-checkbox = Пожаловаться на это расширение в { -vendor-short-name } addon-downloading-and-verifying = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/messenger.ftl thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/messenger.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/ru/localization/ru/messenger/messenger.ftl 2026-03-24 16:59:42.397544100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/localization/ru/messenger/messenger.ftl 2026-04-23 05:16:31.527229500 +0000 @@ -254,9 +254,9 @@ toolbar-context-menu-remove-extension = .label = Удалить расширение .accesskey = л -addon-removal-title = Удалить { $name }? +addon-removal-title = Удалить «{ $name }»? addon-removal-confirmation-button = Удалить -addon-removal-confirmation-message = Удалить { $name }, а также его конфигурацию и данные из { -brand-short-name }? +addon-removal-confirmation-message = Удалить «{ $name }», а также его конфигурацию и данные из { -brand-short-name }? caret-browsing-prompt-title = Активный курсор caret-browsing-prompt-text = Нажатие клавиши F7 включает или отключает режим активного курсора. В этом режиме, поместив курсор в текст, вы можете выделять текст с помощью клавиатуры. Включить этот режим? caret-browsing-prompt-check-text = Больше не спрашивать. @@ -275,7 +275,7 @@ spaces-toolbar-element = .toolbarname = Панель мест .aria-label = Панель мест - .aria-description = Вертикальная панель инструментов для переключения между разными местами. Используйте клавиши со стрелками для навигации доступными кнопками. + .aria-description = Вертикальная панель инструментов для переключения между различными частями приложения. Для навигации по доступным кнопкам используйте клавиши-стрелки. spaces-toolbar-button-mail2 = .title = Почта spaces-toolbar-button-address-book2 = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/ru/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/ru/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/ru/manifest.json 2026-03-24 16:59:42.412176400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/ru/manifest.json 2026-04-23 05:16:31.542050100 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Русский (Russian)", "description": "Thunderbird Language Pack for Русский (ru) – Russian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "ru": { - "version": "20260320084425", + "version": "20260417023504", "chrome_resources": { "alerts": "chrome/ru/locale/ru/alerts/", "autoconfig": "chrome/ru/locale/ru/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messengercompose/messengercompose.dtd thunderbird-140.10.0esr/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messengercompose/messengercompose.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messengercompose/messengercompose.dtd 2026-03-24 16:59:42.433765200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messengercompose/messengercompose.dtd 2026-04-23 05:16:31.563619000 +0000 @@ -117,7 +117,7 @@ - + @@ -238,7 +238,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sk/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/sk/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/sk/manifest.json 2026-03-24 16:59:42.464833700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sk/manifest.json 2026-04-23 05:16:31.596306800 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Slovenčina (Slovak)", "description": "Thunderbird Language Pack for Slovenčina (sk) – Slovak", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "sk": { - "version": "20260320084636", + "version": "20260417023723", "chrome_resources": { "alerts": "chrome/sk/locale/sk/alerts/", "autoconfig": "chrome/sk/locale/sk/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/keyWizard.ftl thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/keyWizard.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/keyWizard.ftl 2026-03-24 16:59:42.507633400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/keyWizard.ftl 2026-04-23 05:16:31.635849200 +0000 @@ -78,7 +78,7 @@ openpgp-import-key-title = Uvozi obstoječ osebni ključ OpenPGP openpgp-import-key-legend = Izberite datoteko z varnostno kopijo. openpgp-import-key-description = Lahko uvozite osebne ključe, ki so bili ustvarjeni z drugo programsko opremo OpenPGP. -openpgp-import-key-info = Drugi programi lahko osebni ključ imenujejo drugače, na primer lastni ključ, skrivni ključ, zasebni ključ ali par ključev. +openpgp-import-key-info = Drugi programi lahko osebni ključ imenujejo drugače, na primer lastni ključ, tajni ključ, skrivni ključ, zasebni ključ ali par ključev. openpgp-import-key-list-amount-2 = { $count -> [one] { -brand-short-name } je našel en ključ, ki ga lahko uvozi. @@ -89,7 +89,7 @@ openpgp-import-key-list-description = Potrdite, kateri ključi naj se obravnavajo kot vaši osebni ključi. Kot osebne ključe uporabljajte samo ključe, ki ste jih ustvarili sami in ki izkazujejo vašo identiteto. To možnost lahko pozneje spremenite v pogovornem oknu Lastnosti ključa. openpgp-import-key-list-caption = Ključi, označeni za obravnavo kot osebni ključi, bodo navedeni v razdelku Šifriranje od konca do konca. Ostali bodo na voljo v upravitelju ključev. openpgp-import-keep-passphrases = - .label = Obdrži zaščito uvoženih skrivnih ključev z geslom + .label = Obdrži zaščito uvoženih tajnih ključev z geslom openpgp-passphrase-prompt-title = Zahtevano je geslo openpgp-import-key-button = .label = Izberi datoteko za uvoz … diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp-frontend.ftl thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp-frontend.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp-frontend.ftl 2026-03-24 16:59:42.508127000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp-frontend.ftl 2026-04-23 05:16:31.636155800 +0000 @@ -35,7 +35,7 @@ To je šifrirano sporočilo, ki uporablja star in ranljiv mehanizem. Med potovanjem bi lahko bilo spremenjeno z namenom kraje njegove vsebine. Za preprečitev tega tveganja vsebina ni prikazana. -openpgp-cannot-decrypt-because-missing-key = Skrivni ključ, ki je potreben za dešifriranje tega sporočila, ni na voljo. +openpgp-cannot-decrypt-because-missing-key = Tajni ključ, ki je potreben za dešifriranje tega sporočila, ni na voljo. openpgp-partially-signed = Samo del tega sporočila je bil digitalno podpisan z uporabo OpenPGP. Ob kliku na gumb Preveri bodo nezaščiteni deli skriti in prikazano bo stanje digitalnega podpisa. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:42.508281500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sl/localization/sl/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:31.636402800 +0000 @@ -1,5 +1,5 @@ e2e-intro-description = Za pošiljanje šifriranih ali digitalno podpisanih sporočil morate nastaviti tehnologijo šifriranja, bodisi OpenPGP bodisi S/MIME. -e2e-intro-description-more = Izberite si osebni ključ za omogočitev uporabe OpenPGP ali osebno digitalno potrdilo za omogočitev uporabe S/MIME. Za osebni ključ ali digitalno potrdilo imate ustrezen skrivni ključ. +e2e-intro-description-more = Izberite si osebni ključ za omogočitev uporabe OpenPGP ali osebno digitalno potrdilo za omogočitev uporabe S/MIME. Za osebni ključ ali digitalno potrdilo imate pripadajoč tajni ključ. e2e-csr-intro-info = Izberite mapo in ime za datoteko CSR ter odgovorite na naslednja vprašanja za nastavitev algoritma in moči. e2e-csr-title = Ustvari CSR e2e-csr-continue = Nadaljuj @@ -65,7 +65,7 @@ .label = Uvozi javne ključe iz datoteke .accesskey = U openpgp-key-man-import-secret-from-file = - .label = Uvozi skrivne ključe iz datoteke + .label = Uvozi tajne ključe iz datoteke openpgp-key-man-import-sig-from-file = .label = Uvozi preklice iz datoteke openpgp-key-man-import-from-clipbrd = @@ -81,7 +81,7 @@ .label = Pošlji javne ključe po e-pošti .accesskey = P openpgp-key-man-backup-secret-keys = - .label = Varnostno kopiraj skrivne ključe v datoteko + .label = Varnostno kopiraj tajne ključe v datoteko .accesskey = V openpgp-key-man-discover-cmd = .label = Odkrij ključe na spletu @@ -100,7 +100,7 @@ .label = Izvozi javni ključ v datoteko .accesskey = I openpgp-key-backup-key = - .label = Varnostno kopiraj skrivni ključ v datoteko + .label = Varnostno kopiraj tajni ključ v datoteko .accesskey = V openpgp-key-send-key = .label = Pošlji javni ključ po e-pošti @@ -272,7 +272,7 @@ openpgp-acceptance-verified-label = .label = Da, osebno sem preveril, da ima ta ključ pravi prstni odtis. key-accept-personal = - Za ta ključ imate tako javni kot skrivni del. Lahko ga uporabljate kot osebni ključ. + Za ta ključ imate tako javni kot tajni del. Lahko ga uporabljate kot osebni ključ. Če vam je ta ključ dal nekdo drug, ga ne uporabljajte kot osebni ključ. openpgp-personal-no-label = .label = Ne, ne uporabljaj ga kot moj osebni ključ. @@ -411,7 +411,7 @@ "{ $userId }"? delete-selected-pub-key = Ali želite izbrisati javne ključe? refresh-all-question = Izbrali niste nobenega ključa. Želite osvežiti vse ključe? -key-man-button-export-sec-key = Izvozi &skrivne ključe +key-man-button-export-sec-key = Izvozi &tajne ključe key-man-button-export-pub-key = Izvozi samo &javne ključe key-man-button-refresh-all = &Osveži vse ključe key-man-loading-keys = Nalaganje ključev, počakajte … @@ -419,20 +419,20 @@ text-file = Besedilne datoteke (*.txt) no-key-selected = Za izvedbo izbranega dejanja izberite vsaj en ključ export-to-file = Izvozi javni ključ v datoteko -export-keypair-to-file = Izvozi skrivni in javni ključ v datoteko -export-secret-key = Ali želite vključiti skrivni ključ v shranjeno datoteko ključa OpenPGP? +export-keypair-to-file = Izvozi tajni in javni ključ v datoteko +export-secret-key = Ali želite vključiti tajni ključ v shranjeno datoteko ključa OpenPGP? save-keys-ok = Ključi so bili uspešno shranjeni save-keys-failed = Shranjevanje ključev ni uspelo default-pub-key-filename = Izvozeni_javni_kljuci -default-pub-sec-key-filename = Varnostna_kopija_skrivnih_kljucev +default-pub-sec-key-filename = Varnostna_kopija_tajnih_kljucev refresh-key-warn = Opozorilo: osvežitev vseh ključev je lahko, odvisno od števila ključev in hitrosti povezave, precej dolgotrajen postopek! preview-failed = Datoteke z javnim ključem ni mogoče prebrati. general-error = Napaka: { $reason } dlg-button-delete = &Izbriši openpgp-export-public-success = Javni ključ uspešno izvožen! openpgp-export-public-fail = Izbranega javnega ključa ni mogoče izvoziti! -openpgp-export-secret-success = Skrivni ključ uspešno izvožen! -openpgp-export-secret-fail = Izbranega skrivnega ključa ni mogoče izvoziti! +openpgp-export-secret-success = Tajni ključ uspešno izvožen! +openpgp-export-secret-fail = Izbranega tajnega ključa ni mogoče izvoziti! key-ring-pub-key-revoked = Ključ { $userId } (ID ključa { $keyId }) je preklican. key-ring-pub-key-expired = Ključu { $userId } (ID ključa { $keyId }) je pretekla veljavnost. key-ring-pub-key-not-for-signing = Ključa { $userId } (ID ključa { $keyId }) ni mogoče uporabiti za podpisovanje. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sl/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/sl/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/sl/manifest.json 2026-03-24 16:59:42.529770400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sl/manifest.json 2026-04-23 05:16:31.649017300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Slovenščina (Slovenian)", "description": "Thunderbird Language Pack for Slovenščina (sl) – Slovenian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "sl": { - "version": "20260320084847", + "version": "20260417023922", "chrome_resources": { "alerts": "chrome/sl/locale/sl/alerts/", "autoconfig": "chrome/sl/locale/sl/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sq/localization/sq/messenger/messenger.ftl thunderbird-140.10.0esr/thunderbird-l10n/sq/localization/sq/messenger/messenger.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sq/localization/sq/messenger/messenger.ftl 2026-03-24 16:59:42.590686600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sq/localization/sq/messenger/messenger.ftl 2026-04-23 05:16:31.688572000 +0000 @@ -340,4 +340,5 @@ .title = Kuota IMAP: { $usage } të përdorur, nga { $limit } gjithsej mark-as-read-action = Vëri Shenjë si të Lexuar delete-action = Fshije +mark-as-starred-action = Vëri Shenjë si Me Yll mark-as-spam-action = Vëri shenjë si i Padëshiruar diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sq/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/sq/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/sq/manifest.json 2026-03-24 16:59:42.613912800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sq/manifest.json 2026-04-23 05:16:31.703168200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Shqip (Albanian)", "description": "Thunderbird Language Pack for Shqip (sq) – Albanian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "sq": { - "version": "20260320084247", + "version": "20260417022911", "chrome_resources": { "alerts": "chrome/sq/locale/sq/alerts/", "autoconfig": "chrome/sq/locale/sq/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/calendar/calendar-extract.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/calendar/calendar-extract.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/calendar/calendar-extract.properties 2026-03-24 16:59:42.620173700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/calendar/calendar-extract.properties 2026-04-23 05:16:31.705959800 +0000 @@ -1,40 +1,40 @@ -start.prefix = +start.prefix = од | са | почевши од start.suffix = од | до | ка | - | све до | и | od | do | ка | - | sve do |i end.prefix = од | до | ка | - | све до | и | рок: | рок | крај | крајњи рок | od | do | ka | - | sve do | i | rok: | rok | kraj | krajnji rok -end.suffix = +end.suffix = до | крај | завршно са no.datetime.prefix = прошле недеље | послато | мејл | уместо | > | нажалост | у | не no.datetime.suffix = спрат | flr | : | мејл | имејл | > | % | usd | долар | динар | евро | $ from.today = данас from.tomorrow = сутра -until.tomorrow = +until.tomorrow = до сутра from.ordinal.date = #1st | #1nd | #1rd | #1th | #1. -until.ordinal.date = +until.ordinal.date = до #1. from.noon = подне -until.noon = +until.noon = до подне from.hour = у #1 | око #1 | #1 - | #1 до until.hour = - #1 | до #1 | све до #1 | најкасније до #1 from.hour.am = #1 am | #1 a.m -until.hour.am = +until.hour.am = до #1 am | до #1 a.m from.hour.pm = #1 pm | #1 p.m | #1 p -until.hour.pm = +until.hour.pm = до #1 pm | до #1 p.m | до #1 p from.half.hour.before = пола сата пре #1 -until.half.hour.before = +until.half.hour.before = до пола сата пре #1 from.half.hour.after = пола сата после #1ч -until.half.hour.after = +until.half.hour.after = до пола сата после #1 from.hour.minutes = #1:#2 | у #1 и #2 -until.hour.minutes = +until.hour.minutes = до #1:#2 from.hour.minutes.am = #1:#2 am | #1:#2 a.m -until.hour.minutes.am = +until.hour.minutes.am = до #1:#2 am | до #1:#2 a.m from.hour.minutes.pm = #1:#2 pm | #1:#2 p.m | #1:#2 p -until.hour.minutes.pm = +until.hour.minutes.pm = до #1:#2 pm | до #1:#2 p.m | до #1:#2 p from.monthname.day = #1 #2 | #2 #1 | #2 #1st | #2 #1nd | #2 #1rd | #2 #1th | #1. у #2 | #1nd of #2 | #1rd of #2 | #1th of #2 -until.monthname.day = +until.monthname.day = до #1. #2 | до #2 #1. from.month.day = #2/#1 -until.month.day = +until.month.day = до #1.#2. | до #2/#1 from.year.month.day = #2/#1/#3 | #3/#2/#1 | #3-#2-#1 -until.year.month.day = +until.year.month.day = до #1.#2.#3. | до #2/#1/#3 from.year.monthname.day = #1 #2 #3 | #1st #2 #3 | #1nd #2 #3 | #1rd #2 #3 | #1th #2 #3 | #2 #1, #3 | #3-#2-#1 -until.year.monthname.day = +until.year.monthname.day = до #1. #2 #3. duration.minutes = #1 минута | #1 мин | #1 мин duration.hours = #1 сат | #1 сати duration.days = #1 дана @@ -57,13 +57,13 @@ from.weekday.4 = четвртак | четвртка from.weekday.5 = петак | петка from.weekday.6 = субота | суботе -until.weekday.0 = -until.weekday.1 = -until.weekday.2 = -until.weekday.3 = -until.weekday.4 = -until.weekday.5 = -until.weekday.6 = +until.weekday.0 = до недеље +until.weekday.1 = до понедељка +until.weekday.2 = до уторка +until.weekday.3 = до среде +until.weekday.4 = до четвртка +until.weekday.5 = до петка +until.weekday.6 = до суботе number.0 = нула number.1 = један | први number.2 = два | други diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/appstrings.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/appstrings.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/appstrings.properties 2026-03-24 16:59:42.638848800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/appstrings.properties 2026-04-23 05:16:31.719142200 +0000 @@ -1,38 +1,38 @@ -malformedURI2 = Please check that the URL is correct and try again. -fileNotFound = The file %S cannot be found. Please check the location and try again. -fileAccessDenied = The file at %S is not readable. -httpErrorPage = %S sent back an error. -serverError = %S might have a temporary problem or it could have moved. -dnsNotFound2 = %S could not be found. Please check the name and try again. -basicHttpAuthDisabled = Someone might be spoofing the content and could try to steal things like your username, password, or email. Your connection settings could also be set up incorrectly. -unknownProtocolFound = One of the following (%S) is not a registered protocol or is not allowed in this context. -connectionFailure = The connection was refused when attempting to contact %S. -netInterrupt = The connection to %S has terminated unexpectedly. Some data may have been transferred. -netTimeout = The operation timed out when attempting to contact %S. -redirectLoop = Redirection limit for this URL exceeded. Unable to load the requested content. This may be caused by cookies that are blocked. -confirmRepostPrompt = To display this content, Thunderbird must send information that will repeat any action (such as a search or order confirmation) that was performed earlier. -resendButton.label = Resend -unknownSocketType = This document cannot be displayed unless you install the Personal Security Manager (PSM). Download and install PSM and try again, or contact your system administrator. -netReset = The document contains no data. -notCached = This document is no longer available. -netOffline = Thunderbird is currently in offline mode and cannot connect to the internet. -isprinting = The document cannot change while Printing or in Print Preview. -deniedPortAccess = Access to the port number given has been disabled for security reasons. -proxyResolveFailure = The proxy server you have configured could not be found. Please check your proxy settings and try again. -proxyConnectFailure = The connection was refused when attempting to contact the proxy server you have configured. Please check your proxy settings and try again. -contentEncodingError = The content you are trying to view cannot be shown because it uses an invalid or unsupported form of compression. -unsafeContentType = The content you are trying to view cannot be shown because it is contained in a file type that may not be safe to open. Please contact the server owners to inform them of this problem. -malwareBlocked = The server at %S has reportedly been used for attacks and has been blocked based on your security settings. -harmfulBlocked = The content at %S has been reported as being potentially harmful and has been blocked based on your security settings. -unwantedBlocked = The server at %S has been reported as serving unwanted software and has been blocked based on your security settings. -deceptiveBlocked = The content at %S has been reported as being deceptive and has been blocked based on your security settings. -cspBlocked = This page has a content security policy that prevents it from being loaded in this way. -xfoBlocked = This page has an X-Frame-Options policy that prevents it from being loaded in this context. -corruptedContentErrorv2 = The server at %S has experienced a network protocol violation that cannot be repaired. -sslv3Used = The safety of your data on %S could not be guaranteed because it uses SSLv3, a broken security protocol. -weakCryptoUsed = The owner of %S has configured their server improperly. To protect your information from being stolen, the connection to this server has not been established. -inadequateSecurityError = The server tried to negotiate an inadequate level of security. -blockedByPolicy = Your organization has blocked access to this content. -blockedByCORP = This content has not been loaded because it looks like the security configuration doesn’t match the previous request. -invalidHeaderValue = %S sent back a header with empty characters not allowed by web security standards. -networkProtocolError = Thunderbird has experienced a network protocol violation that cannot be repaired. +malformedURI2 = Проверите да ли је адреса исправна и покушајте поново. +fileNotFound = Датотека %S не може бити пронађена. Проверите место и покушајте поново. +fileAccessDenied = Датотека на %S није читљива. +httpErrorPage = %S је вратио грешку. +serverError = %S можда има привремени проблем или је премештен. +dnsNotFound2 = %S не може бити пронађен. Проверите назив и покушајте поново. +basicHttpAuthDisabled = Неко можда покушава да лажира садржај и украде ваше податке попут корисничког имена, лозинке или е-поште. Ваше поставке везе такође могу бити погрешно подешене. +unknownProtocolFound = Један од следећих (%S) није регистрован протокол или није дозвољен у овом контексту. +connectionFailure = Веза је одбијена приликом покушаја повезивања са %S. +netInterrupt = Веза са %S је неочекивано прекинута. Неки подаци су можда пренесени. +netTimeout = Време за радњу је истекло приликом покушаја повезивања са %S. +redirectLoop = Ограничење преусмеравања за ову адресу је прекорачено. Не могу да учитам тражени садржај. Ово могу узроковати блокирани колачићи. +confirmRepostPrompt = Да би приказао овај садржај, Thunderbird мора послати податке који ће поновити сваку радњу (попут претраге или потврде поруџбине) која је раније извршена. +resendButton.label = Пошаљи поново +unknownSocketType = Овај документ не може бити приказан осим ако не инсталирате Управника личне безбедности (PSM). Преузмите и инсталирате PSM и покушајте поново, или контактирајте вашег администратора система. +netReset = Документ не садржи податке. +notCached = Овај документ више није доступан. +netOffline = Thunderbird је тренутно у режиму ван мреже и не може се повезати на интернет. +isprinting = Документ се не може мењати током штампања или у прегледу пре штампе. +deniedPortAccess = Приступ наведеном броју прикључка је онемогућен из безбедносних разлога. +proxyResolveFailure = Подешени посреднички сервер не може бити пронађен. Проверите ваша подешавања посредника и покушајте поново. +proxyConnectFailure = Веза је одбијена приликом покушаја повезивања са подешеним посредничким сервером. Проверите ваша подешавања посредника и покушајте поново. +contentEncodingError = Садржај који покушавате да прегледате не може бити приказан јер користи неисправну или неподржану врсту сажимања. +unsafeContentType = Садржај који покушавате да прегледате не може бити приказан јер се налази у врсти датотеке која можда није безбедна за отварање. Обратите се власницима сервера како бисте их обавестили о овом проблему. +malwareBlocked = Сервер на %S је према извештајима коришћен за нападе и блокиран је на основу ваших безбедносних подешавања. +harmfulBlocked = Садржај на %S је пријављен као потенцијално штетан и блокиран је на основу ваших безбедносних подешавања. +unwantedBlocked = Сервер на %S је пријављен да нуди непожељан софтвер и блокиран је на основу ваших безбедносних подешавања. +deceptiveBlocked = Садржај на %S је пријављен као обманљив и блокиран је на основу ваших безбедносних подешавања. +cspBlocked = Ова страница има полицику безбедности садржаја која спречава њено учитавање на овај начин. +xfoBlocked = Ова страница има X-Frame-Options политику која спречава њено учитавање у овом контексту. +corruptedContentErrorv2 = Сервер на %S је доживео нарушавање мрежног протокола које се не може поправити. +sslv3Used = Безбедност ваших података на %S не може бити загарантована јер користи SSLv3, застарели безбедносни протокол. +weakCryptoUsed = Власник %S је неправилно подесио свој сервер. Како бисте заштитили своје податке од крађе, веза са овим сервером није успостављена. +inadequateSecurityError = Сервер је покушао да уговори неодговарајући ниво безбедности. +blockedByPolicy = Ваша организација је блокирала приступ овом садржају. +blockedByCORP = Овај садржај није учитан јер изгледа да се безбедносно подешавање не поклапа са претходним захтевом. +invalidHeaderValue = %S је вратио заглавље са празним знаковима који нису дозвољени према веб безбедносним стандардима. +networkProtocolError = Thunderbird је доживео нарушавање мрежног протокола које се не може поправити. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/imapMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/imapMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/imapMsgs.properties 2026-03-24 16:59:42.641706000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/imapMsgs.properties 2026-04-23 05:16:31.721331000 +0000 @@ -61,7 +61,7 @@ imapAclExpungeRight = Избриши imapServerDisconnected = Прекинута је веза са сервером %S. Можда је сервер пао или можда постоји проблем са мрежном везом. imapSubscribePrompt = Да ли желите да се претплатите на %1$S? -imapServerDroppedConnection2 = Unable to connect to %S. Please try again later. If the problem persists, you may have exceeded the maximum number of connections to this server. You can reduce the number of cached connections in the IMAP server settings. +imapServerDroppedConnection2 = Не могу да се повежем са %S. Покушајте поново касније. Ако се проблем настави, можда сте премашили највећи број веза са овим сервером. Можете смањити број кешираних веза у подешавањима IMAP сервера. imapQuotaStatusFolderNotOpen = Подаци о квотама нису доступни зато што фасцикла није отворена. imapQuotaStatusNotSupported = Овај сервер не подржава квоте. imapQuotaStatusNoQuota2 = Ова фасцикла не садржи податке о квотама. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.dtd thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.dtd 2026-03-24 16:59:42.643367800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.dtd 2026-04-23 05:16:31.722428600 +0000 @@ -651,8 +651,8 @@ - - + + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.properties 2026-03-24 16:59:42.643651500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messenger.properties 2026-04-23 05:16:31.722643600 +0000 @@ -46,7 +46,7 @@ alertFilterCheckbox = Не упозоравај ме више. compactFolderDeniedLock = Фасцикла '%S' се није могла сажмети зато што је друга радња у току. Пробајте поново касније. compactFolderWriteFailed = Фасцикла '%S' се није могла сажмети јер уписивање у фасциклу није успело. Проверите да ли имате довољно простора на диску, проверите да ли имате овлашћење за упис на систем датотека и онда пробајте поново. -compactFolderStorageCorruption = The folder '%S' could not be compacted because it contains unexpected data. +compactFolderStorageCorruption = Фасцикла „%S“ не може бити сажета јер садржи неочекиване податке. compactFolderInsufficientSpace = Неке фасцикле (нпр.: '%S') се не могу сажмети јер нема довољно простора на диску. Обришите неке датотеке и пробајте поново. filterFolderHdrAddFailed = Поруке се нису могле филтрирати у фасциклу '%S' јер додавање поруке није успело. Проверите да ли се фасцикла исправно приказује или пробајте да је поправите из својстава фасцикле. filterFolderWriteFailed = Поруке се нису могле филтрирати у фасциклу '%S' јер уписивање у фасциклу није успело. Проверите да ли имате довољно простора на диску, проверите да ли имате овлашћење за упис на систем датотека и онда пробајте поново. @@ -57,7 +57,7 @@ verboseFolderFormat = %1$S на %2$S mailboxTooLarge = Фасцикла %S је пуна и не може примати више порука. Да бисте направили места за још порука, обришите било коју стару или нежељену пошту па онда сажмите фасциклу. outOfDiskSpace = Нема довољно простора на диску да би се преузеле нове поруке. Пробајте да обришете стару пошту, очистите смеће и сажмете ваше фасцикле са поштом па онда пробајте поново. -outOfDiskSpaceGeneric = There is not enough disk space for the operation attempted. You may need to perform a disk cleanup on your system. +outOfDiskSpaceGeneric = Нема довољно простора на диску за покушану операцију. Можда ћете морати да извршите чишћење диска на вашем систему. errorGettingDB = Нисам успео да отворим резиме датотеку за %S. Могуће је да се догодила грешка на диску или да је пуна путања сувише дугачка. defaultServerTag = (Подразумеван) messageUnread = Непрочитана @@ -89,14 +89,14 @@ serverType-pop3 = POP поштански сервер serverType-imap = IMAP поштански сервер serverType-none = Локално складиште поште -serverType-ews = Microsoft Exchange Mail Server +serverType-ews = Microsoft Exchange сервер поште sizeColumnTooltip2 = Поређај по величини sizeColumnHeader = Величина linesColumnTooltip2 = Поређај по редовима linesColumnHeader = Редови getMsgButtonTooltip = Добави нове поруке за %S getMsgButtonTooltip.listSeparator = ,\u0020 -documentDone = +documentDone = Завршено documentLoading = Учитавам поруку… autosyncProgress = Усклађујем поруке у %1$S са %2$S… localFolders = Локалне фасцикле @@ -144,14 +144,14 @@ junk = Непожељна junkScoreOriginPlugin = Прикључак junkScoreOriginFilter = Филтер -junkScoreOriginAllowlist = Allowlist +junkScoreOriginAllowlist = Списак дозвољених junkScoreOriginUser = Корисник junkScoreOriginImapFlag = IMAP заставица hasAttachments = Има прилоге tag = Ознаке andOthers = и др. mailnews.search_date_format = 0 -mailnews.search_date_separator = +mailnews.search_date_separator = . mailnews.search_date_leading_zeros = true nocachedbodybody2 = Тело ове поруке није преузето са сервера за коришћење ван мреже. Да бисте прочитали ову поруку, морате се поново повезати на мрежу, изабрати опцију „Ван мреже“ из менија „Датотека“ и онда дештиклирати опцију „Ради ван мреже“. Знајте за убудуће да можете означити које поруке и фасцикле желите да читате ван мреже. Да бисте ово урадили, изаберите опцију „Ван мреже“ из менија „Датотека“ и онда изаберите опцију „Преузми/усклади сада“. Можете подесити потрошњу простора на диску да бисте спречили преузимање великих порука. acctCentralTitleFormat = %1$S %2$S - %3$S @@ -211,7 +211,7 @@ attachmentDisplayNameFormat = %S %S attachmentsPrintHeader = Прилози: unknownHostError = Нисам успео да се повежем на сервер %S. -oAuth2Error = Authentication failure while connecting to server %S. +oAuth2Error = Неуспех пријаве приликом повезивања на сервер %S. connectionRefusedError = Нисам успео да се повежем на сервер %S. Веза је одбијена. netTimeoutError = Веза са сервером %S је истекла. netResetError = Веза ка серверу %S је ресетована. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messengercompose/composeMsgs.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messengercompose/composeMsgs.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messengercompose/composeMsgs.properties 2026-03-24 16:59:42.646373000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger/messengercompose/composeMsgs.properties 2026-04-23 05:16:31.724531700 +0000 @@ -18,7 +18,7 @@ errorAttachingFile = Догодила се грешка приликом качења прилога %S. Проверите да ли имате приступ датотеци. errorSendingRcptCommand = Догодила се грешка приликом слања поште. Поштански сервер је одговорио са:  \n%1$S.\n Проверите примаоца поруке "%2$S" и пробајте поново. startTlsFailed = Догодила се грешка приликом слања поште: Не могу да успоставим безбедну везу са одлазним (SMTP) сервером %S користећи STARTTLS зато што сервер не објављује подршку за то. Искључите STARTTLS за тај сервер или контактирајте пружаоца услуге. -smtpTooManyRecipients = The message was not sent due to exceeding the allowed number of recipients. The server responded: %s. +smtpTooManyRecipients = Порука није послата јер је премашен дозвољени број прималаца. Сервер је одговорио: %s. smtpPermSizeExceeded2 = Величина поруке коју покушавате да пошаљете премашује опште ограничење величине на серверу. Порука није послата, смањите величину поруке и пробајте поново. Сервер је одговорио са:  %s. smtpSendFailedUnknownServer = Догодила се грешка приликом слања поште: Одлазни сервер (SMTP) %S је непознат. Сервер је можда лоше подешен. Проверите да су ваша подешавања одлазног (SMTP) сервера исправна и пробајте поново. smtpSendRequestRefused = Порука није могла бити послата јер повезивање на одлазни (SMTP) сервер %S није успело. Сервер је можда недоступан или одбија SMTP везе. Проверите да ли су ваша подешавања одлазног (SMTP) сервера исправна и пробајте поново. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger-region/region.properties thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger-region/region.properties --- thunderbird-140.9.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger-region/region.properties 2026-03-24 16:59:42.655009000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/chrome/sr/locale/sr/messenger-region/region.properties 2026-04-23 05:16:31.730145700 +0000 @@ -1 +1 @@ -mailnews.localizedRe = +mailnews.localizedRe = Одг,Re diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-event-listing.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-event-listing.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-event-listing.ftl 2026-03-24 16:59:42.659875600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-event-listing.ftl 2026-04-23 05:16:31.733470000 +0000 @@ -39,6 +39,8 @@ calendar-event-listing-column-title = .label = Наслов .tooltiptext = Поређај по наслову +calendar-event-listing-interval-past = + .label = Прошли догађаји calendar-event-listing-interval-calendar-month = .label = Догађаји у овом календарском месецу calendar-event-listing-interval-current-view = @@ -53,6 +55,10 @@ .label = Догађаји у наредних 6 месеци calendar-event-listing-interval-next-12-months = .label = Догађаји у наредних 12 месеци +calendar-event-listing-interval-future = + .label = Сви будући догађаји +calendar-event-listing-interval-all = + .label = Сви догађаји calendar-event-listing-interval-selected-day = .label = Тренутно изабрани дан calendar-event-listing-interval-today = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-itip-identity-dialog.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-itip-identity-dialog.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-itip-identity-dialog.ftl 2026-03-24 16:59:42.660287900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-itip-identity-dialog.ftl 2026-04-23 05:16:31.733752500 +0000 @@ -1,2 +1,4 @@ +calendar-itip-identity-dialog-box-title = Непозвани гост +calendar-itip-identity-warning-body = Адреса е-поште повезана са календаром у који увозите овај позив није на списку гостију. calendar-itip-identity-label = Одговори као: calendar-itip-identity-label-none = Повежи овај догађај са: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-today-pane.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-today-pane.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-today-pane.ftl 2026-03-24 16:59:42.660806700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar-today-pane.ftl 2026-04-23 05:16:31.734168000 +0000 @@ -0,0 +1,8 @@ +calendar-today-pane-show-events-and-tasks = + .tooltiptext = Прикажи догађаје и задатке +calendar-today-pane-show-tasks-only = + .tooltiptext = Прикажи само задатке +calendar-today-pane-show-events-only = + .tooltiptext = Прикажи само догађаје +calendar-today-pane-close-button = + .tooltiptext = Сакриј површ „Данас“ diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar.ftl 2026-03-24 16:59:42.661287800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/calendar/calendar.ftl 2026-04-23 05:16:31.734519700 +0000 @@ -172,6 +172,7 @@ html-task-completed = { $task } (завршено) add-category = Додај категорију multiple-categories = Вишеструке категорије +no-categories = Ништа calendar-today = Данас calendar-tomorrow = Сутра yesterday = Јуче @@ -229,6 +230,7 @@ single-long-calendar-week = Календарска недеља: { $index } single-calendar-week = КН: { $index } .title = Календарска недеља: { $index } +several-long-calendar-weeks = Календарске седмице { $startIndex }–{ $endIndex } several-calendar-weeks = КН-е: { $startIndex }-{ $endIndex } .title = Календарске недеље { $startIndex }-{ $endIndex } multiweek-view-week = { $number } недеља @@ -278,24 +280,68 @@ [few] { $count } минута *[other] { $count } минута } +event-duration-menuitem-count-minutes = + .label = { unit-minutes } unit-hours = { $count -> [one] { $count } сат [few] { $count } сати *[other] { $count } сати } +event-duration-menuitem-count-hours = + .label = { unit-hours } unit-days = { $count -> [one] { $count } дан [few] { $count } дана *[other] { $count } дана } +event-duration-menuitem-count-days = + .label = { unit-days } unit-weeks = { $count -> [one] { $count } недеља [few] { $count } недеље *[other] { $count } недеље } +event-duration-menuitem-count-weeks = + .label = { unit-weeks } +event-duration-menuitem-minutes = + .label = + { $count -> + [one] минут + [few] минута + *[other] минута + } +event-duration-label-minutes = + .value = { event-duration-menuitem-minutes.label } +event-duration-menuitem-hours = + .label = + { $count -> + [one] сат + [few] сата + *[other] сати + } +event-duration-label-hours = + .value = { event-duration-menuitem-hours.label } +event-duration-menuitem-days = + .label = + { $count -> + [one] дан + [few] дана + *[other] дана + } +event-duration-label-days = + .value = { event-duration-menuitem-days.label } +event-duration-menuitem-weeks = + .label = + { $count -> + [one] седмица + [few] седмице + *[other] седмица + } +event-duration-label-weeks = + .value = { event-duration-menuitem-weeks.label } show-calendar = Прикажи { $name } hide-calendar = Сакриј { $name } hide-calendar-title = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/chat/irc.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/chat/irc.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/chat/irc.ftl 2026-03-24 16:59:42.663957400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/chat/irc.ftl 2026-04-23 05:16:31.735566000 +0000 @@ -4,6 +4,7 @@ connection-error-invalid-username = { $username } није дозвољено корисничко име connection-error-invalid-password = Неисправна лозинка за сервер connection-error-password-required = Потребна је лозинка +connection-error-invalid-user-password = Неисправна лозинка join-chat-channel = _Канал join-chat-password = _Лозинка options-server = Сервер diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/chat/matrix-properties.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/chat/matrix-properties.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/chat/matrix-properties.ftl 2026-03-24 16:59:42.664417000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/chat/matrix-properties.ftl 2026-04-23 05:16:31.735781200 +0000 @@ -41,6 +41,7 @@ power-level-server-acl = Шаљи m.room.server_acl догађаје: { $powerLevelName } power-level-upgrade-room = Надогради собу: { $powerLevelName } power-level-remove = Уклони поруке: { $powerLevelName } +power-level-events-default = Подразумевани догађаји: { $powerLevelName } power-level-state-default = Промени поставку: { $powerLevelName } power-level-encryption = Омогући шифровање собе: { $powerLevelName } power-level-topic = Подеси тему собе: { $powerLevelName } @@ -53,9 +54,64 @@ detail-alias = Надимак: { $value } detail-guest = Приступ за госте: { $value } detail-power = Нивои моћи: +command-ban = { $commandName } []: Забранити приступ соби кориснику са уз опциону поруку у којој се наводи разлог. Потребно је овлашћење за забрану приступа корисницима. +command-invite = { $commandName } : Позови корисника у собу. +command-kick = { $commandName } []: Избаци корисника са из собе уз опциону поруку где се наводи разлог. Потребно је овлашћење за избацивање корисника. +command-nick = { $commandName } : Промени своје приказано име. +command-op = { $commandName } []: Одреди степен овлашћења корисника. Укуцај целобројну вредност, Корисник: 0, Модератор: 50 и Администратор: 100. Подразумевана вредност је 50, уколико не буде задата друга вредност. Потребно је овлашћење за измену степена овлашћења корисника. Не може се применити на Администраторе, осим на самог себе. +command-deop = { $commandName } : Врати степен овлашћења корисника на ниво 0 (Корисник). Потребно је овлашћење за промену степена овлашћења корисника. Не може се применити на Администраторе, осим на самог себе. +command-leave = { $commandName }: Напусти просторију у којој си тренутно. +command-topic = { $commandName } : Подесите тему за собу. Потребно је овлашћење за промену теме собе. +command-unban = { $commandName } : Дозволи приступ кориснику коме је био забрањен приступ соби. Потребно је овлашћење за забрану приступа корисника. +command-visibility = { $commandName } []: Подесите видљивост тренутне собе у директоријуму соба тренутног Основног сервера. Унесите целобројну вредност, Приватно: 0 и Јавно: 1. Подразумевана вредност ће бити Приватно (0) ако не буде задата друга вредност. Потребно је овлашћење за промену видљивости собе. +command-guest = { $commandName } <приступ гостима> <видљивост историјата>: Поставља приступ и видљивост историјата тренутне собе за госте. Унесите две целе бројне вредности, прву за приступ гостима (није дозвољено: 0 и дозвољено: 1) и другу за видљивост историјата (није видљиво: 0 и видљиво: 1). Захтева овлашћење за промену видљивости историјата. +command-roomname = { $commandName } <назив>: Поставља назив собе. Захтева овлашћење за промену назива собе. +command-detail = { $commandName }: Приказује детаље о соби. +command-addalias = { $commandName } <надимак>: Прави надимак за собу. Очекује се надимак собе у облику „#месниназив:домен“. Захтева овлашћење за додавање надимака. +command-removealias = { $commandName } <надимак>: Уклања надимак собе. Очекује се надимак собе у облику „#месниназив:домен“. Захтева овлашћење за уклањање надимака. +command-upgraderoom = { $commandName } <новоИздање>: Надограђује собу на дато издање. Захтева овлашћење за надоградњу собе. +command-me = { $commandName } <радња>: Извршава радњу. +command-msg = { $commandName } <ибКорисника> <порука>: Шаље директну поруку датом кориснику. +command-join = { $commandName } <ибСобе>: Придружује се датој соби. +message-banned = { $user } је забранио приступ кориснику { $userBanned }. +message-banned-with-reason = { $user } је забранио приступ кориснику { $userBanned }. Разлог: { $reason } +message-accepted-invite-for = { $user } је прихватио позив за корисника { $userWhoSent }. +message-accepted-invite = { $user } је прихватио позив. +message-invited = { $user } је позвао корисника { $userWhoGotInvited }. +message-display-name-changed = { $user } је променио своје име за приказ из { $oldDisplayName } у { $newDisplayName }. +message-display-name-set = { $user } је поставио своје име за приказ на { $changedName }. +message-display-name-remove = { $user } је уклонио своје име за приказ { $nameRemoved }. +message-joined = { $user } се придружио соби. +message-rejected-invite = { $user } је одбио позив. +message-left = { $user } је напустио собу. +message-unbanned = { $user } је укинуо забрану приступа кориснику { $userUnbanned }. +message-kicked = { $user } је избацио корисника { $userGotKicked }. +message-kicked-with-reason = { $user } је избацио корисника { $userGotKicked }. Разлог: { $reason } +message-withdrew-invite = { $user } је повукао позивницу корисника { $userInvitationWithdrawn }. +message-withdrew-invite-with-reason = { $user } је повукао позивницу корисника { $userInvitationWithdrawn }. Разлог: { $reason } +message-room-name-remove = { $user } је уклонио назив собе. +message-room-name-changed = { $user } је променио назив собе у { $newRoomName }. +message-power-level-changed = { $user } је променио ниво овлашћења за { $powerLevelChanges }. +message-power-level-from-to = { $user } са { $oldPowerLevel } на { $newPowerLevel } +message-guest-allowed = { $user } је дозволио гостима да се придруже соби. +message-guest-prevented = { $user } је онемогућио гостима да се придруже соби. +message-history-anyone = { $user } је учинио будући историјат собе видљивим свима. +message-history-shared = { $user } је учинио будући историјат собе видљивим свим члановима собе. +message-history-invited = { $user } је учинио будући историјат собе видљивим свим члановима собе, од тренутка када су позвани. +message-history-joined = { $user } је учинио будући историјат собе видљивим свим члановима собе, од тренутка када су се придружили. +message-alias-main = { $user } је поставио главну адресу за ову собу са { $oldAddress } на { $newAddress }. +message-alias-added = { $user } је додао { $addresses } као алтернативну адресу за ову собу. +message-alias-removed = { $user } је уклонио { $addresses } као алтернативну адресу за ову собу. +message-alias-removed-and-added = { $user } је уклонио { $removedAddresses } и додао { $addedAddresses } као адресу за ову собу. +message-space-not-supported = Ова соба је простор, што није подржано. +message-encryption-start = Поруке у овом разговору су сада шифроване од краја до краја. +message-verification-request2 = { $user } жели да потврди { $userReceiving }. +message-verification-cancel2 = { $user } је отказао потврду са разлогом: { $reason } message-verification-done = Потврда је обављена. message-decryption-error = Не могу дешифровати садржај ове поруке. Да бисте затражили кључеве шифровања са ваших других уређаја, кликните десним кликом на ову поруку. message-decrypting = Дешифрујем… +message-redacted = Порука је редигована. +message-reaction = { $userThatReacted } је реаговао на { $userThatSentMessage } са { $reaction }. message-action-request-key = Поново затражи кључеве message-action-redact = Цензуриши message-action-report = Пријави поруку diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/about3Pane.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/about3Pane.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/about3Pane.ftl 2026-03-24 16:59:42.668929800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/about3Pane.ftl 2026-04-23 05:16:31.738537800 +0000 @@ -57,6 +57,15 @@ [few] { $count } порука *[other] { $count } порука } +quick-filter-bar-search2 = + .label = Филтрирај поруке +quick-filter-bar-searching = + .title = Претражујем… +quick-filter-bar-search-shortcut = + { PLATFORM() -> + [macos] K + *[other] Ctrl+Shift+K + } quick-filter-bar-search-placeholder-with-key = Филтрирај поруке… { quick-filter-bar-search-shortcut } quick-filter-bar-search-button = .alt = Потражи свуда @@ -275,6 +284,12 @@ .label = Обриши threadpane-cell-delete = .aria-label = Обриши +threadpane-replies = + { $count -> + [one] { $count } одговор + [few] { $count } одговора + *[other] { $count } одговора + } threadpane-message-new = .alt = Показивач нове поруке .title = Нова порука @@ -293,6 +308,12 @@ threadpane-message-replied-redirected = .alt = Показивач одговора и преусмеравања .title = Примљен одговор на поруку и порука је преусмерена +threadpane-message-forwarded-redirected = + .alt = Показатељ прослеђивања и преусмеравања + .title = Порука је прослеђена и преусмерена +threadpane-message-replied-forwarded-redirected = + .alt = Показатељ одговора, прослеђивања и преусмеравања + .title = На поруку је одговорено, прослеђена је и преусмерена apply-columns-to-menu = .label = Примени колоне на… apply-current-view-to-menu = @@ -306,7 +327,29 @@ apply-current-columns-to-folder-with-children-message = Применити колоне тренутне фасцикле на { $name } и њену децу? apply-current-view-to-folder-message = Применити приказ тренутне фасцикле на { $name }? apply-current-view-to-folder-with-children-message = Применити тренутни приказ фасцикле на { $name } и потомке? +threadpane-sort-header-unread-count = + { $unread -> + [one] + { $total -> + [one] 1 непрочитана од 1 поруке + *[other] 1 непрочитана од { $total } порука + } + *[other] + { $total -> + [one] { $unread } непрочитаних од 1 поруке + *[other] { $unread } непрочитаних од { $total } порука + } + } +threadpane-sort-header-count = + { $total -> + [one] 1 порука + [few] { $total } поруке + *[other] { $total } порука + } +threadpane-card-menu-button = + .title = Мени порука message-list-placeholder-no-messages = Нема пронађених порука +message-list-placeholder-multiple-folders = Изабрано је више фасцикли folder-pane-context-mark-folder-read = .label = { $count -> diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutDialog.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutDialog.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutDialog.ftl 2026-03-24 16:59:42.669268100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutDialog.ftl 2026-04-23 05:16:31.738728300 +0000 @@ -22,10 +22,12 @@ warning-desc-telemetry = Он аутоматски шаље податке о перформансама, хардверу, коришћењу и изменама назад ка { -vendor-short-name } да би { -brand-short-name } био још бољи. aboutDialog-version = { $version } ({ $bits }-битна) aboutDialog-version-nightly = { $version } ({ $isodate }) ({ $bits }-битна) +aboutdialog-version-arch = { $version } ({ $arch }) +aboutdialog-version-arch-nightly = { $version } ({ $isodate }) ({ $arch }) aboutdialog-update-checking-failed = Провера ажурирања није успела. community-experimental = { -vendor-short-name } је глобална заједница која ради на томе да задржи веб отвореним, јавним и доступним свима. -community-desc = { -brand-short-name } је дизајнирала { -vendor-short-name }, глобална заједница која ради на томе да задржи веб отвореним, јавним и доступним свима. -about-donation = Желите да помогнете? Донирајте or се прикључите! +community-desc = { -brand-short-name } је осмислила { -vendor-short-name }, глобална заједница која ради на томе да задржи веб отвореним, јавним и доступним свима. +about-donation = Желите да помогнете? Донирајте или се прикључите! bottom-links-license = Информације о лиценцирању bottom-links-rights = Права крајњег корисника bottom-links-privacy = Полиса приватности diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutImport.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutImport.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutImport.ftl 2026-03-24 16:59:42.669430700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutImport.ftl 2026-04-23 05:16:31.738849000 +0000 @@ -55,12 +55,16 @@ items-pane-checkbox-address-books = Именици items-pane-checkbox-calendars = Календари items-pane-checkbox-mail-messages = Поруке е-поште +items-pane-override = Постојећи или идентични подаци неће бити преписани. import-from-addr-book-file-description = Изаберите формат датотеке који садржи податке из именика. +addr-book-csv-file = Датотека раздвојена зарезом или табулатором (.csv, .tsv) addr-book-ldif-file = LDIF датотека (.ldif) addr-book-vcard-file = vCard датотека (.vcf, .vcard) addr-book-sqlite-file = Датотека SQLite базе података (.sqlite) addr-book-mab-file = Датотека Mork базе података (.mab) addr-book-file-picker = Изабери датотеку именика +addr-book-csv-field-map-title = Подударање назива поља +addr-book-csv-field-map-desc = Изаберите поља именика која одговарају изворним пољима. Одзначите поља која не желите да увезете. addr-book-directories-title = Изаберите где желите да увезете изабране податке addr-book-directories-pane-source = Изворна датотека: addr-book-import-into-new-directory2 = Направите нову фасциклу са називом „{ $addressBookName }” @@ -69,18 +73,44 @@ import-from-calendar-file-desc = Изаберите iCalendar (.ics) датотеку коју желите да увезете. calendar-items-title = Изаберите ставке за увоз. calendar-items-loading = Учитавање ставки… +calendar-items-filter-input2 = + .label = Филтрирај ставке + .placeholder = Филтрирај ставке… calendar-select-all-items = Изабери све calendar-deselect-all-items = Поништи све calendar-target-title = Изаберите где ћете увести изабране ставке. calendar-import-into-new-calendar2 = Направите нови календар под називом „{ $targetCalendar }” +calendar-summary-title = + { $itemCount -> + [one] Увези једну ставку у календар „{ $targetCalendar }“ + [few] Увези { $itemCount } ставке у календар „{ $targetCalendar }“ + *[other] Увези { $itemCount } ставки у календар „{ $targetCalendar }“ + } calendar-summary-description = Направиће се нови календар под називом „{ $targetCalendar }”. progress-pane-importing2 = Увозим… { $progressPercent } progress-pane-exporting2 = Извозим… { $progressPercent } progress-pane-finished-desc2 = Завршено. error-pane-title = Грешка error-message-zip-file-too-big2 = Изабрана ZIP датотека је већа од 2GB. Прво је распакујте, а потом увезите из распаковане фасцикле. +error-message-extract-zip-file-failed2 = Распакивање ZIP датотеке није успело. Распакујте је ручно, а затим увезите из распаковане фасцикле. +error-message-failed = Увоз није успео неочекивано, више информација може бити доступно у конзоли грешака. +error-failed-to-parse-ics-file = У датотеци нису пронађене ставке које се могу увести. +error-export-failed = Извоз није успео неочекивано, више информација може бити доступно у конзоли грешака. +error-message-no-profile = Профил није пронађен. +csv-first-row-contains-headers = Први ред садржи називе поља +csv-source-field = Изворно поље +csv-source-first-record = Први запис +csv-source-second-record = Други запис +csv-target-field = Поље именика +export-profile-title = Извезите налоге, поруке, именике и подешавања у ZIP датотеку. +export-profile-description = Ако је ваш тренутни профил већи од 2GB, предлажемо да га сами резервно копирате. +export-open-profile-folder = Отвори фасциклу профила +export-file-picker2 = Извези у ZIP датотеку export-brand-name = { -brand-product-name } +summary-pane-title = Подаци за увоз summary-pane-start = Покрени увоз +summary-pane-warning = { -brand-product-name } ће морати поново да се покрене када се увоз заврши. +summary-pane-start-over = Поново покрени алат за увоз footer-help = Потребна вам је помоћ? footer-import-documentation = Увези документацију footer-export-documentation = Извези документацију diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutRights.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutRights.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutRights.ftl 2026-03-24 16:59:42.669729700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutRights.ftl 2026-04-23 05:16:31.739060000 +0000 @@ -18,6 +18,7 @@ rights-intro-point-5-unbranded = Ако овај производ укључује мрежне услуге, све односне услове услуга можете пронаћи на Сервиси веб сајта. rights-intro-point-6 = Да би се репродуковале одређене врсте видео садржаја, { -brand-short-name } преузима одређене декрипционе модуле од трећих лица. rights-webservices-header = Услуге { -brand-full-name }-ових информација заснованих на вебу +rights-webservices2 = { -brand-full-name } користи информационе услуге засноване на вебу („услуге“) како би омогућио неке од функција које су вам на располагању у овој бинарној верзији програма { -brand-short-name } под условима описаним испод. Ако не желите да користите једну или више услуга или су вам услови испод неприхватљиви, можете да онемогућите ту функцију или услуге. Упутства о томе како да онемогућите одређену функцију или услугу можете пронаћи овде. Остале функције и услуге могу се онемогућити у подешавањима апликације. rights-locationawarebrowsing = Читање осетљиво на положај: је увек могуће. Никакве информације неће бити послате без ваше дозволе. Ако желите да ову могућност трајно искључите, пратите следеће кораке: rights-locationawarebrowsing-term-1 = У траци за адресу унесите about:config rights-locationawarebrowsing-term-2 = Укуцајте geo.enabled diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportCalendar.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportCalendar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportCalendar.ftl 2026-03-24 16:59:42.669866300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportCalendar.ftl 2026-04-23 05:16:31.739155800 +0000 @@ -8,3 +8,22 @@ calendars-table-uri = URI calendars-table-refreshinterval = Стопа освежавања calendars-table-readonly = Само за читање +calendars-table-suppressalarms = Потисни аларме +calendars-table-cache-enabled = Кеш је омогућен +calendars-table-imip-identity = iMIP идентитет +calendars-table-imip-identity-disabled = iMIP је онемогућен +calendars-table-imip-identity-account = iMIP налог +calendars-table-organizerid = ИД организатора +calendars-table-forceemailscheduling = Присилно заказивање путем е-поште +calendars-table-capabilities-alarms-popup-supported = Подржани искачући аларми +calendars-table-capabilities-alarms-oninviations-supported = Подржани аларми за позивнице +calendars-table-capabilities-alarms-maxcount = Највише аларма по догађају +calendars-table-capabilities-attachments-supported = Прилози су подржани +calendars-table-capabilities-categories-maxcount = Највише категорија +calendars-table-capabilities-privacy-supported = Подржано стање приватности +calendars-table-capabilities-priority-supported = Важност је подржана +calendars-table-capabilities-events-supported = Догађаји су подржани +calendars-table-capabilities-tasks-supported = Задаци су подржани +calendars-table-capabilities-timezones-floating-supported = Локално време је подржано +calendars-table-capabilities-timezones-utc-supported = UTC/GMT је подржано +calendars-table-capabilities-autoschedule-supported = Аутоматско заказивање је подржано diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportMail.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportMail.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportMail.ftl 2026-03-24 16:59:42.670117000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/aboutSupportMail.ftl 2026-04-23 05:16:31.739327400 +0000 @@ -12,6 +12,7 @@ identity-name = Идентитет send-via-email = Пошаљи преко е-поште app-basics-telemetry = Подаци телеметрије +app-basics-glean = Glean подаци app-basics-cache-use = Употреба кеш меморије mail-libs-title = Библиотеке libs-table-heading-library = Библиотека @@ -24,3 +25,4 @@ libs-rnp-status-incompatible = Некомпатибилна верзија. OpenPGP неће радити. libs-rnp-status-unofficial = Незванична верзија. OpenPGP можда неће радити како се очекује. libs-otr-status-ok = У реду +libs-otr-status-error = Неуспело учитавање. OTR шифровање ћаскања неће радити. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountManager.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountManager.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountManager.ftl 2026-03-24 16:59:42.670391000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountManager.ftl 2026-04-23 05:16:31.739519800 +0000 @@ -1,7 +1,23 @@ open-preferences-sidebar-button2 = { -brand-short-name } подешавања open-addons-sidebar-button = Додаци и теме +account-tree-create-account-button = Нови налог +account-tree-add-mail-account = + .label = Поштански налог… + .accesskey = П +account-tree-add-chat-account = + .label = Налог за ћаскање… + .accesskey = ћ +account-tree-add-feed-account = + .label = Налог за доводе… + .accesskey = д +account-tree-add-newsgroup-account = + .label = Налог за новинске групе… + .accesskey = н server-change-restart-required = Потребно је поновно покретање да би се примениле промене имена сервера или корисничког имена. edit-vcard-dialog-accept-button = Сачувај .accesskey = С edit-vcard-dialog-cancel-button = Откажи .accesskey = О +account-manager-server-default-icon = + .title = Подразумевани налог + .alt = Иконица звездице diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountSettings.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountSettings.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountSettings.ftl 2026-03-24 16:59:42.670493800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountSettings.ftl 2026-04-23 05:16:31.739602800 +0000 @@ -1,2 +1,8 @@ +account-settings-color-label = Боја: + .accesskey = Б +account-settings-reset-color-button = + .title = Ресетуј боју delete-account-button = .label = Обриши +default-account-button = + .label = Постави као подразумевано diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountHub.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountHub.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountHub.ftl 2026-03-24 16:59:42.670687200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountHub.ftl 2026-04-23 05:16:31.739760600 +0000 @@ -19,6 +19,8 @@ account-hub-import-setup-button = Увезите .title = Увезите резервну копију профила account-hub-sync-button = Пријавите се на Sync… +account-hub-add-email-title = Додајте свој налог +account-hub-manually-configure-email-title = Подеси конфигурацију налога account-hub-email-cancel-button = Откажи account-hub-email-stop-button = Заустави account-hub-email-back-button = Назад @@ -27,9 +29,18 @@ account-hub-email-manually-configure-button = Подесите ручно account-hub-email-continue-button = Настави account-hub-email-confirm-button = Потврди +account-hub-result-incoming-server-legend = Долазни сервер + .title = Долазни сервер +account-hub-result-outgoing-server-legend = Одлазни сервер + .title = Одлазни сервер account-hub-protocol-label = Протокол +account-hub-result-hostname-label = Име домаћина + .title = Име домаћина +account-hub-result-authentication-label = Потврђивање идентитета + .title = Потврђивање идентитета account-hub-port-label = Порт .title = Подесите број порта на 0 за самостално препознавање +account-hub-auto-description = { -brand-short-name } ће покушати да самостално открије поља која су остављена празна. account-hub-ssl-label = Безбедност везе account-hub-ssl-autodetect-option = .label = Самопрепознавање @@ -41,5 +52,85 @@ .label = Шифрована лозинка account-hub-ssl-noencryption-option = .label = Ништа +account-hub-auth-no-authentication-option = + .label = Без потврђивања идентитета account-hub-auth-label = Начин пријаве +account-hub-result-username-label = Корисничко име + .title = Корисничко име +account-hub-name-label = Пуно име + .accesskey = и account-hub-adding-account-title = Додајем налог +account-hub-adding-account-subheader = Поновно тестирање подешавања конфигурације налога +account-hub-lookup-email-configuration-title = Тражење конфигурације +account-hub-lookup-email-configuration-subheader = Покушавам са уобичајеним називима сервера… +account-hub-email-account-added-title = Налог је успешно додат +account-hub-find-account-settings-failed = { -brand-short-name } није успео да пронађе подешавања за ваш налог е-поште. +account-hub-notification-show-more = Прикажи више +account-hub-notification-show-less = Прикажи мање +account-hub-email-setup-header = Додајте вашу адресу е-поште +account-hub-email-setup-incoming = Подешавања долазног сервера +account-hub-email-setup-outgoing = Подешавања одлазног сервера +account-hub-email-config-found = Изаберите врсту вашег налога е-поште +account-hub-email-enter-password = Унесите лозинку за ваш налог е-поште +account-hub-email-sync-accounts = Усагласите ваше календаре и именике +account-hub-test-configuration = Тест +account-hub-add-new-email = Додај још једну е-пошту +account-hub-result-imap-description = Држите ваше фасцикле и е-поште усаглашеним на вашем серверу +account-hub-result-pop-description = Држите ваше фасцикле и е-поште на вашем рачунару +account-hub-result-ews-shortname = Exchange +account-hub-result-ews-description = Користите Microsoft Exchange Web Services за усаглашавање ваших фасцикли и е-пошта +account-hub-result-exchange-description = Усагласите фасцикле и е-пошту са Exchange-ом или Office-ом 365 +account-hub-result-ews-text = Сервер +account-hub-result-recommended-label = Препоручено +account-hub-result-addon-label = Захтева додатак +account-hub-edit-configuration = Уреди подешавање +account-hub-config-success = Подешавање је пронађено у Mozilla ISPDB-у +account-hub-password-info = Ваши подаци за приступ биће сачувани само локално на вашем рачунару +account-hub-creating-account = Прављење налога… +account-hub-sync-accounts-found = { -brand-short-name } је пронашао неке повезане услуге +account-hub-sync-accounts-not-found = { -brand-short-name } не може да пронађе повезане услуге +account-hub-sync-accounts-failure = { -brand-short-name } не може да се повеже са изабраним услугама +account-hub-email-added-success = Налог е-поште је успешно повезан +account-hub-config-test-success = Поставке подешавања су исправне +account-hub-select-all = Изабери све +account-hub-deselect-all = Поништи избор свега +account-hub-sync-accounts-selected = + { $count -> + [one] { $count } изабрана + [few] { $count } изабране + *[other] { $count } изабрано + } +account-hub-no-address-books = Нису пронађени именици +account-hub-no-calendars = Нису пронађени календари +account-hub-email-added-success-links-title = Истражите опције за безбедност и персонализацију: +account-hub-signature-link = Потпис е-поште +account-hub-email-error-text = Унесите исправну адресу е-поште +account-hub-name-error-text = Унесите име +account-hub-hostname-error-text = Име домаћина је празно или неисправно. Дозвољена су само слова, бројеви, - и . + .title = Име домаћина је празно или неисправно. Дозвољена су само слова, бројеви, - и . +account-hub-port-error-text = Прикључник мора бити између 1 и 65535 + .title = Прикључник мора бити између 1 и 65535 +account-hub-username-error-text = Корисничко име је обавезно + .title = Корисничко име је обавезно +account-hub-oauth-pending = Чекање на овлашћење у искачућем прозору за пријаву… +account-hub-addon-install-needed = { -brand-short-name } не подржава изворно овај сервер. Да бисте приступили Exchange е-пошти, инсталирајте додатак треће стране као што је Owl (плаћа се). +account-hub-addon-error = Инсталација додатка није успела. Покушајте поново или контактирајте аутора додатка за помоћ. +account-hub-security-warning = Упозорење: Откривен је небезбедан сервер е-поште. Овом серверу недостаје шифровање, чиме се излажу ваша лозинка и подаци. Контактирајте свог администратора да бисте осигурали везу или наставите на сопствени ризик. Погледајте ЧПП за више информација. +account-hub-account-authentication-error = Грешка при потврди идентитета. +account-hub-add-address-book = Додај именик +address-book-sync-existing-icon = + .alt = Усагласите именик са постојећег налога +address-book-sync-existing = Усагласи са постојећег налога +address-book-add-remote-icon = + .alt = Додај нови удаљени именик +address-book-add-remote = Додај удаљени именик +address-book-add-remote-description = Повежите се на удаљени CardDAV именик +address-book-add-local-icon = + .alt = Направи нови локални именик +address-book-add-local = Нови локални именик +address-book-add-local-description = Направите нови локални именик на свом уређају +address-book-add-ldap-icon = + .alt = Повежите се на удаљени LDAP именик +address-book-add-ldap = Нови LDAP именик +address-book-add-ldap-description = Повежите се на удаљени LDAP именик +account-hub-fetching-sync-accounts = Откривање именика и календара… diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountSetup.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountSetup.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountSetup.ftl 2026-03-24 16:59:42.670844800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/accountcreation/accountSetup.ftl 2026-04-23 05:16:31.739926600 +0000 @@ -1,5 +1,10 @@ account-setup-tab-title = Подешавања налога account-setup-title = Подесите постојећу адресу е-поште +account-setup-description = Да бисте користили своју тренутну адресу е-поште, попуните своје податке за приступ. +account-setup-secondary-description = { -brand-product-name } ће аутоматски потражити радну и препоручену конфигурацију сервера. +account-setup-success-title = Налог је успешно направљен +account-setup-success-description = Сада можете да користите овај налог са { -brand-short-name }. +account-setup-success-secondary-description = Можете побољшати искуство повезивањем сродних услуга и подешавањем напредних поставки налога. account-setup-name-label = Ваше име и презиме .accesskey = м account-setup-name-input = @@ -27,8 +32,14 @@ .accesskey = м account-setup-exchange-label = Ваша пријава .accesskey = и +account-setup-exchange-input = + .placeholder = ВАШДОМЕН\вашекорисничкоиме +account-setup-exchange-info-icon = + .title = Пријава на домен account-setup-button-cancel = Откажи .accesskey = к +account-setup-button-manual-config = Ручно подеси + .accesskey = р account-setup-button-stop = Заустави .accesskey = с account-setup-button-retest = Поново пробај @@ -37,16 +48,72 @@ .accesskey = с account-setup-button-done = Готово .accesskey = Г +account-setup-looking-up-settings = Тражење подешавања… +account-setup-looking-up-settings-guess = Тражење подешавања: испробавање уобичајених назива сервера… +account-setup-looking-up-settings-half-manual = Тражење подешавања: испитивање сервера… +account-setup-looking-up-disk = Тражење подешавања: инсталација { -brand-short-name }… +account-setup-looking-up-isp = Тражење подешавања: добављач е-поште… +account-setup-looking-up-db = Тражење подешавања: Mozilla ISP база података… +account-setup-looking-up-mx = Тражење подешавања: домен долазне поште… +account-setup-looking-up-exchange = Тражење подешавања: Exchange сервер… +account-setup-checking-password = Провера лозинке… +account-setup-installing-addon = Преузимање и инсталирање додатка… +account-setup-success-half-manual = Следећа подешавања су пронађена испитивањем датог сервера: +account-setup-success-guess = Подешавање је пронађено испробавањем уобичајених назива сервера. +account-setup-success-guess-offline = Ван мреже сте. Погодили смо нека подешавања, али ћете морати да унесете исправна. account-setup-success-password = Лозинка је исправна +account-setup-success-addon = Додатак је успешно инсталиран +account-setup-success-settings-db = Подешавање је пронађено у Mozilla ISP бази података. +account-setup-success-settings-disk = Подешавање је пронађено у инсталацији програма { -brand-short-name }. +account-setup-success-settings-isp = Подешавање је пронађено код добављача е-поште. +account-setup-success-settings-exchange = Подешавање је пронађено за Microsoft Exchange сервер. account-setup-step1-image = .title = Почетно подешавање account-setup-step2-image = .title = Учитавање… +account-setup-step3-image = + .title = Подешавање је пронађено +account-setup-step4-image = + .title = Грешка у повезивању +account-setup-step5-image = + .title = Налог је направљен +account-setup-privacy-footnote2 = Ваши подаци за приступ биће сачувани само локално на вашем рачунару. +account-setup-selection-help = Нисте сигурни шта да изаберете? +account-setup-selection-error = Треба вам помоћ? +account-setup-success-help = Нисте сигурни у следеће кораке? +account-setup-documentation-help = Документација за подешавање +account-setup-forum-help = Форум за подршку +account-setup-privacy-help = Политика приватности +account-setup-getting-started = Први кораци +account-setup-results-area-title = + { $count -> + [one] Доступно подешавање + [few] Доступна подешавања + *[other] Доступна подешавања + } +account-setup-result-imap-description = Чувајте своје фасцикле и е-пошту синхронизованим на серверу +account-setup-result-pop-description = Чувајте своје фасцикле и е-пошту на свом рачунару +account-setup-result-exchange2-description = Користите Microsoft Exchange сервер или Office365 услуге у облаку +account-setup-incoming-title = Долазно +account-setup-outgoing-title = Одлазно +account-setup-username-title = Корисничко име +account-setup-exchange-title = Сервер +account-setup-result-no-encryption = Без шифровања +account-setup-result-ssl = SSL/TLS +account-setup-result-starttls = STARTTLS +account-setup-result-outgoing-existing = Користи постојећи одлазни SMTP сервер +account-setup-result-username-different = Долазно: { $incoming }, Одлазно: { $outgoing } +account-setup-credentials-incomplete = Потврда идентитета није успела. Или су унети подаци за приступ нетачни или је потребно посебно корисничко име за пријаву. Ово корисничко име је обично ваша пријава за Windows домен са или без домена (на пример, janedoe или AD\\janedoe) +account-setup-credentials-wrong = Потврда идентитета није успела. Проверите корисничко име и лозинку +account-setup-find-settings-failed = { -brand-short-name } није успео да пронађе подешавања за ваш налог е-поште +account-setup-exchange-config-unverifiable = Није могуће потврдити подешавања. Ако су ваше корисничко име и лозинка тачни, вероватно је да је администратор сервера онемогућио изабрана подешавања за ваш налог. Покушајте да изаберете други протокол. +account-setup-manual-config-title = Ручно подешавање account-setup-incoming-server-legend = Долазни сервер account-setup-protocol-label = Протокол: account-setup-hostname-label = Име сервера: account-setup-port-label = Порт: .title = Поставите на 0 за самопрепознавање +account-setup-auto-description = { -brand-short-name } ће покушати да самостално открије поља која су остављена празна. account-setup-ssl-label = Безбедност везе: account-setup-outgoing-server-legend = Одлазни сервер ssl-autodetect-option = Самопрепознавање @@ -61,15 +128,22 @@ account-setup-insecure-title = Упозорење! account-setup-insecure-incoming-title = Долазна подешавања: account-setup-insecure-outgoing-title = Одлазна подешавања: +account-setup-warning-cleartext = { $server } не користи шифровање. +account-setup-warning-cleartext-details = Небезбедни сервери поште не користе шифроване везе за заштиту ваших лозинки и приватних података. Повезивањем на овај сервер можете изложити своју лозинку и приватне податке. account-setup-insecure-server-checkbox = Разумем последице .accesskey = у +account-setup-insecure-description = { -brand-short-name } вам може омогућити да приступите својој пошти користећи наведене конфигурације. Међутим, требало би да контактирате свог администратора или добављача е-поште у вези са овим непрописним везама. Погледајте Thunderbird ЧПП за више информација. insecure-dialog-cancel-button = Промени подешавања .accesskey = в insecure-dialog-confirm-button = Потврди .accesskey = т +exchange-dialog-question = { -brand-short-name } је пронашао податке за подешавање вашег налога на { $domain }. Да ли желите да наставите и пошаљете своје акредитиве? exchange-dialog-confirm-button = Пријава exchange-dialog-cancel-button = Откажи exit-dialog-title = Нема подешеног налога е-поште +exit-dialog-description = Да ли сте сигурни да желите да откажете поступак подешавања? { -brand-short-name } се и даље може користити без налога е-поште, али многе функције неће бити доступне. +account-setup-no-account-checkbox = Користи { -brand-short-name } без налога е-поште + .accesskey = К exit-dialog-cancel-button = Настави са подешавањем .accesskey = с exit-dialog-confirm-button = Изађи из подешавања @@ -80,12 +154,33 @@ account-setup-confirm-advanced-description = Овај дијалог биће затоврен и тренутна подешавања биће искоришћена за прављење налога, и у случају неисправне конфигурације. Да ли сигурни да желите наставити? account-setup-addon-install-title = Инсталирај account-setup-addon-install-intro = Додатак са треће стране вам може помоћи да приступите вашем мејл налогу на овом серверу: +account-setup-addon-no-protocol = Овај сервер е-поште нажалост не подржава отворене протоколе. { account-setup-addon-install-intro } account-setup-settings-button = Подешавања налога account-setup-encryption-button = Шифровање с краја на крај account-setup-signature-button = Додај потпис account-setup-dictionaries-button = Преузми речнике +account-setup-address-book-carddav-button = Повежи се са CardDAV имеником +account-setup-address-book-ldap-button = Повежи се са LDAP имеником +account-setup-calendar-button = Повежи се са удаљеним календаром +account-setup-linked-services-title = Повежите своје повезане услуге +account-setup-linked-services-description = { -brand-short-name } је открио друге услуге повезане са вашим налогом е-поште. +account-setup-no-linked-description = Подесите друге услуге како бисте извукли максимум из свог { -brand-short-name } искуства. +account-setup-found-address-books-description = + { $count -> + [one] { -brand-short-name } је пронашао један именик повезан са вашим налогом е-поште. + [few] { -brand-short-name } је пронашао { $count } именика повезана са вашим налогом е-поште. + *[other] { -brand-short-name } је пронашао { $count } именика повезаних са вашим налогом е-поште. + } +account-setup-found-calendars-description = + { $count -> + [one] { -brand-short-name } је пронашао један календар повезан са вашим налогом е-поште. + [few] { -brand-short-name } је пронашао { $count } календара повезана са вашим налогом е-поште. + *[other] { -brand-short-name } је пронашао { $count } календара повезаних са вашим налогом е-поште. + } account-setup-button-finish = Доврши .accesskey = р +account-setup-looking-up-address-books = Тражим именике… +account-setup-looking-up-calendars = Тражим календаре… account-setup-address-books-button = Именици account-setup-calendars-button = Календари account-setup-connect-link = Повежи се @@ -114,5 +209,7 @@ } account-setup-calendar-read-only = Само за читање .accesskey = з +account-setup-calendar-show-reminders = Прикажи подсетнике + .accesskey = П account-setup-calendar-offline-support = Подршка ван мреже .accesskey = о diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/aboutAddressBook.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/aboutAddressBook.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/aboutAddressBook.ftl 2026-03-24 16:59:42.671498300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/aboutAddressBook.ftl 2026-04-23 05:16:31.740391000 +0000 @@ -1,7 +1,27 @@ about-addressbook-title = Именик +about-addressbook-toolbar-add-address-book = + .label = Додај локални именик +about-addressbook-toolbar-add-carddav-address-book = + .label = Додај CardDAV именик +about-addressbook-toolbar-add-ldap-address-book = + .label = Додај LDAP именик +books-pane-create-contact-button = Нови контакт + .title = Направи нови контакт +books-pane-create-book-button = + .title = Направи нови именик +books-pane-create-list-button = + .title = Направи нову дописну листу +books-pane-import-button = Увези + .title = Увези именике all-address-books-row = .title = Сви именици all-address-books = Сви именици +about-addressbook-card-count = + { $count -> + [one] Укупно контаката у { $name }: { $count } + [few] Укупно контаката у { $name }: { $count } + *[other] Укупно контаката у { $name }: { $count } + } about-addressbook-card-count-all = Укупно контаката у свим именицима: { $count } about-addressbook-books-context-properties = .label = Својства @@ -22,7 +42,15 @@ about-addressbook-books-context-startup-default = .label = Подразумевана почетна фасцикла about-addressbook-confirm-delete-book-title = Обриши именик +about-addressbook-confirm-delete-book = Да ли сте сигурни да желите да обришете { $name } и све његове контакте? about-addressbook-confirm-remove-remote-book-title = Уклони именик +about-addressbook-confirm-remove-remote-book = Да ли сте сигурни да желите да уклоните { $name }? +about-addressbook-search2 = + .label = Претражи { $name } + .placeholder = Претражи { $name }… +about-addressbook-search-all2 = + .label = Претражи све именике + .placeholder = Претражи све именике… about-addressbook-sort-button2 = .title = Прикажи опције приказа about-addressbook-name-format-display = @@ -45,50 +73,130 @@ .title = Поређај по називу about-addressbook-column-label-generatedname2 = .label = Назив +about-addressbook-cell-generatedname2 = + .aria-label = Име + .title = { $title } about-addressbook-column-header-emailaddresses2 = Адресе е-поште .title = Поређај по адреси е-поште about-addressbook-column-label-emailaddresses2 = .label = Адресе е-поште +about-addressbook-cell-emailaddresses2 = + .aria-label = Адресе е-поште + .title = { $title } about-addressbook-column-header-nickname2 = Надимак .title = Поређај по надимку about-addressbook-column-label-nickname2 = .label = Надимак +about-addressbook-cell-nickname2 = + .aria-label = Надимак + .title = { $title } about-addressbook-column-header-phonenumbers2 = Бројеви телефона .title = Поређај по бројевима телефона about-addressbook-column-label-phonenumbers2 = .label = Бројеви телефона +about-addressbook-cell-phonenumbers2 = + .aria-label = Бројеви телефона + .title = { $title } about-addressbook-column-header-addresses2 = Адресе .title = Поређај по адресама about-addressbook-column-label-addresses2 = .label = Адресе +about-addressbook-cell-addresses2 = + .aria-label = Адресе + .title = { $title } about-addressbook-column-header-title2 = Наслов .title = Поређај по наслову about-addressbook-column-label-title2 = .label = Наслов +about-addressbook-cell-title2 = + .aria-label = Наслов + .title = { $title } about-addressbook-column-header-department2 = Одељење .title = Поређај по одељењу about-addressbook-column-label-department2 = .label = Одељење +about-addressbook-cell-department2 = + .aria-label = Одељење + .title = { $title } about-addressbook-column-header-organization2 = Организација .title = Поређај по организацији about-addressbook-column-label-organization2 = .label = Организација +about-addressbook-cell-organization2 = + .aria-label = Организација + .title = { $title } about-addressbook-column-header-addrbook2 = Именик .title = Поређај по именику about-addressbook-column-label-addrbook2 = .label = Именик +about-addressbook-cell-addrbook2 = + .aria-label = Именик + .title = { $title } about-addressbook-cards-context-write = .label = Пиши about-addressbook-confirm-delete-mixed-title = Обриши контакте и листе +about-addressbook-confirm-delete-mixed = Да ли сте сигурни да желите да обришете ових { $count } контаката и спискова? +about-addressbook-confirm-delete-lists-title = + { $count -> + [one] Брисање списка + [few] Брисање спискова + *[other] Брисање спискова + } +about-addressbook-confirm-delete-lists = + { $count -> + [one] Да ли сте сигурни да желите да обришете списак { $name }? + [few] Да ли сте сигурни да желите да обришете ова { $count } списка? + *[other] Да ли сте сигурни да желите да обришете ових { $count } спискова? + } about-addressbook-confirm-remove-contacts-title = { $count -> [one] Уклони контакт [few] Уклони контакте *[other] Уклони контакте } +about-addressbook-confirm-remove-contacts-single = Да ли сте сигурни да желите да уклоните { $name } из { $list }? +about-addressbook-confirm-remove-contacts-multi = + { $count -> + [one] Да ли сте сигурни да желите да уклоните овај { $count } контакт из { $list }? + [few] Да ли сте сигурни да желите да уклоните ова { $count } контакта из { $list }? + *[other] Да ли сте сигурни да желите да уклоните ових { $count } контаката из { $list }? + } +about-addressbook-confirm-delete-contacts-title = + { $count -> + [one] Обриши контакт + [few] Обриши контакта + *[other] Обриши контакте + } +about-addressbook-confirm-delete-contacts-single = Да ли сте сигурни да желите да обришете контакт { $name }? +about-addressbook-confirm-delete-contacts-multi = + { $count -> + [one] Да ли сте сигурни да желите да обришете овај { $count } контакт? + [few] Да ли сте сигурни да желите да обришете ова { $count } контакта? + *[other] Да ли сте сигурни да желите да обришете ових { $count } контаката? + } about-addressbook-placeholder-empty-book = Контакти нису доступни about-addressbook-placeholder-new-contact = Нови контакт +about-addressbook-placeholder-search-only = Овај именик приказује контакте само након претраге about-addressbook-placeholder-searching = Тражим… +about-addressbook-placeholder-no-search-results = Нису пронађени контакти +about-addressbook-selection-mixed-header2 = + { $count -> + [one] { $count } изабрана ставка именика + [few] { $count } изабране ставке именика + *[other] { $count } изабраних ставки именика + } +about-addressbook-selection-contacts-header2 = + { $count -> + [one] { $count } изабран контакт + [few] { $count } изабрана контакта + *[other] { $count } изабраних контаката + } +about-addressbook-selection-lists-header2 = + { $count -> + [one] { $count } изабран списак + [few] { $count } изабрана списка + *[other] { $count } изабраних спискова + } about-addressbook-details-edit-photo = .title = Уреди слику контакта about-addressbook-new-contact-header = Нови контакт @@ -100,10 +208,37 @@ about-addressbook-delete-edit-contact-button = Обриши about-addressbook-cancel-edit-contact-button = Откажи about-addressbook-save-edit-contact-button = Сачувај +about-addressbook-add-contact-to = Додај у: about-addressbook-details-email-addresses-header = Адресе е-поште +about-addressbook-details-phone-numbers-header = Бројеви телефона +about-addressbook-details-addresses-header = Адресе +about-addressbook-details-notes-header = Белешке +about-addressbook-details-impp-header = Брзе поруке +about-addressbook-details-websites-header = Веб странице +about-addressbook-details-other-info-header = Остали подаци about-addressbook-entry-type-work = Посао about-addressbook-entry-type-home = Кућа +about-addressbook-entry-type-fax = Факс +about-addressbook-entry-type-cell = Мобилни +about-addressbook-entry-type-pager = Пејџер +about-addressbook-entry-name-birthday = Рођендан +about-addressbook-entry-name-anniversary = Годишњица +about-addressbook-entry-name-title = Наслов +about-addressbook-entry-name-role = Улога +about-addressbook-entry-name-organization = Организација +about-addressbook-entry-name-website = Веб страница +about-addressbook-entry-name-time-zone = Временска зона +about-addressbook-entry-name-custom1 = Прилагођено 1 +about-addressbook-entry-name-custom2 = Прилагођено 2 +about-addressbook-entry-name-custom3 = Прилагођено 3 +about-addressbook-entry-name-custom4 = Прилагођено 4 +about-addressbook-unsaved-changes-prompt-title = Несачуване измене about-addressbook-unsaved-changes-prompt = Да ли желите да сачувате промене пре него што напустите уређивачки приказ? +about-addressbook-photo-drop-target = Превуците или убаците фотографију овде, или кликните да изаберете датотеку. +about-addressbook-photo-drop-loading = Учитавање фотографије… +about-addressbook-photo-drop-error = Учитавање фотографије није успело. +about-addressbook-photo-filepicker-title = Изаберите датотеку слике +about-addressbook-photo-discard = Одбаци постојећу фотографију about-addressbook-photo-cancel = Откажи about-addressbook-photo-save = Сачувај about-addressbook-new-contact-key = N diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/vcard.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/vcard.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/vcard.ftl 2026-03-24 16:59:42.671640900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/addressbook/vcard.ftl 2026-04-23 05:16:31.740496600 +0000 @@ -1,15 +1,88 @@ vcard-displayname = Име за приказ +vcard-displayname-placeholder = + .placeholder = { vcard-displayname } +vcard-entry-type-label = Врста vcard-entry-type-home = Кућа vcard-entry-type-work = Посао vcard-entry-type-none = Ништа +vcard-entry-type-custom = Произвољно +vcard-name-header = Име +vcard-n-prefix = Префикс +vcard-n-add-prefix = + .title = Додај префикс vcard-n-firstname = Име vcard-n-add-firstname = .title = Додајте име +vcard-n-middlename = Средње име +vcard-n-add-middlename = + .title = Додај средње име vcard-n-lastname = Презиме vcard-n-add-lastname = .title = Додајте презиме +vcard-n-suffix = Суфикс +vcard-n-add-suffix = + .title = Додај суфикс vcard-nickname = Надимак vcard-email-header = Адресе е-поште +vcard-email-add = Додај адресу е-поште +vcard-email-label = Адреса е-поште +vcard-primary-email-label = Подразумевано +vcard-url-header = Веб странице +vcard-url-add = Додај веб страницу +vcard-url-label = Веб страница +vcard-tel-header = Бројеви телефона +vcard-tel-add = Додај број телефона +vcard-tel-label = Број телефона +vcard-entry-type-cell = Мобилни +vcard-entry-type-fax = Факс +vcard-entry-type-pager = Пејџер +vcard-tz-header = Временска зона +vcard-tz-add = Додај временску зону +vcard-impp2-header = Тренутне поруке +vcard-impp-add = Додај налог за ћаскање +vcard-impp-label = Налог за ћаскање +vcard-impp-select = Протокол +vcard-impp-option-other = Друго +vcard-impp-input-label = УРИ +vcard-impp-input-title = УРИ за тренутне поруке +vcard-bday-anniversary-header = Посебни датуми +vcard-bday-anniversary-add = Додај посебан датум +vcard-bday-label = Рођендан +vcard-anniversary-label = Годишњица +vcard-date-day = Дан +vcard-date-month = Месец +vcard-date-year = Година +vcard-adr-header = Адресе +vcard-adr-add = Додај адресу +vcard-adr-label = Адреса +vcard-adr-delivery-label = Натпис за доставу +vcard-adr-street = Улица и број +vcard-adr-locality = Град +vcard-adr-region = Држава/покрајина +vcard-adr-code = Поштански број +vcard-adr-country = Држава +vcard-note-header = Белешке +vcard-note-add = Додај белешку +vcard-org-header = Организациона својства +vcard-org-add = Додај организациона својства +vcard-org-title = Наслов +vcard-org-title-input = + .title = Положај или посао + .placeholder = Звање на послу +vcard-org-role = Улога +vcard-org-role-input = + .title = Функција или улога у одређеној ситуацији + .placeholder = Улога у пројекту +vcard-org-org = Организација +vcard-org-org-input = + .title = Назив организације + .placeholder = Назив предузећа +vcard-org-org-unit = Одељење +vcard-org-org-unit-input = + .title = Назив организационе јединице + .placeholder = Одељење +vcard-custom-header = Произвољна својства +vcard-custom-add = Додај произвољна својства vcard-remove-button-title = .title = Уклони vcard-remove-button = Уклони diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/appmenu.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/appmenu.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/appmenu.ftl 2026-03-24 16:59:42.671801600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/appmenu.ftl 2026-04-23 05:16:31.740600000 +0000 @@ -1,10 +1,33 @@ +appmenu-sync-panel-title = + .title = Синхронизација +appmenu-signin-panel = + .label = Пријавите се на синхронизацију + .accesskey = с +appmenu-sync-sync = + .value = Синхронизација налога + .accesskey = а +appmenu-sync-manage = + .value = Управљај налогом + .accesskey = У appmenu-sync-account = .value = example@example.com +appmenu-sync-now = + .label = Синхронизуј сада + .accesskey = с +appmenu-sync-settings = + .label = Подешавања синхронизације + .accesskey = П +appmenu-sync-sign-out = + .label = Одјави се… + .accesskey = О appmenu-new-account-panel-title = .title = Нови налог appmenu-new-account-panel = .label = Нови налог .accesskey = Н +appmenu-new-email-account = + .label = Е-пошта + .accesskey = Е appmenu-new-calendar = .label = Календар .accesskey = К @@ -92,6 +115,9 @@ appmenu-tools-export = .label = Извези .accesskey = з +appmenu-export-for-mobile = + .label = Извези за мобилни уређај + .accesskey = и appmenu-tools-message-search = .label = Претражи поруке .accesskey = т @@ -112,6 +138,9 @@ appmenu-help-get-help = .label = Потражи помоћ .accesskey = м +appmenu-help-get-release-help = + .label = Потражите помоћ за { -brand-short-name } + .accesskey = п appmenu-help-shortcuts = .label = Пречице на тастатури .accesskey = ц diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/calendarDialog.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/calendarDialog.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/calendarDialog.ftl 2026-03-24 16:59:42.671801600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/calendarDialog.ftl 2026-04-23 05:16:31.740700200 +0000 @@ -0,0 +1,23 @@ +calendar-dialog-close-button = + .aria-label = Затвори + .title = Затвори +calendar-dialog-back-button = + .aria-label = Назад + .title = Назад +calendar-dialog-date-row-icon = + .alt = Датум и време +calendar-dialog-date-row-recurring-icon = + .alt = Понављајући +calendar-dialog-location-row-icon = + .alt = Локација +calendar-dialog-description-row-icon = + .alt = Опис +calendar-dialog-description-label = Опис +calendar-dialog-description-expand-icon = + .alt = Прикажи пун опис +calendar-dialog-more-categories = + { $additionalCategories -> + [few] још { $additionalCategories } + *[other] још { $additionalCategories } + } + .title = { $categories } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/certError.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/certError.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/certError.ftl 2026-03-24 16:59:42.671801600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/certError.ftl 2026-04-23 05:16:31.740784000 +0000 @@ -0,0 +1,4 @@ +cert-error-domain-mismatch = Уверење за { $hostname } не важи за тај сервер. Неко можда покушава да се лажно представи као сервер и не би требало да наставите. +cert-error-expired = Уверење за { $hostname } је истекло { $not-after }. +cert-error-not-yet-valid = Уверење за { $hostname } неће бити важеће до { $not-before }. +cert-error-untrusted-default = Уверење за { $hostname } не долази из поверљивог извора. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/chat.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/chat.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/chat.ftl 2026-03-24 16:59:42.672060300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/chat.ftl 2026-04-23 05:16:31.740952000 +0000 @@ -0,0 +1,27 @@ +chat-joining-chat-icon2 = + .alt = Придруживање ћаскању +chat-left-chat-icon2 = + .alt = Напуштено ћаскање +chat-participant-owner-role-icon2 = + .alt = Власник +chat-participant-administrator-role-icon2 = + .alt = Администратор +chat-participant-moderator-role-icon2 = + .alt = Модератор +chat-participant-voiced-role-icon2 = + .alt = Учесник може да шаље поруке +chat-verify-identity = + .label = Провери идентитет + .accesskey = П +chat-identity-verified = + .label = Идентитет је већ потврђен +chat-buddy-identity-status = Поверење у шифровање +chat-buddy-identity-status-verified = Потврђено +chat-buddy-identity-status-unverified = Непотврђено +chat-conv-invite-label = Позвани сте на ћаскање у { $conversation } +chat-conv-invite-accept = + .label = Прихвати + .accesskey = П +chat-conv-invite-deny = + .label = Одбиј + .accesskey = О diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/customizableshortcuts/customizableShortcuts.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/customizableshortcuts/customizableShortcuts.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/customizableshortcuts/customizableShortcuts.ftl 2026-03-24 16:59:42.672413300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/customizableshortcuts/customizableShortcuts.ftl 2026-04-23 05:16:31.741159000 +0000 @@ -0,0 +1,2 @@ +shortcuts-close-button-title = + .title = Затвори diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/extensionPermissions.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/extensionPermissions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/extensionPermissions.ftl 2026-03-24 16:59:42.672550200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/extensionPermissions.ftl 2026-04-23 05:16:31.741252000 +0000 @@ -5,9 +5,15 @@ webext-perms-description-compose = Читајте и мењајте ваше поруке током састављања и прије слања webext-perms-description-compose-send = Шаљите састављене е-поруке у ваше име webext-perms-description-compose-save = Сачувајте састављане е-поруке као скице или обрасце +webext-perms-description-experiment-access = Овај додатак ће имати потпун, неограничен приступ програму { -brand-short-name } и вашем рачунару. webext-perms-description-messagesImport = Увезите поруке у Thunderbird webext-perms-description-messagesModify = Читајте у мењајте ваше е-поруке како вам се приказују +webext-perms-description-messagesModifyPermanent = Трајно мења извор ваших порука (укључујући заглавља, тело и прилоге) webext-perms-description-messagesMove = Копирајте или премештајте ваше е-поруке (укључујући премештање у смеће) webext-perms-description-messagesDelete = Трајно избришите ваше е-поруке +webext-perms-description-messagesRead2 = Читање ваших порука е-поште +webext-perms-description-messagesUpdate = Мењање својстава и ознака ваших порука е-поште webext-perms-description-messagesTags = Стварајте, мењајте или бришите ознаке порука +webext-perms-description-messagesTagsList = Списак ознака порука webext-perms-description-sensitiveDataUpload = Пренесите осетљиве корисничке податке (ако је приступ добијен) на удаљени сервер ради даље обраде +webext-perms-description-messengerSettings = Читање подешавања програма { -brand-short-name } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/flatpak.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/flatpak.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/flatpak.ftl 2026-03-24 16:59:42.673040200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/flatpak.ftl 2026-04-23 05:16:31.741530200 +0000 @@ -1,3 +1,6 @@ +flatpak-desktop-name = { -brand-short-name } +flatpak-desktop-comment = Шаљите и примајте е-пошту уз { -brand-product-name } +flatpak-desktop-generic-name = Програм за е-пошту flatpak-desktop-action-compose = Напиши нову поруку flatpak-desktop-action-addressbook = Отвори именик flatpak-desktop-action-calendar = Отвори календар diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/importDialog.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/importDialog.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/importDialog.ftl 2026-03-24 16:59:42.673347500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/importDialog.ftl 2026-04-23 05:16:31.741700000 +0000 @@ -1 +1,15 @@ thunderbird-import-name = Thunderbird +thunderbird-import-description = Увези пошту из Thunderbird директоријума профила. +import-from-thunderbird-zip = + .label = Thunderbird (извезена резервна копија профила, zip датотека мања од 2 GB) + .accesskey = З +import-from-thunderbird-dir = + .label = Thunderbird (фасцикла профила) + .accesskey = Т +import-select-profile-zip = Изаберите запаковани директоријум профила +import-select-profile-dir = Изаберите директоријум профила +zip-file-too-big-title = Zip датотека је превелика +zip-file-too-big-message = Изабрана zip датотека је већа од 2 GB. Прво је распакујте, а затим увезите из распаковане фасцикле. +wizardpage-failed = + .label = Увоз није успео +wizardpage-failed-message = Увоз неочекивано није успео, више информација може бити доступно у конзоли за грешке. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/inAppNotifications.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/inAppNotifications.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/inAppNotifications.ftl 2026-03-24 16:59:42.673347500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/inAppNotifications.ftl 2026-04-23 05:16:31.741778100 +0000 @@ -0,0 +1,8 @@ +in-app-notification-close-image = + .alt = Затвори +-in-app-notification-accesskey = j +in-app-notification-instructions = + { PLATFORM() -> + [macos] Притисните ⌥+Shift+{ -in-app-notification-accesskey } да бисте прешли на обавештење + *[other] Притисните Alt+Shift+{ -in-app-notification-accesskey } да бисте прешли на обавештење + } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/menubar.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/menubar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/menubar.ftl 2026-03-24 16:59:42.673654800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/menubar.ftl 2026-04-23 05:16:31.741960300 +0000 @@ -7,12 +7,18 @@ menu-addons-and-themes = .label = Додаци и теме .accesskey = Д +menu-export-for-mobile = + .label = Извези за мобилни… + .accesskey = м menu-help-help-title = .label = Помоћ .accesskey = { "" } menu-help-get-help = .label = Потражи помоћ .accesskey = { "" } +menu-help-get-release-help = + .label = Потражи помоћ за { -brand-short-name } + .accesskey = п menu-help-shortcuts = .label = Пречице на тастатури .accesskey = ц @@ -106,6 +112,9 @@ menu-spaces-toolbar-button = .label = Просторна трака .accesskey = к +file-new-email-account = + .label = Налог е-поште… + .accesskey = е file-new-newsgroup-account = .label = Налог новинске групе… .accesskey = у diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messageheader/headerFields.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messageheader/headerFields.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messageheader/headerFields.ftl 2026-03-24 16:59:42.673918500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messageheader/headerFields.ftl 2026-04-23 05:16:31.742092800 +0000 @@ -5,7 +5,16 @@ message-header-cc-list-name = Коп message-header-bcc-list-name = сКоп message-header-newsgroups-list-name = Новинска група +message-header-followup-to-list-name = Надовежи се на message-header-tags-list-name = Ознаке +message-header-list-id = ИД списка +message-header-list-help = Помоћ за списак +message-header-list-unsubscribe = Откажи претплату на списак +message-header-list-subscribe = Претплати се на списак +message-header-list-post = Објави на списак +message-header-list-owner = Власник списка +message-header-list-archive = Архива списка +message-header-archived-at = Архивирано у message-header-author-field = Аутор: message-header-organization-field = Организација: message-header-subject-field = Наслов: @@ -15,6 +24,35 @@ message-header-message-id-field = ИБ поруке: message-header-in-reply-to-field = Као одговор на: message-header-website-field = Вебсајт: +message-header-list-id-field = ИД списка: +message-header-list-help-field = Помоћ за списак: +message-header-list-unsubscribe-field = Откажи претплату на списак: +message-header-list-subscribe-field = Претплати се на списак: +message-header-list-post-field = Објави на списак: +message-header-list-owner-field = Власник списка: +message-header-list-archive-field = Архива списка: +message-header-archived-at-field = Архивирано у: +list-id-context-list-help = + .label = Потражи помоћ + .accesskey = П +list-id-list-unsubscribe = + .label = Откажи претплату… + .accesskey = О +list-id-list-subscribe = + .label = Претплати се… + .accesskey = П +list-id-list-post = + .label = Пиши + .accesskey = П +list-id-list-owner = + .label = Контактирајте администратора… + .accesskey = К +list-id-list-archive = + .label = Архиве списка + .accesskey = А +list-id-archived-at = + .label = Стална веза поруке + .accesskey = С message-header-custom-field = { $fieldName }: message-header-address-in-address-book-icon2 = .alt = У именику @@ -27,3 +65,7 @@ message-header-field-show-more = Више .title = Прикажи све примаоце message-ids-field-show-all = Прикажи све +dark-message-mode-toggle-enabled = + .title = Онемогући тамни режим порука +dark-message-mode-toggle-disabled = + .title = Омогући тамни режим порука diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messenger.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messenger.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messenger.ftl 2026-03-24 16:59:42.674061500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messenger.ftl 2026-04-23 05:16:31.742235000 +0000 @@ -1,6 +1,54 @@ +messenger-window-minimize-button = + .tooltiptext = Умањи +messenger-window-maximize-button = + .tooltiptext = Увећај +messenger-window-restore-down-button = + .tooltiptext = Врати доле messenger-window-close-button = .tooltiptext = Затвори +unread-messages-os-tooltip = + { $count -> + [one] { $count } непрочитана порука + [few] { $count } непрочитане поруке + *[other] { $count } непрочитаних порука + } about-rights-notification-text = { -brand-short-name } је слободан и отворен софтвер који је изградила заједница више хиљада особа из целог света. +content-tab-page-loading-icon = + .alt = Страница се учитава +content-tab-security-high-icon = + .alt = Веза је безбедна +content-tab-security-broken-icon = + .alt = Веза није безбедна +content-tab-menu-back = + .tooltiptext = Иди на претходну страницу ({ $shortcut }) + .aria-label = Назад + .accesskey = Н +content-tab-menu-back-mac = + .label = Назад + .accesskey = Н +content-tab-menu-forward = + .tooltiptext = Иди на следећу страницу ({ $shortcut }) + .aria-label = Напред + .accesskey = д +content-tab-menu-forward-mac = + .label = Напред + .accesskey = д +content-tab-menu-reload = + .tooltiptext = Поново учитај страницу + .aria-label = Поново учитај + .accesskey = р +content-tab-menu-reload-mac = + .tooltiptext = Поново учитај страницу + .label = Поново учитај + .accesskey = р +content-tab-menu-stop = + .tooltiptext = Заустави учитавање странице + .aria-label = Заустави + .accesskey = З +content-tab-menu-stop-mac = + .tooltiptext = Заустави учитавање странице + .label = Заустави + .accesskey = З addons-and-themes-toolbarbutton = .label = Додаци и теме .tooltiptext = Управљајте вашим додацима @@ -10,6 +58,11 @@ redirect-msg-button = .label = Преусмерење .tooltiptext = Преусмери изабрану поруку +folder-pane-toolbar = + .toolbarname = Трака са алаткама за окно са фасциклама + .accesskey = ф +folder-pane-toolbar-options-button = + .tooltiptext = Опције окна са фасциклама folder-pane-header-label = Фасцикле folder-toolbar-hide-toolbar-toolbarbutton = .label = Сакриј алатницу @@ -41,6 +94,9 @@ menu-edit-delete-folder = .label = Обриши фасциклу .accesskey = О +menu-edit-unsubscribe-newsgroup = + .label = Откажи претплату на дискусиону групу + .accesskey = О menu-edit-delete-messages = .label = { $count -> @@ -84,9 +140,15 @@ context-menu-mark-reply = .aria-label = Одговори .tooltiptext = Одговор +context-menu-archive = + .aria-label = Архивирај + .tooltiptext = Архивирај context-menu-mark-junk = .aria-label = Означи као смеће .tooltiptext = Означи као смеће +context-menu-mark-not-junk = + .aria-label = Означи да није смеће + .tooltiptext = Означи да није смеће mail-context-menu-open = .label = Отвори .accesskey = о @@ -118,6 +180,8 @@ .accesskey = т context-menu-redirect-msg = .label = Преусмери +context-menu-cancel-msg = + .label = Откажи поруку mail-context-messages-delete = .label = { $count -> @@ -126,6 +190,14 @@ *[other] Обриши изабране поруке } .tooltiptext = { mail-context-messages-delete.label } +mail-context-messages-undelete = + .label = + { $count -> + [one] Поврати поруку + [few] Поврати поруке + *[other] Поврати изабране поруке + } + .tooltiptext = { mail-context-messages-undelete.label } context-menu-decrypt-to-folder2 = .label = Направи дешифровану копију у .accesskey = д @@ -140,6 +212,8 @@ message-header-undelete = .label = Врати .tooltiptext = Опозови брисање ове поруке +message-header-recipient-avatar = + .alt = Профилна слика корисника { $address }. message-header-customize-panel-title = Подешавања заглавља поруке message-header-customize-button-style = .value = Стил дугмета @@ -169,15 +243,37 @@ message-header-all-headers = .label = Прикажи сва заглавља .accesskey = к +message-header-dark-message-toggle = + .label = Прикажи прекидач за тамни режим поруке + .accesskey = т +toolbar-context-menu-manage-extension = + .label = Управљај проширењем + .accesskey = У toolbar-context-menu-remove-extension = .label = Уклони додатак .accesskey = д +addon-removal-title = Уклонити { $name }? addon-removal-confirmation-button = Уклони +addon-removal-confirmation-message = Желите ли да уклоните { $name }, као и његова подешавања и податке из { -brand-short-name }-а? +caret-browsing-prompt-title = Преглед курсором +caret-browsing-prompt-text = Притисак на F7 укључује или искључује преглед курсором. Ова функција поставља покретни курсор унутар садржаја, омогућавајући вам да бирате текст помоћу тастатуре. Желите ли да укључите преглед курсором? +caret-browsing-prompt-check-text = Не питај поново. repair-text-encoding-button = .label = Поправи кодирање текста .tooltiptext = Претпостави исправан кодни распоред текста на основу садржаја поруке no-reply-title = Одговор није подржан +no-reply-message = Адреса за одговор ({ $email }) изгледа да није адреса која се надгледа. Поруке послате на ову адресу вероватно нико неће прочитати. no-reply-reply-anyway-button = Ипак одговори +decrypt-and-copy-failures-multiple = + { $failures -> + [one] { $failures } од { $total } поруке није могла бити дешифрована и није умножена. + [few] { $failures } од { $total } поруке нису могле бити дешифроване и нису умножене. + *[other] { $failures } од { $total } порука није могло бити дешифровано и није умножено. + } +spaces-toolbar-element = + .toolbarname = Просторна трака + .aria-label = Просторна трака + .aria-description = Усправна трака за пребацивање између различитих простора. Користите тастере са стрелицама за кретање кроз доступну дугмад. spaces-toolbar-button-mail2 = .title = Пошта spaces-toolbar-button-address-book2 = @@ -188,6 +284,8 @@ .title = Задаци spaces-toolbar-button-chat2 = .title = Ћаскање +spaces-toolbar-button-overflow = + .title = Више простора… spaces-toolbar-button-settings2 = .title = Подешавања spaces-toolbar-button-hide = @@ -198,14 +296,37 @@ .label = Отвори у новом језичку spaces-context-new-window-item = .label = Отвара у новом прозору +spaces-context-switch-tab-item = + .label = Пребаци се на { $tabName } settings-context-open-settings-item2 = .label = Подешавања settings-context-open-account-settings-item2 = .label = Подешавања налога settings-context-open-addons-item2 = .label = Додаци и теме +spaces-toolbar-pinned-tab-button = + .tooltiptext = Мени простора +spaces-pinned-button-menuitem-mail2 = + .label = { spaces-toolbar-button-mail2.title } +spaces-pinned-button-menuitem-address-book2 = + .label = { spaces-toolbar-button-address-book2.title } +spaces-pinned-button-menuitem-calendar2 = + .label = { spaces-toolbar-button-calendar2.title } +spaces-pinned-button-menuitem-tasks2 = + .label = { spaces-toolbar-button-tasks2.title } +spaces-pinned-button-menuitem-chat2 = + .label = { spaces-toolbar-button-chat2.title } +spaces-pinned-button-menuitem-settings2 = + .label = { spaces-toolbar-button-settings2.title } spaces-pinned-button-menuitem-show = .label = { spaces-toolbar-button-show.title } +chat-button-unread-messages = { $count } + .title = + { $count -> + [one] Једна непрочитана порука + [few] { $count } непрочитане поруке + *[other] { $count } непрочитаних порука + } menuitem-customize-label = .label = Прилагоди… spaces-customize-panel-title = Подешавања просторног страничника @@ -222,3 +343,10 @@ .accesskey = б quick-filter-bar-show = .key = k +openpgp-forget = Заборави OpenPGP лозинке +quota-panel-percent-used = { $percent }% заузето + .title = IMAP квота: { $usage } заузето од укупно { $limit } +mark-as-read-action = Означи као прочитано +delete-action = Обриши +mark-as-starred-action = Означи са звездицом +mark-as-spam-action = Означи као непожељно diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messengercompose/messengercompose.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messengercompose/messengercompose.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/messengercompose/messengercompose.ftl 2026-03-24 16:59:42.674304500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/messengercompose/messengercompose.ftl 2026-04-23 05:16:31.742427600 +0000 @@ -156,6 +156,21 @@ menu-open-key-manager = .label = Управљач кључевима .accesskey = У +openpgp-key-issue-notification-from = Нисте подешени за слање шифрованих порука од краја до краја са адресе { $addr }. +openpgp-key-issue-notification-single = Шифровање од краја до краја захтева решавање проблема са кључем за адресу { $addr }. +openpgp-key-issue-notification-multi = + { $count -> + [one] Шифровање од краја до краја захтева решавање проблема са кључевима за { $count } примаоца. + [few] Шифровање од краја до краја захтева решавање проблема са кључевима за { $count } примаоца. + *[other] Шифровање од краја до краја захтева решавање проблема са кључевима за { $count } прималаца. + } +smime-cert-issue-notification-single = Шифровање од краја до краја захтева решавање проблема са сертификатом за адресу { $addr }. +smime-cert-issue-notification-multi = + { $count -> + [one] Шифровање од краја до краја захтева решавање проблема са сертификатима за { $count } примаоца. + [few] Шифровање од краја до краја захтева решавање проблема са сертификатима за { $count } примаоца. + *[other] Шифровање од краја до краја захтева решавање проблема са сертификатима за { $count } прималаца. + } key-notification-disable-encryption = .label = Немој шифровати .accesskey = Н @@ -204,20 +219,43 @@ .title = Прикажи сКоп поље ({ ctrl-cmd-shift-pretty-prefix }{ $key }) extra-address-rows-menu-button = .title = Остала поља за адресирање за приказ +public-recipients-notice-single = Ваша порука има јавног примаоца. Можете избећи откривање примаоца коришћењем „сКоп“. +public-recipients-notice-multi = + { $count -> + [one] { $count } прималац у пољима „За“ и „Копија“ ће видети адресе једни других. Можете избећи откривање прималаца коришћењем „сКоп“. + [few] { $count } примаоца у пољима „За“ и „Копија“ ће видети адресе једни других. Можете избећи откривање прималаца коришћењем „сКоп“. + *[other] { $count } прималаца у пољима „За“ и „Копија“ ће видети адресе једни других. Можете избећи откривање прималаца коришћењем „сКоп“. + } +many-public-recipients-bcc = + .label = Користи „сКоп“ + .accesskey = К many-public-recipients-ignore = .label = Нека примаоци буду јавни .accesskey = ј many-public-recipients-prompt-title = Превише јавних прималаца +many-public-recipients-prompt-msg = + { $count -> + [one] Ваша порука има { $count } јавног примаоца, који ће моћи да виде адресе једни других. Ово може бити проблем за приватност. Можете избећи откривање прималаца премештањем прималаца из поља „За/Копија“ у „сКоп“. + [few] Ваша порука има { $count } јавна примаоца, који ће моћи да виде адресе једни других. Ово може бити проблем за приватност. Можете избећи откривање прималаца премештањем прималаца из поља „За/Копија“ у „сКоп“. + *[other] Ваша порука има { $count } јавних прималаца, који ће моћи да виде адресе једни других. Ово може бити проблем за приватност. Можете избећи откривање прималаца премештањем прималаца из поља „За/Копија“ у „сКоп“. + } many-public-recipients-prompt-cancel = Откажи слање many-public-recipients-prompt-send = Ипак пошаљи compose-missing-identity-warning = Није пронађен ниједан јединствени идентитет који одговара адреси пошиљаоца. Порука ће бити послана са подешавањима поља Од и идентитета { $identity }. encrypted-bcc-warning = Слање шифроване поруке не сакрива у потпуности примаоце у сКоп. Сви примаоци могу да их идентификују. encrypted-bcc-ignore-button = Разумем +auto-disable-e2ee-warning = Шифровање од краја до краја за ову поруку је аутоматски онемогућено. compose-tool-button-remove-text-styling = .tooltiptext = Уклони форматирање текста cloud-file-unknown-account-tooltip = Отпремљено на непознати Filelink налог. cloud-file-placeholder-title = { $filename } - Filelink прилог cloud-file-placeholder-intro = Датотека { $filename } је приложена као Filelink. Може се преузети са везе испод. +cloud-file-count-header = + { $count -> + [one] Повезао сам { $count } датотеку са овом е-поштом: + [few] Повезао сам { $count } датотеке са овом е-поштом: + *[other] Повезао сам { $count } датотека са овом е-поштом: + } cloud-file-service-provider-footer-single = Сазнајте више о{ $link }-у. cloud-file-service-provider-footer-multiple = Сазнајте више о { $firstLinks }-у и { $lastLink }-у. cloud-file-tooltip-password-protected-link = Веза заштићена лозинком @@ -246,3 +284,5 @@ spell-add-dictionaries = .label = Додај речнике… .accesskey = Д +subject-encription-icon = + .title = Наслов неће бити шифрован diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/msgAuthPrompt.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/msgAuthPrompt.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/msgAuthPrompt.ftl 2026-03-24 16:59:42.674417000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/msgAuthPrompt.ftl 2026-04-23 05:16:31.742592600 +0000 @@ -0,0 +1 @@ +remember-password-checkbox-label = Користите управника лозинки да бисте запамтили ову лозинку. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/news.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/news.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/news.ftl 2026-03-24 16:59:42.674564800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/news.ftl 2026-04-23 05:16:31.742755200 +0000 @@ -0,0 +1,15 @@ +new-newsgroup-headers = + { $count -> + [one] Преузимам { $count } заглавље за { $newsgroup }… + [few] Преузимам { $count } заглавља за { $newsgroup }… + *[other] Преузимам { $count } заглавља за { $newsgroup }… + } +no-new-messages = Нема нових порука у { $newsgroup }. +downloading-articles-for-offline = + { $count -> + [one] Преузимам { $count } чланак за { $newsgroup }… + [few] Преузимам { $count } чланка за { $newsgroup }… + *[other] Преузимам { $count } чланака за { $newsgroup }… + } +no-articles-to-download = Нема чланака за преузимање за { $newsgroup }. +no-such-newsgroup = Новинска група { $newsgroup } није доступна на серверу. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/changeExpiryDlg.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/changeExpiryDlg.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/changeExpiryDlg.ftl 2026-03-24 16:59:42.674837800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/changeExpiryDlg.ftl 2026-04-23 05:16:31.742973600 +0000 @@ -0,0 +1,17 @@ +openpgp-change-expiry-title = Промена истека кључа +info-will-expire = Овај кључ је тренутно подешен да истекне { $date }. +info-already-expired = Овај кључ је већ истекао. +info-does-not-expire = Овај кључ је тренутно подешен да никада не истекне. +info-explanation-1 = Након што кључ истекне, више га није могуће користити за шифровање или дигитално потписивање. +info-explanation-1-complex = Овај OpenPGP кључ се састоји од примарног кључа и барем једног поткључа са различитим датумима истека. +select-key-prompt = Кључ за промену: +info-explanation-2 = Да бисте овај кључ користили дужи временски период, промените његов датум истека, а затим поново поделите јавни кључ са својим партнерима у разговору. +usage-label = Начин коришћења: +algorithm-label = Алгоритам: +created-label = Направљен: +expire-no-change-label = Не мењај датум истека +expire-in-time-label = Кључ ће истећи за: +expire-never-expire-label = Кључ никада неће истећи +partial-label-expired = истекао +partial-label-never-expires = никада не истиче +partial-label-expires = истиче: { $date } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/composeKeyStatus.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/composeKeyStatus.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/composeKeyStatus.ftl 2026-03-24 16:59:42.674837800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/composeKeyStatus.ftl 2026-04-23 05:16:31.743054400 +0000 @@ -0,0 +1,7 @@ +openpgp-compose-alias-status-direct = + { $count -> + [one] мапирано на кључ псеудонима + [few] мапирано на { $count } кључа псеудонима + *[other] мапирано на { $count } кључева псеудонима + } +openpgp-compose-alias-status-error = неупотребљив/недоступан кључ псеудонима diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyAssistant.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyAssistant.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyAssistant.ftl 2026-03-24 16:59:42.675062200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyAssistant.ftl 2026-04-23 05:16:31.743157400 +0000 @@ -1,3 +1,76 @@ +openpgp-key-assistant-title = ОпенПГП помоћник за кључеве +openpgp-key-assistant-rogue-warning = Избегавајте прихватање лажних кључева. Да бисте били сигурни да сте набавили прави кључ, требало би да га потврдите. Сазнајте више… +openpgp-key-assistant-recipients-issue-header = Шифровање није могуће +openpgp-key-assistant-recipients-issue-description = + { $count -> + [one] Да бисте шифровали, морате набавити и прихватити употребљив кључ за једног примаоца. Сазнајте више… + [few] Да бисте шифровали, морате набавити и прихватити употребљиве кључеве за { $count } примаоца. Сазнајте више… + *[other] Да бисте шифровали, морате набавити и прихватити употребљиве кључеве за { $count } прималаца. Сазнајте више… + } +openpgp-key-assistant-info-alias = { -brand-short-name } обично захтева да јавни кључ примаоца садржи кориснички ИД са одговарајућом адресом е-поште. Ово се може заобићи коришћењем ОпенПГП правила алијаса примаоца. Сазнајте више… +openpgp-key-assistant-recipients-description = + { $count -> + [one] Већ имате употребљив и прихваћен кључ за једног примаоца. + [few] Већ имате употребљиве и прихваћене кључеве за { $count } примаоца. + *[other] Већ имате употребљиве и прихваћене кључеве за { $count } прималаца. + } +openpgp-key-assistant-recipients-description-no-issues = Ова порука се може шифровати. Имате употребљиве и прихваћене кључеве за све примаоце. +openpgp-key-assistant-resolve-title = + { $numKeys -> + [one] { -brand-short-name } је пронашао следећи кључ за { $recipient }. + [few] { -brand-short-name } је пронашао следеће кључеве за { $recipient }. + *[other] { -brand-short-name } је пронашао следеће кључеве за { $recipient }. + } +openpgp-key-assistant-valid-description = Изаберите кључ који желите да прихватите +openpgp-key-assistant-invalid-title = + { $numKeys -> + [one] Следећи кључ се не може користити, осим ако не набавите ажурирање. + [few] Следећи кључеви се не могу користити, осим ако не набавите ажурирање. + *[other] Следећи кључеви се не могу користити, осим ако не набавите ажурирање. + } +openpgp-key-assistant-no-key-available = Нема доступног кључа. +openpgp-key-assistant-multiple-keys = Доступно је више кључева. +openpgp-key-assistant-key-unaccepted = + { $count -> + [one] Кључ је доступан, али још увек није прихваћен. + [few] Више кључева је доступно, али још увек нису прихваћени. + *[other] Више кључева је доступно, али ниједан од њих још увек није прихваћен. + } +openpgp-key-assistant-key-accepted-expired = Прихваћени кључ је истекао { $date }. +openpgp-key-assistant-keys-accepted-expired = Више прихваћених кључева је истекло. +openpgp-key-assistant-this-key-accepted-expired = Овај кључ је раније био прихваћен, али је истекао { $date }. +openpgp-key-assistant-key-unaccepted-expired-one = Кључ је истекао { $date }. +openpgp-key-assistant-key-unaccepted-expired-many = Више кључева је истекло. +openpgp-key-assistant-key-fingerprint = Отисак +openpgp-key-assistant-key-source = + { $count -> + [one] Извор + [few] Извора + *[other] Извори + } +openpgp-key-assistant-key-collected-attachment = прилог е-поште +openpgp-key-assistant-key-collected-autocrypt = Autocrypt заглавље +openpgp-key-assistant-key-collected-keyserver = сервер кључева +openpgp-key-assistant-key-collected-wkd = Web Key Directory +openpgp-key-assistant-key-collected-gnupg = GnuPG привезак кључева +openpgp-key-assistant-keys-has-collected = + { $count -> + [one] Пронађен је кључ, али ниједан још увек није прихваћен. + [few] Пронађено је више кључева, али ниједан још увек није прихваћен. + *[other] Пронађено је више кључева, али ниједан још увек није прихваћен. + } +openpgp-key-assistant-key-rejected = Овај кључ је раније одбијен. +openpgp-key-assistant-key-accepted-other = Овај кључ је раније прихваћен за другу адресу е-поште. +openpgp-key-assistant-resolve-discover-info = Пронађите додатне или ажуриране кључеве за { $recipient } на мрежи или их увезите из датотеке. +openpgp-key-assistant-discover-title = Проналажење на мрежи је у току. +openpgp-key-assistant-discover-keys = Проналажење кључева за { $recipient }… +openpgp-key-assistant-expired-key-update = + Пронађено је ажурирање за један од раније прихваћених кључева за { $recipient }. + Сада се може користити јер више није истекао. +openpgp-key-assistant-discover-online-button = Пронађи јавне кључеве на мрежи… +openpgp-key-assistant-import-keys-button = Увези јавне кључеве из датотеке… +openpgp-key-assistant-issue-resolve-button = Реши… +openpgp-key-assistant-view-key-button = Прикажи кључ… openpgp-key-assistant-recipients-show-button = Прикажи openpgp-key-assistant-recipients-hide-button = Сакриј openpgp-key-assistant-cancel-button = Откажи @@ -6,3 +79,4 @@ openpgp-key-assistant-close-button = Затвори openpgp-key-assistant-disable-button = Онемогући шифровање openpgp-key-assistant-confirm-button = Пошаљи шифровано +openpgp-key-assistant-key-created = направљен { $date } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyWizard.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyWizard.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyWizard.ftl 2026-03-24 16:59:42.675176100 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/keyWizard.ftl 2026-04-23 05:16:31.743307400 +0000 @@ -1,9 +1,63 @@ +key-wizard-dialog-window = + .title = Додавање личног OpenPGP кључа за { $identity } key-wizard-dialog = .buttonlabelaccept = Настави .buttonlabelextra1 = Иди назад +key-wizard-warning = Ако већ имате лични кључ за ову адресу е-поште, требало би да га увезете. У супротном нећете имати приступ својим архивама шифрованих порука, нити ћете моћи да читате долазне шифроване поруке од људи који и даље користе ваш постојећи кључ. key-wizard-learn-more = Сазнајте више +radio-create-key = + .label = Направи нови OpenPGP кључ + .accesskey = Н +radio-import-key = + .label = Увези постојећи OpenPGP кључ + .accesskey = У +radio-gnupg-key = + .label = Користите спољни кључ преко GnuPG-а (нпр. са паметне картице) + .accesskey = К +openpgp-generate-key-title = Генерисање OpenPGP кључа +openpgp-keygen-secret-protection = Заштита тајног кључа +radio-keygen-no-protection = + .label = Незаштићено +radio-keygen-protect-primary-pass = + .label = Заштити главном лозинком +radio-keygen-passphrase-protection = + .label = Заштити лозинком: +openpgp-passphrase-repeat = Потврдите лозинку: +openpgp-generate-key-info = Генерисање кључа може потрајати неколико минута. Немојте затварати програм док је генерисање кључа у току. Активно прегледање веба или обављање захтевних операција на диску током генерисања кључа ће допунити „базен насумичности” и убрзати процес. Бићете обавештени када се генерисање кључа заврши. +openpgp-keygen-expiry-title = Истек кључа +openpgp-keygen-expiry-description = Одредите време истека за свој новогенерисани кључ. Касније можете променити датум да бисте га продужили ако буде потребно. +radio-keygen-expiry = + .label = Кључ истиче за + .accesskey = и +radio-keygen-no-expiry = + .label = Кључ не истиче + .accesskey = б +openpgp-keygen-days-label = + .label = дана +openpgp-keygen-months-label = + .label = месеци +openpgp-keygen-years-label = + .label = година openpgp-keygen-advanced-title = Напредна подешавања +openpgp-keygen-advanced-description = Управљајте напредним подешавањима вашег OpenPGP кључа. +openpgp-keygen-keytype = + .value = Врста кључа: + .accesskey = в +openpgp-keygen-keysize = + .value = Величина кључа: + .accesskey = в +openpgp-keygen-type-rsa = + .label = RSA +openpgp-keygen-type-ecc = + .label = ECC (елиптична крива) openpgp-keygen-button = Направи кључ +openpgp-keygen-progress-title = Стварање вашег новог OpenPGP кључа… +openpgp-keygen-import-progress-title = Увоз ваших OpenPGP кључева… +openpgp-import-success = OpenPGP кључеви су успешно увезени! +openpgp-import-success-title = Довршите поступак увоза +openpgp-import-success-description = Да бисте почели да користите увезени OpenPGP кључ за шифровање е-поште, затворите овај прозор и идите у подешавања налога да бисте га изабрали. +openpgp-keygen-confirm = + .label = Потврди openpgp-keygen-dismiss = .label = Откажи openpgp-keygen-cancel = @@ -11,3 +65,51 @@ openpgp-keygen-import-complete = .label = Затвори .accesskey = З +openpgp-keygen-missing-username = Није наведено име за тренутни налог. Унесите вредност у поље „Ваше име“ у подешавањима налога. +openpgp-keygen-long-expiry = Не можете направити кључ који истиче за више од 100 година. +openpgp-keygen-short-expiry = Ваш кључ мора бити важећи барем један дан. +openpgp-keygen-ongoing = Стварање кључа је већ у току! +openpgp-keygen-error-core = Не могу да покренем OpenPGP језгрену услугу +openpgp-keygen-error-failed = Стварање OpenPGP кључа је неочекивано отказало +openpgp-keygen-error-revocation = OpenPGP кључ је успешно направљен, али није успело добијање опозива за кључ { $key } +openpgp-keygen-abort-title = Прекинути стварање кључа? +openpgp-keygen-abort = Стварање OpenPGP кључа је тренутно у току, да ли сте сигурни да желите да га откажете? +openpgp-key-confirm = Направити јавни и тајни кључ за { $identity }? +openpgp-import-key-title = Увоз постојећег личног OpenPGP кључа +openpgp-import-key-legend = Изаберите претходно резервну датотеку. +openpgp-import-key-description = Можете увести личне кључеве који су направљени помоћу другог OpenPGP софтвера. +openpgp-import-key-info = Други софтвери могу описати лични кључ користећи алтернативне изразе као што су ваш сопствени кључ, тајни кључ, приватни кључ или пар кључева. +openpgp-import-key-list-amount-2 = + { $count -> + [one] { -brand-short-name } је пронашао један кључ који се може увести. + [few] { -brand-short-name } је пронашао { $count } кључа која се могу увести. + *[other] { -brand-short-name } је пронашао { $count } кључева који се могу увести. + } +openpgp-import-key-list-description = Потврдите који кључеви се могу третирати као ваши лични кључеви. Само кључеви које сте сами направили и који показују ваш сопствени идентитет треба да се користе као лични кључеви. Ову опцију можете променити касније у прозору за својства кључа. +openpgp-import-key-list-caption = Кључеви означени да се третирају као лични кључеви биће наведени у одељку за шифровање с краја на крај. Остали ће бити доступни унутар управника кључевима. +openpgp-import-keep-passphrases = + .label = Задржи заштиту лозинком за увезене тајне кључеве +openpgp-passphrase-prompt-title = Лозинка је обавезна +openpgp-import-key-button = + .label = Изаберите датотеку за увоз… + .accesskey = И +import-key-file = Увоз датотеке OpenPGP кључа +import-key-personal-checkbox = + .label = Третирај овај кључ као лични кључ +gnupg-file = GnuPG датотеке +import-error-file-size = Грешка! Датотеке веће од 5 MB нису подржане. +import-error-failed = Грешка! Није успео увоз датотеке. { $error } +openpgp-import-keys-failed = Грешка! Није успео увоз кључева. { $error } +openpgp-import-identity-label = Идентитет +openpgp-import-fingerprint-label = Отисак прста +openpgp-import-created-label = Направљено +openpgp-import-bits-label = Битова +openpgp-import-key-props = + .label = Својства кључа + .accesskey = с +openpgp-external-key-title = Спољни GnuPG кључ +openpgp-external-key-description = Подесите спољни GnuPG кључ уношењем ИД-а кључа +openpgp-external-key-info = Поред тога, морате користити управника кључевима да бисте увезли и прихватили одговарајући јавни кључ. +openpgp-external-key-warning = Можете подесити само један спољни GnuPG кључ. Ваш претходни унос ће бити замењен. +openpgp-save-external-button = Сачувај ИД кључа +openpgp-external-key-label = ИД тајног кључа: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/msgReadStatus.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/msgReadStatus.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/msgReadStatus.ftl 2026-03-24 16:59:42.675281000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/msgReadStatus.ftl 2026-04-23 05:16:31.743418700 +0000 @@ -16,6 +16,8 @@ openpgp-uncertain-sig-with-date = Несигуран дигитални потпис - потписан { $date } openpgp-invalid-sig = Неважећи дигитални потпис openpgp-invalid-sig-with-date = Неважећи дигитални потпис - потписан { $date } +openpgp-bad-date-sig = Непоклапање датума потписа +openpgp-bad-date-sig-with-date = Непоклапање датума потписа - потписано: { $date } openpgp-good-sig = Добар дигитални потпис openpgp-good-sig-with-date = Добар дигитални потпис - потписан { $date } openpgp-sig-uncertain-no-key = Ова порука садржи дигитални потпис али није утврђено да ли је потпис исправан. Да бисте проверили потпис, морате набавити примерак јавног кључа пошиљаоца. @@ -23,6 +25,7 @@ openpgp-sig-uncertain-not-accepted = Ова порука садржи дигитални потпис али још нисте одлучили да ли вам је кључ потписника прихватљив. openpgp-sig-invalid-rejected = Ова порука садржи дигитални потпис али сте претходно одлучили да одбијете кључ потписника. openpgp-sig-invalid-technical-problem = Ова порука садржи дигитални потпис али је откривена техничка грешка. Порука је оштећена или је неко други изменио поруку. +openpgp-sig-invalid-date-mismatch = Ова порука садржи дигитални потпис, али потпис није направљен у исто време када је порука е-поште послата. Ово може бити покушај да вас преваре садржајем из погрешног контекста: нпр. садржајем написаним у другом временском контексту или намењеним некоме другом. openpgp-sig-valid-unverified = Ова порука садржи важећи дигитални потпис кључа који сте већ прихватили. Међутим, још увек нисте потврдили да ли кључ заправо припада пошиљаоцу. openpgp-sig-valid-verified = Ова порука садржи важећи дигитални потпис потврђеног кључа. openpgp-sig-valid-own-key = Ова порука садржи важећи дигитални потпис вашег приватног кључа. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp-frontend.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp-frontend.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp-frontend.ftl 2026-03-24 16:59:42.675537800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp-frontend.ftl 2026-04-23 05:16:31.743614200 +0000 @@ -1,10 +1,20 @@ openpgp-manage-keys-openpgp-cmd = .label = OpenPGP управник кључева .accesskey = O +openpgp-ctx-decrypt-open = + .label = Дешифруј и отвори + .accesskey = Д +openpgp-ctx-decrypt-save = + .label = Дешифруј и сачувај као… + .accesskey = С openpgp-ctx-import-key = .label = Увези OpenPGP кључ .accesskey = к +openpgp-ctx-verify-att = + .label = Провери потпис + .accesskey = в openpgp-has-sender-key = Ова порука тврди да садржи OpenPGP јавни кључ пошиљаоца +openpgp-be-careful-new-key = Упозорење: нови јавни OpenPGP кључ у овој поруци се разликује од јавних кључева које сте претходно прихватили за { $email }. openpgp-import-sender-key = .label = Увези… openpgp-search-keys-openpgp = @@ -12,5 +22,28 @@ openpgp-missing-signature-key = Ова порука је потписана кључем чију копију за сада немате. openpgp-search-signature-key = .label = Потражи… +openpgp-broken-exchange-opened = Ово је OpenPGP порука коју је очигледно оштетио MS-Exchange и не може се поправити јер је отворена из локалне датотеке. Умножите поруку у фасциклу поште да бисте покушали аутоматску поправку. +openpgp-broken-exchange-info = Ово је OpenPGP порука коју је очигледно оштетио MS-Exchange. Ако садржај поруке није приказан као што је очекивано, можете покушати аутоматску поправку. +openpgp-broken-exchange-repair = + .label = Поправи поруку +openpgp-broken-exchange-wait = Сачекајте… +openpgp-has-nested-encrypted-parts = Ова порука садржи додатне шифроване делове. +openpgp-show-encrypted-parts = Дешифруј и прикажи +openpgp-has-nested-signed-parts = Неки делови ове поруке су можда дигитално потписани. +openpgp-show-signed-parts = Отвори и прикажи +openpgp-cannot-decrypt-because-mdc = + Ово је шифрована порука која користи стари и рањиви механизам. + Могла је бити измењена током преноса, са намером да се украде њен садржај. + Да би се спречио овај ризик, садржај није приказан. +openpgp-cannot-decrypt-because-missing-key = Тајни кључ који је потребан за дешифровање ове поруке није доступан. +openpgp-partially-signed = + Само је подскуп ове поруке дигитално потписан користећи OpenPGP. + Ако кликнете на дугме за проверу, незаштићени делови ће бити скривени, а статус дигиталног потписа ће бити приказан. +openpgp-partially-encrypted = + Само је подскуп ове поруке шифрован користећи OpenPGP. + Читљиви делови поруке који су већ приказани нису били шифровани. + Ако кликнете на дугме за дешифровање, садржај шифрованих делова ће бити приказан. +openpgp-reminder-partial-display = Подсетник: порука приказана испод је само подскуп оригиналне поруке. openpgp-partial-verify-button = Потврди openpgp-partial-decrypt-button = Дешифруј +openpgp-unexpected-key-for-you = Упозорење: ова порука садржи непознат OpenPGP кључ који се односи на једну од ваших адреса е-поште. Ако ово није један од ваших кључева, то би могао бити покушај обмане других дописника. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp.ftl 2026-03-24 16:59:42.675644000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/openpgp/openpgp.ftl 2026-04-23 05:16:31.743850000 +0000 @@ -1,5 +1,19 @@ e2e-intro-description = Да бисте слали шифроване или дигитално потписане поруке, потребно је да подесите технологију за шифровање као што је OpenPGP или S/MIME. e2e-intro-description-more = Изаберите ваш лични кључ за омогућавање коришћењеа OpenPGP-а или ваш лични сертификат да бисте омогућили S/MIME. За лични кључ или сертификат, ви сте власник пратећег приватног кључа. +e2e-csr-intro = Да бисте добили нови лични S/MIME сертификат, направите захтев за потписивање сертификата (CSR) и поднесите га издавачу уверења (CA). +e2e-csr-intro-info = Изаберите локални директоријум и назив датотеке за вашу CSR датотеку и одговорите на следећа питања за постављање алгоритма и јачине. +e2e-csr-title = Направи CSR +e2e-csr-continue = Настави +e2e-csr-back = Назад +e2e-csr-button = + .label = Направи и сачувај CSR датотеку као… +e2e-csr-select-title = CSR алгоритам +e2e-csr-select-alg = Изаберите између RSA (препоручено) или ECC као вашег криптографског алгоритма за нови S/MIME сертификат. +e2e-csr-select-strength = Изаберите жељену криптографску јачину (брже са мањим бројевима или боља безбедност са већим бројевима) за нови S/MIME сертификат, или задржите подразумевано подешавање. +e2e-csr-summary = Нови { $type } { $strength } тајни кључ ће бити направљен у подешавањима { -brand-short-name }-а. Овај процес може потрајати и изазвати привремену нереактивност; молимо будите стрпљиви током овог корака. Датотека захтева за потписивање сертификата (CSR), сачувана као { $file }, биће направљена у међувремену. +e2e-csr-include-email = Укључи адресу е-поште ({ $email }) у CSR (препоручено) +e2e-csr-success = CSR је успешно сачуван у { $file } +e2e-csr-failure = Није могуће сачувати CSR у датотеку { $file } e2e-signing-description = Дигитални потпис омогућава примаоцима да потврде да сте ви послали поруку и да садржај није промењен. Шифроване поруке се подразумевано увек потписују. e2e-sign-message = .label = Потпиши нешифроване поруке @@ -24,40 +38,537 @@ e2e-autocrypt-headers = .label = Шаљи OpenPGP јавне кључве у заглављу е-поруке зарад боље усклађености са Autocrypt-ом .accesskey = т +openpgp-key-created-label = + .label = Направљено +openpgp-key-expiry-label = + .label = Истек +openpgp-key-id-label = + .label = ИД кључа openpgp-key-man-dialog-title = OpenPGP управник кључева +openpgp-key-man-generate = + .label = Нови пар кључева + .accesskey = к +openpgp-key-man-gen-revoke = + .label = Сертификат опозива + .accesskey = р +openpgp-key-man-gen-revocation = + .label = Сачувај сертификат о опозиву у датотеку + .accesskey = С +openpgp-key-man-file-menu = + .label = Датотека + .accesskey = Д openpgp-key-man-edit-menu = .label = Уреди .accesskey = е +openpgp-key-man-view-menu = + .label = Приказ + .accesskey = П +openpgp-key-man-generate-menu = + .label = Генерисање + .accesskey = Г +openpgp-key-man-keyserver-menu = + .label = Сервер кључева + .accesskey = С +openpgp-key-man-import-public-from-file = + .label = Увези јавне кључеве из датотеке + .accesskey = У +openpgp-key-man-import-secret-from-file = + .label = Увези тајне кључеве из датотеке +openpgp-key-man-import-sig-from-file = + .label = Увези опозиве из датотеке +openpgp-key-man-import-from-clipbrd = + .label = Увези кључеве из оставе + .accesskey = о +openpgp-key-man-import-from-url = + .label = Увези кључеве са URL-а + .accesskey = U +openpgp-key-man-export-to-file = + .label = Извези јавне кључеве у датотеку + .accesskey = И +openpgp-key-man-send-keys = + .label = Пошаљи јавне кључеве путем е-поште + .accesskey = П +openpgp-key-man-backup-secret-keys = + .label = Направи резервну копију тајних кључева у датотеку + .accesskey = р +openpgp-key-man-discover-cmd = + .label = Пронађи кључеве на мрежи + .accesskey = П +openpgp-key-man-publish-cmd = + .label = Објави + .accesskey = О +openpgp-key-publish = Објави +openpgp-key-man-discover-prompt = Да бисте пронашли OpenPGP кључеве на мрежи, на серверима кључева или користећи WKD протокол, унесите или адресу е-поште или ИД кључа. openpgp-key-man-discover-progress = Тражим… +openpgp-key-publish-ok = Јавни кључ је послат на „{ $keyserver }“. +openpgp-key-publish-fail = Слање вашег јавног кључа на „{ $keyserver }“ није успело. +openpgp-key-copy-key = + .label = Копирај јавни кључ + .accesskey = К +openpgp-key-export-key = + .label = Извези јавни кључ у датотеку + .accesskey = И +openpgp-key-backup-key = + .label = Направи резервну копију тајног кључа у датотеку + .accesskey = р +openpgp-key-send-key = + .label = Пошаљи јавни кључ путем е-поште + .accesskey = П +openpgp-key-man-copy-key-ids = + .label = + { $count -> + [one] Копирај ИД кључа у оставу + [few] Копирај ИД-ове кључева у оставу + *[other] Копирај ИД-ове кључева у оставу + } + .accesskey = К +openpgp-key-man-copy-fprs = + .label = + { $count -> + [one] Копирај отисак у оставу + [few] Копирај отиске у оставу + *[other] Копирај отиске у оставу + } + .accesskey = о +openpgp-key-man-copy-to-clipboard = + .label = + { $count -> + [one] Копирај јавни кључ у оставу + [few] Копирај јавне кључеве у оставу + *[other] Копирај јавне кључеве у оставу + } + .accesskey = К openpgp-key-man-ctx-copy = .label = Копирај .accesskey = и +openpgp-key-man-ctx-copy-fprs = + .label = + { $count -> + [one] Отисак + [few] Отисци + *[other] Отисци + } + .accesskey = О +openpgp-key-man-ctx-copy-key-ids = + .label = + { $count -> + [one] ИД кључа + [few] ИД-ови кључева + *[other] ИД-ови кључева + } + .accesskey = Д +openpgp-key-man-ctx-copy-public-keys = + .label = + { $count -> + [one] Јавни кључ + [few] Јавни кључеви + *[other] Јавни кључеви + } + .accesskey = Ј openpgp-key-man-close = .label = Затвори +openpgp-key-man-reload = + .label = Поново учитај оставу кључева + .accesskey = П +openpgp-key-man-change-expiry = + .label = Измени датум истека + .accesskey = е +openpgp-key-man-refresh-online = + .label = Освежи на мрежи + .accesskey = О openpgp-key-man-ignored-ids = .label = Адресе е-поште +openpgp-key-man-del-key = + .label = Обриши кључеве + .accesskey = О +openpgp-delete-key = + .label = Обриши кључ + .accesskey = О +openpgp-key-man-revoke-key = + .label = Опозови кључ + .accesskey = О +openpgp-key-man-key-props = + .label = Својства кључа + .accesskey = С +openpgp-key-man-key-more = + .label = Још + .accesskey = Ј +openpgp-key-man-view-photo = + .label = Фотографија + .accesskey = Ф +openpgp-key-man-ctx-view-photo-label = + .label = Прикажи фотографију +openpgp-key-man-show-invalid-keys = + .label = Прикажи неисправне кључеве + .accesskey = н +openpgp-key-man-show-others-keys = + .label = Прикажи кључеве других људи + .accesskey = г +openpgp-key-man-user-id-label = + .label = Име +openpgp-key-man-fingerprint-label = + .label = Отисак прста +openpgp-key-man-select-all = + .label = Изабери све кључеве + .accesskey = с +openpgp-key-man-empty-tree-tooltip = + .label = Унесите појмове за претрагу у поље изнад +openpgp-key-man-nothing-found-tooltip = + .label = Ниједан кључ се не поклапа са вашим појмовима за претрагу +openpgp-key-man-please-wait-tooltip = + .label = Сачекајте док се кључеви учитавају… +openpgp-key-man-filter-label = + .placeholder = Претражи кључеве +openpgp-key-man-select-all-key = + .key = A +openpgp-key-man-key-details-key = + .key = I +openpgp-ign-addr-intro = Прихватате коришћење овог кључа за следеће изабране адресе е-поште: +openpgp-key-details-doc-title = Својства кључа +openpgp-key-details-signatures-tab = + .label = Сертификације +openpgp-key-details-structure-tab = + .label = Структура +openpgp-key-details-uid-certified-col = + .label = Кориснички ИД / Сертификовао +openpgp-key-details-key-id-label = ИД кључа +openpgp-key-details-user-id3-label = Наводни власник кључа +openpgp-key-details-id-label = + .label = ИД +openpgp-key-details-key-type-label = Врста +openpgp-key-details-key-part-label = + .label = Део кључа +openpgp-key-details-attr-ignored = Упозорење: овај кључ можда неће радити како је очекивано, јер су нека од његових својстава небезбедна и могу бити занемарена. +openpgp-key-details-attr-upgrade-sec = Требало би да надоградите небезбедна својства. +openpgp-key-details-attr-upgrade-pub = Требало би да замолите власника овог кључа да надогради небезбедна својства. +openpgp-key-details-upgrade-unsafe = + .label = Надогради небезбедна својства + .accesskey = Н +openpgp-key-details-upgrade-ok = Кључ је успешно надограђен. Требало би да поделите надограђени јавни кључ са својим дописницима. +openpgp-key-details-algorithm-label = + .label = Алгоритам +openpgp-key-details-size-label = + .label = Величина +openpgp-key-details-created-label = + .label = Направљено +openpgp-key-details-created-header = Направљено +openpgp-key-details-expiry-label = + .label = Истек +openpgp-key-details-expiry-header = Истек +openpgp-key-details-usage-label = + .label = Употреба +openpgp-key-details-fingerprint-label = Отисак кључа +openpgp-key-details-legend-secret-missing = За кључеве означене са (!) тајни кључ није доступан. +openpgp-key-details-sel-action = + .label = Изаберите радњу… + .accesskey = И openpgp-card-details-close-window-label = .buttonlabelaccept = Затвори +openpgp-acceptance-label = + .label = Ваше прихватање +openpgp-acceptance-rejected-label = + .label = Не, одбаци овај кључ. +openpgp-acceptance-undecided-label = + .label = Не још, можда касније. +openpgp-acceptance-unverified-label = + .label = Да, али нисам потврдио да је то исправан кључ. +openpgp-acceptance-verified-label = + .label = Да, лично сам потврдио да овај кључ има исправан отисак. +key-accept-personal = + За овај кључ имате и јавни и тајни део. Можете га користити као лични кључ. + Ако вам је овај кључ дао неко други, немојте га користити као лични кључ. +openpgp-personal-no-label = + .label = Не, немој га користити као мој лични кључ. +openpgp-personal-yes-label = + .label = Да, третирај овај кључ као лични кључ. +openpgp-passphrase-protection = + .label = Заштита лозинком +openpgp-passphrase-status-unprotected = Незаштићено +openpgp-passphrase-status-primary-password = Заштићено главном лозинком { -brand-short-name }-а +openpgp-passphrase-status-user-passphrase = Заштићено лозинком +openpgp-passphrase-instruction-unprotected = Поставите лозинку да заштитите овај кључ +openpgp-passphrase-instruction-primary-password = Алтернативно заштитите овај кључ посебном лозинком +openpgp-passphrase-instruction-user-passphrase = Откључајте овај кључ да бисте променили његову заштиту. +openpgp-passphrase-unlock = Откључај +openpgp-passphrase-unlocked = Кључ је успешно откључан. +openpgp-remove-protection = Уклони заштиту лозинком +openpgp-use-primary-password = Уклони лозинку и заштити главном лозинком +openpgp-passphrase-new = Нова лозинка +openpgp-passphrase-new-repeat = Потврдите нову лозинку +openpgp-passphrase-set = Постави лозинку +openpgp-passphrase-change = Промени фразу openpgp-copy-cmd-label = .label = Копирај openpgp-description-no-key = { -brand-short-name } нема лични OpenPGP лични кључ за { $identity } +openpgp-description-has-keys = + { $count -> + [one] { -brand-short-name } је пронашао { $count } лични OpenPGP кључ повезан са { $identity } + [few] { -brand-short-name } је пронашао { $count } лична OpenPGP кључа повезана са { $identity } + *[other] { -brand-short-name } је пронашао { $count } личних OpenPGP кључева повезаних са { $identity } + } +openpgp-selection-status-have-key = Ваша тренутна конфигурација користи ИД кључа { $key } +openpgp-selection-status-error = Ваша тренутна конфигурација користи кључ { $key }, који је истекао. openpgp-add-key-button = .label = Додај кључ… .accesskey = а e2e-learn-more = Сазнајте више +openpgp-keygen-success = OpenPGP кључ је успешно направљен! +openpgp-keygen-import-success = OpenPGP кључеви су успешно увезени! +openpgp-keygen-external-success = ИД спољног GnuPG кључа је сачуван! openpgp-radio-none = .label = Ништа +openpgp-radio-none-desc = Немој користити OpenPGP за овај идентитет. +openpgp-radio-key-not-usable = Овај кључ није употребљив као лични кључ, јер недостаје тајни кључ! +openpgp-radio-key-not-accepted = Да бисте користили овај кључ, морате га одобрити као лични кључ! +openpgp-radio-key-not-found = Овај кључ није пронађен! Ако желите да га користите, морате га увести у { -brand-short-name }. +openpgp-radio-key-expires = Истиче: { $date } +openpgp-radio-key-expired = Истекао: { $date } +openpgp-key-expires-within-6-months-icon = + .title = Кључ истиче за мање од 6 месеци +openpgp-key-has-expired-icon = + .title = Кључ је истекао +openpgp-suggest-publishing-key = Објављивање јавног кључа на серверу кључева омогућава другима да га пронађу. +openpgp-key-expand-section = + .tooltiptext = Више информација +openpgp-key-revoke-title = Опозови кључ +openpgp-key-edit-title = Измени OpenPGP кључ +openpgp-key-edit-date-title = Продужи датум истека openpgp-manager-description = Користите OpenPGP управника кључева за прегледање и управљање јавних кључева ваших саговорника и свих осталих кључева који нису наведени изнад. openpgp-manager-button = .label = OpenPGP управник кључева .accesskey = O +openpgp-key-remove-external = + .label = Уклони спољни ИД кључа + .accesskey = У +key-external-label = Спољни GnuPG кључ +key-type-public = јавни кључ +key-type-primary = примарни кључ +key-type-subkey = поткључ +key-type-pair = пар кључева (тајни и јавни кључ) +key-expiry-never = никада key-usage-encrypt = Шифруј +key-usage-sign = Потписивање +key-usage-certify = Сертификовање +key-usage-authentication = Потврда идентитета +key-does-not-expire = Кључ не истиче +key-expired-date = Кључ је истекао { $keyExpiry } +key-expired-simple = Кључ је истекао +key-revoked-simple = Кључ је опозван +key-do-you-accept = Да ли прихватате овај кључ за проверу дигиталних потписа и за шифровање порука? +key-verification = Проверите отисак кључа користећи безбедан канал комуникације који није е-пошта како бисте се уверили да је то заиста кључ корисника { $addr }. +cannot-use-own-key-because = Слање поруке није успело јер постоји проблем са вашим личним кључем. { $problem } +keyserver-error-aborted = Поништен +keyserver-error-unknown = Дошло је до непознате грешке +keyserver-error-server-error = Сервер кључева је пријавио грешку. +keyserver-error-import-error = Увоз преузетог кључа није успео. +keyserver-error-unavailable = Сервер кључева није доступан. +keyserver-error-security-error = Сервер кључева не подржава шифровани приступ. +keyserver-error-certificate-error = Уверење сервера кључева није важеће. +keyserver-error-unsupported = Сервер кључева није подржан. +wkd-message-body-req = + Ваш добављач е-поште је обрадио ваш захтев за отпремање вашег јавног кључа у OpenPGP веб директоријум кључева (WKD). + Потврдите да бисте довршили објављивање вашег јавног кључа. +wkd-message-body-process = + Ово је порука е-поште везана за аутоматску обраду отпремања вашег јавног кључа у OpenPGP веб директоријум кључева (WKD). + У овом тренутку не морате предузимати никакве ручне радње. +converter-decrypt-body-failed = + Дешифровање поруке са насловом + { $subject } није успело. + Желите ли да покушате поново са другом лозинком или желите да прескочите поруку? +filter-folder-required = Морате изабрати одредишну фасциклу. +filter-term-pgpencrypted-label = OpenPGP шифровано +filter-key-required = Морате изабрати кључ примаоца. +filter-key-not-found = Није могуће пронаћи кључ за шифровање за „{ $desc }“. +filter-warn-key-not-secret = + Упозорење — радња филтера „Шифруј кључем“ замењује примаоце. + Ако немате тајни кључ за „{ $desc }“, више нећете моћи да читате поруке е-поште. +filter-decrypt-move-label = Дешифруј трајно (OpenPGP) +filter-decrypt-copy-label = Направи дешифровани примерак (OpenPGP) +filter-encrypt-label = Шифруј кључем (OpenPGP) +import-info-dialog-title = Успех! Кључеви су увезени +import-info-bits = Битова +import-info-created = Направљено +import-info-fpr = Отисак прста +import-info-details = Прикажи детаље и управљај прихватањем кључа import-info-no-keys = Ниједан кључ није увезен. +import-from-clip = Желите ли да увезете неке кључеве из оставе? +import-from-url = Преузми јавни кључ са ове адресе: +copy-to-clipbrd-failed = Није могуће умножити изабране кључеве у оставу. +copy-to-clipbrd-ok = Кључеви су умножени у оставу +delete-secret-key = + УПОЗОРЕЊЕ: Намеравате да обришете тајни кључ! + + Ако обришете свој тајни кључ, више нећете моћи да дешифрујете поруке шифроване тим кључем, нити ћете моћи да га опозовете. + + Да ли заиста желите да обришете И тајни И јавни кључ + „{ $userId }“? +delete-mix = + УПОЗОРЕЊЕ: Намеравате да обришете тајне кључеве! + Ако обришете свој тајни кључ, више нећете моћи да дешифрујете поруке шифроване тим кључем. + Да ли заиста желите да обришете И изабране тајне И јавне кључеве? +delete-pub-key = + Желите ли да обришете јавни кључ + „{ $userId }“? +delete-selected-pub-key = Желите ли да обришете јавне кључеве? +refresh-all-question = Нисте изабрали ниједан кључ. Желите ли да освежите СВЕ кључеве? +key-man-button-export-sec-key = Извези &тајне кључеве +key-man-button-export-pub-key = Извези само &јавне кључеве +key-man-button-refresh-all = &Освежи све кључеве +key-man-loading-keys = Учитавам кључеве, сачекајте… +ascii-armor-file = ASCII оклопљене датотеке (*.asc) +text-file = Текстуалне датотеке (*.txt) +no-key-selected = Треба да изаберете барем један кључ да бисте извршили изабрану радњу +export-to-file = Извези јавни кључ у датотеку +export-keypair-to-file = Извези тајни и јавни кључ у датотеку +export-secret-key = Желите ли да укључите тајни кључ у сачувану датотеку OpenPGP кључа? +save-keys-ok = Кључеви су успешно сачувани +save-keys-failed = Чување кључева није успело +default-pub-key-filename = Извезени-јавни-кључеви +default-pub-sec-key-filename = Резерва-тајних-кључева +refresh-key-warn = Упозорење: у зависности од броја кључева и брзине везе, освежавање свих кључева може бити прилично дуг процес! +preview-failed = Не могу да прочитам датотеку јавног кључа. +general-error = Грешка: { $reason } dlg-button-delete = &Обриши +openpgp-export-public-success = Јавни кључ је успешно извезен! +openpgp-export-public-fail = Не могу да извезем изабрани јавни кључ! +openpgp-export-secret-success = Тајни кључ је успешно извезен! +openpgp-export-secret-fail = Не могу да извезем изабрани тајни кључ! +key-ring-pub-key-revoked = Кључ { $userId } (ИД кључа { $keyId }) је опозван. +key-ring-pub-key-expired = Кључ { $userId } (ИД кључа { $keyId }) је истекао. +key-ring-no-secret-key = Изгледа да немате тајни кључ за { $userId } (ИД кључа { $keyId }) на вашем привеску; не можете користити кључ за потписивање. +key-ring-pub-key-not-for-signing = Кључ { $userId } (ИД кључа { $keyId }) се не може користити за потписивање. +key-ring-pub-key-not-for-encryption = Кључ { $userId } (ИД кључа { $keyId }) се не може користити за шифровање. +key-ring-sign-sub-keys-revoked = Сви поткључеви за потписивање кључа { $userId } (ИД кључа { $keyId }) су опозвани. +key-ring-sign-sub-keys-expired = Сви поткључеви за потписивање кључа { $userId } (ИД кључа { $keyId }) су истекли. +key-ring-enc-sub-keys-revoked = Сви поткључеви за шифровање кључа { $userId } (ИД кључа { $keyId }) су опозвани. +key-ring-enc-sub-keys-expired = Сви поткључеви за шифровање кључа { $userId } (ИД кључа { $keyId }) су истекли. keyring-photo = Слика +user-att-photo = Кориснички атрибут (JPEG слика) +already-revoked = Овај кључ је већ опозван. +revoke-key-question = + Намеравате да опозовете кључ „{ $identity }“. + Више нећете моћи да потписујете овим кључем, а када се једном дистрибуира, ни други више неће моћи да шифрују тим кључем. И даље можете користити кључ за дешифровање старих порука. + Желите ли да наставите? +revoke-key-not-present = + Немате кључ (0x{ $keyId }) који одговара овом сертификату о опозиву! + Ако сте изгубили свој кључ, морате га увести (нпр. са сервера кључева) пре увоза сертификата о опозиву! +revoke-key-already-revoked = Кључ 0x{ $keyId } је већ опозван. +key-man-button-revoke-key = &Опозови кључ +openpgp-key-revoke-success = Кључ је успешно опозван. +after-revoke-info = + Кључ је опозван. + Поново поделите овај јавни кључ, слањем путем е-поште или отпремањем на сервере кључева, како бисте обавестили друге да сте опозвали свој кључ. + Чим софтвер који користе други људи сазна за опозив, престаће да користи ваш стари кључ. + Ако користите нови кључ за исту адресу е-поште и приложите нови јавни кључ уз поруке које шаљете, информације о вашем опозваном старом кључу ће бити аутоматски укључене. +key-man-button-import = &Увези +delete-key-title = Брисање OpenPGP кључа +delete-external-key-title = Уклони спољни GnuPG кључ +delete-external-key-description = Желите ли да уклоните овај ИД спољног GnuPG кључа? +key-in-use-title = OpenPGP кључ је тренутно у употреби +delete-key-in-use-description = Није могуће наставити! Кључ који сте изабрали за брисање тренутно користи овај идентитет. Изаберите други кључ, или немојте изабрати ниједан, па покушајте поново. +revoke-key-in-use-description = Није могуће наставити! Кључ који сте изабрали за опозив тренутно користи овај идентитет. Изаберите други кључ, или немојте изабрати ниједан, па покушајте поново. +key-error-key-spec-not-found = Адреса е-поште „{ $keySpec }“ се не може упарити са кључем у вашем привеску. +key-error-key-id-not-found = Подешени ИД кључа „{ $keySpec }“ се не може пронаћи у вашем привеску. +key-error-not-accepted-as-personal = Нисте потврдили да је кључ са ИД-ом „{ $keySpec }“ ваш лични кључ. +need-online = Функција коју сте изабрали није доступна у режиму ван мреже. Повежите се на мрежу и покушајте поново. +no-key-found2 = Нисмо успели да пронађемо ниједан употребљив кључ који одговара наведеним критеријумима претраге. +no-update-found = Већ имате кључеве који су откривени на мрежи. +fail-key-extract = Грешка — наредба за извлачење кључа није успела +fail-cancel = Грешка — корисник је отказао пријем кључа +not-first-block = Грешка — први OpenPGP блок није блок јавног кључа +import-key-confirm = Желите ли да увезете јавне кључеве уграђене у поруку? +fail-key-import = Грешка — увоз кључа није успео file-write-failed = Неуспех при упису у датотеку { $output } +no-pgp-block = Грешка — није пронађен важећи оклопљени OpenPGP блок података +imported-secret-with-unsupported-features = Неки од увезених тајних кључева оглашавају неподржану функцију. Ако користите такав кључ као свој лични кључ, дописници вам могу слати е-поруке или јавне кључеве у некомпатибилном формату. Ово утиче на увезене тајне кључеве са следећим отисцима: { $fingerprints }. +help-button = Помоћ +key-valid-unknown = непознато +key-valid-invalid = неисправан +key-valid-disabled = онемогућен +key-valid-revoked = опозван +key-valid-expired = истекао +key-trust-untrusted = неповерљив +key-trust-marginal = делимично +key-trust-full = потпуно +key-trust-ultimate = безусловно +key-trust-group = (група) +import-key-file = Увези датотеку OpenPGP кључа +import-rev-file = Увези датотеку OpenPGP опозива +gnupg-file = GnuPG датотеке +import-keys-failed = Увоз кључева није успео +passphrase-prompt2 = Унесите лозинку за откључавање тајног кључа са ИД-ом { $key }, направљеног { $date }, { $username_and_email } +passphrase-prompt2-sub = Унесите лозинку за откључавање тајног кључа са ИД-ом { $subkey }, који је поткључ кључа са ИД-ом { $key }, направљеног { $date }, { $username_and_email } +file-to-big-to-import = Ова датотека је превелика. Немојте увозити велики скуп кључева одједмном. +save-revoke-cert-as = Направи и сачувај сертификат о опозиву +revoke-cert-ok = Сертификат о опозиву је успешно направљен. Можете га користити да поништите свој јавни кључ, нпр. у случају да изгубите свој тајни кључ. +revoke-cert-failed = Сертификат о опозиву није могао бити направљен. +gen-going = Генерисање кључа је већ у току! +keygen-missing-user-name = Није наведено име за изабрани налог/идентитет. Унесите вредност у поље „Ваше име“ у подешавањима налога. +expiry-too-short = Ваш кључ мора бити важећи бар један дан. +expiry-too-long = Не можете направити кључ који истиче за више од 100 година. +key-confirm = Желите ли да генеришете јавни и тајни кључ за „{ $id }“? +key-man-button-generate-key = &Генериши кључ +key-abort = Желите ли да прекинете генерисање кључа? +key-man-button-generate-key-abort = &Прекини генерисање кључа +key-man-button-generate-key-continue = &Настави генерисање кључа +failed-decrypt = Грешка — дешифровање није успело +fix-broken-exchange-msg-failed = Није могуће поправити ову поруку. +attachment-no-match-to-signature = Није могуће упарити прилог „{ $attachment }“ са датотеком потписа +signature-verified-ok = Потпис за прилог { $attachment } је успешно потврђен +signature-verify-failed = Потпис за прилог { $attachment } није могао бити потврђен +decrypt-ok-no-sig = + Упозорење + Дешифровање је успело, али потпис није могао бити исправно потврђен +msg-ovl-button-cont-anyway = &Ипак настави +enig-content-note = *Прилози уз ову поруку нису ни потписани ни шифровани* +msg-compose-button-send = &Пошаљи поруку +msg-compose-details-button-label = Детаљи… +msg-compose-details-button-access-key = Д +send-aborted = Радња слања је прекинута. +key-not-trusted = Нема довољно поверења за кључ „{ $key }“ +key-not-found = Кључ „{ $key }“ није пронађен +key-revoked = Кључ „{ $key }“ је опозван +key-expired = Кључ „{ $key }“ је истекао +msg-compose-internal-error = Дошло је до унутрашње грешке. +keys-to-export = Изаберите OpenPGP кључеве за уметање +msg-compose-partially-encrypted-inlinePGP = + Порука на коју одговарате садржи и нешифроване и шифроване делове. Ако пошиљалац првобитно није могао да дешифрује неке делове поруке, можда ћете открити поверљиве информације које сам пошиљалац првобитно није могао да дешифрује. + Размислите о уклањању свог цитираног текста из вашег одговора овом пошиљаоцу. +msg-compose-cannot-save-draft = Грешка приликом чувања нацрта +msg-compose-partially-encrypted-short = Чувајте се цурења осетљивих информација — делимично шифрована е-пошта. +quoted-printable-warn = + Омогућили сте кодирање „quoted-printable“ за слање порука. Ово може довести до неисправног дешифровања и/или провере ваше поруке. + Желите ли сада да искључите слање „quoted-printable“ порука? +minimal-line-wrapping = + Поставили сте прелом реда на { $width } знакова. За исправно шифровање и/или потписивање, ова вредност мора бити најмање 68. + Желите ли сада да промените прелом реда на 68 знакова? +save-attachment-header = Сачувај дешифровани прилог +cannot-send-sig-because-no-own-key = Не могу дигитално потписати ову поруку јер још нисте подесили шифровање с краја на крај за <{ $key }> +cannot-send-enc-because-no-own-key = Не могу послати ову поруку шифровану јер још нисте подесили шифровање с краја на крај за <{ $key }> do-import-multiple = Извршити увоз следећих кључева? { $key } +do-import-one = Увести { $name } ({ $id })? +cant-import = Грешка при увозу јавног кључа +unverified-reply = Увучени део поруке (одговор) је вероватно измењен +key-in-message-body = Кључ је пронађен у телу поруке. Кликните на „Увези кључ“ да бисте увезли кључ +sig-mismatch = Грешка — неслагање потписа +invalid-email = Грешка — неисправна(е) адреса(е) е-поште +attachment-pgp-key = + Прилог „{ $name }“ који отварате изгледа да је датотека OpenPGP кључа. + Кликните на „Увези“ да бисте увели садржане кључеве или на „Прегледај“ да бисте прегледали садржај датотеке у прозору прегледника +dlg-button-view = &Прегледај +not-required = Грешка — шифровање није потребно +no-photo-available = Фотографија није доступна +error-photo-path-not-readable = Путања фотографије „{ $photo }“ није читљива +debug-log-title = Дневник OpenPGP отклањања грешака +dlg-button-ok = &У реду dlg-button-close = &Затвори dlg-button-cancel = &Откажи +dlg-no-prompt = Не приказуј ми више овај дијалог +enig-prompt = OpenPGP упит +enig-confirm = OpenPGP потврда +dlg-button-retry = &Покушај поново +dlg-button-skip = &Прескочи +enig-alert-title = + .title = OpenPGP упозорење diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/auth.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/auth.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/auth.ftl 2026-03-24 16:59:42.676075700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/auth.ftl 2026-04-23 05:16:31.744195500 +0000 @@ -19,7 +19,10 @@ .label = { auth-question-and-answer } auth-shared-secret-label = .label = { auth-shared-secret } +auth-manual-instruction = Контактирајте жељеног саговорника путем неког другог аутентификованог канала, као што је е-пошта потписана OpenPGP-ом или телефоном. Требало би да кажете једно другом своје отиске кључа. (Отисак кључа је контролни збир који идентификује кључ за шифровање). Ако се отисци поклапају, требало би да назначите у дијалогу испод да сте потврдили отисак. auth-how = На који начин желите потврдити идентитет контакта? +auth-qa-instruction = Смислите питање на које је одговор познат само вама и вашем контакту. Унесите питање и одговор, а затим сачекајте да ваш контакт унесе одговор. Ако се одговори не поклапају, комуникациони канал који користите је можда под надзором. +auth-secret-instruction = Смислите тајну познату само вама и вашем контакту. Немојте користити исту интернет везу за размену тајне. Унесите тајну, а затим сачекајте да је ваш контакт унесе. Ако се тајне не поклапају, комуникациони канал који користите је можда под надзором. auth-question = Унесите питање: auth-answer = Унесите одговор (прави разлику између великих и малих слова): auth-secret = Унесите тајну: diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otr.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otr.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otr.ftl 2026-03-24 16:59:42.676591400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otr.ftl 2026-04-23 05:16:31.744550200 +0000 @@ -1,2 +1,26 @@ msgevent-encryption-required-part1 = Покушали сте да пошаљете нешифровану поруку према { $name }. Према смерницама, нешифроване поруке нису дозвољене. +msgevent-encryption-required-part2 = Покушавам да започнем приватан разговор. Ваша порука ће бити поново послата када приватан разговор почне. +msgevent-encryption-error = Дошло је до грешке приликом шифровања ваше поруке. Порука није послата. +msgevent-connection-ended = { $name } је већ затворио своју шифровану везу са вама. Да бисте избегли случајно слање поруке без шифровања, ваша порука није послата. Завршите ваш шифровани разговор или га поново покрените. +msgevent-setup-error = Дошло је до грешке приликом подешавања приватног разговора са корисником { $name }. +msgevent-msg-reflected = Примате сопствене OTR поруке. Или покушавате да разговарате са собом, или неко одбија ваше поруке назад вама. +msgevent-msg-resent = Последња порука за { $name } је поново послата. +msgevent-rcvdmsg-not-private = Шифрована порука примљена од { $name } је нечитљива, јер тренутно не комуницирате приватно. +msgevent-rcvdmsg-unreadable = Примили сте нечитљиву шифровану поруку од { $name }. +msgevent-rcvdmsg-malformed = Примили сте неисправну поруку са подацима од { $name }. +msgevent-log-heartbeat-rcvd = Примљен је откуцај срца од { $name }. +msgevent-log-heartbeat-sent = Послат је откуцај срца за { $name }. +msgevent-rcvdmsg-general-err = Дошло је до неочекиване грешке приликом покушаја заштите вашег разговора коришћењем OTR-а. +msgevent-rcvdmsg-unencrypted = Следећа порука примљена од { $name } није била шифрована: { $msg } +msgevent-rcvdmsg-unrecognized = Примили сте непрепознату OTR поруку од { $name }. +msgevent-rcvdmsg-for-other-instance = { $name } је послао поруку намењену за другу сесију. Ако сте пријављени више пута, друга сесија је можда примила поруку. +context-gone-secure-private = Приватан разговор са { $name } је започет. +context-gone-secure-unverified = Шифрован, али непотврђен разговор са { $name } је започет. +context-still-secure = Шифровани разговор са { $name } је успешно освежен. +error-enc = Дошло је до грешке приликом шифровања поруке. +error-not-priv = Послали сте шифроване податке за { $name }, који их није очекивао. +error-unreadable = Пренели сте нечитљиву шифровану поруку. +error-malformed = Пренели сте неисправну поруку са подацима. resent = [поново послато] +tlv-disconnected = { $name } је завршио свој шифровани разговор са вама; требало би да урадите исто. +query-msg = { $name } је затражио Off-the-Record (OTR) шифровани разговор. Међутим, немате прикључак који то подржава. Погледајте https://en.wikipedia.org/wiki/Off-the-Record_Messaging за више информација. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otrUI.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otrUI.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otrUI.ftl 2026-03-24 16:59:42.676754000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/otr/otrUI.ftl 2026-04-23 05:16:31.744649200 +0000 @@ -6,9 +6,31 @@ auth-cancel-access-key = к auth-error = Догодила се грешка приликом потврђивања идентитета контакта. auth-success = Потврђивање идентитета контакта је успешно завршено. +auth-success-them = Ваш контакт је успешно потврдио ваш идентитет. Можда ћете желети да и ви потврдите његов идентитет постављањем сопственог питања. +auth-fail = Није успела потврда идентитета вашег контакта. +auth-waiting = Чека се да контакт доврши потврду… finger-verify = Потврди +finger-verify-access-key = П +finger-ignore = Занемари +finger-ignore-access-key = З buddycontextmenu-label = Додај OTR отисак +alert-start = Покушавам да започнем шифровани разговор са { $name }. +alert-refresh = Покушавам да освежим шифровани разговор са { $name }. +alert-gone-insecure = Шифровани разговор са { $name } је завршен. +finger-unseen = Идентитет { $name } још увек није потврђен. Обично прислушкивање није могуће, али уз мало труда неко би могао да слуша. Спречите надзор потврђивањем идентитета овог контакта. +finger-seen = { $name } вас контактира са непрепознатог рачунара. Обично прислушкивање није могуће, али уз мало труда неко би могао да слуша. Спречите надзор потврђивањем идентитета овог контакта. +state-not-private = Тренутни разговор није приватан. +state-generic-not-private = Тренутни разговор није приватан. +state-unverified = Тренутни разговор је шифрован али није приватан, пошто идентитет { $name } још увек није потврђен. +state-generic-unverified = Тренутни разговор је шифрован али није приватан, пошто неки идентитети још увек нису потврђени. +state-private = Идентитет { $name } је потврђен. Тренутни разговор је шифрован и приватан. +state-generic-private = Тренутни разговор је шифрован и приватан. +state-finished = { $name } је завршио свој шифровани разговор са вама; требало би да и ви урадите исто. +state-not-private-label = Небезбедно state-unverified-label = Непотврђено state-private-label = Приватно state-finished-label = Довршено verify-request = Контакт { $name } је затражио потврђивање вашег идентитета. +afterauth-private = Потврдили сте идентитет { $name }. +afterauth-unverified = Идентитет { $name } није потврђен. +otr-genkey-failed = Стварање OTR приватног кључа није успело: { $error } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/policies/policies-descriptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/policies/policies-descriptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/policies/policies-descriptions.ftl 2026-03-24 16:59:42.677518600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/policies/policies-descriptions.ftl 2026-04-23 05:16:31.744889300 +0000 @@ -38,6 +38,7 @@ policy-ExtensionUpdate = Омогућите или онемогућите аутоматско ажурирање проширења. policy-Handlers = Подесите подразумеване менаџере апликација. policy-HardwareAcceleration = Ако је вредност лажна, искључи хардверско убрзање. +policy-InAppNotification = Омогућите или онемогућите врсте обавештења. policy-InstallAddonsPermission = Дозволите одређеним страницама да инсталирају додатке. policy-LegacyProfiles = Онемогућите функцију намећући посебан налог за сваку инсталацију policy-LegacySameSiteCookieBehaviorEnabled = Омогућите подразумевано наслеђено подешавање понашања SameSite колачића. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/am-archiveoptions.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/am-archiveoptions.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/am-archiveoptions.ftl 2026-03-24 16:59:42.678027400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/am-archiveoptions.ftl 2026-04-23 05:16:31.745039500 +0000 @@ -12,8 +12,15 @@ keep-folder-structure = .label = Задржи постојећу структуру фасцикли архивираних порука .accesskey = З +recreate-inbox = + .label = Поново направи фасциклу за долазну пошту + .accesskey = П archive-example-label = Пример archive-folder-name = .label = Архиве inbox-folder-name = .label = Долазно +child-folder-name = + .label = Подфасцикла долазне поште +sibling-folder-name = + .label = На истом нивоу као долазна пошта diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/cookies.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/cookies.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/cookies.ftl 2026-03-24 16:59:42.678793400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/cookies.ftl 2026-04-23 05:16:31.745548700 +0000 @@ -1,3 +1,4 @@ +cookies-dialog-title = Колачићи window-focus-search-key = .key = f window-focus-search-alt-key = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/notifications.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/notifications.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/notifications.ftl 2026-03-24 16:59:42.679324000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/notifications.ftl 2026-04-23 05:16:31.745992200 +0000 @@ -9,6 +9,7 @@ sender-checkbox = .label = Пошиљалац .accesskey = ц +enabled-actions-description = Радње над порукама: open-time-label-before = .value = Прикажи нову узбуну за пошту у трајању од .accesskey = у diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/passwordManager.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/passwordManager.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/passwordManager.ftl 2026-03-24 16:59:42.679533500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/passwordManager.ftl 2026-04-23 05:16:31.746173400 +0000 @@ -64,3 +64,8 @@ password-os-auth-dialog-message = Потврдите свој идентитет да бисте открили сачуване лозинке. password-os-auth-dialog-message-macosx = откриј сачуване лозинке password-os-auth-dialog-caption = { -brand-full-name } +password-os-auth-change-dialog-message = + { PLATFORM() -> + [macos] промените подешавања за лозинке + *[other] { -brand-short-name } покушава да промени подешавања за лозинке. Користите пријаву на свој уређај да бисте ово дозволили. + } diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/preferences.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/preferences.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/preferences.ftl 2026-03-24 16:59:42.679861300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/preferences/preferences.ftl 2026-04-23 05:16:31.746509600 +0000 @@ -6,6 +6,9 @@ pane-general-title = Опште category-general = .tooltiptext = { pane-general-title } +pane-appearance-title = Изглед +category-appearance = + .tooltiptext = { pane-appearance-title } pane-compose-title = Састављање category-compose = .tooltiptext = Састављање @@ -21,6 +24,10 @@ pane-sync-title = Sync category-sync = .tooltiptext = Sync +pane-qr-export-title = Извоз за мобилне уређаје +category-qr-export = + .tooltiptext = Извоз за мобилне уређаје +general-language-and-fonts-header = Језик и фонтови general-incoming-mail-header = Долазна пошта general-files-and-attachment-header = Датотеке и прилози general-tags-header = Ознаке @@ -133,6 +140,10 @@ .accesskey = д biff-use-system-alert = .label = Користи системско обавештење +tray-icon-unread-label = + .label = Прикажи иконицу у системској касети за непрочитане поруке + .accesskey = и +tray-icon-unread-description = Препоручено када се користе мала дугмад на траци задатака mail-system-sound-label = .label = Подразумевани системски звук за нову поруку .accesskey = д @@ -207,6 +218,9 @@ check-updates-label = .label = Провери да ли има ажурирања али мени допусти да изаберем када да се инсталирају .accesskey = П +update-application-background-enabled = + .label = Када { -brand-short-name } није покренут + .accesskey = К update-history-button = .label = Прикажи историју ажурирања .accesskey = П @@ -246,6 +260,10 @@ clear-cache-shutdown-label = .label = Очисти кеш при гашењу програма .accesskey = г +always-underline-links = + .label = Увек подвуци везе + .accesskey = в +font-legend = Фонтови default-font-label = .value = Подразумевани фонт: .accesskey = д @@ -341,9 +359,48 @@ close-move-delete = .label = Затвори прозор/језичак поруке при померању или брисању .accesskey = З +address-display-legend = Листа порука +address-display-description = Жељени формат приказа адресе: +address-display-full = + .label = Пуно име и адреса е-поште + .accesskey = П +address-display-email = + .label = Само е-пошта + .accesskey = Е +address-display-name = + .label = Само име + .accesskey = и condensed-addresses-label = .label = Прикажи само име за приказ за људе у мом именику .accesskey = П +table-layout-legend = Приказ табеле +table-layout-horizontal-scroll-label = + .label = Дозволи водоравно клизање + .accesskey = в +conversation-view-legend = Приказ преписке +conversation-view-checkbox-label = + .label = Омогући приказ преписке + .accesskey = п +conversation-view-checkbox-description = Експериментална функција заснована на Глоди, користите је на сопствени ризик +label-experiment = Експериментално +dark-message-mode-legend = Стил читача порука +dark-message-mode-checkbox-label = + .label = Омогући тамни режим порука + .accesskey = т +dark-message-mode-description = Приморај тело поруке да прати тамне теме +dark-message-mode-toggle-label = + .label = Прикажи прекидач за тамни режим порука + .accesskey = п +dark-message-mode-toggle-description = Прикажи прекидач у заглављу поруке за брзо онемогућавање тамног режима поруке +account-hub-legend = Чвориште налога +account-hub-checkbox-label = + .label = Направи налоге у новом чворишту налога + .accesskey = н +account-hub-checkbox-description = Експериментални нови ток прављења налога е-поште +account-hub-ab-checkbox-label = + .label = Направи именике у новом чворишту налога + .accesskey = н +account-hub-ab-checkbox-description = Експериментални нови ток прављења именика forward-label = .value = Прослеђивање порука: .accesskey = л @@ -476,6 +533,11 @@ cookies-button = .label = Прикажи колачиће… .accesskey = р +global-privacy-control-search = Општа контрола приватности (GPC) +global-privacy-control-description = + .label = Реци веб-сајтовима да не продају или деле моје податке + .accesskey = н +do-not-track-removal = Више не подржавамо сигнал „Do Not Track“ passwords-description = { -brand-short-name } може памтити лозинке за све ваше налоге. passwords-button = .label = Сачуване лозинке… @@ -484,11 +546,17 @@ primary-password-label = .label = Користи главну лозинку .accesskey = т +forms-os-reauth = + .label = Захтевај пријаву на уређај за попуњавање и управљање лозинкама primary-password-button = .label = Промени главну лозинку .accesskey = з +forms-primary-pw-fips-title = Тренутно сте у FIPS режиму. FIPS захтева непразну главну лозинку. forms-master-pw-fips-desc = Промена лозинке није успела junk-description = Поставите ваша подразумевана подешавања непожељне поште. Специфична подешавања за сваки налог понаособ можете поставити у подешавањима тог налога. +junk-marked-label = + .label = Када су поруке означене као безначајне: + .accesskey = К junk-move-label = .label = Помери их у фасциклу "Непожељно" тог налога .accesskey = о @@ -496,6 +564,12 @@ .label = Обриши их .accesskey = б junk-read-description = Означи поруке као прочитане +junk-read-manual-label = + .label = Када су ручно означене као безначајне + .accesskey = Р +junk-read-auto-label = + .label = Када { -brand-short-name } утврди да су безначајне + .accesskey = Т junk-log-label = .label = Омогући записивање адаптивног филтрирања непожељног .accesskey = г @@ -659,3 +733,140 @@ synced-acount-item-keys = OpenPGP - S/MIME sync-disconnected-text = Синхронизујте налоге е-поште, именике, календаре и идентитете на свим вашим уређајима. sync-disconnected-turn-on-sync = Укључи синхронизацију… +qr-export-pane-header = Извези налоге на { -brand-product-name } мобилни +qr-export-description = Брзо пренесите подешавања вашег налога са рачунара на мобилни генерисањем КР кода. Изаберите налоге које желите да укључите, одлучите да ли желите да пренесете лозинку и скенирајте код својим мобилним уређајем. Брзо, безбедно и једноставно. +qr-export-get-app = Још увек немате { -brand-product-name } на мобилном? Преузмите га на Google Play продавници +qr-export-create = Направите КР код за извоз својих налога +qr-export-select-accounts = Изаберите налоге за извоз: +qr-export-no-accounts = Не видите све своје налоге? Неки налози могу бити онемогућени јер их { -brand-product-name } за Android не подржава. Подршка +qr-export-accounts-legend = Налози е-поште +qr-export-select-all-accounts = Изабери све +qr-export-security-legend = Безбедност +qr-export-include-passwords = Укључи лозинке свих налога +qr-export-oauth-warning = Неки од ваших налога користе метод потврде идентитета који може захтевати поновну потврду идентитета на мобилном уређају. Можда ћете морати поново да унесете своје лозинке током овог процеса. +qr-export-security-hint = Скенирањем следећих КР кодова, подешавања вашег налога — укључујући вашу е-пошту и лозинку — биће безбедно пренета. Ми не прикупљамо, не складиштимо и не делимо било који од ових података током процеса. Пренос се одвија директно између ваших уређаја. +qr-export-security-warning = Ради ваше безбедности, уверите се да сте у приватном окружењу и скенирајте само КР кодове из поузданих извора. +qr-export-start-export = Извези +qr-export-scan-progress = + { $count -> + [one] { $step } од { $count } КР кода + [few] { $step } од { $count } КР кода + *[other] { $step } од { $count } КР кодова + } +qr-export-scan-description = + { $count -> + [one] Скенирајте КР код помоћу апликације { -brand-product-name } на свом мобилном уређају + [few] Скенирајте КР кода помоћу апликације { -brand-product-name } на свом мобилном уређају + *[other] Скенирајте КР кодове помоћу апликације { -brand-product-name } на свом мобилном уређају + } +qr-export-scan-step1 = Отворите { -brand-product-name } на свом мобилном уређају +qr-export-scan-step2 = Идите у подешавања +qr-export-scan-step3 = Изаберите Увоз подешавања +qr-export-scan-step4-revision = Додирните Скенирај КР код и држите телефон преко овог кода +qr-export-back = Назад +qr-export-next = Следеће +qr-export-done = Готово +qr-export-summary-description = Налози су извезени. Наставите на свом мобилном уређају. +qr-export-summary-title = Сажетак извоза: +qr-export-summary-qr-count = + { $count -> + [one] { $count } КР код је створен + [few] { $count } КР кода су створена + *[other] { $count } КР кодова је створено + } +qr-export-summary-accounts = + { $count -> + [one] { $count } налог је извезен: + [few] { $count } налога су извезена: + *[other] { $count } налога је извезено: + } +qr-export-summary-passwords-included = Лозинке су укључене +qr-export-summary-passwords-excluded = Лозинке су искључене +qr-export-more-accounts = Извези још налога +appearance-category-header = Изглед +default-message-list-legend = Списак порука +appearance-view-style = + .value = Стил приказа: +appearance-radio-table = + .label = Приказ табеле +appearance-radio-cards = + .label = Приказ картица +cards-view-legend = Опције приказа картица +table-view-legend = Опције приказа табеле +appearance-card-rows = + .value = Број редова: +appearance-card-style-3 = + .label = 3 реда +appearance-card-style-2 = + .label = 2 реда +default-message-list-sorting-legend = Ређање и темачење +default-message-list-description = Дефинишите подразумевано ређање и опције темачења за новоотворене фасцикле. +default-flag-label = + .value = Подразумевано темачење: +default-flag-unthreaded = + .label = Без нити +default-flag-threaded = + .label = По нитима +default-flag-grouped = + .label = Груписано по ређању +default-sort-label = Подразумевано ређање према: +default-sort-date = + .label = Датум +default-sort-subject = + .label = Наслов +default-sort-from = + .label = Шаље +default-sort-id = + .label = ИБ +default-sort-thread = + .label = Нит +default-sort-priority = + .label = Приоритет +default-sort-status = + .label = Стање +default-sort-size = + .label = Величина +default-sort-star = + .label = Звезда +default-sort-unread = + .label = Прочитано +default-sort-recipient = + .label = Прималац +default-sort-location = + .label = Место +default-sort-tags = + .label = Ознаке +default-sort-spam = + .label = Стање непожељног +default-sort-attachments = + .label = Прилози +default-sort-account = + .label = Налог +default-sort-received = + .label = Редослед пријема +default-sort-correspondents = + .label = Дописници +default-order-label = Подразумевани редослед ређања: +default-sort-ascending = + .label = Узлазно +default-sort-ascending-description = Нове поруке на дну +default-sort-descending = + .label = Силазно +default-sort-descending-description = Нове поруке на врху +apply-thread-sort-label = Прошири подешавања темачења и ређања на: +apply-sort-to-all-button = + .label = Све постојеће фасцикле + .accesskey = А +choose-apply-sort-button = + .label = Изабери… + .accesskey = И +apply-current-view-to-folder = + .label = Фасцикла… +apply-current-view-to-folder-children = + .label = Фасцикла и њене подфасцикле… +apply-changes-prompt-title = Применити измене? +apply-changes-prompt-message = Применити тренутне поставке темачења и ређања на све фасцикле? +apply-changes-prompt-folder-message = Применити тренутне поставке темачења и ређања на „{ $name }“? +apply-changes-prompt-folder-children-message = Применити тренутна подешавања темачења и ређања на „{ $name }“ и њене садржаоце? +apply-current-view-error = Не могу да применим тренутна подешавања прегледа +apply-current-view-success = Тренутна подешавања прегледа су успешно примењена diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/searchbar.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/searchbar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/searchbar.ftl 2026-03-24 16:59:42.680196000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/searchbar.ftl 2026-04-23 05:16:31.746883900 +0000 @@ -0,0 +1,6 @@ +search-bar-clear-button = + .alt = Очисти + .title = Очисти текстуално поље +search-bar-search-button = + .alt = Претражи + .title = Претражи diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/syncAccounts.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/syncAccounts.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/syncAccounts.ftl 2026-03-24 16:59:42.680445200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/syncAccounts.ftl 2026-04-23 05:16:31.747057200 +0000 @@ -2,6 +2,7 @@ sync-verification-sent-body = Веза за потврду је послана на { $userEmail }. sync-verification-not-sent-title = Не могу да пошаљем потврду sync-verification-not-sent-body = Не можемо да пошаљемо е-пошту за потврду, покушајте касније. +sync-signout-dialog-title = Одјава са налога? sync-signout-dialog-body = Синхронизовани подаци ће остати на вашем налогу. sync-signout-dialog-button = Одјави се sync-disconnect-dialog-title = Прекинути везу? diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/treeView.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/treeView.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/treeView.ftl 2026-03-24 16:59:42.680539600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/treeView.ftl 2026-04-23 05:16:31.747146600 +0000 @@ -1,8 +1,46 @@ +tree-list-view-row-select = + .alt = Поље за избор за пребацивање избора тренутног реда + .title = Изабери тренутни ред +tree-list-view-row-deselect = + .alt = Поље за избор за пребацивање избора тренутног реда + .title = Поништи избор тренутног реда +tree-list-view-row-delete = + .title = Обриши тренутни ред +tree-list-view-row-restore = + .title = Поврати тренутни ред tree-list-view-column-picker = .title = Изаберите које колоне треба приказати +tree-list-view-column-picker-restore-default-columns = + .label = Поврати подразумеване колоне +tree-list-view-row-thread-button = + .title = Ово је порука у нити +tree-list-view-row-ignored-thread = Нит је занемарена +tree-list-view-row-ignored-thread-button = + .title = Ова порука у нити је занемарена +tree-list-view-row-ignored-subthread = Поднит је занемарена +tree-list-view-row-ignored-subthread-button = + .title = Ова поднит је занемарена +tree-list-view-row-watched-thread = Нит се надгледа +tree-list-view-row-watched-thread-button = + .title = Ова порука у нити се надгледа tree-list-view-row-flagged = .alt = Показивач порука са звездицом .title = Порука има звездицу tree-list-view-row-flag = .alt = Показивач порука са звездицом .title = Порука нема звездицу +tree-list-view-row-attach = + .alt = Показатељ прилога + .title = Порука садржи прилоге +tree-list-view-row-spam = + .alt = Показатељ стања непожељности + .title = Порука је означена као непожељна +tree-list-view-row-not-spam = + .alt = Показатељ стања непожељности + .title = Порука није означена као непожељна +tree-list-view-row-read = + .alt = Показатељ стања прочитаности + .title = Стање прочитаности поруке +tree-list-view-row-not-read = + .alt = Показатељ стања непрочитаности + .title = Стање непрочитаности поруке diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbar.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbar.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbar.ftl 2026-03-24 16:59:42.680760900 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbar.ftl 2026-04-23 05:16:31.747335200 +0000 @@ -1,5 +1,7 @@ search-bar-button = .alt = Претрага +search-bar-item2 = + .label = Претрага search-bar-placeholder = Претрага… search-bar-placeholder-with-key2 = { PLATFORM() -> @@ -34,6 +36,9 @@ customize-cancel = Откажи customize-save = Сачувај customize-unsaved-changes = Несачуване промене у другим просторима +customize-search-bar2 = + .label = Претражи дугмад траке алата + .placeholder = Претражи дугмад траке алата… customize-spaces-tabs = .aria-label = Простори customize-main-toolbar-target = diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbarItems.ftl thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbarItems.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbarItems.ftl 2026-03-24 16:59:42.680917300 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/localization/sr/messenger/unifiedToolbarItems.ftl 2026-04-23 05:16:31.747440800 +0000 @@ -135,3 +135,21 @@ toolbar-throbber-label = Показивач активности toolbar-throbber = .title = Показивач активности +toolbar-create-contact-label = Нови контакт +toolbar-create-contact = + .title = Направи нови контакт +toolbar-create-address-book-label = Нови именик +toolbar-create-address-book = + .title = Направи нови именик +toolbar-create-list-label = Нови списак +toolbar-create-list = + .title = Направи нови дописни списак +toolbar-import-contacts-label = Увези +toolbar-import-contacts = + .title = Увези контакте из датотеке +toolbar-new-address-book-popup-add-js-address-book = + .label = Додај локални именик +toolbar-new-address-book-popup-add-carddav-address-book = + .label = Додај CardDAV именик +toolbar-new-address-book-popup-add-ldap-address-book = + .label = Додај LDAP именик diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sr/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/sr/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/sr/manifest.json 2026-03-24 16:59:42.694527600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sr/manifest.json 2026-04-23 05:16:31.756486200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Српски (Serbian)", "description": "Thunderbird Language Pack for Српски (sr) – Serbian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "sr": { - "version": "20260320084513", + "version": "20260417023124", "chrome_resources": { "alerts": "chrome/sr/locale/sr/alerts/", "autoconfig": "chrome/sr/locale/sr/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar-invitations-dialog.dtd thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar-invitations-dialog.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar-invitations-dialog.dtd 2026-03-24 16:59:42.699933500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar-invitations-dialog.dtd 2026-04-23 05:16:31.759349600 +0000 @@ -2,4 +2,4 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar.dtd thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar.dtd --- thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar.dtd 2026-03-24 16:59:42.700145500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/calendar/calendar.dtd 2026-04-23 05:16:31.759557700 +0000 @@ -87,7 +87,7 @@ - + @@ -101,7 +101,7 @@ - + diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/preferences/new-tag.ftl thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/preferences/new-tag.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/preferences/new-tag.ftl 2026-03-24 16:59:42.755972600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/preferences/new-tag.ftl 2026-04-23 05:16:31.799683800 +0000 @@ -1,4 +1,4 @@ -tag-dialog-title = Ny tagg +tag-dialog-title = Ny etikett tag-name-label = .value = Etikettnamn: .accesskey = E diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/sv-SE/manifest.json 2026-03-24 16:59:42.769698400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/sv-SE/manifest.json 2026-04-23 05:16:31.810442400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Svenska (Swedish)", "description": "Thunderbird Language Pack for Svenska (sv-SE) – Swedish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "sv-SE": { - "version": "20260320084725", + "version": "20260417023330", "chrome_resources": { "alerts": "chrome/sv-SE/locale/sv-SE/alerts/", "autoconfig": "chrome/sv-SE/locale/sv-SE/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/th/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/th/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/th/manifest.json 2026-03-24 16:59:42.839235800 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/th/manifest.json 2026-04-23 05:16:31.864904400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: ไทย (Thai)", "description": "Thunderbird Language Pack for ไทย (th) – Thai", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "th": { - "version": "20260320084935", + "version": "20260417023524", "chrome_resources": { "alerts": "chrome/th/locale/th/alerts/", "autoconfig": "chrome/th/locale/th/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/tr/localization/tr/messenger/openpgp/msgReadStatus.ftl thunderbird-140.10.0esr/thunderbird-l10n/tr/localization/tr/messenger/openpgp/msgReadStatus.ftl --- thunderbird-140.9.0esr/thunderbird-l10n/tr/localization/tr/messenger/openpgp/msgReadStatus.ftl 2026-03-24 16:59:42.885729000 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/tr/localization/tr/messenger/openpgp/msgReadStatus.ftl 2026-04-23 05:16:31.905637700 +0000 @@ -25,6 +25,7 @@ openpgp-sig-uncertain-not-accepted = Bu ileti dijital bir imza içeriyor ama imzalayanın anahtarını kabul edip etmeyeceğinize henüz karar vermediniz. openpgp-sig-invalid-rejected = Bu ileti bir dijital imza içeriyor ama imzalayan anahtarı daha önce reddettiniz. openpgp-sig-invalid-technical-problem = Bu ileti bir dijital imza içeriyor ama teknik bir hata tespit edildi. İleti bozuk veya başka birisi tarafından değiştirilmiş. +openpgp-sig-invalid-date-mismatch = Bu ileti bir sayısal imza içeriyor ama bu imza e-posta iletisi gönderildiği anda oluşturulmamış. Bu durum, yanlış bağlamdan gelen içerikle sizi kandırma girişimi olabilir. (Örn. başka bir zamanda yazılmış veya başka birisine yazılmış içerik) openpgp-sig-valid-unverified = Bu ileti, daha önce kabul ettiğiniz bir anahtara ait geçerli bir dijital imza içeriyor. Ancak anahtarın gerçekten göndericiye ait olup olmadığını henüz doğrulamadınız. openpgp-sig-valid-verified = Bu ileti, doğrulanmış bir anahtara ait geçerli bir dijital imza içeriyor. openpgp-sig-valid-own-key = Bu ileti, kişisel anahtarınıza ait geçerli bir dijital imza içeriyor. diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/tr/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/tr/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/tr/manifest.json 2026-03-24 16:59:42.900524400 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/tr/manifest.json 2026-04-23 05:16:31.918808200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Türkçe (Turkish)", "description": "Thunderbird Language Pack for Türkçe (tr) – Turkish", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "tr": { - "version": "20260320085144", + "version": "20260417023719", "chrome_resources": { "alerts": "chrome/tr/locale/tr/alerts/", "autoconfig": "chrome/tr/locale/tr/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/uk/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/uk/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/uk/manifest.json 2026-03-24 16:59:42.960984700 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/uk/manifest.json 2026-04-23 05:16:31.973449000 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Українська (Ukrainian)", "description": "Thunderbird Language Pack for Українська (uk) – Ukrainian", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "uk": { - "version": "20260320084308", + "version": "20260417023018", "chrome_resources": { "alerts": "chrome/uk/locale/uk/alerts/", "autoconfig": "chrome/uk/locale/uk/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/uz/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/uz/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/uz/manifest.json 2026-03-24 16:59:43.012908500 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/uz/manifest.json 2026-04-23 05:16:32.021766400 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: O‘zbek (Uzbek)", "description": "Thunderbird Language Pack for O‘zbek (uz) – Uzbek", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "uz": { - "version": "20260320084525", + "version": "20260417023237", "chrome_resources": { "alerts": "chrome/uz/locale/uz/alerts/", "autoconfig": "chrome/uz/locale/uz/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/vi/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/vi/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/vi/manifest.json 2026-03-24 16:59:43.071391600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/vi/manifest.json 2026-04-23 05:16:32.075175500 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: Tiếng Việt (Vietnamese)", "description": "Thunderbird Language Pack for Tiếng Việt (vi) – Vietnamese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "vi": { - "version": "20260320084729", + "version": "20260417023443", "chrome_resources": { "alerts": "chrome/vi/locale/vi/alerts/", "autoconfig": "chrome/vi/locale/vi/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/zh-CN/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/zh-CN/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/zh-CN/manifest.json 2026-03-24 16:59:43.127595200 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/zh-CN/manifest.json 2026-04-23 05:16:32.127357200 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: 简体中文 (Simplified Chinese)", "description": "Thunderbird Language Pack for 简体中文 (zh-CN) – Simplified Chinese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "zh-CN": { - "version": "20260320084933", + "version": "20260417023646", "chrome_resources": { "alerts": "chrome/zh-CN/locale/zh-CN/alerts/", "autoconfig": "chrome/zh-CN/locale/zh-CN/autoconfig/", diff -Nru thunderbird-140.9.0esr/thunderbird-l10n/zh-TW/manifest.json thunderbird-140.10.0esr/thunderbird-l10n/zh-TW/manifest.json --- thunderbird-140.9.0esr/thunderbird-l10n/zh-TW/manifest.json 2026-03-24 16:59:43.182182600 +0000 +++ thunderbird-140.10.0esr/thunderbird-l10n/zh-TW/manifest.json 2026-04-23 05:16:32.203581300 +0000 @@ -10,10 +10,10 @@ }, "name": "Language: 正體中文 (Traditional Chinese)", "description": "Thunderbird Language Pack for 正體中文 (zh-TW) – Traditional Chinese", - "version": "140.9.20260320.73352", + "version": "140.10.20260417.12335", "languages": { "zh-TW": { - "version": "20260320085137", + "version": "20260417023848", "chrome_resources": { "alerts": "chrome/zh-TW/locale/zh-TW/alerts/", "autoconfig": "chrome/zh-TW/locale/zh-TW/autoconfig/", diff -Nru thunderbird-140.9.0esr/toolkit/actors/FindBarParent.sys.mjs thunderbird-140.10.0esr/toolkit/actors/FindBarParent.sys.mjs --- thunderbird-140.9.0esr/toolkit/actors/FindBarParent.sys.mjs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/actors/FindBarParent.sys.mjs 2026-04-21 14:53:08.000000000 +0000 @@ -28,9 +28,21 @@ } switch (message.name) { - case "Findbar:Keypress": - findBar._onBrowserKeypress(message.data); + case "Findbar:Keypress": { + let d = message.data || {}; + findBar._onBrowserKeypress({ + type: "keypress", + bubbles: false, + cancelable: !!d.cancelable, + ctrlKey: !!d.ctrlKey, + altKey: !!d.altKey, + shiftKey: !!d.shiftKey, + metaKey: !!d.metaKey, + keyCode: (d.keyCode | 0) & 0xffff, + charCode: (d.charCode | 0) & 0xffff, + }); break; + } case "Findbar:Mouseup": findBar.onMouseUp(); break; diff -Nru thunderbird-140.9.0esr/toolkit/actors/PictureInPictureChild.sys.mjs thunderbird-140.10.0esr/toolkit/actors/PictureInPictureChild.sys.mjs --- thunderbird-140.9.0esr/toolkit/actors/PictureInPictureChild.sys.mjs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/actors/PictureInPictureChild.sys.mjs 2026-04-21 14:53:09.000000000 +0000 @@ -1969,6 +1969,8 @@ this.closePictureInPicture({ reason: "Fullscreen" }); break; } + case "playing": + // Intentional fall-through case "play": { this.sendAsyncMessage("PictureInPicture:Playing"); break; @@ -2300,6 +2302,7 @@ if (originatingWindow) { originatingWindow.addEventListener("pagehide", this); originatingVideo.addEventListener("play", this); + originatingVideo.addEventListener("playing", this); originatingVideo.addEventListener("pause", this); originatingVideo.addEventListener("volumechange", this); originatingVideo.addEventListener("resize", this); @@ -2352,6 +2355,7 @@ if (originatingWindow) { originatingWindow.removeEventListener("pagehide", this); originatingVideo.removeEventListener("play", this); + originatingVideo.removeEventListener("playing", this); originatingVideo.removeEventListener("pause", this); originatingVideo.removeEventListener("volumechange", this); originatingVideo.removeEventListener("resize", this); diff -Nru thunderbird-140.9.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp thunderbird-140.10.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp --- thunderbird-140.9.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/antitracking/StorageAccessAPIHelper.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -524,22 +524,27 @@ __func__); } + RefPtr parentBC = aParentContext; auto storePermission = - [aParentContext, aTopLevelWindowId, trackingOrigin, trackingPrincipal, + [parentBC, aTopLevelWindowId, trackingOrigin, trackingPrincipal, aCookieBehavior, aReason](int aAllowMode) -> RefPtr { + if (parentBC->IsDiscarded()) { + return StorageAccessPermissionGrantPromise::CreateAndReject(false, + __func__); + } // We don't have the window, send an IPC to the content process that // owns the parent window. But there is a special case, for window.open, // we'll return to the content process we need to inform when this // function is done. So we don't need to create an extra IPC for the case. if (aReason != ContentBlockingNotifier::eOpener) { - dom::ContentParent* cp = aParentContext->Canonical()->GetContentParent(); + dom::ContentParent* cp = parentBC->Canonical()->GetContentParent(); if (!cp) { return StorageAccessPermissionGrantPromise::CreateAndReject(false, __func__); } - Unused << cp->SendOnAllowAccessFor(aParentContext, trackingOrigin, + Unused << cp->SendOnAllowAccessFor(parentBC, trackingOrigin, aCookieBehavior, aReason); } @@ -547,7 +552,7 @@ reportReason; // We can directly report here if we can know the origin of the top. ContentBlockingNotifier::ReportUnblockingToConsole( - aParentContext, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); + parentBC, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); // Set the report reason to nothing if we've already reported. reportReason = Nothing(); @@ -555,9 +560,9 @@ bool frameOnly = StaticPrefs::dom_storage_access_frame_only() && aReason == ContentBlockingNotifier::eStorageAccessAPI; - uint64_t innerWindowId = aParentContext->GetCurrentInnerWindowId(); + uint64_t innerWindowId = parentBC->GetCurrentInnerWindowId(); - return SaveAccessForOriginOnParentProcess(aTopLevelWindowId, aParentContext, + return SaveAccessForOriginOnParentProcess(aTopLevelWindowId, parentBC, trackingPrincipal, aAllowMode, frameOnly) ->Then(GetCurrentSerialEventTarget(), __func__, @@ -746,21 +751,26 @@ __func__); } + RefPtr parentBC = aParentContext; auto storePermission = - [aParentContext, aTopLevelWindowId, trackingOrigin, trackingPrincipal, + [parentBC, aTopLevelWindowId, trackingOrigin, trackingPrincipal, aCookieBehavior, aReason](int aAllowMode) -> RefPtr { + if (parentBC->IsDiscarded()) { + return StorageAccessPermissionGrantPromise::CreateAndReject(false, + __func__); + } // Inform the window we granted permission for. This has to be done in the // window's process. As a child this is always the case. - StorageAccessAPIHelper::OnAllowAccessFor(aParentContext, trackingOrigin, + StorageAccessAPIHelper::OnAllowAccessFor(parentBC, trackingOrigin, aCookieBehavior, aReason); Maybe reportReason; // We can directly report here if we can know the origin of the top. - if (aParentContext->Top()->IsInProcess()) { + if (parentBC->Top()->IsInProcess()) { ContentBlockingNotifier::ReportUnblockingToConsole( - aParentContext, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); + parentBC, NS_ConvertUTF8toUTF16(trackingOrigin), aReason); // Set the report reason to nothing if we've already reported. reportReason = Nothing(); @@ -783,12 +793,12 @@ bool frameOnly = StaticPrefs::dom_storage_access_frame_only() && aReason == ContentBlockingNotifier::eStorageAccessAPI; - uint64_t innerWindowId = aParentContext->GetCurrentInnerWindowId(); + uint64_t innerWindowId = parentBC->GetCurrentInnerWindowId(); return cc ->SendStorageAccessPermissionGrantedForOrigin( - aTopLevelWindowId, aParentContext, trackingPrincipal, - trackingOrigin, aAllowMode, reportReason, frameOnly) + aTopLevelWindowId, parentBC, trackingPrincipal, trackingOrigin, + aAllowMode, reportReason, frameOnly) ->Then( GetCurrentSerialEventTarget(), __func__, [aReason, trackingPrincipal, diff -Nru thunderbird-140.9.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs thunderbird-140.10.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs --- thunderbird-140.9.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/downloads/DownloadPaths.sys.mjs 2026-04-21 14:53:08.000000000 +0000 @@ -100,11 +100,12 @@ // .*? Matches the base name non-greedily. // \.[A-Z0-9]{1,3} Up to three letters or numbers preceding a // double extension. - // \.(?:gz|bz2|Z) The second part of common double extensions. + // \.(?:bz2|gz|lzma|xz|zst|Z) The second part of common double extensions. // \.[^.]* Matches any extension or a single trailing dot. - let [, base, ext] = /(.*?)(\.[A-Z0-9]{1,3}\.(?:gz|bz2|Z)|\.[^.]*)?$/i.exec( - leafName - ); + let [, base, ext] = + /(.*?)(\.[A-Z0-9]{1,3}\.(?:bz2|gz|lzma|xz|zst|Z)|\.[^.]*)?$/i.exec( + leafName + ); // Return an empty string instead of undefined if no extension is found. return [base, ext || ""]; }, diff -Nru thunderbird-140.9.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js thunderbird-140.10.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js --- thunderbird-140.9.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/downloads/test/unit/test_DownloadPaths.js 2026-04-21 14:53:09.000000000 +0000 @@ -173,10 +173,12 @@ testCreateNiceUniqueFile(tempFile, "test(2).txt"); // Double extension. - tempFile.leafName = "test.tar.gz"; - testCreateNiceUniqueFile(tempFile, "test.tar.gz"); - testCreateNiceUniqueFile(tempFile, "test(1).tar.gz"); - testCreateNiceUniqueFile(tempFile, "test(2).tar.gz"); + for (let suffix of ["gz", "lzma", "xz", "zst", "bz2"]) { + tempFile.leafName = "test.tar." + suffix; + testCreateNiceUniqueFile(tempFile, "test.tar." + suffix); + testCreateNiceUniqueFile(tempFile, "test(1).tar." + suffix); + testCreateNiceUniqueFile(tempFile, "test(2).tar." + suffix); + } // Test automatic shortening of long file names. We don't know exactly how // many characters are removed, because it depends on the name of the folder diff -Nru thunderbird-140.9.0esr/toolkit/components/extensions/MatchPattern.cpp thunderbird-140.10.0esr/toolkit/components/extensions/MatchPattern.cpp --- thunderbird-140.9.0esr/toolkit/components/extensions/MatchPattern.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/extensions/MatchPattern.cpp 2026-04-21 14:53:08.000000000 +0000 @@ -91,7 +91,7 @@ nsGkAtoms::ws, nsGkAtoms::wss, nsGkAtoms::file, nsGkAtoms::ftp, nsGkAtoms::moz_extension, nsGkAtoms::chrome, nsGkAtoms::resource, nsGkAtoms::moz, - nsGkAtoms::moz_icon, nsGkAtoms::moz_gio); + nsGkAtoms::moz_icon); DEFINE_STATIC_ATOM_SET(WildcardSchemes, nsGkAtoms::http, nsGkAtoms::https, nsGkAtoms::ws, nsGkAtoms::wss); diff -Nru thunderbird-140.9.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs thunderbird-140.10.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs --- thunderbird-140.9.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/formautofill/FormAutofillParent.sys.mjs 2026-04-21 14:53:09.000000000 +0000 @@ -52,7 +52,6 @@ LoginHelper: "resource://gre/modules/LoginHelper.sys.mjs", MLAutofill: "resource://autofill/MLAutofill.sys.mjs", NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", - OSKeyStore: "resource://gre/modules/OSKeyStore.sys.mjs", }); ChromeUtils.defineLazyGetter(lazy, "log", () => @@ -67,6 +66,16 @@ let gMessageObservers = new Set(); +const FORM_AUTOFILL_MESSAGES = new Set([ + "FormAutofill:InitStorage", + "FormAutofill:OnFormSubmit", + "FormAutofill:FieldsIdentified", + "FormAutofill:OnFieldsDetected", + "FormAutofill:OnFieldsUpdated", + "FormAutofill:FieldFilledModified", + "FormAutofill:FieldsUpdatedDuringAutofill", +]); + export let FormAutofillStatus = { _initialized: false, @@ -306,6 +315,10 @@ return undefined; } + if (!FORM_AUTOFILL_MESSAGES.has(name) && !Cu.isInAutomation) { + return undefined; + } + switch (name) { case "FormAutofill:InitStorage": { await lazy.gFormAutofillStorage.initialize(); @@ -364,12 +377,6 @@ break; } case "FormAutofill:SaveCreditCard": { - // Setting the first parameter of OSKeyStore.ensurLoggedIn as false - // since this case only called in tests. Also the reason why we're not calling FormAutofill.verifyUserOSAuth. - if (!(await lazy.OSKeyStore.ensureLoggedIn(false)).authenticated) { - lazy.log.warn("User canceled encryption login"); - return undefined; - } await lazy.gFormAutofillStorage.creditCards.add(data.creditcard); break; } diff -Nru thunderbird-140.9.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs thunderbird-140.10.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs --- thunderbird-140.9.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/messaging-system/lib/SpecialMessageActions.sys.mjs 2026-04-21 14:53:08.000000000 +0000 @@ -718,12 +718,6 @@ throw new Error( `Special message action with type ${action.type} is unsupported.` ); - case "CLICK_ELEMENT": - const clickElement = window.document.querySelector( - action.data.selector - ); - clickElement?.click(); - break; case "RELOAD_BROWSER": browser.reload(); break; diff -Nru thunderbird-140.9.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json thunderbird-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json --- thunderbird-140.9.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/SpecialMessageActionSchemas.json 2026-04-21 14:53:09.000000000 +0000 @@ -592,24 +592,6 @@ { "type": "object", "properties": { - "data": { - "selector": { - "type": "string", - "description": "A CSS selector for the HTML element to be clicked" - } - }, - "type": { - "type": "string", - "enum": ["CLICK_ELEMENT"] - } - }, - "required": ["data", "type"], - "additionalProperties": false, - "description": "Selects an element in the current Window's document and triggers a click action" - }, - { - "type": "object", - "properties": { "type": { "type": "string", "enum": ["RELOAD_BROWSER"] diff -Nru thunderbird-140.9.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md thunderbird-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md --- thunderbird-140.9.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/messaging-system/schemas/SpecialMessageActionSchemas/index.md 2026-04-21 14:53:09.000000000 +0000 @@ -357,12 +357,6 @@ } ``` -### `CLICK_ELEMENT` - -* args: `string` A CSS selector for the HTML element to be clicked - -Selects an element in the current Window's document and triggers a click action - ### `RELOAD_BROWSER` diff -Nru thunderbird-140.9.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs thunderbird-140.10.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs --- thunderbird-140.9.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/passwordmgr/LoginManagerParent.sys.mjs 2026-04-21 14:53:08.000000000 +0000 @@ -1502,7 +1502,7 @@ } async searchAutoCompleteEntries(searchString, data) { - return this.doAutocompleteSearch(data.formOrigin, data); + return this.doAutocompleteSearch(this.origin, data); } onAutoCompleteEntryHovered(_message, _data) { diff -Nru thunderbird-140.9.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp thunderbird-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp --- thunderbird-140.9.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.cpp 2026-04-21 14:53:08.000000000 +0000 @@ -211,7 +211,7 @@ ".class", // Java //".cmd", exec // Windows executable //".com", exec // Windows executable - ".command", // Mac script + //".command", exec // Mac script ".configprofile", // Configuration file for Apple systems ".cpgz", // Mac archive ".cpi", // Control Panel Item. Executable used for adding icons @@ -434,7 +434,7 @@ ".scptd", // AppleScript //".scr", exec // Windows //".sct", exec // Windows shell - ".search-ms", // Windows + //".search-ms", exec // Windows Saved Search ".seplugin", // AppleScript ".service", // Systemd service unit file //".settingcontent-ms", exec // Windows settings diff -Nru thunderbird-140.9.0esr/toolkit/components/reputationservice/ApplicationReputation.h thunderbird-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.h --- thunderbird-140.9.0esr/toolkit/components/reputationservice/ApplicationReputation.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/reputationservice/ApplicationReputation.h 2026-04-21 14:53:09.000000000 +0000 @@ -27,9 +27,9 @@ public: static const char* const kNonBinaryExecutables[6]; #ifdef XP_WIN - static const char* const kBinaryFileExtensions[184]; + static const char* const kBinaryFileExtensions[182]; #else - static const char* const kBinaryFileExtensions[183]; + static const char* const kBinaryFileExtensions[181]; #endif static already_AddRefed GetSingleton(); diff -Nru thunderbird-140.9.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp thunderbird-140.10.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp --- thunderbird-140.9.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/reputationservice/test/gtest/TestExecutableLists.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -213,7 +213,7 @@ ".scptd", // AppleScript ".scr", // Windows ".sct", // Windows shell - ".search-ms", // Windows + ".search-ms", // Windows Saved Search ".seplugin", // AppleScript ".service", // Systemd service unit file ".settingcontent-ms", // Windows settings diff -Nru thunderbird-140.9.0esr/toolkit/components/search/schema/search-config-v2-schema.json thunderbird-140.10.0esr/toolkit/components/search/schema/search-config-v2-schema.json --- thunderbird-140.9.0esr/toolkit/components/search/schema/search-config-v2-schema.json 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/search/schema/search-config-v2-schema.json 2026-04-21 14:53:08.000000000 +0000 @@ -146,7 +146,7 @@ "title": "Partner Code", "description": "The partner code for the engine or variant. This will be inserted into parameters which include '{partnerCode}'", "type": "string", - "pattern": "^[a-zA-Z0-9-_]*$" + "pattern": "^[a-zA-Z0-9-_.]*$" }, "urls": { "title": "URLs", diff -Nru thunderbird-140.9.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js thunderbird-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js --- thunderbird-140.9.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js 2026-04-21 14:53:09.000000000 +0000 @@ -310,7 +310,7 @@ }); tests.push({ - region: "CA", // Testing for "rest of world" (excluding US, RU, TR, BY, KZ) + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) distribution: "dt-002", application: "firefox-android", test: engines => @@ -332,11 +332,33 @@ }); tests.push({ - region: "CA", // Testing for "rest of world" (excluding US, RU, TR, BY, KZ) + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) distribution: "dt-003", application: "firefox-android", test: engines => hasParams(engines, "Google", "client=firefox-b-dt") && + hasDefault(engines, "Google") && + hasEnginesFirst(engines, ["Google"]) && + hasTelemetryId(engines, "Google", "google-b-dt"), +}); + +tests.push({ + region: "US", + distribution: "xiaomi-001", + application: "firefox-android", + test: engines => + hasParams(engines, "Google", "client=firefox-b-1-dt") && + hasDefault(engines, "Google") && + hasEnginesFirst(engines, ["Google"]) && + hasTelemetryId(engines, "Google", "google-b-1-dt"), +}); + +tests.push({ + region: "CA", // Testing for "rest of world" (excluding US, RU, BY) + distribution: "xiaomi-001", + application: "firefox-android", + test: engines => + hasParams(engines, "Google", "client=firefox-b-dt") && hasDefault(engines, "Google") && hasEnginesFirst(engines, ["Google"]) && hasTelemetryId(engines, "Google", "google-b-dt"), diff -Nru thunderbird-140.9.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js thunderbird-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js --- thunderbird-140.9.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_google.js 2026-04-21 14:53:08.000000000 +0000 @@ -47,7 +47,7 @@ : "firefox-b-1-d", }, { - excluded: [{ regions: ["us", "by", "kz", "ru", "tr"] }], + excluded: [{ regions: ["us", "by", "ru"] }], included: [{}], domain: "google.com", telemetryId: @@ -62,7 +62,7 @@ : "firefox-b-d", }, { - included: [{ regions: ["by", "kz", "ru", "tr"] }], + included: [{ regions: ["by", "ru"] }], domain: "google.com", telemetryId: "google-com-nocodes", partnerCode: "", diff -Nru thunderbird-140.9.0esr/toolkit/components/url-classifier/LookupCache.cpp thunderbird-140.10.0esr/toolkit/components/url-classifier/LookupCache.cpp --- thunderbird-140.9.0esr/toolkit/components/url-classifier/LookupCache.cpp 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/url-classifier/LookupCache.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -505,7 +505,7 @@ if (FindCharInReadable('.', iter, end)) { iter++; nsAutoCString thirdPartyURLToAdd; - thirdPartyURLToAdd.Assign(Substring(iter++, end)); + thirdPartyURLToAdd.Assign(Substring(iter, end)); // don't bother checking toplevel domains if (FindCharInReadable('.', iter, end)) { diff -Nru thunderbird-140.9.0esr/toolkit/components/utils/SimpleServices.sys.mjs thunderbird-140.10.0esr/toolkit/components/utils/SimpleServices.sys.mjs --- thunderbird-140.9.0esr/toolkit/components/utils/SimpleServices.sys.mjs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/components/utils/SimpleServices.sys.mjs 2026-04-21 14:53:10.000000000 +0000 @@ -143,8 +143,8 @@ aDocListenerResult ) { // Bug 1824325: application/http-index-format is deprecated for almost all - // sites, we only allow it for urls with a inner scheme of "file" or - // "moz-gio" (specified in network.http_index_format.allowed_schemes). + // sites, we only allow it for urls with a inner scheme of "file" + // (specified in network.http_index_format.allowed_schemes). // This also includes jar: and resource:// uris, as jar: uris has a inner // scheme of "file", and resource:// uris have been turned into either a // jar: or file:// uri by the point where we are checking them here. diff -Nru thunderbird-140.9.0esr/toolkit/content/widgets/findbar.js thunderbird-140.10.0esr/toolkit/content/widgets/findbar.js --- thunderbird-140.9.0esr/toolkit/content/widgets/findbar.js 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/content/widgets/findbar.js 2026-04-21 14:53:09.000000000 +0000 @@ -797,10 +797,10 @@ } // The event information comes from the child process. - let event = new target.ownerGlobal.KeyboardEvent( - fakeEvent.type, - fakeEvent - ); + let event = new target.ownerGlobal.KeyboardEvent("keypress", { + ...fakeEvent, + bubbles: false, + }); target.dispatchEvent(event); } diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/glean.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/glean.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/glean.rs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/glean.rs 2026-04-21 14:53:09.000000000 +0000 @@ -5,6 +5,8 @@ //! Glean telemetry integration. use crate::config::{buildid, Config}; +use crate::prefs_parser::find_bool_pref; +use crate::std::path::Path; use glean::{ClientInfoMetrics, Configuration, ConfigurationBuilder}; const APP_ID: &str = if cfg!(mock) { @@ -18,6 +20,55 @@ } else { "https://incoming.telemetry.mozilla.org" }; +const TELEMETRY_ENABLED_PREF_KEY: &str = "datareporting.healthreport.uploadEnabled"; + +/// Parse the telemetry enablement pref from the prefs file. +/// +/// For example: +/// ```rust +/// let input = r#"user_pref("datareporting.healthreport.uploadEnabled", false);"#; +/// assert_eq!(parse_telemetry_enabled_pref(input), Some(false)); +/// let input = r#"user_pref("datareporting.healthreport.uploadEnabled", true);"#; +/// assert_eq!(parse_telemetry_enabled_pref(input), Some(true)); +/// ``` +fn parse_telemetry_enabled_pref(prefs_content: &str) -> Option { + find_bool_pref(prefs_content, TELEMETRY_ENABLED_PREF_KEY) +} + +/// Determine whether telemetry should be enabled based on the profile. +fn determine_telemetry_enabled(profile_dir: Option<&Path>) -> bool { + // If there is no profile dir, we cannot determine whether telemetry is enabled or not. However, + // disabling telemetry in this case will cause us to entirely miss the class of crashes that + // occur before the profile is set up, so we leave it enabled. + let Some(profile_dir) = profile_dir else { + return true; + }; + + let prefs = profile_dir.join("prefs.js"); + + // If there is no pref file, default to true. + if !prefs.exists() { + return true; + } + + match crate::std::fs::read_to_string(&prefs) { + Ok(prefs_contents) => { + parse_telemetry_enabled_pref(&prefs_contents) + // If there is no pref, default to true + .unwrap_or(true) + } + Err(e) => { + // Like the no-profile-dir case, if we can't read the prefs file, this might be the + // cause of some crash that we are trying to report. So disabling telemetry in this case + // would make us blind to the issue. + log::error!( + "failed to read prefs file at {} for disabling telemetry: {e}", + prefs.display() + ); + true + } + } +} /// Initialize glean based on the given configuration. /// @@ -34,7 +85,8 @@ } fn config(cfg: &Config) -> Configuration { - ConfigurationBuilder::new(true, glean_data_dir(cfg), APP_ID) + let upload_enabled = determine_telemetry_enabled(cfg.profile_dir.as_deref()); + ConfigurationBuilder::new(upload_enabled, glean_data_dir(cfg), APP_ID) .with_server_endpoint(TELEMETRY_SERVER) .with_use_core_mps(false) .with_internal_pings(false) @@ -155,6 +207,27 @@ ); } } + + #[test] + fn test_telemetry_enable_pref() { + use crate::std::{ + fs::{MockFS, MockFiles}, + mock, + path::Path, + }; + + for pref_value in [false, true] { + let files = MockFiles::new(); + files.add_dir("profile_dir").add_file( + "profile_dir/prefs.js", + format!(r#"user_pref("datareporting.healthreport.uploadEnabled", {pref_value});"#), + ); + let result = mock::builder() + .set(MockFS, files) + .run(|| determine_telemetry_enabled(Some(Path::new("profile_dir")))); + assert_eq!(result, pref_value); + } + } } #[cfg(test)] diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/lang/langpack.rs 2026-04-21 14:53:09.000000000 +0000 @@ -5,10 +5,11 @@ use super::language_info::LanguageInfo; use super::zip::{read_archive_file_as_string, read_zip, Archive}; use crate::config::installation_resource_path; +use crate::prefs_parser::find_string_pref; use crate::std::path::{Path, PathBuf}; use anyhow::Context; -const LOCALE_PREF_KEY: &str = r#""intl.locale.requested""#; +const LOCALE_PREF_KEY: &str = "intl.locale.requested"; /// Use the profile language preferences to determine the localization to use. pub fn read( @@ -115,12 +116,9 @@ /// Parse the language pref (if any) from the prefs file. /// -/// This finds the first string match for the regex `"intl.locale.requested"[ \t\n\r\f\v,]*"(.*)"`, -/// and splits and trims the first match group, returning the set of strings that results. -/// /// For example: /// ```rust -/// let input = r#""intl.locale.requested", "foo , bar,,""#; +/// let input = r#"user_pref("intl.locale.requested", "foo , bar,,");"#; /// let expected_output = Some(vec!["foo","bar"]); /// assert_eq!(parse_requested_locales(input), output); /// ``` @@ -128,10 +126,7 @@ /// This will parse the locales out of the user prefs file contents, which looks like /// `user_pref("intl.locale.requested", "")`. fn parse_requested_locales(prefs_content: &str) -> Option> { - let (_, s) = prefs_content.split_once(LOCALE_PREF_KEY)?; - let s = s.trim_start_matches(|c: char| c.is_whitespace() || c == ','); - let s = s.strip_prefix('"')?; - let (v, _) = s.split_once('"')?; + let v = find_string_pref(prefs_content, LOCALE_PREF_KEY)?; Some( v.split(",") .map(|s| s.trim()) @@ -187,7 +182,7 @@ #[test] fn parse_locales_empty() { assert_eq!( - parse_requested_locales(r#"user_pref("intl.locale.requested","")"#), + parse_requested_locales(r#"user_pref("intl.locale.requested","");"#), Some(vec![]) ); } @@ -195,7 +190,7 @@ #[test] fn parse_locales() { assert_eq!( - parse_requested_locales(r#"user_pref("intl.locale.requested", "fr,en-US")"#), + parse_requested_locales(r#"user_pref("intl.locale.requested", "fr,en-US");"#), Some(vec!["fr", "en-US"]) ); } diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/main.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/main.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/main.rs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/main.rs 2026-04-21 14:53:09.000000000 +0000 @@ -67,6 +67,7 @@ mod logic; mod memory_test; mod net; +mod prefs_parser; mod process; mod settings; mod std; diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/prefs_parser.rs 2026-04-21 14:53:10.000000000 +0000 @@ -0,0 +1,86 @@ +/* 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/. */ + +//! Prefs file parsing utilities. + +/// Parse a single pref value (if any) from the prefs file contents. +/// +/// This parser could be improved (e.g., it doesn't respect comments), but it is compatible with +/// prefs files generated by Firefox. +/// +/// This finds the first string match for the regex `user_pref\("PREFSTRING"[ \t\n\r\f\v,]*(.*)[ \t\n\r\f\v]*\);`. +/// +/// For example: +/// ```rust +/// let input = r#"user_pref("FOOBAR", "baz");"#; +/// let expected_output = Some(r#""baz""#); +/// assert_eq!(find_pref(input, "FOOBAR"), output); +/// ``` +pub fn find_pref<'a>(prefs_content: &'a str, pref: &str) -> Option<&'a str> { + let mut search_content = prefs_content; + loop { + let (before, s) = search_content.split_once(&format!("\"{pref}\""))?; + if !before.trim().ends_with("user_pref(") { + search_content = s; + continue; + } + let s = s.trim_start_matches(|c: char| c.is_whitespace() || c == ','); + let (content, _) = s.split_once(");")?; + return Some(content.trim()); + } +} + +/// Find a single string pref (if any) from the prefs file contents. +pub fn find_string_pref<'a>(prefs_content: &'a str, pref: &str) -> Option<&'a str> { + find_pref(prefs_content, pref).and_then(|s| s.strip_prefix('"')?.strip_suffix('"')) +} + +/// Find a single bool pref (if any) from the prefs file contents. +pub fn find_bool_pref(prefs_content: &str, pref: &str) -> Option { + find_pref(prefs_content, pref).and_then(|s| s.parse().ok()) +} + +// Doctests don't run for binaries, so make some unit tests instead. +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn find_pref_read_value() { + let input = r#"user_pref("FOOBAR", "baz");"#; + assert_eq!(find_pref(input, "FOOBAR"), Some(r#""baz""#)); + } + + #[test] + fn find_pref_continues_search() { + let input = r#" + user_pref("rawr", "FOOBAR"); + user_pref("FOOBAR", "baz"); + "#; + assert_eq!(find_pref(input, "FOOBAR"), Some(r#""baz""#)); + } + + #[test] + fn find_pref_missing() { + let input = r#" + user_pref("rawr", "FOOBAR"); + user_pref("FOOBAR", "hello"); + "#; + assert_eq!(find_pref(input, "hello"), None); + } + + #[test] + fn test_find_string_pref() { + let input = r#"user_pref("FOOBAR", "baz");"#; + assert_eq!(find_string_pref(input, "FOOBAR"), Some("baz")); + } + + #[test] + fn test_find_bool_pref() { + let input = r#"user_pref("FOOBAR", true);"#; + assert_eq!(find_bool_pref(input, "FOOBAR"), Some(true)); + let input = r#"user_pref("FOOBAR", false);"#; + assert_eq!(find_bool_pref(input, "FOOBAR"), Some(false)); + } +} diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/std/fs.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/std/fs.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/std/fs.rs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/std/fs.rs 2026-04-21 14:53:09.000000000 +0000 @@ -524,6 +524,12 @@ }) } +pub fn read_to_string>(path: P) -> Result { + let mut s = String::new(); + File::open(path.as_ref())?.read_to_string(&mut s)?; + Ok(s) +} + pub fn write, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()> { File::create(path.as_ref())?.write_all(contents.as_ref()) } diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/test.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/test.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/test.rs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/test.rs 2026-04-21 14:53:09.000000000 +0000 @@ -247,25 +247,29 @@ .. } = self; let before_run = self.before_run.take(); - let mut config = Arc::new(std::mem::take(config)); + let mut test_config = Arc::new(std::mem::take(config)); // Run the mock environment. - mock.run(move || { + let result = mock.run(|| { let _glean = if *enable_glean { - Some(glean::test_init(&config)) + Some(glean::test_init(&test_config)) } else { None }; gui_interact( - move || { + || { if let Some(f) = before_run { f(); } - try_run(&mut config) + try_run(&mut test_config) }, interact, ) - }) + }); + + *config = Arc::into_inner(test_config).unwrap(); + + result } /// Run the test as configured, using the given function to interact with the GUI. @@ -992,6 +996,87 @@ } #[test] +fn reads_profile_directory() { + let mut test = GuiTest::new(); + let minidump_extra_contents = r#"{ + "Vendor": "FooCorp", + "ProductName": "Bar", + "ProfileDirectory": "profile_dir", + "ReleaseChannel": "release", + "BuildID": "1234", + "AsyncShutdownTimeout": "{}", + "StackTraces": { + "status": "OK" + }, + "Version": "100.0", + "ServerURL": "https://reports.example.com", + "TelemetryServerURL": "https://telemetry.example.com", + "TelemetryClientId": "telemetry_client", + "TelemetryProfileGroupId": "telemetry_profile_group", + "TelemetrySessionId": "telemetry_session", + "SomeNestedJson": { "foo": "bar" }, + "URL": "https://url.example.com" + }"#; + test.files = { + let mock_files = MockFiles::new(); + mock_files + .add_file_result( + "minidump.dmp", + Ok(MOCK_MINIDUMP_FILE.into()), + current_system_time(), + ) + .add_file_result( + "minidump.extra", + Ok(minidump_extra_contents.into()), + current_system_time(), + ) + .add_dir("profile_dir"); + test.mock.set(MockFS, mock_files.clone()); + mock_files + }; + test.run(|interact| { + interact.element("quit", |_style, b: &model::Button| b.click.fire(&())); + }); + + assert_eq!(test.config.profile_dir, Some("profile_dir".into())); +} + +#[test] +#[ignore = "This test often passes, however it relies on Glean network scheduling, which has been + found to be unreliable for testing purposes. A more reliable unit test is in the glean module."] +fn glean_ping_uses_pref() { + for pref_value in [false, true] { + let mut test = GuiTest::new(); + test.enable_glean_pings(); + // Set profile dir manually because glean is initialized earlier than the extra file is read + // in tests. We check that the profile dir is correctly read in another test. + test.config.profile_dir = Some("profile_dir".into()); + test.files.add_dir("profile_dir").add_file( + "profile_dir/prefs.js", + format!(r#"user_pref("datareporting.healthreport.uploadEnabled", {pref_value});"#), + ); + + // Set a mock hook at the HTTP layer to check whether the ping is sent. + // test_before_next_send is called whether upload is enabled or not. + let submitted_glean_ping = Counter::new(); + test.mock.set( + net::http::MockHttp, + Box::new(cc! { (submitted_glean_ping) move |_request, url| { + if url.starts_with("https://incoming.glean.example.com/submit/firefox-crashreporter-mock/crash") { + submitted_glean_ping.inc(); + } + Ok(Ok(vec!())) + }}), + ); + + test.run(|interact| { + interact.element("quit", |_style, b: &model::Button| b.click.fire(&())); + }); + assert_eq!(submitted_glean_ping.count(), if pref_value { 1 } else { 0 }); + } +} + +#[test] fn eol_version() { let mut test = GuiTest::new(); test.files diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/app/src/ui/gtk.rs 2026-04-21 14:53:10.000000000 +0000 @@ -108,6 +108,7 @@ /// These types must be sized to avoid fat pointers (i.e., the pointers must be FFI-compatible, the /// same size as usize). trait ToPointer: Sized { + /// Convert the value to a pointer, passing ownership. fn to_ptr(self) -> *mut (); /// # Safety /// The caller must ensure that the pointer was created as the result of `to_ptr` on the same @@ -186,6 +187,33 @@ } } +/// An owned GLib Source. +/// +/// Dropping will remove the source. +#[repr(transparent)] +struct GSource(u32); + +impl ToPointer for GSource { + fn to_ptr(self) -> *mut () { + let ptr = self.0 as _; + // to_ptr passes ownership + std::mem::forget(self); + ptr + } + + unsafe fn from_ptr(ptr: *mut ()) -> Self { + GSource(ptr as _) + } +} + +impl Drop for GSource { + fn drop(&mut self) { + unsafe { + gtk::g_source_remove(self.0); + } + } +} + /// Connect a GTK+ object signal to a function, providing an additional context value (by /// reference). macro_rules! connect_signal { @@ -748,6 +776,11 @@ property_read_only! { property amount; fn set(value: &Option) { + // FIXME: The logic here assumes that if `amount` is None, it will remain that + // way. Specifically, if we were to change back and forth, additional pulse + // callbacks would be registered, and they are not be removed when changing to + // a specific fraction. As this property is currently used, we don't encounter + // this case. match &*value { Some(v) => unsafe { gtk::gtk_progress_bar_set_fraction( @@ -758,29 +791,16 @@ None => unsafe { gtk::gtk_progress_bar_pulse(progress_ptr as *mut _); - fn auto_pulse_progress_bar(progress: *mut gtk::GtkProgressBar) { - unsafe extern "C" fn pulse(progress: *mut std::ffi::c_void) -> gtk::gboolean { - if gtk::gtk_widget_is_visible(progress as _) == 0 { - false.into() - } else { - gtk::gtk_progress_bar_pulse(progress as _); - true.into() - } - } - unsafe { - gtk::g_timeout_add(100, Some(pulse as unsafe extern "C" fn(*mut std::ffi::c_void) -> gtk::gboolean), progress as _); - } - + unsafe extern "C" fn pulse(progress: *mut std::ffi::c_void) -> gtk::gboolean { + gtk::gtk_progress_bar_pulse(progress as _); + true.into() } - connect_signal! { - object progress_ptr; - with std::ptr::null_mut(); - signal show(_user_data: &(), progress: *mut gtk::GtkWidget) { - auto_pulse_progress_bar(progress as *mut _); - } - } - auto_pulse_progress_bar(progress_ptr as *mut _); + // This will call even when the progress bar is hidden, but it's of + // little consequence. + let source = GSource(gtk::g_timeout_add(100, Some(pulse), progress_ptr as _)); + + source.drop_with_widget(progress_ptr); } } } diff -Nru thunderbird-140.9.0esr/toolkit/crashreporter/client/gtkbind/build.rs thunderbird-140.10.0esr/toolkit/crashreporter/client/gtkbind/build.rs --- thunderbird-140.9.0esr/toolkit/crashreporter/client/gtkbind/build.rs 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/crashreporter/client/gtkbind/build.rs 2026-04-21 14:53:09.000000000 +0000 @@ -19,7 +19,7 @@ .clang_args(GTK_CFLAGS) .allowlist_function("gtk_.*") .allowlist_function( - "g_(application|main_context|memory_input_stream|object|signal|timeout)_.*", + "g_(application|main_context|memory_input_stream|object|signal|source|timeout)_.*", ) .allowlist_function("gdk_pixbuf_new_from_stream") .allowlist_function("pango_attr_.*") diff -Nru thunderbird-140.9.0esr/toolkit/library/rust/shared/Cargo.toml thunderbird-140.10.0esr/toolkit/library/rust/shared/Cargo.toml --- thunderbird-140.9.0esr/toolkit/library/rust/shared/Cargo.toml 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/library/rust/shared/Cargo.toml 2026-04-21 14:53:09.000000000 +0000 @@ -23,7 +23,7 @@ profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional = true } mozurl = { path = "../../../../netwerk/base/mozurl" } webrender_bindings = { path = "../../../../gfx/webrender_bindings" } -cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "579b75af21c040700eee6a1d8520e222699fe4cd", optional = true } +cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "bebaa23317332c95734df76e25193c24a83a6840", optional = true } cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="8678dcab1c287de79c4c184ccc2e065bc62b70e2", optional = true, features=["pulse-dlopen"] } cubeb-sys = { version = "0.13", optional = true, features=["gecko-in-tree"] } audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "e6f44a2bd1e57d11dfc737632a9e849077632330", optional = true } diff -Nru thunderbird-140.9.0esr/toolkit/mozapps/update/updater/updater.cpp thunderbird-140.10.0esr/toolkit/mozapps/update/updater/updater.cpp --- thunderbird-140.9.0esr/toolkit/mozapps/update/updater/updater.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/toolkit/mozapps/update/updater/updater.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -100,7 +100,7 @@ struct UpdateServerThreadArgs { int argc; const NS_tchar** argv; - const char* marChannelID; + const char* marChannelID = ""; }; #endif @@ -3004,16 +3004,17 @@ * `OK` on success, `UPDATE_SETTINGS_FILE_CHANNEL` on failure. */ static int PopulategMARStrings() { + if (gMARStrings.MARChannelID && gMARStrings.MARChannelID[0] != '\0') { + return OK; + } + int rv = UPDATE_SETTINGS_FILE_CHANNEL; # ifdef XP_MACOSX - if (gInvocation == UpdaterInvocation::Second) { - // An elevated update process will have already populated gMARStrings when - // it connected to the unelevated update process to obtain the command line - // args. See `ObtainUpdaterArguments`. - rv = OK; - } else if (auto marChannels = - UpdateSettingsUtil::GetAcceptedMARChannelsValue()) { - rv = ReadMARChannelIDsFromBuffer(marChannels->data(), &gMARStrings); + if (gInvocation != UpdaterInvocation::Second) { + if (std::optional marChannels = + UpdateSettingsUtil::GetAcceptedMARChannelsValue()) { + rv = ReadMARChannelIDsFromBuffer(marChannels->data(), &gMARStrings); + } } # else NS_tchar updateSettingsPath[MAXPATHLEN]; @@ -3698,17 +3699,33 @@ UpdateServerThreadArgs threadArgs; threadArgs.argc = suiArgc; threadArgs.argv = suiArgv.get(); - threadArgs.marChannelID = gMARStrings.MARChannelID.get(); + threadArgs.marChannelID = ""; + bool shouldServeElevatedUpdate = true; - Thread t1; - if (t1.Run(ServeElevatedUpdateThreadFunc, &threadArgs) == 0) { - // Show an indeterminate progress bar while an elevated update is in - // progress. - if (!isDMGInstall) { - ShowProgressUI(true); +# ifdef MOZ_VERIFY_MAR_SIGNATURE + int rv = PopulategMARStrings(); + if (rv != OK) { + shouldServeElevatedUpdate = false; + WriteStatusFile(UPDATE_SETTINGS_FILE_CHANNEL); + fprintf(stderr, + "Unable to start unelevated update process to serve elevated " + "updater due to inability to retrieve MAR channels."); + } else { + threadArgs.marChannelID = gMARStrings.MARChannelID.get(); + } +# endif // MOZ_VERIFY_MAR_SIGNATURE + + if (shouldServeElevatedUpdate) { + Thread t1; + if (t1.Run(ServeElevatedUpdateThreadFunc, &threadArgs) == 0) { + // Show an indeterminate progress bar while an elevated update is in + // progress. + if (!isDMGInstall) { + ShowProgressUI(true); + } } + t1.Join(); } - t1.Join(); } LaunchCallbackAndPostProcessApps(argc, argv, std::move(umaskContext)); diff -Nru thunderbird-140.9.0esr/widget/ClipboardWriteRequestParent.cpp thunderbird-140.10.0esr/widget/ClipboardWriteRequestParent.cpp --- thunderbird-140.9.0esr/widget/ClipboardWriteRequestParent.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/ClipboardWriteRequestParent.cpp 2026-04-21 14:53:10.000000000 +0000 @@ -89,7 +89,11 @@ return IPC_OK(); } - mAsyncSetClipboardData->SetData(trans, nullptr); + rv = mAsyncSetClipboardData->SetData(trans, nullptr); + if (rv == NS_ERROR_IN_PROGRESS) { + return IPC_FAIL(this, "reentrant SetData"); + } + // Non-fatal errors are notified via the callback inside SetData. return IPC_OK(); } diff -Nru thunderbird-140.9.0esr/widget/IMEData.h thunderbird-140.10.0esr/widget/IMEData.h --- thunderbird-140.9.0esr/widget/IMEData.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/IMEData.h 2026-04-21 14:53:09.000000000 +0000 @@ -7,6 +7,8 @@ #define mozilla_widget_IMEData_h_ #include "mozilla/CheckedInt.h" +#include "mozilla/EnumSet.h" +#include "mozilla/EnumTypeTraits.h" #include "mozilla/EventForwards.h" #include "mozilla/NativeKeyBindingsType.h" #include "mozilla/ToString.h" @@ -208,73 +210,45 @@ /** * Preference for receiving IME updates * - * If mWantUpdates is not NOTIFY_NOTHING, nsTextStateManager will observe text + * If mWantUpdates is not empty, IMEContentObserver will observe text * change and/or selection change and call nsIWidget::NotifyIME() with * NOTIFY_IME_OF_SELECTION_CHANGE and/or NOTIFY_IME_OF_TEXT_CHANGE. * Please note that the text change observing cost is very expensive especially * on an HTML editor has focus. * If the IME implementation on a particular platform doesn't care about * NOTIFY_IME_OF_SELECTION_CHANGE and/or NOTIFY_IME_OF_TEXT_CHANGE, - * they should set mWantUpdates to NOTIFY_NOTHING to avoid the cost. + * they should set mWantUpdates to empty to avoid the cost. * If the IME implementation needs notifications even while our process is - * deactive, it should also set NOTIFY_DURING_DEACTIVE. + * inactive, it should also set NotifyDuringInactive. */ -struct IMENotificationRequests final { - typedef uint8_t Notifications; - - enum : Notifications { - NOTIFY_NOTHING = 0, - NOTIFY_TEXT_CHANGE = 1 << 1, - NOTIFY_POSITION_CHANGE = 1 << 2, - // NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR is used when mouse button is pressed - // or released on a character in the focused editor. The notification is - // notified to IME as a mouse event. If it's consumed by IME, NotifyIME() - // returns NS_SUCCESS_EVENT_CONSUMED. Otherwise, it returns NS_OK if it's - // handled without any error. - NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR = 1 << 3, - // NOTE: NOTIFY_DURING_DEACTIVE isn't supported in environments where two - // or more compositions are possible. E.g., Mac and Linux (GTK). - NOTIFY_DURING_DEACTIVE = 1 << 7, - - NOTIFY_ALL = NOTIFY_TEXT_CHANGE | NOTIFY_POSITION_CHANGE | - NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR, - }; - - IMENotificationRequests() : mWantUpdates(NOTIFY_NOTHING) {} - - explicit IMENotificationRequests(Notifications aWantUpdates) - : mWantUpdates(aWantUpdates) {} - - IMENotificationRequests operator|( - const IMENotificationRequests& aOther) const { - return IMENotificationRequests(aOther.mWantUpdates | mWantUpdates); - } - IMENotificationRequests& operator|=(const IMENotificationRequests& aOther) { - mWantUpdates |= aOther.mWantUpdates; - return *this; - } - bool operator==(const IMENotificationRequests& aOther) const { - return mWantUpdates == aOther.mWantUpdates; - } - - bool WantTextChange() const { return !!(mWantUpdates & NOTIFY_TEXT_CHANGE); } - - bool WantPositionChanged() const { - return !!(mWantUpdates & NOTIFY_POSITION_CHANGE); - } +enum class IMENotificationRequest : uint8_t { + TextChange, + PositionChange, + // NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR is used when mouse button is pressed + // or released on a character in the focused editor. The notification is + // notified to IME as a mouse event. If it's consumed by IME, NotifyIME() + // returns NS_SUCCESS_EVENT_CONSUMED. Otherwise, it returns NS_OK if it's + // handled without any error. + MouseEventOnChar, + // NOTE: NotifyDuringInactive isn't supported in environments where two + // or more compositions are possible. E.g., Mac and Linux (GTK). + NotifyDuringInactive, +}; - bool WantChanges() const { return WantTextChange(); } +} // namespace widget - bool WantMouseButtonEventOnChar() const { - return !!(mWantUpdates & NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR); - } +template <> +struct MaxEnumValue { + static constexpr uint8_t value = static_cast( + widget::IMENotificationRequest::NotifyDuringInactive); +}; - bool WantDuringDeactive() const { - return !!(mWantUpdates & NOTIFY_DURING_DEACTIVE); - } +namespace widget { - Notifications mWantUpdates; -}; +using IMENotificationRequests = EnumSet; +inline constexpr const IMENotificationRequests AllIMENotificationRequests = { + IMENotificationRequest::TextChange, IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar}; /** * IME enabled states. @@ -641,7 +615,7 @@ // IMEMessage is shared by IMEStateManager and TextComposition. // Update values in GeckoEditable.java if you make changes here. // XXX Negative values are used in Android... -typedef int8_t IMEMessageType; +using IMEMessageType = int8_t; enum IMEMessage : IMEMessageType { // This is used by IMENotification internally. This means that the instance // hasn't been initialized yet. diff -Nru thunderbird-140.9.0esr/widget/PuppetWidget.cpp thunderbird-140.10.0esr/widget/PuppetWidget.cpp --- thunderbird-140.9.0esr/widget/PuppetWidget.cpp 2026-03-20 19:18:48.000000000 +0000 +++ thunderbird-140.10.0esr/widget/PuppetWidget.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -725,7 +725,7 @@ } mIMENotificationRequestsOfParent = - IMENotificationRequests(IMENotificationRequests::NOTIFY_ALL); + IMENotificationRequests(AllIMENotificationRequests); RefPtr self = this; mBrowserChild->SendNotifyIMEFocus(mContentCache, aIMENotification) ->Then( @@ -780,8 +780,9 @@ } // BrowserParent doesn't this this to cache. we don't send the notification - // if parent process doesn't request NOTIFY_TEXT_CHANGE. - if (mIMENotificationRequestsOfParent.WantTextChange()) { + // if parent process doesn't request text changes. + if (mIMENotificationRequestsOfParent.contains( + IMENotificationRequest::TextChange)) { mBrowserChild->SendNotifyIMETextChange(mContentCache, aIMENotification); } else { mBrowserChild->SendUpdateContentCache(mContentCache); @@ -843,7 +844,8 @@ !mContentCache.CacheCaretAndTextRects(this, &aIMENotification))) { return NS_ERROR_FAILURE; } - if (mIMENotificationRequestsOfParent.WantPositionChanged()) { + if (mIMENotificationRequestsOfParent.contains( + IMENotificationRequest::PositionChange)) { mBrowserChild->SendNotifyIMEPositionChange(mContentCache, aIMENotification); } else { mBrowserChild->SendUpdateContentCache(mContentCache); @@ -1089,10 +1091,9 @@ NS_IMETHODIMP_(IMENotificationRequests) PuppetWidget::GetIMENotificationRequests() { - return IMENotificationRequests( - mIMENotificationRequestsOfParent.mWantUpdates | - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE); + return mIMENotificationRequestsOfParent + + IMENotificationRequests{IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange}; } NS_IMETHODIMP_(void) diff -Nru thunderbird-140.9.0esr/widget/SwipeTracker.cpp thunderbird-140.10.0esr/widget/SwipeTracker.cpp --- thunderbird-140.9.0esr/widget/SwipeTracker.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/SwipeTracker.cpp 2026-04-21 14:53:10.000000000 +0000 @@ -40,15 +40,18 @@ const PanGestureInput& aSwipeStartEvent, uint32_t aAllowedDirections, uint32_t aSwipeDirection) - : mWidget(aWidget), - mRefreshDriver(GetRefreshDriver(mWidget)), + : mWidget(do_GetWeakReference(&aWidget)), + mRefreshDriver(GetRefreshDriver(aWidget)), mAxis(0.0, 0.0, 0.0, kSpringForce, 1.0), mEventPosition(RoundedToInt(ViewAs( aSwipeStartEvent.mPanStartPoint, PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent))), mLastEventTimeStamp(aSwipeStartEvent.mTimeStamp), mAllowedDirections(aAllowedDirections), - mSwipeDirection(aSwipeDirection) { + mSwipeDirection(aSwipeDirection) {} + +void SwipeTracker::StartTracking( + const PanGestureInput& aSwipeStartEvent) { SendSwipeEvent(eSwipeGestureStart, 0, 0.0, aSwipeStartEvent.mTimeStamp); ProcessEvent(aSwipeStartEvent, /* aProcessingFirstEvent = */ true); } @@ -96,6 +99,8 @@ nsEventStatus SwipeTracker::ProcessEvent( const PanGestureInput& aEvent, bool aProcessingFirstEvent /* = false */) { + RefPtr selfPin(this); + // If the fingers have already been lifted or the swipe direction is where // navigation is impossible, don't process this event for swiping. if (!mEventsAreControllingSwipe || !SwipingInAllowedDirection()) { @@ -109,12 +114,16 @@ : nsEventStatus_eConsumeNoDefault; } + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return nsEventStatus_eIgnore; + } mDeltaTypeIsPage = aEvent.mDeltaType == PanGestureInput::PANDELTA_PAGE; double delta = [&]() -> double { if (mDeltaTypeIsPage) { return -aEvent.mPanDisplacement.x / StaticPrefs::widget_swipe_page_size(); } - return -aEvent.mPanDisplacement.x / mWidget.GetDefaultScaleInternal() / + return -aEvent.mPanDisplacement.x / widget->GetDefaultScaleInternal() / StaticPrefs::widget_swipe_pixel_size(); }(); @@ -185,6 +194,8 @@ } void SwipeTracker::WillRefresh(TimeStamp aTime) { + RefPtr selfPin(this); + // FIXME(emilio): shouldn't we be using `aTime`? TimeStamp now = TimeStamp::Now(); mAxis.Simulate(now - mLastAnimationFrameTime); @@ -214,7 +225,11 @@ void SwipeTracker::SwipeFinished(const TimeStamp& aTimeStamp) { SendSwipeEvent(eSwipeGestureEnd, 0, 0.0, aTimeStamp); - mWidget.SwipeFinished(); + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return; + } + widget->SwipeFinished(); } void SwipeTracker::UnregisterFromRefreshDriver() { @@ -238,14 +253,18 @@ return geckoEvent; } -bool SwipeTracker::SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, +void SwipeTracker::SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, const TimeStamp& aTimeStamp) { + nsCOMPtr widget = do_QueryReferent(mWidget); + if (!widget) { + return; + } WidgetSimpleGestureEvent geckoEvent = - CreateSwipeGestureEvent(aMsg, &mWidget, mEventPosition, aTimeStamp); + CreateSwipeGestureEvent(aMsg, widget, mEventPosition, aTimeStamp); geckoEvent.mDirection = aDirection; geckoEvent.mDelta = aDelta; geckoEvent.mAllowedDirections = mAllowedDirections; - return mWidget.DispatchWindowEvent(geckoEvent); + widget->DispatchWindowEvent(geckoEvent); } // static diff -Nru thunderbird-140.9.0esr/widget/SwipeTracker.h thunderbird-140.10.0esr/widget/SwipeTracker.h --- thunderbird-140.9.0esr/widget/SwipeTracker.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/SwipeTracker.h 2026-04-21 14:53:09.000000000 +0000 @@ -11,6 +11,7 @@ #include "mozilla/layers/AxisPhysicsMSDModel.h" #include "mozilla/RefPtr.h" #include "mozilla/TimeStamp.h" +#include "nsIWeakReferenceUtils.h" #include "nsRefreshObservers.h" #include "Units.h" @@ -54,6 +55,8 @@ void Destroy(); + void StartTracking(const PanGestureInput& aSwipeStartEvent); + nsEventStatus ProcessEvent(const PanGestureInput& aEvent, bool aProcessingFirstEvent = false); void CancelSwipe(const TimeStamp& aTimeStamp); @@ -79,10 +82,10 @@ void StartAnimating(double aStartValue, double aTargetValue); void SwipeFinished(const TimeStamp& aTimeStamp); void UnregisterFromRefreshDriver(); - bool SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, + void SendSwipeEvent(EventMessage aMsg, uint32_t aDirection, double aDelta, const TimeStamp& aTimeStamp); - nsIWidget& mWidget; + nsWeakPtr mWidget; RefPtr mRefreshDriver; layers::AxisPhysicsMSDModel mAxis; const LayoutDeviceIntPoint mEventPosition; diff -Nru thunderbird-140.9.0esr/widget/TextEventDispatcher.cpp thunderbird-140.10.0esr/widget/TextEventDispatcher.cpp --- thunderbird-140.9.0esr/widget/TextEventDispatcher.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/TextEventDispatcher.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -527,7 +527,7 @@ nsCOMPtr nativeListener = mWidget->GetNativeTextEventDispatcherListener(); if (nativeListener) { - mIMENotificationRequests |= nativeListener->GetIMENotificationRequests(); + mIMENotificationRequests += nativeListener->GetIMENotificationRequests(); } } } diff -Nru thunderbird-140.9.0esr/widget/TextEventDispatcherListener.h thunderbird-140.10.0esr/widget/TextEventDispatcherListener.h --- thunderbird-140.9.0esr/widget/TextEventDispatcherListener.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/TextEventDispatcherListener.h 2026-04-21 14:53:09.000000000 +0000 @@ -5,14 +5,16 @@ #ifndef mozilla_textinputdispatcherlistener_h_ #define mozilla_textinputdispatcherlistener_h_ +#include "mozilla/EnumSet.h" #include "nsWeakReference.h" namespace mozilla { namespace widget { +enum class IMENotificationRequest : uint8_t; class TextEventDispatcher; struct IMENotification; -struct IMENotificationRequests; +using IMENotificationRequests = EnumSet; #define NS_TEXT_INPUT_PROXY_LISTENER_IID \ {0xf2226f55, \ diff -Nru thunderbird-140.9.0esr/widget/android/GeckoEditableSupport.cpp thunderbird-140.10.0esr/widget/android/GeckoEditableSupport.cpp --- thunderbird-140.9.0esr/widget/android/GeckoEditableSupport.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/android/GeckoEditableSupport.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -1461,7 +1461,7 @@ NS_IMETHODIMP_(IMENotificationRequests) GeckoEditableSupport::GetIMENotificationRequests() { - return IMENotificationRequests(IMENotificationRequests::NOTIFY_TEXT_CHANGE); + return {IMENotificationRequest::TextChange}; } static bool ShouldKeyboardDismiss(const nsAString& aInputType, diff -Nru thunderbird-140.9.0esr/widget/cocoa/TextInputHandler.mm thunderbird-140.10.0esr/widget/cocoa/TextInputHandler.mm --- thunderbird-140.9.0esr/widget/cocoa/TextInputHandler.mm 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/cocoa/TextInputHandler.mm 2026-04-21 14:53:10.000000000 +0000 @@ -3436,7 +3436,7 @@ // XXX Shouldn't we move floating window which shows composition string // when plugin has focus and its parent is scrolled or the window is // moved? - return IMENotificationRequests(IMENotificationRequests::NOTIFY_TEXT_CHANGE); + return {IMENotificationRequest::TextChange}; } NS_IMETHODIMP_(void) diff -Nru thunderbird-140.9.0esr/widget/gtk/DMABufSurface.cpp thunderbird-140.10.0esr/widget/gtk/DMABufSurface.cpp --- thunderbird-140.9.0esr/widget/gtk/DMABufSurface.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/gtk/DMABufSurface.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -919,13 +919,21 @@ const SurfaceDescriptor& aDesc) { const SurfaceDescriptorDMABuf& desc = aDesc.get_SurfaceDescriptorDMABuf(); + mBufferPlaneCount = desc.fds().Length(); + + MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); + if (mBufferPlaneCount <= 0 || desc.width().Length() == 0 || + desc.height().Length() == 0 || desc.modifier().Length() == 0 || + desc.strides().Length() < (uint32_t)mBufferPlaneCount || + desc.offsets().Length() < (uint32_t)mBufferPlaneCount) { + return false; + } + mFOURCCFormat = desc.fourccFormat(); mWidth = desc.width()[0]; mHeight = desc.height()[0]; - mBufferPlaneCount = desc.fds().Length(); mGbmBufferFlags = desc.flags(); mBufferModifier = desc.modifier()[0]; - MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); mUID = desc.uid(); mPID = desc.pid(); @@ -1482,6 +1490,9 @@ unsigned int subsample = i == 0 ? 0 : 1; unsigned int object = aDesc.layers[i].object_index[0]; + if (object >= aDesc.num_objects) { + return false; + } mBufferModifiers[i] = aDesc.objects[object].drm_format_modifier; mDrmFormats[i] = aDesc.layers[i].drm_format; mOffsets[i] = aDesc.layers[i].offset[0]; @@ -1515,6 +1526,9 @@ VADRMPRIMESurfaceDescriptor& aDesc) { for (unsigned int i = 0; i < aDesc.num_layers; i++) { unsigned int object = aDesc.layers[i].object_index[0]; + if (object >= aDesc.num_objects) { + continue; + } if (aDesc.objects[object].fd != -1) { close(aDesc.objects[object].fd); aDesc.objects[object].fd = -1; @@ -1792,6 +1806,19 @@ bool DMABufSurfaceYUV::ImportSurfaceDescriptor( const SurfaceDescriptorDMABuf& aDesc) { mBufferPlaneCount = aDesc.fds().Length(); + MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); + if (mBufferPlaneCount <= 0 || + aDesc.width().Length() < (uint32_t)mBufferPlaneCount || + aDesc.height().Length() < (uint32_t)mBufferPlaneCount || + aDesc.widthAligned().Length() < (uint32_t)mBufferPlaneCount || + aDesc.heightAligned().Length() < (uint32_t)mBufferPlaneCount || + aDesc.format().Length() < (uint32_t)mBufferPlaneCount || + aDesc.modifier().Length() < (uint32_t)mBufferPlaneCount || + aDesc.strides().Length() < (uint32_t)mBufferPlaneCount || + aDesc.offsets().Length() < (uint32_t)mBufferPlaneCount) { + return false; + } + mSurfaceType = SURFACE_YUV; mFOURCCFormat = aDesc.fourccFormat(); mColorSpace = aDesc.yUVColorSpace(); @@ -1804,7 +1831,6 @@ LOGDMABUF("DMABufSurfaceYUV::ImportSurfaceDescriptor() UID %d", mUID); - MOZ_RELEASE_ASSERT(mBufferPlaneCount <= DMABUF_BUFFER_PLANES); for (int i = 0; i < mBufferPlaneCount; i++) { mDmabufFds[i] = aDesc.fds()[i]; mWidth[i] = aDesc.width()[i]; diff -Nru thunderbird-140.9.0esr/widget/gtk/IMContextWrapper.cpp thunderbird-140.10.0esr/widget/gtk/IMContextWrapper.cpp --- thunderbird-140.9.0esr/widget/gtk/IMContextWrapper.cpp 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/widget/gtk/IMContextWrapper.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -603,13 +603,10 @@ NS_IMETHODIMP_(IMENotificationRequests) IMContextWrapper::GetIMENotificationRequests() { - IMENotificationRequests::Notifications notifications = - IMENotificationRequests::NOTIFY_NOTHING; // If it's not enabled, we don't need position change notification. - if (IsEnabled()) { - notifications |= IMENotificationRequests::NOTIFY_POSITION_CHANGE; - } - return IMENotificationRequests(notifications); + return IsEnabled() + ? IMENotificationRequests{IMENotificationRequest::PositionChange} + : IMENotificationRequests{}; } void IMContextWrapper::OnDestroyWindow(nsWindow* aWindow) { diff -Nru thunderbird-140.9.0esr/widget/gtk/nsFilePicker.cpp thunderbird-140.10.0esr/widget/gtk/nsFilePicker.cpp --- thunderbird-140.9.0esr/widget/gtk/nsFilePicker.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/gtk/nsFilePicker.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -30,6 +30,7 @@ #include "WidgetUtilsGtk.h" #include "gfxPlatform.h" +#include "GRefPtr.h" #include "nsFilePicker.h" #undef LOG @@ -615,10 +616,10 @@ } GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT; - auto* cancel_dialog = gtk_message_dialog_new( + RefPtr cancel_dialog = gtk_message_dialog_new( GTK_WINDOW(file_chooser), flags, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", NS_ConvertUTF16toUTF8(errorMessage).get()); - gtk_dialog_run(GTK_DIALOG(cancel_dialog)); + gtk_dialog_run(GTK_DIALOG(cancel_dialog.get())); gtk_widget_destroy(cancel_dialog); return true; diff -Nru thunderbird-140.9.0esr/widget/gtk/nsPrintDialogGTK.cpp thunderbird-140.10.0esr/widget/gtk/nsPrintDialogGTK.cpp --- thunderbird-140.9.0esr/widget/gtk/nsPrintDialogGTK.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/gtk/nsPrintDialogGTK.cpp 2026-04-21 14:53:10.000000000 +0000 @@ -10,6 +10,7 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/Services.h" +#include "GRefPtr.h" #include "MozContainer.h" #include "nsIPrintSettings.h" #include "nsIWidget.h" @@ -69,12 +70,12 @@ nsAutoString intlString; printBundle->GetStringFromName("headerFooterCustom", intlString); - GtkWidget* prompt_dialog = gtk_dialog_new_with_buttons( + RefPtr prompt_dialog = gtk_dialog_new_with_buttons( NS_ConvertUTF16toUTF8(intlString).get(), printDialog, - (GtkDialogFlags)(GTK_DIALOG_MODAL), g_dgettext("gtk30", "_Cancel"), - GTK_RESPONSE_REJECT, g_dgettext("gtk30", "_OK"), GTK_RESPONSE_ACCEPT, - nullptr); - gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog), + (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), + g_dgettext("gtk30", "_Cancel"), GTK_RESPONSE_REJECT, + g_dgettext("gtk30", "_OK"), GTK_RESPONSE_ACCEPT, nullptr); + gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog.get()), GTK_RESPONSE_ACCEPT); printBundle->GetStringFromName("customHeaderFooterPrompt", intlString); @@ -107,9 +108,9 @@ gtk_widget_show_all(custom_hbox); gtk_box_pack_start( - GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(prompt_dialog))), + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(prompt_dialog.get()))), custom_hbox, FALSE, FALSE, 0); - gint diag_response = gtk_dialog_run(GTK_DIALOG(prompt_dialog)); + gint diag_response = gtk_dialog_run(GTK_DIALOG(prompt_dialog.get())); if (diag_response == GTK_RESPONSE_ACCEPT) { const gchar* response_text = gtk_entry_get_text(GTK_ENTRY(custom_entry)); @@ -139,7 +140,7 @@ nsresult ExportSettings(nsIPrintSettings* aNSSettings); private: - GtkWidget* dialog; + RefPtr dialog; GtkWidget* shrink_to_fit_toggle; GtkWidget* print_bg_colors_toggle; GtkWidget* print_bg_images_toggle; @@ -177,9 +178,12 @@ dialog = gtk_print_unix_dialog_new(GetUTF8FromBundle("printTitleGTK").get(), gtkParent); + if (gtkParent) { + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog.get()), TRUE); + } gtk_print_unix_dialog_set_manual_capabilities( - GTK_PRINT_UNIX_DIALOG(dialog), + GTK_PRINT_UNIX_DIALOG(dialog.get()), GtkPrintCapabilities( GTK_PRINT_CAPABILITY_COPIES | GTK_PRINT_CAPABILITY_COLLATE | GTK_PRINT_CAPABILITY_REVERSE | GTK_PRINT_CAPABILITY_SCALE | @@ -315,7 +319,7 @@ gtk_box_pack_start(GTK_BOX(custom_options_tab), header_footer_vertical_squasher, FALSE, FALSE, 0); - gtk_print_unix_dialog_add_custom_tab(GTK_PRINT_UNIX_DIALOG(dialog), + gtk_print_unix_dialog_add_custom_tab(GTK_PRINT_UNIX_DIALOG(dialog.get()), custom_options_tab, tab_label); gtk_widget_show_all(custom_options_tab); } @@ -340,7 +344,7 @@ } gint nsPrintDialogWidgetGTK::Run() { - const gint response = gtk_dialog_run(GTK_DIALOG(dialog)); + const gint response = gtk_dialog_run(GTK_DIALOG(dialog.get())); gtk_widget_hide(dialog); return response; } @@ -394,8 +398,10 @@ aNSSettings->GetNumPagesPerSheet(&pagesPerSide); gtk_print_settings_set_number_up(settings, pagesPerSide); - gtk_print_unix_dialog_set_settings(GTK_PRINT_UNIX_DIALOG(dialog), settings); - gtk_print_unix_dialog_set_page_setup(GTK_PRINT_UNIX_DIALOG(dialog), setup); + gtk_print_unix_dialog_set_settings(GTK_PRINT_UNIX_DIALOG(dialog.get()), + settings); + gtk_print_unix_dialog_set_page_setup(GTK_PRINT_UNIX_DIALOG(dialog.get()), + setup); return NS_OK; } @@ -405,11 +411,11 @@ NS_ENSURE_TRUE(aNSSettings, NS_ERROR_FAILURE); GtkPrintSettings* settings = - gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog)); + gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog.get())); GtkPageSetup* setup = - gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog)); - GtkPrinter* printer = - gtk_print_unix_dialog_get_selected_printer(GTK_PRINT_UNIX_DIALOG(dialog)); + gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog.get())); + GtkPrinter* printer = gtk_print_unix_dialog_get_selected_printer( + GTK_PRINT_UNIX_DIALOG(dialog.get())); if (settings && setup && printer) { ExportHeaderFooter(aNSSettings); diff -Nru thunderbird-140.9.0esr/widget/nsBaseClipboard.cpp thunderbird-140.10.0esr/widget/nsBaseClipboard.cpp --- thunderbird-140.9.0esr/widget/nsBaseClipboard.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsBaseClipboard.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -244,11 +244,13 @@ MOZ_ASSERT(mClipboard); MOZ_ASSERT( mClipboard->nsIClipboard::IsClipboardTypeSupported(mClipboardType)); - MOZ_DIAGNOSTIC_ASSERT(mClipboard->mPendingWriteRequests[mClipboardType] == - this); + RefPtr selfPin(this); + + if (mClipboard->mPendingWriteRequests[mClipboardType] != this) { + return NS_ERROR_IN_PROGRESS; + } + mClipboard->mPendingWriteRequests[mClipboardType] = nullptr; - RefPtr request = - std::move(mClipboard->mPendingWriteRequests[mClipboardType]); nsresult rv = mClipboard->SetData(aTransferable, aOwner, mClipboardType, mWindowContext); MaybeNotifyCallback(rv); @@ -275,13 +277,13 @@ // take a reference to mClipboard. MOZ_ASSERT(IsValid()); + // Once the callback is notified, setData should not be allowed, so invalidate + // this request. + mClipboard = nullptr; if (nsCOMPtr callback = mCallback.forget()) { callback->OnComplete(aResult); } - // Once the callback is notified, setData should not be allowed, so invalidate - // this request. - mClipboard = nullptr; } void nsBaseClipboard::RejectPendingAsyncSetDataRequestIfAny( diff -Nru thunderbird-140.9.0esr/widget/nsBaseWidget.cpp thunderbird-140.10.0esr/widget/nsBaseWidget.cpp --- thunderbird-140.9.0esr/widget/nsBaseWidget.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsBaseWidget.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -1947,7 +1947,8 @@ mWidgetListener->WindowMoved(this, aX, aY, aByMoveToRect); } - if (mIMEHasFocus && IMENotificationRequestsRef().WantPositionChanged()) { + if (mIMEHasFocus && IMENotificationRequestsRef().contains( + IMENotificationRequest::PositionChange)) { NotifyIME(IMENotification(IMEMessage::NOTIFY_IME_OF_POSITION_CHANGE)); } } @@ -2371,6 +2372,7 @@ mSwipeTracker = new SwipeTracker(*this, aSwipeStartEvent, aAllowedDirections, direction); + mSwipeTracker->StartTracking(aSwipeStartEvent); if (!mAPZC) { mCurrentPanGestureBelongsToSwipe = true; diff -Nru thunderbird-140.9.0esr/widget/nsColorPickerProxy.cpp thunderbird-140.10.0esr/widget/nsColorPickerProxy.cpp --- thunderbird-140.9.0esr/widget/nsColorPickerProxy.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsColorPickerProxy.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -40,24 +40,22 @@ mozilla::ipc::IPCResult nsColorPickerProxy::RecvUpdate( const nsAString& aColor) { - if (mCallback) { - mCallback->Update(aColor); + if (nsCOMPtr callback = mCallback) { + callback->Update(aColor); } return IPC_OK(); } mozilla::ipc::IPCResult nsColorPickerProxy::Recv__delete__( const nsAString& aColor) { - if (mCallback) { - mCallback->Done(aColor); - mCallback = nullptr; + if (nsCOMPtr callback = std::move(mCallback)) { + callback->Done(aColor); } return IPC_OK(); } void nsColorPickerProxy::ActorDestroy(ActorDestroyReason aWhy) { - if (mCallback) { - mCallback->Done(u""_ns); - mCallback = nullptr; + if (nsCOMPtr callback = std::move(mCallback)) { + callback->Done(u""_ns); } } diff -Nru thunderbird-140.9.0esr/widget/nsGUIEventIPC.h thunderbird-140.10.0esr/widget/nsGUIEventIPC.h --- thunderbird-140.9.0esr/widget/nsGUIEventIPC.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsGUIEventIPC.h 2026-04-21 14:53:10.000000000 +0000 @@ -508,13 +508,19 @@ }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::TextRangeStyle::LineStyle, + mozilla::TextRangeStyle::LineStyle::None, + mozilla::TextRangeStyle::LineStyle::Wavy> {}; + +template <> struct ParamTraits { using paramType = mozilla::TextRangeStyle; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mDefinedStyles); - WriteParam(aWriter, static_cast( - aParam.mLineStyle)); + WriteParam(aWriter, aParam.mLineStyle); WriteParam(aWriter, aParam.mIsBoldLine); WriteParam(aWriter, aParam.mForegroundColor); WriteParam(aWriter, aParam.mBackgroundColor); @@ -522,41 +528,37 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::TextRangeStyle::LineStyleType lineStyle; - if (!ReadParam(aReader, &aResult->mDefinedStyles) || - !ReadParam(aReader, &lineStyle) || - !ReadParam(aReader, &aResult->mIsBoldLine) || - !ReadParam(aReader, &aResult->mForegroundColor) || - !ReadParam(aReader, &aResult->mBackgroundColor) || - !ReadParam(aReader, &aResult->mUnderlineColor)) { - return false; - } - aResult->mLineStyle = mozilla::TextRangeStyle::ToLineStyle(lineStyle); - return true; + return ReadParam(aReader, &aResult->mDefinedStyles) && + ReadParam(aReader, &aResult->mLineStyle) && + ReadParam(aReader, &aResult->mIsBoldLine) && + ReadParam(aReader, &aResult->mForegroundColor) && + ReadParam(aReader, &aResult->mBackgroundColor) && + ReadParam(aReader, &aResult->mUnderlineColor); } }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::TextRangeType, mozilla::TextRangeType::eUninitialized, + mozilla::TextRangeType::eSelectedClause> {}; + +template <> struct ParamTraits { using paramType = mozilla::TextRange; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mStartOffset); WriteParam(aWriter, aParam.mEndOffset); - WriteParam(aWriter, mozilla::ToRawTextRangeType(aParam.mRangeType)); + WriteParam(aWriter, aParam.mRangeType); WriteParam(aWriter, aParam.mRangeStyle); } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::RawTextRangeType rawTextRangeType; - if (ReadParam(aReader, &aResult->mStartOffset) && - ReadParam(aReader, &aResult->mEndOffset) && - ReadParam(aReader, &rawTextRangeType) && - ReadParam(aReader, &aResult->mRangeStyle)) { - aResult->mRangeType = mozilla::ToTextRangeType(rawTextRangeType); - return true; - } - return false; + return ReadParam(aReader, &aResult->mStartOffset) && + ReadParam(aReader, &aResult->mEndOffset) && + ReadParam(aReader, &aResult->mRangeType) && + ReadParam(aReader, &aResult->mRangeStyle); } }; @@ -669,19 +671,6 @@ }; template <> -struct ParamTraits { - using paramType = mozilla::widget::IMENotificationRequests; - - static void Write(MessageWriter* aWriter, const paramType& aParam) { - WriteParam(aWriter, aParam.mWantUpdates); - } - - static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, &aResult->mWantUpdates); - } -}; - -template <> struct ParamTraits { using paramType = mozilla::widget::NativeIMEContext; @@ -776,12 +765,21 @@ }; template <> +struct ParamTraits + : ContiguousEnumSerializerInclusive< + mozilla::widget::IMEMessage, + // FYI: mozilla::widget::NOTIFY_IME_OF_NOTHING is the actual lowest + // value, but it shouldn't be set at crossing the process boundary + // since it's odd to notify the process of "nothing happened". + mozilla::widget::NOTIFY_IME_OF_FOCUS, + mozilla::widget::REQUEST_TO_CANCEL_COMPOSITION> {}; + +template <> struct ParamTraits { using paramType = mozilla::widget::IMENotification; static void Write(MessageWriter* aWriter, const paramType& aParam) { - WriteParam(aWriter, - static_cast(aParam.mMessage)); + WriteParam(aWriter, aParam.mMessage); switch (aParam.mMessage) { case mozilla::widget::NOTIFY_IME_OF_SELECTION_CHANGE: WriteParam(aWriter, aParam.mSelectionChangeData); @@ -798,21 +796,29 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - mozilla::widget::IMEMessageType IMEMessage = 0; - if (!ReadParam(aReader, &IMEMessage)) { + if (!ReadParam(aReader, &aResult->mMessage)) { return false; } - aResult->mMessage = static_cast(IMEMessage); switch (aResult->mMessage) { + case mozilla::widget::NOTIFY_IME_OF_NOTHING: + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE( + "NOTIFY_IME_OF_NOTHING shouldn't cross the process boundary"); + return false; case mozilla::widget::NOTIFY_IME_OF_SELECTION_CHANGE: return ReadParam(aReader, &aResult->mSelectionChangeData); case mozilla::widget::NOTIFY_IME_OF_TEXT_CHANGE: return ReadParam(aReader, &aResult->mTextChangeData); case mozilla::widget::NOTIFY_IME_OF_MOUSE_BUTTON_EVENT: return ReadParam(aReader, &aResult->mMouseButtonEventData); - default: + case mozilla::widget::NOTIFY_IME_OF_FOCUS: + case mozilla::widget::NOTIFY_IME_OF_BLUR: + case mozilla::widget::NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED: + case mozilla::widget::NOTIFY_IME_OF_POSITION_CHANGE: + case mozilla::widget::REQUEST_TO_COMMIT_COMPOSITION: + case mozilla::widget::REQUEST_TO_CANCEL_COMPOSITION: return true; } + return false; } }; @@ -1032,6 +1038,16 @@ WriteParam(aWriter, aParam.mLayersId); } + template + static bool Read(MessageReader* aReader, mozilla::InputType aInputType, + T* aResult) { + if (!Read(aReader, static_cast(aResult))) { + return false; + } + return aResult->mInputType == aInputType; + } + + private: static bool Read(MessageReader* aReader, paramType* aResult) { return ReadParam(aReader, &aResult->mInputType) && ReadParam(aReader, &aResult->mTimeStamp) && @@ -1118,7 +1134,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::MULTITOUCH_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mTouches) && ReadParam(aReader, &aResult->mHandledByAPZ) && @@ -1160,7 +1177,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read(aReader, mozilla::MOUSE_INPUT, + aResult) && ReadParam(aReader, &aResult->mButtonType) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mInputSource) && @@ -1211,7 +1229,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::PANGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mPanStartPoint) && ReadParam(aReader, &aResult->mPanDisplacement) && @@ -1267,7 +1286,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::PINCHGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mSource) && ReadParam(aReader, &aResult->mScreenOffset) && @@ -1299,7 +1319,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::TAPGESTURE_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mPoint) && ReadParam(aReader, &aResult->mLocalPoint); @@ -1362,7 +1383,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::SCROLLWHEEL_INPUT, aResult) && ReadParam(aReader, &aResult->mDeltaType) && ReadParam(aReader, &aResult->mScrollMode) && ReadParam(aReader, &aResult->mOrigin) && @@ -1406,7 +1428,8 @@ } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, static_cast(aResult)) && + return ParamTraits::Read( + aReader, mozilla::KEYBOARD_INPUT, aResult) && ReadParam(aReader, &aResult->mType) && ReadParam(aReader, &aResult->mKeyCode) && ReadParam(aReader, &aResult->mCharCode) && diff -Nru thunderbird-140.9.0esr/widget/nsIWidget.h thunderbird-140.10.0esr/widget/nsIWidget.h --- thunderbird-140.9.0esr/widget/nsIWidget.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsIWidget.h 2026-04-21 14:53:10.000000000 +0000 @@ -343,6 +343,7 @@ typedef mozilla::widget::IMEEnabled IMEEnabled; typedef mozilla::widget::IMEMessage IMEMessage; typedef mozilla::widget::IMENotification IMENotification; + typedef mozilla::widget::IMENotificationRequest IMENotificationRequest; typedef mozilla::widget::IMENotificationRequests IMENotificationRequests; typedef mozilla::widget::IMEState IMEState; typedef mozilla::widget::InputContext InputContext; diff -Nru thunderbird-140.9.0esr/widget/nsTransferable.cpp thunderbird-140.10.0esr/widget/nsTransferable.cpp --- thunderbird-140.9.0esr/widget/nsTransferable.cpp 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/widget/nsTransferable.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -114,6 +114,7 @@ void DataStruct::ClearData() { if (mCacheFD) { PR_Close(mCacheFD); + mCacheFD = nullptr; } mData = nullptr; } diff -Nru thunderbird-140.9.0esr/widget/uikit/TextInputHandler.mm thunderbird-140.10.0esr/widget/uikit/TextInputHandler.mm --- thunderbird-140.9.0esr/widget/uikit/TextInputHandler.mm 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/widget/uikit/TextInputHandler.mm 2026-04-21 14:53:09.000000000 +0000 @@ -36,7 +36,7 @@ } IMENotificationRequests TextInputHandler::GetIMENotificationRequests() { - return IMENotificationRequests(); + return IMENotificationRequests{}; } void TextInputHandler::OnRemovedFrom( diff -Nru thunderbird-140.9.0esr/widget/windows/IMMHandler.cpp thunderbird-140.10.0esr/widget/windows/IMMHandler.cpp --- thunderbird-140.9.0esr/widget/windows/IMMHandler.cpp 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/IMMHandler.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -347,9 +347,8 @@ // static IMENotificationRequests IMMHandler::GetIMENotificationRequests() { - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_POSITION_CHANGE | - IMENotificationRequests::NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR); + return {IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar}; } // used for checking the lParam of WM_IME_COMPOSITION diff -Nru thunderbird-140.9.0esr/widget/windows/TSFEmptyTextStore.cpp thunderbird-140.10.0esr/widget/windows/TSFEmptyTextStore.cpp --- thunderbird-140.9.0esr/widget/windows/TSFEmptyTextStore.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/TSFEmptyTextStore.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -497,7 +497,7 @@ } IMENotificationRequests TSFEmptyTextStore::GetIMENotificationRequests() const { - return IMENotificationRequests(); + return {}; } } // namespace mozilla::widget diff -Nru thunderbird-140.9.0esr/widget/windows/TSFTextStore.cpp thunderbird-140.10.0esr/widget/windows/TSFTextStore.cpp --- thunderbird-140.9.0esr/widget/windows/TSFTextStore.cpp 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/TSFTextStore.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -3189,7 +3189,7 @@ if (NS_WARN_IF(!mDocumentMgr)) { // If there is no active text store, we don't need any notifications // since there is no sink which needs notifications. - return IMENotificationRequests(); + return {}; } // Otherwise, requests all notifications since even if some of them may not @@ -3207,11 +3207,10 @@ // focused element isn't changed. Therefore, if sEnabledTextStore isn't // nullptr, we need to keep notifying the sink even when it is not focused // text store for the thread manager. - return IMENotificationRequests( - IMENotificationRequests::NOTIFY_TEXT_CHANGE | - IMENotificationRequests::NOTIFY_POSITION_CHANGE | - IMENotificationRequests::NOTIFY_MOUSE_BUTTON_EVENT_ON_CHAR | - IMENotificationRequests::NOTIFY_DURING_DEACTIVE); + return {IMENotificationRequest::TextChange, + IMENotificationRequest::PositionChange, + IMENotificationRequest::MouseEventOnChar, + IMENotificationRequest::NotifyDuringInactive}; } nsresult TSFTextStore::OnTextChangeInternal( diff -Nru thunderbird-140.9.0esr/widget/windows/TSFUtils.cpp thunderbird-140.10.0esr/widget/windows/TSFUtils.cpp --- thunderbird-140.9.0esr/widget/windows/TSFUtils.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/TSFUtils.cpp 2026-04-21 14:53:10.000000000 +0000 @@ -622,7 +622,7 @@ IMENotificationRequests TSFUtils::GetIMENotificationRequests() { return sCurrentTextStore ? sCurrentTextStore->GetIMENotificationRequests() - : IMENotificationRequests(); + : IMENotificationRequests{}; } inline std::ostream& operator<<( diff -Nru thunderbird-140.9.0esr/widget/windows/TSFUtils.h thunderbird-140.10.0esr/widget/windows/TSFUtils.h --- thunderbird-140.9.0esr/widget/windows/TSFUtils.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/TSFUtils.h 2026-04-21 14:53:09.000000000 +0000 @@ -41,9 +41,6 @@ class TSFEmptyTextStore; class TSFTextStore; class TSFTextStoreBase; -struct IMENotificationRequests; -struct InputContext; -struct InputContextAction; class TSFUtils final { public: diff -Nru thunderbird-140.9.0esr/widget/windows/WinIMEHandler.cpp thunderbird-140.10.0esr/widget/windows/WinIMEHandler.cpp --- thunderbird-140.9.0esr/widget/windows/WinIMEHandler.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/widget/windows/WinIMEHandler.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -361,7 +361,7 @@ // an editor has focus isn't supported by IMEContentObserver nor // ContentCacheInParent. Therefore, we need to request whole notifications // which are necessary either IMMHandler or TSFTextStore. - return IMMHandler::GetIMENotificationRequests() | + return IMMHandler::GetIMENotificationRequests() + TSFUtils::GetIMENotificationRequests(); } diff -Nru thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSContext.cpp thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSContext.cpp --- thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSContext.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSContext.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -1018,18 +1018,40 @@ : public DiscardableRunnable { public: explicit CleanupRunnable(FinalizationRegistryCleanup* aCleanupWork) - : DiscardableRunnable("CleanupRunnable"), mCleanupWork(aCleanupWork) {} + : DiscardableRunnable("CleanupRunnable"), mCleanupWork(aCleanupWork) { + MOZ_ASSERT(aCleanupWork); + } + + virtual ~CleanupRunnable() { + if (mCleanupWork) { + clearPendingRunnable(); + } + } // MOZ_CAN_RUN_SCRIPT_BOUNDARY until Runnable::Run is MOZ_CAN_RUN_SCRIPT. See // bug 1535398. MOZ_CAN_RUN_SCRIPT_BOUNDARY NS_IMETHOD Run() override { + if (!mCleanupWork) { + // The FinalizationRegistryCleanup has been destroyed. + return NS_OK; + } + + clearPendingRunnable(); + mCleanupWork->DoCleanup(); + mCleanupWork = nullptr; return NS_OK; } + void clearPendingRunnable() { + MOZ_ASSERT(mCleanupWork->mPendingRunnable == this); + mCleanupWork->mPendingRunnable = nullptr; + } + private: FinalizationRegistryCleanup* mCleanupWork; + friend class FinalizationRegistryCleanup; }; FinalizationRegistryCleanup::FinalizationRegistryCleanup( @@ -1039,6 +1061,10 @@ void FinalizationRegistryCleanup::Destroy() { // This must happen before the CycleCollectedJSContext destructor calls // JS_DestroyContext(). + if (mPendingRunnable) { + MOZ_ASSERT(mPendingRunnable->mCleanupWork == this); + mPendingRunnable->mCleanupWork = nullptr; + } mCallbacks.reset(); } @@ -1059,7 +1085,7 @@ void FinalizationRegistryCleanup::QueueCallback(JSFunction* aDoCleanup, JSObject* aHostDefinedData) { - bool firstCallback = mCallbacks.empty(); + MOZ_ASSERT_IF(!mCallbacks.empty(), mPendingRunnable); JSObject* incumbentGlobal = nullptr; @@ -1074,9 +1100,9 @@ MOZ_ALWAYS_TRUE(mCallbacks.append(Callback{aDoCleanup, incumbentGlobal})); - if (firstCallback) { - RefPtr cleanup = new CleanupRunnable(this); - NS_DispatchToCurrentThread(cleanup.forget()); + if (!mPendingRunnable) { + mPendingRunnable = new CleanupRunnable(this); + NS_DispatchToCurrentThread(mPendingRunnable); } } diff -Nru thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSContext.h thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSContext.h --- thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSContext.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSContext.h 2026-04-21 14:53:10.000000000 +0000 @@ -134,6 +134,10 @@ // pointer to its containing context here. CycleCollectedJSContext* mContext; + // Weak pointer to a previously dispatched runnable. The CleanupRunnable::Run + // method will null out this pointer. + CleanupRunnable* mPendingRunnable = nullptr; + using CallbackVector = JS::GCVector; JS::PersistentRooted mCallbacks; }; diff -Nru thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSRuntime.cpp thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.cpp --- thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSRuntime.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -1762,8 +1762,15 @@ for (auto iter = objects.Iter(); !iter.Done(); iter.Next()) { nsWrapperCache* cache = iter.Get(); + if (MOZ_UNLIKELY(!cache)) { + continue; + } JSObject* wrapper = cache->GetWrapperMaybeDead(); - MOZ_DIAGNOSTIC_ASSERT(wrapper); + if (MOZ_UNLIKELY(!wrapper)) { + // Wrapper might have been cleared temporarily while updating reflector + // global. + continue; + } if (js::gc::InCollectedNurseryRegion(wrapper)) { MOZ_ASSERT(!cache->PreservingWrapper()); @@ -1789,6 +1796,17 @@ mNurseryObjects.InfallibleAppend(aCache); } +void CycleCollectedJSRuntime::NurseryWrapperRemovedSlow( + nsWrapperCache* aCache) { + MOZ_ASSERT(aCache); + for (auto iter = mNurseryObjects.IterFromLast(); !iter.Done(); iter.Prev()) { + if (iter.Get() == aCache) { + iter.Get() = nullptr; + return; + } + } +} + void CycleCollectedJSRuntime::DeferredFinalize( DeferredFinalizeAppendFunction aAppendFunc, DeferredFinalizeFunction aFunc, void* aThing) { diff -Nru thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSRuntime.h thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.h --- thunderbird-140.9.0esr/xpcom/base/CycleCollectedJSRuntime.h 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/base/CycleCollectedJSRuntime.h 2026-04-21 14:53:09.000000000 +0000 @@ -529,6 +529,7 @@ // storage), because we do not want to keep it alive. nsWrapperCache handles // this for us via its "object moved" handling. void NurseryWrapperAdded(nsWrapperCache* aCache); + void NurseryWrapperRemovedSlow(nsWrapperCache* aCache); void JSObjectsTenured(JS::GCContext* aGCContext); void DeferredFinalize(DeferredFinalizeAppendFunction aAppendFunc, diff -Nru thunderbird-140.9.0esr/xpcom/base/nsISupportsImpl.h thunderbird-140.10.0esr/xpcom/base/nsISupportsImpl.h --- thunderbird-140.9.0esr/xpcom/base/nsISupportsImpl.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/base/nsISupportsImpl.h 2026-04-21 14:53:10.000000000 +0000 @@ -20,6 +20,7 @@ #include "nsXPCOM.h" #include #include +#include #include "mozilla/Attributes.h" #include "mozilla/Assertions.h" #include "mozilla/Atomics.h" @@ -416,6 +417,31 @@ mValue.store(aValue, std::memory_order_release); return aValue; } + // Atomically decrements the refcount if it is strictly above Limit. + // Returns the pair of {success, new value}. + template + MOZ_ALWAYS_INLINE std::pair DecrementWithLimit() { + // This ensures we can never release the final reference on this thread. + // Callers which want to do that should use operator--() which adds the + // appropriate fencing. + static_assert(Limit > 0, + "DecrementWithLimit cannot release the final reference"); + nsrefcnt count = mValue.load(std::memory_order_relaxed); + while (count > Limit) { + // Since this may be the last release on this thread, we need + // release semantics on success so that prior writes on this thread + // are visible to the thread that destroys the object when it reads + // mValue with acquire semantics. + // On failure, this thread still owns a reference to the object, + // so no synchronization is required. + if (mValue.compare_exchange_weak(count, count - 1, + std::memory_order_release, + std::memory_order_relaxed)) { + return {true, count - 1}; + } + } + return {false, count}; + } MOZ_ALWAYS_INLINE operator nsrefcnt() const { return get(); } MOZ_ALWAYS_INLINE nsrefcnt get() const { // Use acquire semantics since we're not sure what the caller is diff -Nru thunderbird-140.9.0esr/xpcom/ds/StaticAtoms.py thunderbird-140.10.0esr/xpcom/ds/StaticAtoms.py --- thunderbird-140.9.0esr/xpcom/ds/StaticAtoms.py 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/ds/StaticAtoms.py 2026-04-21 14:53:09.000000000 +0000 @@ -2037,7 +2037,6 @@ Atom("chrome", "chrome"), Atom("moz", "moz"), Atom("moz_icon", "moz-icon"), - Atom("moz_gio", "moz-gio"), Atom("proxy", "proxy"), Atom("privateBrowsingAllowedPermission", "internal:privateBrowsingAllowed"), Atom("svgContextPropertiesAllowedPermission", "internal:svgContextPropertiesAllowed"), diff -Nru thunderbird-140.9.0esr/xpcom/io/nsLocalFileCommon.cpp thunderbird-140.10.0esr/xpcom/io/nsLocalFileCommon.cpp --- thunderbird-140.9.0esr/xpcom/io/nsLocalFileCommon.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/io/nsLocalFileCommon.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -53,6 +53,7 @@ ".chm", ".cmd", ".com", + ".command", // Mac script ".cpl", ".crt", ".der", @@ -115,6 +116,7 @@ ".scf", // Windows explorer command ".scr", ".sct", + ".search-ms", // Windows Saved Search ".settingcontent-ms", ".shb", ".shs", diff -Nru thunderbird-140.9.0esr/xpcom/io/nsLocalFileCommon.h thunderbird-140.10.0esr/xpcom/io/nsLocalFileCommon.h --- thunderbird-140.9.0esr/xpcom/io/nsLocalFileCommon.h 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/io/nsLocalFileCommon.h 2026-04-21 14:53:09.000000000 +0000 @@ -8,9 +8,9 @@ #define _NS_LOCAL_FILE_COMMON_H_ #ifdef MOZ_ESR -extern const char* const sExecutableExts[110]; +extern const char* const sExecutableExts[112]; #else -extern const char* const sExecutableExts[111]; +extern const char* const sExecutableExts[113]; #endif #endif diff -Nru thunderbird-140.9.0esr/xpcom/io/nsLocalFileUnix.cpp thunderbird-140.10.0esr/xpcom/io/nsLocalFileUnix.cpp --- thunderbird-140.9.0esr/xpcom/io/nsLocalFileUnix.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/io/nsLocalFileUnix.cpp 2026-04-21 14:53:10.000000000 +0000 @@ -1958,21 +1958,22 @@ // Search for any of the set of executable extensions. static const char* const executableExts[] = { #ifdef MOZ_WIDGET_COCOA - "afploc", // Can point to other files. + ".afploc", // Can point to other files. #endif - "air", // Adobe AIR installer + ".air", // Adobe AIR installer #ifdef MOZ_WIDGET_COCOA - "atloc", // Can point to other files. - "fileloc", // File location files can be used to point to other - // files. - "ftploc", // Can point to other files. - "inetloc", // Shouldn't be able to do the same, but can, due to - // macOS vulnerabilities. - "terminal", // macOS Terminal app configuration files + ".atloc", // Can point to other files. + ".command", // Mac script + ".fileloc", // File location files can be used to point to other + // files. + ".ftploc", // Can point to other files. + ".inetloc", // Shouldn't be able to do the same, but can, due to + // macOS vulnerabilities. + ".terminal", // macOS Terminal app configuration files #endif - "jar" // java application bundle + ".jar" // java application bundle }; - nsDependentSubstring ext = Substring(path, dotIdx + 1); + nsDependentSubstring ext = Substring(path, dotIdx); for (auto executableExt : executableExts) { if (ext.EqualsASCII(executableExt)) { // Found a match. Set result and quit. diff -Nru thunderbird-140.9.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp thunderbird-140.10.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp --- thunderbird-140.9.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp 2026-03-20 19:18:50.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/tests/gtest/TestAutoRefCnt.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -43,6 +43,37 @@ Atomic nsThreadSafeAutoRefCntRunner::sIncToOne(0); Atomic nsThreadSafeAutoRefCntRunner::sDecToZero(0); +class nsThreadSafeAutoRefCntDecrementWithLimitRunner final : public Runnable { + public: + static constexpr size_t kDecrementsPerThread = 1000; + + NS_IMETHOD Run() final { + for (size_t i = 0; i < kDecrementsPerThread; i++) { + auto [ok, count] = sRefCnt.DecrementWithLimit<1>(); + if (!ok) { + sLimitHits++; + break; + } + } + return NS_OK; + } + + static ThreadSafeAutoRefCnt sRefCnt; + // Relaxed ordering so sLimitHits doesn't affect the ordering properties of + // DecrementWithLimit being tested. + static Atomic sLimitHits; + + nsThreadSafeAutoRefCntDecrementWithLimitRunner() + : Runnable("nsThreadSafeAutoRefCntDecrementWithLimitRunner") {} + + private: + ~nsThreadSafeAutoRefCntDecrementWithLimitRunner() = default; +}; + +ThreadSafeAutoRefCnt nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt; +Atomic + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits(0); + // When a refcounted object is actually owned by a cache, we may not // want to release the object after last reference gets released. In // this pattern, the cache may rely on the balance of increment to one @@ -51,16 +82,87 @@ { static const size_t kThreadCount = 4; nsCOMPtr threads[kThreadCount]; - for (size_t i = 0; i < kThreadCount; i++) { - nsresult rv = - NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(threads[i]), - new nsThreadSafeAutoRefCntRunner); + for (auto& thread : threads) { + nsresult rv = NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(thread), + new nsThreadSafeAutoRefCntRunner); EXPECT_NS_SUCCEEDED(rv); } - for (size_t i = 0; i < kThreadCount; i++) { - threads[i]->Shutdown(); + for (const auto& thread : threads) { + thread->Shutdown(); } EXPECT_EQ(nsThreadSafeAutoRefCntRunner::sRefCnt, nsrefcnt(0)); EXPECT_EQ(nsThreadSafeAutoRefCntRunner::sIncToOne, nsThreadSafeAutoRefCntRunner::sDecToZero); } + +// Spawns kThreadCount threads each attempting kDecrementsPerThread +// decrements, then verifies the final refcount is 1 and that exactly +// aExpectedLimitHits threads hit the limit. +// kInitial is derived from aExpectedLimitHits so that exactly +// (kThreadCount - aExpectedLimitHits) threads can complete all their +// decrements; the rest hit the limit. +static void RunDecrementWithLimitThreaded(uint32_t aExpectedLimitHits) { + static const size_t kThreadCount = 4; + const nsrefcnt kInitial = + (kThreadCount - aExpectedLimitHits) * + nsThreadSafeAutoRefCntDecrementWithLimitRunner::kDecrementsPerThread + + 1; + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt = kInitial; + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits = 0; + + nsCOMPtr threads[kThreadCount]; + for (auto& thread : threads) { + nsresult rv = + NS_NewNamedThread("AutoRefCnt Test", getter_AddRefs(thread), + new nsThreadSafeAutoRefCntDecrementWithLimitRunner); + EXPECT_NS_SUCCEEDED(rv); + } + for (const auto& thread : threads) { + thread->Shutdown(); + } + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt, + nsrefcnt(1)); + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sLimitHits, + uint32_t(aExpectedLimitHits)); +} + +// Verify DecrementWithLimit with no lost updates when the limit is never hit. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitNoHit) +{ + RunDecrementWithLimitThreaded(0); +} + +// Verify DecrementWithLimit correctly enforces the limit. With kInitial == 1 +// (equal to Limit), all threads hit the limit on their first attempt, +// giving a deterministic sLimitHits == kThreadCount. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitHit) +{ + static const size_t kThreadCount = 4; + RunDecrementWithLimitThreaded(kThreadCount); +} + +// Verify DecrementWithLimit performs exactly kDecrementsPerThread successful +// decrements before hitting the limit. Single-threaded for determinism. +TEST(AutoRefCnt, ThreadSafeAutoRefCntDecrementWithLimitSequential) +{ + const nsrefcnt kDecrementsPerThread = + nsThreadSafeAutoRefCntDecrementWithLimitRunner::kDecrementsPerThread; + // Initialize so exactly kDecrementsPerThread decrements succeed before + // hitting the limit at 1. + nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt = + kDecrementsPerThread + 1; + + size_t successes = 0; + while (true) { + auto [ok, count] = nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt + .DecrementWithLimit<1>(); + if (!ok) { + break; + } + successes++; + } + + EXPECT_EQ(successes, size_t(kDecrementsPerThread)); + EXPECT_EQ(nsThreadSafeAutoRefCntDecrementWithLimitRunner::sRefCnt, + nsrefcnt(1)); +} diff -Nru thunderbird-140.9.0esr/xpcom/threads/nsThreadPool.cpp thunderbird-140.10.0esr/xpcom/threads/nsThreadPool.cpp --- thunderbird-140.9.0esr/xpcom/threads/nsThreadPool.cpp 2026-03-20 19:18:49.000000000 +0000 +++ thunderbird-140.10.0esr/xpcom/threads/nsThreadPool.cpp 2026-04-21 14:53:09.000000000 +0000 @@ -466,6 +466,10 @@ MOZ_ASSERT(gCurrentThreadPool.get() == this); gCurrentThreadPool.set(nullptr); + // Clear the thread's back-pointer into this pool so that the profiler's + // SamplerThread stops using it for this thread. + static_cast(current.get())->SetPoolThreadFreePtr(nullptr); + if (shutdownThreadOnExit) { ShutdownThread(current); }