author | Noemi Erli <nerli@mozilla.com> |
Tue, 09 Oct 2018 07:01:46 +0300 | |
changeset 440136 | adf7408d9bc64caec663921f7a21e43164b0a387 |
parent 440135 | f95186d58bfaad221b599e284b57d980ade32468 (current diff) |
parent 440040 | cd94fba048645c2e73776138aac06c1b85ad334b (diff) |
child 440137 | 6a6c984745eff7fdcaeb6ec930e9c0669abaab9a |
push id | 70564 |
push user | nerli@mozilla.com |
push date | Tue, 09 Oct 2018 04:06:18 +0000 |
treeherder | autoland@ac590db9a294 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 64.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -3275,46 +3275,87 @@ function BrowserFullScreen() { window.fullScreen = !window.fullScreen; } function getWebNavigation() { return gBrowser.webNavigation; } function BrowserReloadWithFlags(reloadFlags) { - let url = gBrowser.currentURI.spec; - if (gBrowser.updateBrowserRemotenessByURL(gBrowser.selectedBrowser, url)) { - // If the remoteness has changed, the new browser doesn't have any - // information of what was loaded before, so we need to load the previous - // URL again. - gBrowser.loadURI(url, { - flags: reloadFlags, - triggeringPrincipal: gBrowser.selectedBrowser.contentPrincipal, - }); + let unchangedRemoteness = []; + + for (let tab of gBrowser.selectedTabs) { + let browser = tab.linkedBrowser; + let url = browser.currentURI.spec; + if (gBrowser.updateBrowserRemotenessByURL(browser, url)) { + // If the remoteness has changed, the new browser doesn't have any + // information of what was loaded before, so we need to load the previous + // URL again. + if (tab.linkedPanel) { + loadBrowserURI(browser, url); + } else { + // Shift to fully loaded browser and make + // sure load handler is instantiated. + tab.addEventListener("SSTabRestoring", + () => loadBrowserURI(browser, url), + { once: true }); + gBrowser._insertBrowser(tab); + } + } else { + unchangedRemoteness.push(tab); + } + } + + if (unchangedRemoteness.length == 0) { return; } // Do this after the above case where we might flip remoteness. // Unfortunately, we'll count the remoteness flip case as a // "newURL" load, since we're using loadURI, but hopefully // that's rare enough to not matter. - maybeRecordAbandonmentTelemetry(gBrowser.selectedTab, "reload"); - - // Reset temporary permissions on the current tab. This is done here - // because we only want to reset permissions on user reload. - SitePermissions.clearTemporaryPermissions(gBrowser.selectedBrowser); + for (let tab of unchangedRemoteness) { + maybeRecordAbandonmentTelemetry(tab, "reload"); + } + + // Reset temporary permissions on the remaining tabs to reload. + // This is done here because we only want to reset + // permissions on user reload. + for (let tab of unchangedRemoteness) { + SitePermissions.clearTemporaryPermissions(tab.linkedBrowser); + } PanelMultiView.hidePopup(gIdentityHandler._identityPopup); let handlingUserInput = window.windowUtils.isHandlingUserInput; - gBrowser.selectedBrowser - .messageManager - .sendAsyncMessage("Browser:Reload", - { flags: reloadFlags, handlingUserInput }); + for (let tab of unchangedRemoteness) { + if (tab.linkedPanel) { + sendReloadMessage(tab); + } else { + // Shift to fully loaded browser and make + // sure load handler is instantiated. + tab.addEventListener("SSTabRestoring", () => sendReloadMessage(tab), { once: true }); + gBrowser._insertBrowser(tab); + } + } + + function loadBrowserURI(browser, url) { + browser.loadURI(url, { + flags: reloadFlags, + triggeringPrincipal: browser.contentPrincipal, + }); + } + + function sendReloadMessage(tab) { + tab.linkedBrowser + .messageManager + .sendAsyncMessage("Browser:Reload", + { flags: reloadFlags, handlingUserInput }); + } } function getSecurityInfo(securityInfoAsString) { if (!securityInfoAsString) return null; const serhelper = Cc["@mozilla.org/network/serialization-helper;1"] .getService(Ci.nsISerializationHelper);
--- a/browser/base/content/test/tabs/browser_multiselect_tabs_reload.js +++ b/browser/base/content/test/tabs/browser_multiselect_tabs_reload.js @@ -1,50 +1,89 @@ const PREF_MULTISELECT_TABS = "browser.tabs.multiselect"; async function tabLoaded(tab) { - const browser = gBrowser.getBrowserForTab(tab); - await BrowserTestUtils.browserLoaded(browser); - return true; + const browser = gBrowser.getBrowserForTab(tab); + await BrowserTestUtils.browserLoaded(browser); + return true; } add_task(async function setPref() { - await SpecialPowers.pushPrefEnv({ - set: [[PREF_MULTISELECT_TABS, true]], - }); + await SpecialPowers.pushPrefEnv({ + set: [[PREF_MULTISELECT_TABS, true]], + }); }); -add_task(async function test() { +add_task(async function test_usingTabContextMenu() { + let tab1 = await addTab(); + let tab2 = await addTab(); + let tab3 = await addTab(); + + let menuItemReloadTab = document.getElementById("context_reloadTab"); + let menuItemReloadSelectedTabs = document.getElementById("context_reloadSelectedTabs"); + + await BrowserTestUtils.switchTab(gBrowser, tab1); + await triggerClickOn(tab2, { ctrlKey: true }); + + ok(tab1.multiselected, "Tab1 is multi-selected"); + ok(tab2.multiselected, "Tab2 is multi-selected"); + ok(!tab3.multiselected, "Tab3 is not multi-selected"); + + updateTabContextMenu(tab3); + is(menuItemReloadTab.hidden, false, "Reload Tab is visible"); + is(menuItemReloadSelectedTabs.hidden, true, "Reload Tabs is hidden"); + + updateTabContextMenu(tab2); + is(menuItemReloadTab.hidden, true, "Reload Tab is hidden"); + is(menuItemReloadSelectedTabs.hidden, false, "Reload Tabs is visible"); + + let tab1Loaded = tabLoaded(tab1); + let tab2Loaded = tabLoaded(tab2); + menuItemReloadSelectedTabs.click(); + await tab1Loaded; + await tab2Loaded; + + // We got here because tab1 and tab2 are reloaded. Otherwise the test would have timed out and failed. + ok(true, "Tab1 and Tab2 are reloaded"); + + BrowserTestUtils.removeTab(tab1); + BrowserTestUtils.removeTab(tab2); + BrowserTestUtils.removeTab(tab3); +}); + +add_task(async function test_usingKeyboardShortcuts() { + let keys = [ + ["R", { accelKey: true }], + ["R", { accelKey: true, shift: true }], + ["VK_F5", {}], + ]; + + if (AppConstants.platform != "macosx") { + keys.push(["VK_F5", { accelKey: true }]); + } + + for (let key of keys) { + let tab1 = await addTab(); let tab2 = await addTab(); let tab3 = await addTab(); - let menuItemReloadTab = document.getElementById("context_reloadTab"); - let menuItemReloadSelectedTabs = document.getElementById("context_reloadSelectedTabs"); - await BrowserTestUtils.switchTab(gBrowser, tab1); await triggerClickOn(tab2, { ctrlKey: true }); ok(tab1.multiselected, "Tab1 is multi-selected"); ok(tab2.multiselected, "Tab2 is multi-selected"); ok(!tab3.multiselected, "Tab3 is not multi-selected"); - updateTabContextMenu(tab3); - is(menuItemReloadTab.hidden, false, "Reload Tab is visible"); - is(menuItemReloadSelectedTabs.hidden, true, "Reload Selected Tabs is hidden"); - - updateTabContextMenu(tab2); - is(menuItemReloadTab.hidden, true, "Reload Tab is hidden"); - is(menuItemReloadSelectedTabs.hidden, false, "Reload Selected Tabs is visible"); - let tab1Loaded = tabLoaded(tab1); let tab2Loaded = tabLoaded(tab2); - menuItemReloadSelectedTabs.click(); + EventUtils.synthesizeKey(key[0], key[1]); await tab1Loaded; await tab2Loaded; // We got here because tab1 and tab2 are reloaded. Otherwise the test would have timed out and failed. ok(true, "Tab1 and Tab2 are reloaded"); BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab2); BrowserTestUtils.removeTab(tab3); + } });
--- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -73,17 +73,16 @@ skip-if = (os == 'mac' && debug) # Bug 1 [browser_ext_commands_execute_page_action.js] skip-if = (verify && (os == 'linux' || os == 'mac')) [browser_ext_commands_execute_sidebar_action.js] [browser_ext_commands_getAll.js] [browser_ext_commands_onCommand.js] [browser_ext_commands_update.js] [browser_ext_connect_and_move_tabs.js] [browser_ext_contentscript_connect.js] -[browser_ext_contentscript_nontab_connect.js] [browser_ext_contextMenus.js] [browser_ext_contextMenus_checkboxes.js] [browser_ext_contextMenus_commands.js] [browser_ext_contextMenus_icons.js] [browser_ext_contextMenus_onclick.js] [browser_ext_contextMenus_radioGroups.js] [browser_ext_contextMenus_targetUrlPatterns.js] [browser_ext_contextMenus_uninstall.js]
--- a/browser/components/extensions/test/browser/browser-remote.ini +++ b/browser/components/extensions/test/browser/browser-remote.ini @@ -6,12 +6,14 @@ # in this manifest to the sub-directory "test-oop-extensions", and then check # whether we're running from that directory from head.js install-to-subdir = test-oop-extensions tags = webextensions remote-webextensions skip-if = !e10s support-files = head.js +[browser_ext_contentscript_nontab_connect.js] + [browser_ext_popup_select.js] skip-if = debug || os != 'win' # FIXME: re-enable on debug build (bug 1442822) [include:browser-common.ini]
--- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -93,16 +93,20 @@ DOMInterfaces = { 'channelInterpretation': 'channelInterpretationValue', }, }, 'AudioWorklet': { 'nativeType': 'mozilla::dom::Worklet', }, +'AudioWorkletGlobalScope': { + 'implicitJSContext': [ 'registerProcessor' ], +}, + 'BarProp': { 'headerFile': 'mozilla/dom/BarProps.h', }, 'BaseAudioContext': { 'nativeType': 'mozilla::dom::AudioContext', },
--- a/dom/bindings/Errors.msg +++ b/dom/bindings/Errors.msg @@ -110,8 +110,9 @@ MSG_DEF(MSG_INVALID_CURVE_DURATION_ERROR MSG_DEF(MSG_INVALID_AUDIOPARAM_METHOD_START_TIME_ERROR, 0, JSEXN_RANGEERR, "The start time for an AudioParam method must be non-negative.") MSG_DEF(MSG_INVALID_AUDIOPARAM_METHOD_END_TIME_ERROR, 0, JSEXN_RANGEERR, "The end time for an AudioParam method must be non-negative.") MSG_DEF(MSG_INVALID_AUDIOPARAM_EXPONENTIAL_VALUE_ERROR, 0, JSEXN_RANGEERR, "The value passed to exponentialRampToValueAtTime must be positive.") MSG_DEF(MSG_INVALID_AUDIOPARAM_EXPONENTIAL_CONSTANT_ERROR, 0, JSEXN_RANGEERR, "The exponential constant passed to setTargetAtTime must be non-negative.") MSG_DEF(MSG_VALUE_OUT_OF_RANGE, 1, JSEXN_RANGEERR, "The value for the {0} is outside the valid range.") MSG_DEF(MSG_INVALID_PANNERNODE_REFDISTANCE_ERROR, 0, JSEXN_RANGEERR, "The refDistance value passed to PannerNode must not be negative.") MSG_DEF(MSG_INVALID_PANNERNODE_MAXDISTANCE_ERROR, 0, JSEXN_RANGEERR, "The maxDistance value passed to PannerNode must be positive.") MSG_DEF(MSG_INVALID_PANNERNODE_ROLLOFF_ERROR, 0, JSEXN_RANGEERR, "The rolloffFactor value passed to PannerNode must not be negative.") +MSG_DEF(MSG_NOT_ARRAY_NOR_UNDEFINED, 1, JSEXN_TYPEERR, "{0} is neither an array nor undefined.")
--- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -2694,18 +2694,18 @@ HTMLMediaElement::CurrentTime() const } void HTMLMediaElement::FastSeek(double aTime, ErrorResult& aRv) { LOG(LogLevel::Debug, ("%p FastSeek(%f) called by JS", this, aTime)); LOG(LogLevel::Debug, ("Reporting telemetry VIDEO_FASTSEEK_USED")); Telemetry::Accumulate(Telemetry::VIDEO_FASTSEEK_USED, 1); - RefPtr<Promise> tobeDropped = Seek(aTime, SeekTarget::PrevSyncPoint, aRv); - aRv.SuppressException(); + RefPtr<Promise> tobeDropped = Seek(aTime, SeekTarget::PrevSyncPoint, + IgnoreErrors()); } already_AddRefed<Promise> HTMLMediaElement::SeekToNextFrame(ErrorResult& aRv) { /* This will cause JIT code to be kept around longer, to help performance * when using SeekToNextFrame to iterate through every frame of a video. */ @@ -2720,18 +2720,18 @@ HTMLMediaElement::SeekToNextFrame(ErrorR return Seek(CurrentTime(), SeekTarget::NextFrame, aRv); } void HTMLMediaElement::SetCurrentTime(double aCurrentTime, ErrorResult& aRv) { LOG(LogLevel::Debug, ("%p SetCurrentTime(%f) called by JS", this, aCurrentTime)); - RefPtr<Promise> tobeDropped = Seek(aCurrentTime, SeekTarget::Accurate, aRv); - aRv.SuppressException(); + RefPtr<Promise> tobeDropped = Seek(aCurrentTime, SeekTarget::Accurate, + IgnoreErrors()); } /** * Check if aValue is inside a range of aRanges, and if so returns true * and puts the range index in aIntervalIndex. If aValue is not * inside a range, returns false, and aIntervalIndex * is set to the index of the range which starts immediately after aValue * (and can be aRanges.Length() if aValue is after the last range). @@ -2764,16 +2764,17 @@ HTMLMediaElement::Seek(double aTime, { // Note: Seek is called both by synchronous code that expects errors thrown in // aRv, as well as asynchronous code that expects a promise. Make sure all // synchronous errors are returned using aRv, not promise rejections. // aTime should be non-NaN. MOZ_ASSERT(!mozilla::IsNaN(aTime)); + RefPtr<Promise> promise = CreateDOMPromise(aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } // Detect if user has interacted with element by seeking so that // play will not be blocked when initiated by a script. if (EventStateManager::IsHandlingUserInput()) { mIsBlessed = true; @@ -2885,17 +2886,19 @@ HTMLMediaElement::Seek(double aTime, // event if it changes the playback position as a result of the seek. LOG(LogLevel::Debug, ("%p SetCurrentTime(%f) starting seek", this, aTime)); mDecoder->Seek(aTime, aSeekType); // We changed whether we're seeking so we need to AddRemoveSelfReference. AddRemoveSelfReference(); // Keep the DOM promise. - return do_AddRef(mSeekDOMPromise = CreateDOMPromise(aRv)); + mSeekDOMPromise = promise; + + return promise.forget(); } double HTMLMediaElement::Duration() const { if (mSrcStream) { return std::numeric_limits<double>::infinity(); } @@ -4274,47 +4277,54 @@ HTMLMediaElement::UpdateWakeLock() MOZ_ASSERT(NS_IsMainThread()); // Ensure we have a wake lock if we're playing audibly. This ensures the // device doesn't sleep while playing. bool playing = !mPaused; bool isAudible = Volume() > 0.0 && !mMuted && mIsAudioTrackAudible; // WakeLock when playing audible media. if (playing && isAudible) { - WakeLockCreate(); + CreateAudioWakeLockIfNeeded(); } else { - WakeLockRelease(); - } -} - -void -HTMLMediaElement::WakeLockCreate() + ReleaseAudioWakeLockIfExists(); + } +} + +void +HTMLMediaElement::CreateAudioWakeLockIfNeeded() { if (!mWakeLock) { RefPtr<power::PowerManagerService> pmService = power::PowerManagerService::GetInstance(); NS_ENSURE_TRUE_VOID(pmService); ErrorResult rv; - mWakeLock = pmService->NewWakeLock( - NS_LITERAL_STRING("audio-playing"), OwnerDoc()->GetInnerWindow(), rv); - } -} - -void -HTMLMediaElement::WakeLockRelease() + mWakeLock = pmService->NewWakeLock(NS_LITERAL_STRING("audio-playing"), + OwnerDoc()->GetInnerWindow(), + rv); + } +} + +void +HTMLMediaElement::ReleaseAudioWakeLockIfExists() { if (mWakeLock) { ErrorResult rv; mWakeLock->Unlock(rv); rv.SuppressException(); mWakeLock = nullptr; } } +void +HTMLMediaElement::WakeLockRelease() +{ + ReleaseAudioWakeLockIfExists(); +} + HTMLMediaElement::OutputMediaStream::OutputMediaStream() : mNextAvailableTrackID(1) , mFinishWhenEnded(false) , mCapturingAudioOnly(false) , mCapturingDecoder(false) , mCapturingMediaStream(false) { } @@ -7748,16 +7758,17 @@ HTMLMediaElement::SetMediaInfo(const Med if (aInfo.HasAudio() != oldHasAudio) { UpdateAudioChannelPlayingState(); NotifyAudioPlaybackChanged( AudioChannelService::AudibleChangedReasons::eDataAudibleChanged); } if (mAudioChannelWrapper) { mAudioChannelWrapper->AudioCaptureStreamChangeIfNeeded(); } + UpdateWakeLock(); } void HTMLMediaElement::AudioCaptureStreamChange(bool aCapture) { // No need to capture a silence media element. if (!HasAudio()) { return; @@ -8186,31 +8197,31 @@ HasDebuggerOrTabsPrivilege(JSContext* aC void HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists() { MOZ_ASSERT(NS_IsMainThread()); if (mSeekDOMPromise) { RefPtr<dom::Promise> promise = mSeekDOMPromise.forget(); nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction( "dom::HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists", - [=]() { promise->MaybeResolveWithUndefined(); }); + [promise]() { promise->MaybeResolveWithUndefined(); }); mAbstractMainThread->Dispatch(r.forget()); mSeekDOMPromise = nullptr; } } void HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists() { MOZ_ASSERT(NS_IsMainThread()); if (mSeekDOMPromise) { RefPtr<dom::Promise> promise = mSeekDOMPromise.forget(); nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction( "dom::HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists", - [=]() { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); }); + [promise]() { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); }); mAbstractMainThread->Dispatch(r.forget()); mSeekDOMPromise = nullptr; } } void HTMLMediaElement::ReportCanPlayTelemetry() {
--- a/dom/html/HTMLMediaElement.h +++ b/dom/html/HTMLMediaElement.h @@ -839,18 +839,16 @@ protected: class StreamListener; class StreamSizeListener; class ShutdownObserver; MediaDecoderOwner::NextFrameStatus NextFrameStatus(); void SetDecoder(MediaDecoder* aDecoder); - void UpdateWakeLock(); - // Holds references to the DOM wrappers for the MediaStreams that we're // writing to. struct OutputMediaStream { OutputMediaStream(); ~OutputMediaStream(); RefPtr<DOMMediaStream> mStream; TrackID mNextAvailableTrackID; @@ -877,21 +875,24 @@ protected: /** * Use this method to change the mNetworkState member, so required * actions will be taken during the transition. */ void ChangeNetworkState(nsMediaNetworkState aState); /** - * These two methods are called when mPaused is changed to ensure we have - * a wake lock active when we're playing audibly. + * The MediaElement will be responsible for creating and releasing the audio + * wakelock depending on the playing and audible state. */ - virtual void WakeLockCreate(); virtual void WakeLockRelease(); + virtual void UpdateWakeLock(); + + void CreateAudioWakeLockIfNeeded(); + void ReleaseAudioWakeLockIfExists(); RefPtr<WakeLock> mWakeLock; /** * Logs a warning message to the web console to report various failures. * aMsg is the localized message identifier, aParams is the parameters to * be substituted into the localized message, and aParamCount is the number * of parameters in aParams. */
--- a/dom/html/HTMLVideoElement.cpp +++ b/dom/html/HTMLVideoElement.cpp @@ -291,54 +291,72 @@ HTMLVideoElement::GetVideoPlaybackQualit } RefPtr<VideoPlaybackQuality> playbackQuality = new VideoPlaybackQuality(this, creationTime, totalFrames, droppedFrames, corruptedFrames); return playbackQuality.forget(); } -void -HTMLVideoElement::WakeLockCreate() -{ - HTMLMediaElement::WakeLockCreate(); - UpdateScreenWakeLock(); -} void HTMLVideoElement::WakeLockRelease() { - UpdateScreenWakeLock(); HTMLMediaElement::WakeLockRelease(); + ReleaseVideoWakeLockIfExists(); } void -HTMLVideoElement::UpdateScreenWakeLock() +HTMLVideoElement::UpdateWakeLock() { - if (mScreenWakeLock && mPaused) { - ErrorResult rv; - mScreenWakeLock->Unlock(rv); - rv.SuppressException(); - mScreenWakeLock = nullptr; - return; + HTMLMediaElement::UpdateWakeLock(); + if (!mPaused) { + CreateVideoWakeLockIfNeeded(); + } else { + ReleaseVideoWakeLockIfExists(); } +} - if (!mScreenWakeLock && !mPaused && HasVideo()) { +bool +HTMLVideoElement::ShouldCreateVideoWakeLock() const +{ + // Make sure we only request wake lock for video with audio track, because + // video without audio track is often used as background image which seems no + // need to hold a wakelock. + return HasVideo() && HasAudio(); +} + +void +HTMLVideoElement::CreateVideoWakeLockIfNeeded() +{ + if (!mScreenWakeLock && ShouldCreateVideoWakeLock()) { RefPtr<power::PowerManagerService> pmService = power::PowerManagerService::GetInstance(); NS_ENSURE_TRUE_VOID(pmService); ErrorResult rv; mScreenWakeLock = pmService->NewWakeLock(NS_LITERAL_STRING("video-playing"), OwnerDoc()->GetInnerWindow(), rv); } } void +HTMLVideoElement::ReleaseVideoWakeLockIfExists() +{ + if (mScreenWakeLock) { + ErrorResult rv; + mScreenWakeLock->Unlock(rv); + rv.SuppressException(); + mScreenWakeLock = nullptr; + return; + } +} + +void HTMLVideoElement::Init() { Preferences::AddBoolVarCache(&sVideoStatsEnabled, "media.video_stats.enabled"); } /* static */ bool HTMLVideoElement::IsVideoStatsEnabled()
--- a/dom/html/HTMLVideoElement.h +++ b/dom/html/HTMLVideoElement.h @@ -150,19 +150,28 @@ public: mIsOrientationLocked = aLock; } protected: virtual ~HTMLVideoElement(); virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; - virtual void WakeLockCreate() override; - virtual void WakeLockRelease() override; - void UpdateScreenWakeLock(); + /** + * We create video wakelock when the video is playing and release it when + * video pauses. Note, the actual platform wakelock will automatically be + * released when the page is in the background, so we don't need to check the + * video's visibility by ourselves. + */ + void WakeLockRelease() override; + void UpdateWakeLock() override; + + bool ShouldCreateVideoWakeLock() const; + void CreateVideoWakeLockIfNeeded(); + void ReleaseVideoWakeLockIfExists(); RefPtr<WakeLock> mScreenWakeLock; bool mIsOrientationLocked; private: static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, MappedDeclarations&);
--- a/dom/webidl/AudioWorkletGlobalScope.webidl +++ b/dom/webidl/AudioWorkletGlobalScope.webidl @@ -4,13 +4,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * The origin of this IDL file is * https://webaudio.github.io/web-audio-api/#audioworkletglobalscope */ [Global=(Worklet,AudioWorklet),Exposed=AudioWorklet] interface AudioWorkletGlobalScope : WorkletGlobalScope { + [Throws] void registerProcessor (DOMString name, VoidFunction processorCtor); readonly attribute unsigned long long currentFrame; readonly attribute double currentTime; readonly attribute float sampleRate; };
--- a/dom/worklet/AudioWorkletGlobalScope.cpp +++ b/dom/worklet/AudioWorkletGlobalScope.cpp @@ -1,22 +1,31 @@ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=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 "AudioWorkletGlobalScope.h" -#include "WorkletPrincipal.h" +#include "jsapi.h" #include "mozilla/dom/AudioWorkletGlobalScopeBinding.h" -#include "mozilla/dom/FunctionBinding.h" +#include "WorkletPrincipal.h" namespace mozilla { namespace dom { +NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope, + mNameToProcessorMap); + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AudioWorkletGlobalScope) +NS_INTERFACE_MAP_END_INHERITING(WorkletGlobalScope) + +NS_IMPL_ADDREF_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope) +NS_IMPL_RELEASE_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope) + AudioWorkletGlobalScope::AudioWorkletGlobalScope(WorkletImpl* aImpl) : WorkletGlobalScope(aImpl) , mCurrentFrame(0) , mCurrentTime(0) , mSampleRate(0.0) {} bool @@ -26,20 +35,163 @@ AudioWorkletGlobalScope::WrapGlobalObjec JS::RealmOptions options; return AudioWorkletGlobalScope_Binding::Wrap(aCx, this, this, options, WorkletPrincipal::GetWorkletPrincipal(), true, aReflector); } void -AudioWorkletGlobalScope::RegisterProcessor(const nsAString& aType, - VoidFunction& aProcessorCtor) +AudioWorkletGlobalScope::RegisterProcessor(JSContext* aCx, + const nsAString& aName, + VoidFunction& aProcessorCtor, + ErrorResult& aRv) { - // Nothing to do here. + JS::Rooted<JSObject*> processorConstructor(aCx, aProcessorCtor.CallableOrNull()); + + /** + * 1. If the name is the empty string, throw a NotSupportedError + * exception and abort these steps because the empty string is not + * a valid key. + */ + if (aName.IsEmpty()) { + aRv.ThrowDOMException(NS_ERROR_DOM_NOT_SUPPORTED_ERR, + NS_LITERAL_CSTRING( + "Argument 1 of AudioWorkletGlobalScope.registerProcessor " + "should not be an empty string.")); + return; + } + + /** + * 2. If the name exists as a key in the node name to processor + * definition map, throw a NotSupportedError exception and abort + * these steps because registering a definition with a duplicated + * key is not allowed. + */ + if (mNameToProcessorMap.GetWeak(aName)) { + // Duplicate names are not allowed + aRv.ThrowDOMException(NS_ERROR_DOM_NOT_SUPPORTED_ERR, + NS_LITERAL_CSTRING( + "Argument 1 of AudioWorkletGlobalScope.registerProcessor " + "is invalid: a class with the same name is already registered.")); + return; + } + + JS::Rooted<JSObject*> constructorUnwrapped( + aCx, js::CheckedUnwrap(processorConstructor)); + if (!constructorUnwrapped) { + // If the caller's compartment does not have permission to access the + // unwrapped constructor then throw. + aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); + return; + } + + /** + * 3. If the result of IsConstructor(argument=processorCtor) is false, + * throw a TypeError and abort these steps. + */ + if (!JS::IsConstructor(constructorUnwrapped)) { + aRv.ThrowTypeError<MSG_NOT_CONSTRUCTOR>(NS_LITERAL_STRING( + "Argument 2 of AudioWorkletGlobalScope.registerProcessor")); + return; + } + + /** + * 4. Let prototype be the result of Get(O=processorCtor, P="prototype"). + */ + // The .prototype on the constructor passed could be an "expando" of a + // wrapper. So we should get it from wrapper instead of the underlying + // object. + JS::Rooted<JS::Value> prototype(aCx); + if (!JS_GetProperty(aCx, processorConstructor, "prototype", &prototype)) { + aRv.NoteJSContextException(aCx); + return; + } + + /** + * 5. If the result of Type(argument=prototype) is not Object, throw a + * TypeError and abort all these steps. + */ + if (!prototype.isObject()) { + aRv.ThrowTypeError<MSG_NOT_OBJECT>(NS_LITERAL_STRING( + "Argument 2 of AudioWorkletGlobalScope.registerProcessor " + "processorCtor.prototype")); + return; + } + + /** + * 6. If the result of IsCallable(argument=Get(O=prototype, P="process")) + * is false, throw a TypeError and abort these steps. + */ + JS::Rooted<JS::Value> process(aCx); + JS::Rooted<JSObject*> prototypeObject(aCx, &prototype.toObject()); + if (!JS_GetProperty(aCx, prototypeObject, "process", &process)) { + aRv.NoteJSContextException(aCx); + return; + } + + if (!process.isObjectOrNull() || + !JS::IsCallable(process.toObjectOrNull())) { + aRv.ThrowTypeError<MSG_NOT_CALLABLE>(NS_LITERAL_STRING( + "Argument 2 of AudioWorkletGlobalScope.registerProcessor " + "constructor.process")); + return; + } + + /** + * 7. Let descriptors be the result of Get(O=processorCtor, + * P="parameterDescriptors"). + */ + JS::Rooted<JS::Value> descriptors(aCx); + if (!JS_GetProperty(aCx, processorConstructor, "parameterDescriptors", + &descriptors)) { + aRv.NoteJSContextException(aCx); + return; + } + + /** + * 8. If descriptors is neither an array nor undefined, throw a + * TypeError and abort these steps. + */ + bool isArray = false; + if (!JS_IsArrayObject(aCx, descriptors, &isArray)) { + // I would assume isArray won't be set to true if JS_IsArrayObject + // failed, but just in case, force it to false + isArray = false; + JS_ClearPendingException(aCx); + } + + if (!descriptors.isUndefined() && !isArray) { + aRv.ThrowTypeError<MSG_NOT_ARRAY_NOR_UNDEFINED>(NS_LITERAL_STRING( + "Argument 2 of AudioWorkletGlobalScope.registerProcessor " + "constructor.parameterDescriptors")); + return; + } + + /** + * 9. Let definition be a new AudioWorkletProcessor definition with: + * - node name being name + * - processor class constructor being processorCtor + * 10. Add the key-value pair (name - definition) to the node name to + * processor definition map of the associated AudioWorkletGlobalScope. + */ + if (!mNameToProcessorMap.Put(aName, &aProcessorCtor, fallible)) { + aRv.Throw(NS_ERROR_OUT_OF_MEMORY); + return; + } + + /** + * 11. Queue a task to the control thread to add the key-value pair + * (name - descriptors) to the node name to parameter descriptor + * map of the associated BaseAudioContext. + */ + // TODO: we don't have a proper mechanism to communicate with the + // control thread currently. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=1473467#c3 + // and https://bugzilla.mozilla.org/show_bug.cgi?id=1492014 } uint64_t AudioWorkletGlobalScope::CurrentFrame() const { return mCurrentFrame; } double AudioWorkletGlobalScope::CurrentTime() const
--- a/dom/worklet/AudioWorkletGlobalScope.h +++ b/dom/worklet/AudioWorkletGlobalScope.h @@ -2,49 +2,57 @@ /* vim: set ts=8 sts=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/. */ #ifndef mozilla_dom_AudioWorkletGlobalScope_h #define mozilla_dom_AudioWorkletGlobalScope_h +#include "mozilla/dom/FunctionBinding.h" #include "mozilla/dom/WorkletGlobalScope.h" +#include "nsRefPtrHashtable.h" namespace mozilla { class WorkletImpl; namespace dom { -class VoidFunction; class AudioWorkletGlobalScope final : public WorkletGlobalScope { public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioWorkletGlobalScope, WorkletGlobalScope); + explicit AudioWorkletGlobalScope(WorkletImpl* aImpl); bool WrapGlobalObject(JSContext* aCx, JS::MutableHandle<JSObject*> aReflector) override; void - RegisterProcessor(const nsAString& aType, - VoidFunction& aProcessorCtor); + RegisterProcessor(JSContext* aCx, const nsAString& aName, + VoidFunction& aProcessorCtor, + ErrorResult& aRv); uint64_t CurrentFrame() const; double CurrentTime() const; float SampleRate() const; private: ~AudioWorkletGlobalScope() = default; uint64_t mCurrentFrame; double mCurrentTime; float mSampleRate; + + typedef nsRefPtrHashtable<nsStringHashKey, VoidFunction> NodeNameToProcessorDefinitionMap; + NodeNameToProcessorDefinitionMap mNameToProcessorMap; }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_AudioWorkletGlobalScope_h
--- a/dom/worklet/tests/mochitest.ini +++ b/dom/worklet/tests/mochitest.ini @@ -11,13 +11,15 @@ support-files=worklet_console.js skip-if = verify support-files=server_import_with_cache.sjs [test_dump.html] support-files=worklet_dump.js [test_audioWorklet_insecureContext.html] scheme = http [test_audioWorklet.html] support-files=worklet_audioWorklet.js +[test_audioWorkletGlobalScopeRegisterProcessor.html] +support-files=worklet_test_audioWorkletGlobalScopeRegisterProcessor.js [test_exception.html] support-files=worklet_exception.js [test_paintWorklet.html] scheme = http support-files=worklet_paintWorklet.js
new file mode 100644 --- /dev/null +++ b/dom/worklet/tests/test_audioWorkletGlobalScopeRegisterProcessor.html @@ -0,0 +1,68 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test for AudioWorklet</title> + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + <script type="application/javascript" src="common.js"></script> +</head> +<body> + +<script type="application/javascript"> + +function configureTest() { + + var expected_errors = [ + "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor is not a constructor.", + "NotSupportedError: Argument 1 of AudioWorkletGlobalScope.registerProcessor should not be an empty string.", + "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor is not an object.", + "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.process is not callable.", + "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.process is not callable.", + "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.parameterDescriptors is neither an array nor undefined.", + "NotSupportedError: Argument 1 of AudioWorkletGlobalScope.registerProcessor is invalid: a class with the same name is already registered.", + ]; + + var expected_errors_i = 0; + + function consoleListener() { + SpecialPowers.addObserver(this, "console-api-log-event"); + } + + consoleListener.prototype = { + observe: function(aSubject, aTopic, aData) { + if (aTopic == "console-api-log-event") { + var obj = aSubject.wrappedJSObject; + if (obj.arguments[0] == expected_errors[expected_errors_i]) { + ok(true, "Expected error received: " + obj.arguments[0]); + expected_errors_i++; + } + + if (expected_errors_i == expected_errors.length) { + // All errors have been received, this test has been completed + // succesfully! + SpecialPowers.removeObserver(this, "console-api-log-event"); + SimpleTest.finish(); + return; + } + } + } + } + + var cl = new consoleListener(); + + return SpecialPowers.pushPrefEnv( + {"set": [["dom.audioworklet.enabled", true], + ["dom.worklet.enabled", true]]}); +} + +// This function is called into an iframe. +function runTestInIframe() { + ok(window.isSecureContext, "Test should run in secure context"); + var audioContext = new AudioContext(); + ok(audioContext.audioWorklet instanceof AudioWorklet, + "AudioContext.audioWorklet should be an instance of AudioWorklet"); + audioContext.audioWorklet.addModule("worklet_test_audioWorkletGlobalScopeRegisterProcessor.js") +} +</script> +</body> +</html>
--- a/dom/worklet/tests/worklet_audioWorklet.js +++ b/dom/worklet/tests/worklet_audioWorklet.js @@ -1,3 +1,12 @@ -// This should work for real... at some point. -registerProcessor("sure!", () => {}); +class DummyProcessWorkletProcessor extends AudioWorkletProcessor { + constructor() { super(); } + + process() { + // Do nothing, output silence + } +} + +// We need to pass a valid AudioWorkletProcessor here, otherwise, it will fail, +// and the console.log won't be executed +registerProcessor("sure!", DummyProcessWorkletProcessor); console.log(this instanceof AudioWorkletGlobalScope ? "So far so good" : "error");
new file mode 100644 --- /dev/null +++ b/dom/worklet/tests/worklet_test_audioWorkletGlobalScopeRegisterProcessor.js @@ -0,0 +1,106 @@ +// Define several classes. +// Only the last ones are valid. +class EmptyWorkletProcessor extends AudioWorkletProcessor { +} + +class NoProcessWorkletProcessor extends AudioWorkletProcessor { + constructor() { super(); } +} + +class BadDescriptorsWorkletProcessor extends AudioWorkletProcessor { + constructor() { super(); } + + process() { + // Do nothing, output silence + } + + static get parameterDescriptors() { + return "A string"; + } +} + +class GoodDescriptorsWorkletProcessor extends AudioWorkletProcessor { + constructor() { super(); } + + process() { + // Do nothing, output silence + } + + static get parameterDescriptors() { + return [{ + name: 'myParam', defaultValue: 0.707 + }]; + } +} + +class DummyProcessWorkletProcessor extends AudioWorkletProcessor { + constructor() { super(); } + + process() { + // Do nothing, output silence + } +} + +// Test not a constructor +// "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor is not a constructor." +try { + registerProcessor("sure!", () => {}); +} catch (e) { + console.log(e) +} + +// Test empty name +// "NotSupportedError: Argument 1 of AudioWorkletGlobalScope.registerProcessor should not be an empty string." +try { + registerProcessor("", EmptyWorkletProcessor); +} catch (e) { + console.log(e) +} + +// Test not an object +// "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor is not an object." +try { + registerProcessor("my-worklet-processor", ""); +} catch (e) { + console.log(e) +} + +// Test Empty class definition +// "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.process is not callable." +try { + registerProcessor("empty-worklet-processor", EmptyWorkletProcessor); +} catch (e) { + console.log(e) +} + +// Test class with constructor but not process function +// "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.process is not callable." +try { + registerProcessor("no-worklet-processor", NoProcessWorkletProcessor); +} catch (e) { + console.log(e) +} + +// Test class with parameterDescriptors not being array nor undefined +// "TypeError: Argument 2 of AudioWorkletGlobalScope.registerProcessor constructor.parameterDescriptors is neither an array nor undefined." +try { + registerProcessor("bad-descriptors-worklet-processor", BadDescriptorsWorkletProcessor); +} catch (e) { + console.log(e) +} + +// Test class with good parameterDescriptors +// No error expected here +registerProcessor("good-descriptors-worklet-processor", GoodDescriptorsWorkletProcessor); + +// Test class with constructor and process function +// No error expected here +registerProcessor("dummy-worklet-processor", DummyProcessWorkletProcessor); + +// Test class adding class with the same name twice +// "NotSupportedError: Operation is not supported: Argument 1 of AudioWorkletGlobalScope.registerProcessor is invalid: a class with the same name is already registered." +try { + registerProcessor("dummy-worklet-processor", DummyProcessWorkletProcessor); +} catch (e) { + console.log(e) +}
--- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -2705,31 +2705,33 @@ JS_AlreadyHasOwnElement(JSContext* cx, J extern JS_PUBLIC_API(JSObject*) JS_NewArrayObject(JSContext* cx, const JS::HandleValueArray& contents); extern JS_PUBLIC_API(JSObject*) JS_NewArrayObject(JSContext* cx, size_t length); /** - * Returns true and sets |*isArray| indicating whether |value| is an Array - * object or a wrapper around one, otherwise returns false on failure. + * On success, returns true, setting |*isArray| to true if |value| is an Array + * object or a wrapper around one, or to false if not. Returns false on + * failure. * - * This method returns true with |*isArray == false| when passed a proxy whose - * target is an Array, or when passed a revoked proxy. + * This method returns true with |*isArray == false| when passed an ES6 proxy + * whose target is an Array, or when passed a revoked proxy. */ extern JS_PUBLIC_API(bool) JS_IsArrayObject(JSContext* cx, JS::HandleValue value, bool* isArray); /** - * Returns true and sets |*isArray| indicating whether |obj| is an Array object - * or a wrapper around one, otherwise returns false on failure. + * On success, returns true, setting |*isArray| to true if |obj| is an Array + * object or a wrapper around one, or to false if not. Returns false on + * failure. * - * This method returns true with |*isArray == false| when passed a proxy whose - * target is an Array, or when passed a revoked proxy. + * This method returns true with |*isArray == false| when passed an ES6 proxy + * whose target is an Array, or when passed a revoked proxy. */ extern JS_PUBLIC_API(bool) JS_IsArrayObject(JSContext* cx, JS::HandleObject obj, bool* isArray); extern JS_PUBLIC_API(bool) JS_GetArrayLength(JSContext* cx, JS::Handle<JSObject*> obj, uint32_t* lengthp); extern JS_PUBLIC_API(bool)
--- a/layout/generic/TextOverflow.h +++ b/layout/generic/TextOverflow.h @@ -40,17 +40,17 @@ class TextOverflow final { /** * Constructor, which client code SHOULD NOT use directly. Instead, clients * should call WillProcessLines(), which is basically the factory function * for TextOverflow instances. */ TextOverflow(nsDisplayListBuilder* aBuilder, nsIFrame* aBlockFrame); - TextOverflow() = default; + TextOverflow() = delete; ~TextOverflow() = default; TextOverflow(TextOverflow&&) = default; TextOverflow(const TextOverflow&) = delete; TextOverflow& operator=(TextOverflow&&) = default; TextOverflow& operator=(const TextOverflow&) = delete; /** * Analyze the display lists for text overflow and what kind of item is at
--- a/security/ct/BTVerifier.cpp +++ b/security/ct/BTVerifier.cpp @@ -1,19 +1,23 @@ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=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 "BTVerifier.h" + +#include <stdint.h> + #include "CTUtils.h" #include "SignedCertificateTimestamp.h" - -#include <stdint.h> +#include "hasht.h" +#include "mozpkix/pkixnss.h" +#include "mozpkix/pkixutil.h" namespace mozilla { namespace ct { using namespace mozilla::pkix; typedef mozilla::pkix::Result Result; // Members of a Inclusion Proof struct @@ -84,9 +88,156 @@ DecodeInclusionProof(pkix::Reader& reade InputToBuffer(logId, result.logId); result.inclusionPath = std::move(inclusionPath); output = std::move(result); return Success; } + +static Result +CommonFinishDigest(UniquePK11Context& context, size_t digestAlgorithmLength, + /* out */ Buffer& outputBuffer) +{ + uint32_t outLen = 0; + outputBuffer.assign(digestAlgorithmLength, 0); + if (PK11_DigestFinal(context.get(), outputBuffer.data(), &outLen, + digestAlgorithmLength) != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + if (outLen != digestAlgorithmLength) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + return Success; +} + +static Result +LeafHash(Input leafEntry, size_t digestAlgorithmLength, + SECOidTag digestAlgorithmId, /* out */ Buffer& calculatedHash) +{ + UniquePK11Context context(PK11_CreateDigestContext(digestAlgorithmId)); + if (!context) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + const unsigned char zero = 0; + if (PK11_DigestOp(context.get(), &zero, 1u) != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + SECItem leafEntryItem = UnsafeMapInputToSECItem(leafEntry); + if (PK11_DigestOp(context.get(), leafEntryItem.data, leafEntryItem.len) + != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + return CommonFinishDigest(context, digestAlgorithmLength, calculatedHash); +} + +static Result +NodeHash(const Buffer& left, const Buffer& right, size_t digestAlgorithmLength, + SECOidTag digestAlgorithmId, /* out */ Buffer& calculatedHash) +{ + UniquePK11Context context(PK11_CreateDigestContext(digestAlgorithmId)); + if (!context) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + const unsigned char one = 1; + if (PK11_DigestOp(context.get(), &one, 1u) != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + if (PK11_DigestOp(context.get(), left.data(), left.size()) != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + if (PK11_DigestOp(context.get(), right.data(), right.size()) != SECSuccess) { + return Result::FATAL_ERROR_LIBRARY_FAILURE; + } + return CommonFinishDigest(context, digestAlgorithmLength, calculatedHash); +} + +static Result +GetDigestAlgorithmLengthAndIdentifier(DigestAlgorithm digestAlgorithm, + /* out */ size_t& digestAlgorithmLength, + /* out */ SECOidTag& digestAlgorithmId) +{ + switch (digestAlgorithm) { + case DigestAlgorithm::sha512: + digestAlgorithmLength = SHA512_LENGTH; + digestAlgorithmId = SEC_OID_SHA512; + return Success; + case DigestAlgorithm::sha256: + digestAlgorithmLength = SHA256_LENGTH; + digestAlgorithmId = SEC_OID_SHA256; + return Success; + default: + return pkix::Result::FATAL_ERROR_INVALID_ARGS; + } +} + +// This algorithm is specified by: +// https://tools.ietf.org/html/draft-ietf-trans-rfc6962-bis-28#section-2.1.3.2 +Result +VerifyInclusionProof(const InclusionProofDataV2& proof, Input leafEntry, + Input expectedRootHash, DigestAlgorithm digestAlgorithm) +{ + if (proof.treeSize == 0) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + size_t digestAlgorithmLength; + SECOidTag digestAlgorithmId; + Result rv = GetDigestAlgorithmLengthAndIdentifier(digestAlgorithm, + digestAlgorithmLength, digestAlgorithmId); + if (rv != Success) { + return rv; + } + if (proof.leafIndex >= proof.treeSize) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + if (expectedRootHash.GetLength() != digestAlgorithmLength) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + uint64_t leafIndex = proof.leafIndex; + uint64_t lastNodeIndex = proof.treeSize - 1; + Buffer calculatedHash; + rv = LeafHash(leafEntry, digestAlgorithmLength, digestAlgorithmId, + calculatedHash); + if (rv != Success) { + return rv; + } + for (const auto& hash: proof.inclusionPath) { + if (lastNodeIndex == 0) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + if (leafIndex % 2 == 1 || leafIndex == lastNodeIndex) { + rv = NodeHash(hash, calculatedHash, digestAlgorithmLength, + digestAlgorithmId, calculatedHash); + if (rv != Success) { + return rv; + } + if (leafIndex % 2 == 0) { + while (leafIndex % 2 == 0 && lastNodeIndex > 0) { + leafIndex >>= 1; + lastNodeIndex >>= 1; + } + } + } else { + rv = NodeHash(calculatedHash, hash, digestAlgorithmLength, + digestAlgorithmId, calculatedHash); + if (rv != Success) { + return rv; + } + } + leafIndex >>= 1; + lastNodeIndex >>= 1; + } + if (lastNodeIndex != 0) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + assert(calculatedHash.size() == digestAlgorithmLength); + if (calculatedHash.size() != digestAlgorithmLength) { + return pkix::Result::FATAL_ERROR_LIBRARY_FAILURE; + } + if (memcmp(calculatedHash.data(), expectedRootHash.UnsafeGetData(), + digestAlgorithmLength) != 0) { + return pkix::Result::ERROR_BAD_SIGNATURE; + } + return Success; +} + } } //namespace mozilla::ct
--- a/security/ct/BTVerifier.h +++ b/security/ct/BTVerifier.h @@ -5,19 +5,27 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef BTVerifier_h #define BTVerifier_h #include "BTInclusionProof.h" #include "mozpkix/Input.h" #include "mozpkix/Result.h" +#include "mozpkix/pkixtypes.h" namespace mozilla { namespace ct { // Decodes an Inclusion Proof (InclusionProofDataV2 as defined in RFC // 6962-bis). This consumes the entirety of the input. pkix::Result DecodeInclusionProof(pkix::Reader& input, InclusionProofDataV2& output); +// Given a decoded Inclusion Proof (InclusionProofDataV2 as per RFC 6962-bis), +// the corresponding leaf data entry, and the expected root hash, returns +// Success if the proof verifies correctly. +// (https://tools.ietf.org/html/draft-ietf-trans-rfc6962-bis-28#section-2.1.3.2) +pkix::Result VerifyInclusionProof(const InclusionProofDataV2& proof, + pkix::Input leafEntry, pkix::Input expectedRootHash, + pkix::DigestAlgorithm digestAlgorithm); } } // namespace mozilla::ct #endif // BTVerifier_h
--- a/security/ct/CTUtils.h +++ b/security/ct/CTUtils.h @@ -19,16 +19,17 @@ #define MOZILLA_CT_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0])) struct DeleteHelper { void operator()(CERTSubjectPublicKeyInfo* value) { SECKEY_DestroySubjectPublicKeyInfo(value); } + void operator()(PK11Context* value) { PK11_DestroyContext(value, true); } void operator()(PK11SlotInfo* value) { PK11_FreeSlot(value); } void operator()(SECKEYPublicKey* value) { SECKEY_DestroyPublicKey(value); } void operator()(SECItem* value) { SECITEM_FreeItem(value, true); } }; template <class T> struct MaybeDeleteHelper { @@ -38,16 +39,18 @@ struct MaybeDeleteHelper DeleteHelper del; del(ptr); } } }; typedef std::unique_ptr<CERTSubjectPublicKeyInfo, MaybeDeleteHelper<CERTSubjectPublicKeyInfo>> UniqueCERTSubjectPublicKeyInfo; +typedef std::unique_ptr<PK11Context, MaybeDeleteHelper<PK11Context>> + UniquePK11Context; typedef std::unique_ptr<PK11SlotInfo, MaybeDeleteHelper<PK11SlotInfo>> UniquePK11SlotInfo; typedef std::unique_ptr<SECKEYPublicKey, MaybeDeleteHelper<SECKEYPublicKey>> UniqueSECKEYPublicKey; typedef std::unique_ptr<SECItem, MaybeDeleteHelper<SECItem>> UniqueSECItem; namespace mozilla { namespace ct {
new file mode 100644 --- /dev/null +++ b/security/ct/tests/gtest/BTVerificationTest.cpp @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=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 "BTVerifier.h" +#include "CTTestUtils.h" +#include "gtest/gtest.h" + +#include "nss.h" + +namespace mozilla { namespace ct { + +using namespace pkix; + +struct BTVerificationTestParams +{ + const char* mInclusionProofHex; + const char* mExpectedRootHashHex; + const char* mInputHex; + pkix::DigestAlgorithm mDigestAlgorithm; + pkix::Result mExpectedVerificationResult; +}; + +class BTVerificationTest + : public ::testing::Test + , public ::testing::WithParamInterface<BTVerificationTestParams> +{ + void SetUp() override + { + if (!NSS_IsInitialized()) { + if (NSS_NoDB_Init(nullptr) != SECSuccess) { + abort(); + } + } + } +}; + +// This comes from testing/mozharness/test/test_mozilla_merkle.py +static const char* kValidInclusionProofHex = + "020000" + "0000000000000007" // 7 total nodes + "0000000000000005" // leaf index is 5 + "0063" // 99 (in base 10) bytes follow + "20" // 32 byte hash + "2ff3bdac9bec3580b82da8a357746f15919414d9cbe517e2dd96910c9814c30c" + "20" + "bb13dfb7b202a95f241ea1715c8549dc048d9936ec747028002f7c795de72fcf" + "20" + "380d0dc6fd7d4f37859a12dbfc7171b3cce29ab0688c6cffd2b15f3e0b21af49"; + +static const char* kExpectedRootHashHex = + "d1a0d3947db4ae8305f2ac32985957e02659b2ea3c10da52a48d2526e9af3bbc"; + +static const char* kInputHex = "81aae91cf90be172eedd1c75c349bf9e"; +static const char* kAlteredInputHex = "81aae91c0000000000000000c349bf9e"; + +// Same as kValidInclusionProofHex, but missing the last hash (the proof is +// still structurally valid, so it decodes successfully). +static const char* kShortInclusionProofHex = + "020000" + "0000000000000007" // 7 total nodes + "0000000000000005" // leaf index is 5 + "0042" // 66 (in base 10) bytes follow + "20" // 32 byte hash + "2ff3bdac9bec3580b82da8a357746f15919414d9cbe517e2dd96910c9814c30c" + "20" + "bb13dfb7b202a95f241ea1715c8549dc048d9936ec747028002f7c795de72fcf"; + +// Same as kValidInclusionProofHex, but has too many hashes (the proof is +// still structurally valid, so it decodes successfully). +static const char* kLongInclusionProofHex = + "020000" + "0000000000000007" // 7 total nodes + "0000000000000005" // leaf index is 5 + "0084" // 132 (in base 10) bytes follow + "20" // 32 byte hash + "2ff3bdac9bec3580b82da8a357746f15919414d9cbe517e2dd96910c9814c30c" + "20" + "bb13dfb7b202a95f241ea1715c8549dc048d9936ec747028002f7c795de72fcf" + "20" + "380d0dc6fd7d4f37859a12dbfc7171b3cce29ab0688c6cffd2b15f3e0b21af49" + "20" + "abbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabba"; + +static const char* kIncorrectRootHashHex = + "beebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeebeee"; + +static const char* kWrongTreeSizeInclusionProofHex = + "020000" + "0000000000000009" // 9 total nodes (this is wrong) + "0000000000000005" // leaf index is 5 + "0063" // 99 (in base 10) bytes follow + "20" // 32 byte hash + "2ff3bdac9bec3580b82da8a357746f15919414d9cbe517e2dd96910c9814c30c" + "20" + "bb13dfb7b202a95f241ea1715c8549dc048d9936ec747028002f7c795de72fcf" + "20" + "380d0dc6fd7d4f37859a12dbfc7171b3cce29ab0688c6cffd2b15f3e0b21af49"; + +static const char* kWrongLeafIndexInclusionProofHex = + "020000" + "0000000000000007" // 7 total nodes + "0000000000000002" // leaf index is 2 (this is wrong) + "0063" // 99 (in base 10) bytes follow + "20" // 32 byte hash + "2ff3bdac9bec3580b82da8a357746f15919414d9cbe517e2dd96910c9814c30c" + "20" + "bb13dfb7b202a95f241ea1715c8549dc048d9936ec747028002f7c795de72fcf" + "20" + "380d0dc6fd7d4f37859a12dbfc7171b3cce29ab0688c6cffd2b15f3e0b21af49"; + +// This is a longer proof taken from the Firefox 62.0.2 release. +static const char* kValidInclusionProof2Hex = + "020000" + "0000000000000cb3" + "00000000000000e2" + "018c" + "20" + "6d3d060c72c28cd1967a6ce4e87a470c266981ee8beb6e5956745b5839120338" + "20" + "cd028053c51f52447cd2b1ffea7761be546b72832d776db155008dc3071231eb" + "20" + "36167b32f7ba4980257c79ed65d133d8c53efbfd7addaa391a121953c78b2b98" + "20" + "f2b4abf09140b05058a74e25f4008157655e73fa4aeece9b3f2a40dbbae95c16" + "20" + "a2be4813b2ca0e7bb755ed5459789c25a83465fb3f2808590c04c64cdbb404ef" + "20" + "43e4341b74ea11f075f35761b867cb256e9d42c4c1253d6b5c958174daa800da" + "20" + "1c925ec8d2d4014c0b84d7bed8065d9e7b326e3e4eaebc90d7a6a66431249851" + "20" + "bd275e9e4e48c3725f6ef68c2661d4d6ae415129cfb0ea0881177f5347d683ae" + "20" + "01e84996a7cc1719b19a4a7e48941657b125bcd0dfd03d183daff87de6a480c3" + "20" + "664b6962909692980661be55e8bdadc48350b2461d37372457e8ff97824ae8da" + "20" + "39f7ab1500a58643fccc9e07ed409be4c707c5536b95c57f6716207656464019" + "20" + "d68c856664d660456d4c85498c2cc2abfb955a63bd1fb23f3e25850da80153f6"; + +static const char* kExpectedRootHash2Hex = + "0d489b16a64b80035a8d08ce55549c89c4b67be64a0456382cc5be1e51ddae1a"; + +// This the hex encoding of the SHA-256 hash of +// linux-x86_64/en-US/firefox-62.0.2.tar.bz2, encoded (again) in hex (because +// that's how generate-checksums.py currently builds the binary transparency +// tree). +static const char* kInput2Hex = + "3231623461306361626538663030306261663236373235643530313462386434" + "3865353561333832336538653665656131343638313062313031623034396536"; + +// This is the hex encoding of an inclusion proof for +// update/win32/en-GB/firefox-61.0-62.0.2.partial.mar using SHA-512. +static const char* kValidInclusionProofSHA512Hex = + "020000" + "0000000000000cb3" + "00000000000007ac" + "030c" + "40" + "b39fbe359108724ec1daed2a8c88511c6b94a74563bfaaf25b774286ab03cab9" + "b2e64bbd4eeb02003b7397cd814b5d18a160e14ad08eca04559abe146201e027" + "40" + "de119745a41884ed482a41638cc1979d89e1bd0ca295e0c412e7ee4b5c2e042d" + "a1f4aa9c7f1e58b78fac10400b207197383177401976ef6baa80d482c102a94f" + "40" + "d0fe203b0e95cbe48e2e663538aba382718c85ae167d8c4ccf326519f81b3860" + "55058f6a49943b8ed228af88b3414ec00e939ad8dc736f502ca90d63494eddcd" + "40" + "ae825352bbe12845fb1d3be27375c27dd462ebd6dc6d7bd0b5929df97aaccf1a" + "9eedb304ae1e9742b1e2a2ba8b22408d2d52e3bb3d547632d5f03cfe112572d2" + "40" + "1ab0f7f7d674c691cf8e51d4409d3402d94927231b82f7f71f16828dd9e36152" + "1a69f7e571df06aea16c83df88dc74042444ae8771375a7118477275395b570d" + "40" + "9c6b94c5be456c68518753cf626daf11b30ce981e18b76c036664dcafeba19b7" + "3f5ee20ab35aa38b11c92e2c8f103d1b19113b7171c615ce0b9c5ff520242d8c" + "40" + "d395ef3cd63ae617a96bd6c5c361d5f6aaccff1ed90599115394310dfa0c528d" + "611998d325f374c01a827ee900d72ed66d299845438bba565ba666c588b232a0" + "40" + "ce3548561f5ec7a94a6c7a2adc604f5e32869d0727cee80f12c95cab2a996965" + "6ad61a02b35e0fb2d0031ea496381f1413d33b8cbfdf092accd903881e083ee0" + "40" + "a4247b649fee9017d9c9e729c4763719b7155056013abc488de0079dc7bddce6" + "57a93f2596967cfb123d812a901bc4ffe0338cbecf30adc1a821e7261f88e3cd" + "40" + "7d2056ea6645b0306373fa2e26fbc4a4ccd4c82cb7d605d2372fa297654cd3a0" + "b151f6b0fffe7472661de79c7ce7873cb75e05cad5ea40173be540e16d51414d" + "40" + "eed2c98b3d8b8035777af74a0d5dd38963f84c09e6f42b6ca4e290674c175035" + "b9bc85bb4304fcf3d042c444f951b3b134563c6936a1b176679e35e94c42416b" + "40" + "6167cccd9d03909f95bb389936766340234b5b3e35dfa8c81d330db9055d7b7d" + "bfaf262f1821b4a68f43af62c53987550b4174eaab8357f9bd83f2715c98d441"; + +// This is the hex encoding of the expected root hash of the SHA-512 tree. +static const char* kExpectedRootHashSHA512Hex = + "6f20812da2980393767e98dd7f79d89aa41e029c790d3908739c02c01d9c6525" + "8bb3e24ab608c95b063259620751ce258930d48929cbe543b166c33c4de65e60"; + +// This the hex encoding of the SHA-512 hash of +// update/win32/en-GB/firefox-61.0-62.0.2.partial.mar, encoded (again) in hex. +static const char* kInputSHA512Hex = + "6237656563626164353363386432346230383763666437323333303162326437" + "6234326136323536663462636336356134623231636437376133613830613734" + "3865396533623666306432333839666234623763396563356638643833373534" + "6239313635313165333661373238653863303236376564653761666561316638"; + +static const BTVerificationTestParams BT_VERIFICATION_TEST_PARAMS[] = +{ + { kValidInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, Success }, + { kValidInclusionProofHex, kExpectedRootHashHex, kAlteredInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kShortInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kLongInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kValidInclusionProofHex, kIncorrectRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kWrongTreeSizeInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kWrongLeafIndexInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, + { kValidInclusionProofHex, kExpectedRootHashHex, kInputHex, + pkix::DigestAlgorithm::sha512, pkix::Result::ERROR_BAD_SIGNATURE }, + { kValidInclusionProof2Hex, kExpectedRootHash2Hex, kInput2Hex, + pkix::DigestAlgorithm::sha256, Success }, + { kValidInclusionProofSHA512Hex, kExpectedRootHashSHA512Hex, kInputSHA512Hex, + pkix::DigestAlgorithm::sha512, Success }, + { kValidInclusionProofSHA512Hex, kExpectedRootHashSHA512Hex, kInputSHA512Hex, + pkix::DigestAlgorithm::sha256, pkix::Result::ERROR_BAD_SIGNATURE }, +}; + +TEST_P(BTVerificationTest, BTVerificationSimpleTest) +{ + const BTVerificationTestParams& params(GetParam()); + + Buffer encodedProofBuffer(HexToBytes(params.mInclusionProofHex)); + Input encodedProof = InputForBuffer(encodedProofBuffer); + Reader encodedProofReader(encodedProof); + + InclusionProofDataV2 ipr; + ASSERT_EQ(Success, DecodeInclusionProof(encodedProofReader, ipr)); + + Buffer leafEntryBuffer(HexToBytes(params.mInputHex)); + Input leafEntry = InputForBuffer(leafEntryBuffer); + Buffer expectedRootHashBuffer(HexToBytes(params.mExpectedRootHashHex)); + Input expectedRootHash = InputForBuffer(expectedRootHashBuffer); + ASSERT_EQ(params.mExpectedVerificationResult, + VerifyInclusionProof(ipr, leafEntry, expectedRootHash, + params.mDigestAlgorithm)); +} + +INSTANTIATE_TEST_CASE_P(BTVerificationTest, + BTVerificationTest, + testing::ValuesIn(BT_VERIFICATION_TEST_PARAMS)); + +} } //namespace mozilla::ct
--- a/security/ct/tests/gtest/CTTestUtils.cpp +++ b/security/ct/tests/gtest/CTTestUtils.cpp @@ -430,17 +430,17 @@ CharToByte(char c) } else if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } abort(); } -static Buffer +Buffer HexToBytes(const char* hexData) { size_t hexLen = strlen(hexData); if (!(hexLen > 0 && (hexLen % 2 == 0))) { abort(); } size_t resultLen = hexLen / 2; Buffer result;
--- a/security/ct/tests/gtest/CTTestUtils.h +++ b/security/ct/tests/gtest/CTTestUtils.h @@ -12,16 +12,18 @@ #include "mozpkix/Input.h" #include "mozpkix/Time.h" #include "seccomon.h" #include "SignedCertificateTimestamp.h" #include "SignedTreeHead.h" namespace mozilla { namespace ct { +Buffer HexToBytes(const char* hexData); + // Note: unless specified otherwise, all test data is taken from // Certificate Transparency test data repository at // https://github.com/google/certificate-transparency/tree/master/test/testdata // Fills |entry| with test data for an X.509 entry. void GetX509CertLogEntry(LogEntry& entry); // Returns a DER-encoded X509 cert. The SCT provided by
--- a/security/ct/tests/gtest/moz.build +++ b/security/ct/tests/gtest/moz.build @@ -1,16 +1,17 @@ # -*- 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/. SOURCES += [ 'BTSerializationTest.cpp', + 'BTVerificationTest.cpp', 'CTDiversityPolicyTest.cpp', 'CTLogVerifierTest.cpp', 'CTObjectsExtractorTest.cpp', 'CTPolicyEnforcerTest.cpp', 'CTSerializationTest.cpp', 'CTTestUtils.cpp', 'MultiLogCTVerifierTest.cpp', ]
--- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1166,9 +1166,9 @@ static const TransportSecurityPreload kP { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, }; // Pinning Preload List Length = 488; static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1547121793919000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1547467493204000);
--- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -3,17 +3,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /*****************************************************************************/ /* This is an automatically generated file. If you're not */ /* nsSiteSecurityService.cpp, you shouldn't be #including it. */ /*****************************************************************************/ #include <stdint.h> -const PRTime gPreloadListExpirationTime = INT64_C(1549540988428000); +const PRTime gPreloadListExpirationTime = INT64_C(1549886688587000); %% 0-1.party, 1 00100010.net, 1 0010100.net, 1 00120012.net, 1 00130013.net, 1 00140014.net, 1 00150015.net, 1 @@ -138,16 +138,17 @@ 0x52.org, 1 0x7d.com, 1 0x7fffffff.net, 1 0x90.in, 1 0x90.io, 1 0xaa55.me, 1 0xabe.io, 1 0xacab.org, 1 0xda.de, 1 +0xdc.io, 0 0xdefaced.de, 1 0xee.eu, 1 0xf00.ch, 1 0xfc.de, 1 0xn.de, 1 0yen.org, 1 1-2-3bounce.co.uk, 1 100-downloads.com, 1 @@ -337,17 +338,16 @@ 1montre.fr, 1 1morebounce.co.uk, 1 1nfr.com, 0 1nian.vip, 1 1of16.de, 1 1on1on1.de, 1 1on1on1.tv, 1 1p.ro, 0 1panorama.ru, 1 -1para.net, 1 1password.ca, 1 1password.com, 1 1password.eu, 1 1px.tv, 1 1q2w.nl, 1 1q365a.com, 1 1r.is, 1 1rs.nl, 1 @@ -386,16 +386,17 @@ 2333.press, 1 23333.link, 1 2333666.xyz, 1 2333blog.com, 1 233abc.com, 1 233blog.com, 1 233boy.com, 1 233bwg.com, 1 233hugo.com, 1 +233ss.net, 1 233vps.com, 1 24-7.jp, 1 245meadowvistaway.com, 1 246060.ru, 1 247a.co.uk, 1 247exchange.com, 1 247healthshop.com, 1 247medplan.com, 1 @@ -1128,16 +1129,17 @@ 8880013.com, 1 8880021.com, 1 8880023.com, 1 8880025.com, 1 8880057.com, 1 8880059.com, 1 8880067.com, 1 8880083.com, 1 8880100.com, 1 +8884553.com, 1 8886737.com, 1 8886739.com, 1 8886793.com, 1 8886806.com, 1 8886860.com, 1 8887999.com, 0 888888722.com, 1 88889822.com, 1 @@ -1331,16 +1333,17 @@ aandkevents.co.uk, 1 aanmpc.com, 1 aaomidi.com, 1 aapas.org.ar, 1 aariefhaafiz.com, 1 aarkue.eu, 1 aaron.xin, 1 aaronburt.co.uk, 1 aaronhorler.com, 1 +aaronhorler.com.au, 1 aaronkimmig.de, 1 aaronroyle.com, 1 aaronsilber.me, 1 aarvinproperties.com, 1 aatf.us, 1 aati.be, 1 aati.info, 1 aavienna.com, 1 @@ -1485,17 +1488,16 @@ ac-epmservices.com, 1 ac-town.com, 1 ac0g.dyndns.org, 1 aca-creative.co.uk, 1 academicexperts.us, 1 academichealthscience.net, 1 academie-de-police.ch, 1 academkin.com, 1 academytv.com.au, 1 -acadianapatios.com, 1 acaeum.com, 1 acampar.com.br, 1 acaonegocios.com.br, 1 acaptureservices.com, 1 acara-yoga.de, 1 acareer.in, 1 acat.io, 1 acbrussels-used.be, 1 @@ -1539,16 +1541,17 @@ aceinflatables.com, 1 aceinstituteonline.com, 1 acelpb.com, 1 acem.org.au, 1 acemobileforce.com, 1 acemypaper.com, 1 acen.eu, 1 acendealuz.com.br, 1 acerentalandsales.com, 1 +acerislaw.com, 1 acessoeducacao.com, 1 acevik.de, 1 acfo.org, 1 acg.mn, 1 acg.sb, 0 acg.social, 1 acg18.us, 0 acgaudio.com, 1 @@ -1817,16 +1820,17 @@ advancedwriters.com, 1 advanceworx.com, 1 advancis.net, 1 advancyte.com, 1 advantagehomeexteriors.com, 1 advara.com, 1 advelty.cz, 1 advenacs.com.au, 1 advenapay.com, 1 +adventaholdings.com, 1 adventistdeploy.org, 1 advento.bg, 1 adventure-inn.com, 1 adventureally.com, 1 adventureforest.co.nz, 1 adventureforest.de, 0 adventureforest.nz, 1 adventuregamers.com, 1 @@ -1836,17 +1840,16 @@ adventureswithlillie.ca, 1 advertis.biz, 1 advertisemant.com, 1 advicepro.org.uk, 1 advocate-europe.eu, 1 advocaten-avocats.be, 1 advocatenalkmaar.org, 1 advocator.ca, 1 advocoeurdehaan.nl, 1 -advokat-romanov.com, 1 advtran.com, 1 adware.pl, 1 adwokatkosterka.pl, 1 adwokatzdunek.pl, 1 adws.io, 1 adxperience.com, 1 adzie.xyz, 1 adzuna.at, 1 @@ -2002,17 +2005,16 @@ agilecraft.com, 1 agileecommerce.com.br, 1 agileui.com, 1 agiley.se, 1 agilizing.us, 1 agilob.net, 1 aging.gov, 1 agingstats.gov, 1 agingstop.net, 1 -aginion.net, 1 agiserv.fr, 1 agliamici.it, 1 agnesk.blog, 1 agoodmind.com, 1 agoravm.tk, 1 agoravox.fr, 1 agoravox.it, 1 agoravox.tv, 1 @@ -2055,17 +2057,17 @@ agscinemas.com, 1 agscinemasapp.com, 1 agung-furniture.com, 1 agwa.name, 1 agy.cl, 1 ahcpr.gov, 0 ahd.com, 0 ahelos.tk, 1 aheng.me, 1 -ahiru3.com, 1 +ahero4all.org, 1 ahkubiak.ovh, 1 ahlaejaba.com, 1 ahlz.sk, 1 ahmad.works, 1 ahmadly.com, 1 ahmedabadflowermall.com, 1 ahmedcharles.com, 1 ahmerjamilkhan.org, 1 @@ -2199,17 +2201,16 @@ airbnb.pt, 1 airbnb.ru, 1 airbnb.se, 1 airbnb.tools, 1 airbnbchina.cn, 1 airbnbopen.com, 1 airborne-inflatables.co.uk, 1 airclass.com, 1 aircomms.com, 1 -airconsalberton.co.za, 1 airconssandton.co.za, 1 airductclean.com, 0 airductcleaning-fresno.com, 1 airductcleaninggrandprairie.com, 1 airductcleaningirving.com, 1 airdur.eu, 1 aireaseleaks.org, 1 airedaleterrier.com.br, 1 @@ -2223,17 +2224,16 @@ airicy.com, 1 airikai.com, 1 airlinesettlement.com, 1 airmail.cc, 1 airmaxinflatables.com, 1 airnow.gov, 1 airpbx.com, 1 airplay-inflatable-hire.co.uk, 1 airplayradio.nl, 1 -airportlimototoronto.com, 1 airpurifierproductsonline.com, 1 airrestoration.ch, 1 airsoft.ch, 1 airtimerewards.co.uk, 1 airvpn.org, 1 airvuz.com, 1 airwaystorage.net, 1 airwegobouncycastles.co.uk, 1 @@ -2604,25 +2604,23 @@ allthingswild.co.uk, 1 alltubedownload.net, 1 allurescarves.com, 1 alluvion.studio, 1 allvips.ru, 1 almaatlantica.com, 1 almagalla.com, 1 almatinki.com, 1 almavios.com, 1 -almorafestival.com, 1 almstrom.org, 1 almut-zielonka.de, 1 alnitech.com, 0 alocato.com, 1 aloesoluciones.com.ar, 1 alohapartyevents.co.uk, 1 alonetone.com, 1 -alorenzi.eu, 1 alp.net.cn, 1 alp.od.ua, 1 alpca.org, 1 alpe-d-or.dyn-o-saur.com, 1 alpencam.com, 1 alpencams.com, 1 alpengreis.ch, 1 alpenjuice.com, 1 @@ -2635,16 +2633,17 @@ alpha88uat.com, 1 alphaantileak.net, 1 alphabetsigns.com, 1 alphabouncycastles.co.uk, 1 alphabrock.cn, 1 alphachat.net, 1 alphadote.com, 1 alphaetomega3d.fr, 1 alphafiduciaryservices.ch, 1 +alphafitnesslibya.com, 1 alphagateanddoor.com, 1 alphahunks.com, 0 alphainflatablehire.com, 1 alphaman.ooo, 1 alphapengu.in, 1 alpharotary.com, 1 alphassl.de, 1 alphatrash.de, 1 @@ -2918,17 +2917,16 @@ andiplusben.com, 1 andisadhdspot.com, 1 andiscyber.space, 1 anditi.com, 1 andoms.fi, 1 andre-ballensiefen.de, 1 andre-lategan.com, 1 andre-otto.com, 1 andrea-kiaora.de, 1 -andrea-m.me, 1 andrea-wirthensohn.at, 1 andreaboero.it, 1 andreadraghetti.it, 1 andreagourmet.it, 1 andreahruby.it, 1 andreamcnett.com, 1 andreas-hecht.com, 1 andreas-kluge.eu, 1 @@ -2938,17 +2936,16 @@ andreashecht-blog.de, 1 andreaskluge.eu, 1 andreaskrasa.com, 1 andreaslicht.nl, 1 andreasolsson.se, 1 andreasr.com, 1 andree.cloud, 1 andrefaber.nl, 1 andrehansen.de, 1 -andrei-coman.com, 1 andrei-nakov.org, 1 andrejbenz.com, 1 andreoliveira.io, 1 andrepicard.de, 1 andrespaz.com, 1 andreundnina.de, 1 andrew.fi, 1 andrew.london, 1 @@ -3177,17 +3174,16 @@ antennista.pavia.it, 1 antennista.roma.it, 1 antennista.tv, 1 antennisti.milano.it, 1 antennisti.roma.it, 1 anteprima.info, 1 anthedesign.fr, 1 anthisis.tv, 1 anthony-rouanet.com, 1 -anthony.codes, 1 anthonycarbonaro.com, 1 anthonyfontanez.com, 1 anthonygaidot.fr, 1 anthonyvadala.me, 1 anthropoid.ca, 1 anti-bible.com, 1 anti-radar.org, 1 antibioticshome.com, 1 @@ -3520,17 +3516,16 @@ arg.zone, 1 argama-nature.com, 0 arganaderm.ch, 1 argb.de, 1 argekultur.at, 1 argh.io, 1 argonium.com.au, 1 argot.com, 1 argovpay.com, 1 -ariaartgallery.com, 1 ariadermspa.com, 1 arian.io, 1 arias.re, 1 ariba.info, 1 ariege-pyrenees.net, 1 arieswdd.com, 1 arifburhan.online, 1 arifp.me, 1 @@ -3548,16 +3543,17 @@ aritec-la.com, 1 arivo.com.br, 1 arizer.com, 1 arizonaautomobileclub.com, 1 arizonabondedtitle.com, 1 arjandejong.eu, 1 arjanvaartjes.net, 1 arjunasdaughter.pub, 1 arjweb.co.uk, 1 +arkacrao.org, 1 arkadiyt.com, 1 arkaic.dyndns.org, 1 arkbyte.com, 1 arknodejs.com, 1 arksan.com.tr, 1 arkulagunak.com, 0 arlatools.com, 1 arlen.tv, 1 @@ -3570,17 +3566,16 @@ armandsdiscount.com, 1 armanozak.com, 1 armansfinejewellery.com, 1 armansfinejewellery.com.au, 1 armarinhovirtual.com.br, 1 armazemdaminiatura.com.br, 1 armazemgourmetbrasil.com.br, 1 armbrust.me, 1 armedpoet.com, 1 -armeni-jewellery.gr, 1 armenians.online, 1 armil.it, 1 armin-cme.de, 1 armin-cpe.de, 1 arminc.tk, 1 arminpech.de, 1 armleads.com, 1 armor.ai, 1 @@ -3852,17 +3847,17 @@ astrea-voetbal-groningen.nl, 1 astrology42.com, 1 astroscopy.ch, 1 astrosnail.pt.eu.org, 1 astrovandalistas.cc, 1 astural.org, 1 astutikhonda.com, 1 astutr.co, 1 asuclassfinder.com, 1 -asucrews.com, 0 +asucrews.com, 1 asuhe.cc, 1 asuhe.xyz, 1 asuka.io, 1 asun.co, 1 asurepay.cc, 0 asustreiber.de, 1 asvsa.ch, 1 asws.nl, 1 @@ -3963,16 +3958,17 @@ atplonline.co, 1 atpnutrition.com, 1 atracaosexshop.com.br, 1 atraining.ru, 1 atraverscugy.ch, 1 atrevillot.com, 1 atrinik.org, 1 atsoftware.de, 1 attac.us, 1 +atte.fi, 1 attelage.net, 1 attendantdesign.com, 1 attendu.cz, 1 attention.horse, 1 attilagyorffy.com, 1 attilavandervelde.nl, 1 attinderdhillon.com, 1 attitudes-bureaux.fr, 1 @@ -4565,16 +4561,17 @@ baiker.info, 1 bailakomigo.com.br, 1 baildonbouncycastles.co.uk, 1 baildonhottubs.co.uk, 1 baileebee.com, 1 bailonga.com, 1 bairdzhang.com, 1 baitulongbaycruises.com, 1 baiyangliu.com, 1 +bajajfinserv.in, 1 bajic.ch, 0 baka-gamer.net, 1 baka.network, 1 baka.org.cn, 1 bakabt.info, 1 bakanin.ru, 1 bakaproxy.moe, 1 bakermen.com, 1 @@ -5039,16 +5036,17 @@ beeznest.com, 1 befoodsafe.gov, 1 beforesunrise.de, 1 beframed.ch, 1 befundonline.de, 1 begabungsfoerderung.info, 1 begbie.com, 1 beginatzero.com, 1 beginner.nl, 1 +beginwp.top, 1 begoodny.co.il, 1 behamepresrdce.sk, 1 behamzdarma.cz, 1 behindthethrills.com, 1 behna24hodin.cz, 1 behoerden-online-dienste.de, 1 beholdthehurricane.com, 1 behoreal.cz, 1 @@ -5146,17 +5144,16 @@ benjamindietrich.com, 1 benjamindietrich.de, 1 benjaminjurke.com, 1 benjaminjurke.net, 1 benjaminkopelke.com, 1 benjaminpiquet.fr, 1 benjamins.com, 1 benjaminvasel.de, 1 benjii.me, 1 -benleemd.com, 1 benmatthews.com.au, 1 benmillett.us, 0 benmorecentre.co.uk, 1 bennettsbouncycastlehire.co.uk, 1 bennettshire.co.uk, 1 benni1.eu, 1 bennierobinson.com, 1 bennink.me, 1 @@ -5224,33 +5221,33 @@ berndklaus.at, 1 bernhard-seidenspinner.de, 1 bernhardkau.de, 1 bernhardluginbuehl.ch, 1 bernhardluginbuehl.com, 1 bernieware.de, 1 berodes.be, 1 berr.yt, 1 berra.se, 1 -berruezoabogados.com, 1 berrus.com, 1 berry.cat, 1 berrypay.com, 1 bersierservices.ch, 1 bersotavocats.fr, 1 berst.cz, 1 berthabailey.com, 1 berthelier.me, 1 bertholdsson.com, 1 bertold.org, 1 bertoliniodontoiatria.it, 1 bertrand.bio, 1 bertrandkeller.info, 1 bertsmithvwparts.com, 1 beryl.net, 1 berz.one, 1 +besb.io, 1 besb66.club, 1 besb66.com, 1 besb66.me, 1 besb66.ninja, 1 besb66.rocks, 1 besb66.us, 1 beschriftung-metz.de, 1 bescover.com, 1 @@ -5711,17 +5708,16 @@ bistrocean.com, 1 bistrodeminas.com, 1 bistrotdelagare.fr, 1 biswas.me, 1 bit-cloud.de, 1 bit-rapid.com, 1 bit-sentinel.com, 1 bit-service-aalter.be, 1 bit.biz.tr, 1 -bit.voyage, 1 bit8.com, 1 bitaccelerate.com, 1 bitbank.cc, 1 bitbeans.de, 1 bitbox.me, 1 bitbucket.com, 1 bitbucket.io, 1 bitbucket.org, 1 @@ -5785,17 +5781,16 @@ bitmarket.net, 1 bitmarket.pl, 1 bitmask.me, 1 bitmessage.ch, 1 bitmexin.com, 1 bitmidi.com, 1 bitminter.com, 1 bitmoe.com, 1 bitmon.net, 1 -bitok.com, 1 bitplay.space, 1 bitpod.de, 1 bitpoll.de, 1 bitpoll.org, 1 bitpumpe.net, 1 bitref.com, 1 bitrush.nl, 1 bitsafe.com.my, 1 @@ -5804,17 +5799,17 @@ bitshaker.net, 1 bitskins.co, 1 bitskrieg.net, 1 bitsoffreedom.nl, 1 bitstep.ca, 1 bitstorm.nl, 1 bitstorm.org, 1 bitsum.com, 1 bitsync.nl, 1 -bitten.pw, 1 +bitten.pw, 0 bittersweetcandybowl.com, 1 bittervault.xyz, 1 bittylicious.com, 1 bitvest.io, 1 bitwolk.nl, 1 bitwrought.net, 1 bitxel.com.co, 1 bityes.org, 1 @@ -5943,17 +5938,16 @@ blayne.me, 1 blayneallan.com, 1 blazeit.io, 1 blazing.cz, 1 blazor.nl, 1 bleaching-tipps.de, 1 bleche-onlineshop.at, 1 bleche-onlineshop.de, 1 blechinger.io, 1 -blechpirat.name, 1 blechschmidt.saarland, 1 bleep.zone, 1 blenderrecipereviews.com, 1 blending.kr, 1 blendle.com, 1 blendle.nl, 1 blendr.com, 1 blenheimears.com, 1 @@ -6699,16 +6693,17 @@ bridgement.com, 1 bridgeout.com, 1 bridgevest.com, 1 bridgingdirectory.com, 1 brie.tech, 1 briefassistant.com, 1 briefhansa.de, 1 briefvorlagen-papierformat.de, 1 briffoud.fr, 1 +briggsleroux.com, 1 brighouse-leisure.co.uk, 1 brightday.bz, 1 brightendofleasecleaning.com.au, 1 brightfuturemadebyme.com, 1 brightlifedirect.com, 1 brightonbank.com, 1 brightonbouncycastles.net, 1 brightonchilli.org.uk, 1 @@ -7007,16 +7002,17 @@ burzstudios.com, 1 busanhs.bid, 1 busanhs.win, 1 buserror.cn, 1 bushbaby.com, 1 bushcraftfriends.com, 1 busindre.com, 1 business-garden.com, 1 business.facebook.com, 0 +businessadviceperth.com.au, 1 businessamongus.com, 1 businesscentermarin.ch, 1 businessesdirectory.eu, 1 businessetmarketing.com, 1 businessfactors.de, 1 businessfurs.info, 1 businesshub.cz, 0 businessimmigration-eu.com, 1 @@ -7099,22 +7095,24 @@ bwwb.nu, 1 bx-n.de, 1 bxdev.me, 1 bxp40.at, 1 by.cx, 1 by1896.com, 1 by1898.com, 1 by1899.com, 1 byange.pro, 1 +byatte.com, 1 bydisk.com, 0 byeskille.no, 1 bygningsregistrering.dk, 1 byhe.me, 1 byiu.info, 0 byji.com, 1 +byken.cn, 1 bymark.co, 1 bymike.co, 1 bynder.com, 1 bynet.cz, 1 bynumlaw.net, 1 bypass.kr, 1 bypass.sh, 1 byrko.cz, 1 @@ -7144,16 +7142,17 @@ bytesatwork.de, 1 byteshark.org, 1 byteshift.ca, 1 bytesign.de, 1 bytesizedalex.com, 1 bytesofcode.de, 1 bytesunlimited.com, 1 bytesystems.com, 1 bythisverse.com, 1 +bytrain.net, 1 byvshie.com, 1 bywin9.com, 1 bzhub.bid, 1 bziaks.xyz, 1 bzsparks.com, 1 bztech.com.br, 1 bztraveler.com, 1 bztraveler.net, 1 @@ -7204,16 +7203,17 @@ cacaolalina.com, 1 cacaumidade.com.br, 1 caceis.bank, 1 cachetagalong.com, 1 cachethome.com, 1 cachetur.no, 1 cackette.com, 1 cad-noerdlingen.de, 1 cadams.io, 1 +cadcreations.co.ke, 1 cadetsge.ch, 1 cadmail.nl, 1 cadman.pw, 1 cadooz.com, 1 cadorama.fr, 1 cadoth.net, 1 cadra.nl, 0 cadre.com, 1 @@ -7322,24 +7322,24 @@ camastowncar.com, 1 cambier.org, 1 cambiowatch.ch, 1 cambodian.dating, 1 cambridge-security.com, 1 cambridgebouncers.co.uk, 1 cambridgesecuritygroup.org, 1 camcapital.com, 1 camconn.cc, 1 -camda.online, 1 camdesign.pl, 1 camel2243.com, 1 camelservers.com, 1 cameo-membership.uk, 1 cameraviva.com.br, 1 camerweb.es, 1 camilomodzz.net, 1 +camjobs.net, 1 camolist.com, 1 camomile.desi, 1 camp-pleinsoleil.ch, 1 camp.co.uk, 1 campaign-ad.com, 1 campaign.gov.uk, 1 campaignagent.com.au, 1 campaignhelpdesk.org, 1 @@ -7354,16 +7354,17 @@ camperdays.de, 1 camperlist.com, 1 campermanaustralia.com, 1 campertrailerfinance.com.au, 1 camperverzekerd.nl, 1 campfiretails.org, 1 camping-seilershof.de, 1 campingcarlovers.com, 1 campinghuntingshooting.com, 1 +campingskyhooks.com, 1 campistry.net, 1 campula.cz, 1 campus-discounts.com, 1 campus-finance.com, 1 campusdrugprevention.gov, 1 campuswire.com, 1 campvana.com, 1 campwabashi.org, 1 @@ -7414,17 +7415,16 @@ cannoli.london, 1 cannyfoxx.me, 1 canoonic.se, 1 cant.at, 1 cantatio.ch, 1 canterberry.cc, 1 canterbury.ws, 1 canterburybouncycastlehire.co.uk, 1 cantrack.com, 1 -canva-dev.com, 1 canva.com, 1 canx.org, 1 canyoupwn.me, 1 cao.gov, 1 cao.la, 1 caodecristachines.com.br, 1 caodesantohumberto.com.br, 1 caoshan60.com, 1 @@ -7854,17 +7854,16 @@ celiendev.ch, 1 celine-patisserie.fr, 1 cellartracker.com, 1 celltek-server.de, 0 celluliteorangeskin.com, 1 celluliteremovaldiet.com, 1 celti.ie.eu.org, 1 celti.name, 1 celuliteonline.com, 1 -cem.pw, 1 cementscience.com, 1 cemeteriat.com, 1 ceml.ch, 1 cenatorium.pl, 1 cencalvia.org, 1 censurfridns.dk, 1 censurfridns.nu, 1 censys.io, 1 @@ -7950,34 +7949,31 @@ cervejista.com, 1 cesantias.co, 1 cesboard.com, 1 cesdb.com, 1 cesipagano.com, 1 ceskepivnesety.sk, 1 ceskepivnisety.cz, 1 ceso-saco.com, 1 cesobaly.cz, 1 -cespri.com.pe, 1 cestasedelicias.com.br, 1 cestlav.it, 1 cestunmetier.ch, 1 -ceta.one, 1 cetamol.com, 1 ceu.edu, 0 cevo.com.hr, 1 ceyizlikelisleri.com, 1 cf-ide.de, 1 cf-tm.net, 1 cfa.gov, 1 cfan.space, 1 cfda.gov, 1 cfdcre5.org, 1 cfh.com, 1 cflsystems.com, 1 -cfneia.org, 1 cfno.org, 1 cfo.gov, 1 cfpa-formation.fr, 1 cfsh.tk, 1 cftc.gov, 1 cftcarouge.com, 1 cfttt.com, 1 cfurl.cf, 1 @@ -7991,17 +7987,16 @@ cgan.de, 1 cgan.pw, 1 cgbassurances.ch, 1 cgbilling.com, 1 cgcookiemarkets.com, 1 cgnparts.com, 1 cgpe.com, 1 cgsmart.com, 1 cgtx.us, 1 -cgurtner.ch, 1 ch-laborit.fr, 1 ch-sc.de, 1 ch.search.yahoo.com, 0 ch47f.com, 1 chabaudparfum.com, 1 chabert-provence.fr, 1 chabik.com, 1 chad.ch, 1 @@ -8133,17 +8128,16 @@ chatfacile.org, 1 chatint.com, 1 chatitaly.org, 1 chatme.im, 0 chatnbook.com, 1 chatnederland.eu, 1 chatsworthelectrical.com, 1 chatt-gratis.net, 1 chatt-gratis.org, 1 -chattanoogaface.com, 1 chattergalerie.eu, 1 chattergallery.com, 1 chattersworld.nl, 1 chatu.io, 1 chatu.me, 1 chatucomputers.com, 1 chatxp.com, 1 chatxsingle.net, 1 @@ -8187,17 +8181,16 @@ cheapgoa.com, 1 cheapiesystems.com, 1 cheapssl.com.tr, 1 cheapticket.in, 1 cheapwritinghelp.com, 1 cheapwritingservice.com, 1 chebwebb.com, 1 check.torproject.org, 0 checkecert.nl, 1 -checkmateshoes.com, 0 checkmyessay.com, 1 checkmyessays.com, 1 checkmyip.com, 1 checkmypsoriasis.com, 1 checkout.google.com, 1 checkpoint-tshirt.com, 1 checkras.tk, 1 checkrente.nl, 1 @@ -8361,17 +8354,16 @@ chonghe.org, 1 chook.as, 1 choootto.club, 1 choosemypc.net, 1 chopperforums.com, 1 chorkley.co.uk, 1 chorkley.com, 1 chorkley.me, 1 chorkley.uk, 1 -chorleiterverband.de, 1 chorpinkpoemps.de, 1 chosenplaintext.org, 1 chourishi-shigoto.com, 1 chovancova.sk, 1 chowii.com, 1 choyri.com, 1 chr0me.sh, 1 chris-edwards.net, 1 @@ -8559,17 +8551,17 @@ cirfi.com, 1 ciri.com.co, 1 cirope.com, 1 cirrus0.de, 1 cirugiasplasticas.com.mx, 1 cirujanooral.com, 1 cirurgicagervasio.com.br, 1 cirurgicalucena.com.br, 1 cirurgicasalutar.com.br, 1 -ciscodude.net, 0 +ciscodude.net, 1 cisoaid.com, 1 cisofy.com, 1 cispeo.org, 1 ciss.ltd, 1 cisum-cycling.com, 1 cisy.me, 1 citationgurus.com, 1 citcuit.in, 1 @@ -9407,16 +9399,17 @@ constares.de, 1 constructexpres.ro, 1 constructieve.nl, 1 construction-colleges.com, 1 construction-student.co.uk, 1 constructionjobs.com, 1 constructive.men, 1 consul.io, 1 consulenza.pro, 1 +consultation.biz.tr, 1 consultcelerity.com, 1 consultimator.com, 1 consultimedia.de, 1 consultoriosodontologicos.com.br, 1 consultpetkov.com, 1 consulvation.com, 1 consumeractionlawgroup.com, 1 consumerfiles.com, 1 @@ -9427,33 +9420,31 @@ contaquanto.com.br, 1 contemplativeeducation.org, 1 content-api-dev.azurewebsites.net, 0 content-design.de, 1 contentcoms.co.uk, 1 contentdesign.de, 1 contentpass.net, 1 contessa32experience.com, 1 contextplatform.com, 1 -conti-profitlink.co.uk, 1 continuation.io, 1 continuum.memorial, 1 contrabass.net, 1 contractdigital.co.uk, 1 contractormountain.com, 1 contractwriters.com, 1 contraspin.co.nz, 1 contratatupoliza.com, 1 contributor.google.com, 1 controlarlaansiedad.com, 1 controlautocom.com.br, 1 controlbooth.com, 1 controle.net, 1 controleer-maar-een-ander.nl, 1 controltickets.com.br, 1 -contxt-agentur.de, 1 conv2pdf.com, 1 convergence.fi, 1 convergencela.com, 1 convergnce.com, 1 conversiones.com, 1 conversionsciences.com, 1 convert.im, 1 convert.zone, 1 @@ -9519,17 +9510,16 @@ corbi.net.au, 1 corbinhesse.com, 1 cordejong.nl, 1 cordep.biz, 1 corder.tech, 1 cordeydesign.ch, 1 cordis.io, 1 cordis.tk, 1 cordlessdog.com, 1 -core-concepts.de, 0 core-networks.de, 1 core.mx, 1 core.org.pt, 1 coreapm.com, 1 coreapm.org, 1 corecdn.org, 1 corecodec.com, 1 coredump.gr, 1 @@ -9611,16 +9601,17 @@ cosmundi.de, 1 cosni.co, 1 cosplayer.com, 1 cospol.ch, 1 costa-rica-reisen.ch, 1 costa-rica-reisen.de, 1 costablanca.villas, 1 costablancavoorjou.com, 1 costcofinance.com, 1 +costellofc.co.uk, 1 costinstefan.eu, 1 costreportdata.com, 0 costulessdirect.com, 1 coteries.com, 1 cotonmusic.ch, 1 cotta.dk, 1 cotwe-ge.ch, 1 cougar.dating, 1 @@ -10627,17 +10618,16 @@ dataguidance.com, 1 dataharvest.at, 1 datahoarder.xyz, 1 datahove.no, 0 datakick.org, 1 datalife.gr, 1 datalysis.ch, 1 datamatic.ru, 1 dataprotectionadvisors.com, 1 -datapun.ch, 1 datapure.net, 1 datascience.cafe, 1 datascience.ch, 1 datascomemorativas.com.br, 1 datasharesystem.com, 1 dataskydd.net, 1 dataspace.pl, 1 datastream.re, 0 @@ -10871,17 +10861,16 @@ debarrascolombes.com, 1 debarrasnanterre.com, 1 debbyefurd.com, 1 debie-usedcars.be, 1 debigare.com, 1 debkleinteam.com, 1 deborahmarinelli.eu, 1 debron-ot.nl, 1 debrusoft.ch, 1 -debt.com, 1 debtrecycling.com.au, 1 debuemon.com, 1 debuis.nl, 1 decaffeinated.io, 1 decalquai.ch, 1 dechat.nl, 1 decidetreatment.org, 1 decis.fr, 1 @@ -11181,17 +11170,16 @@ desplats.com.ar, 1 despora.de, 0 despotika.de, 1 dessinemoilademocratie.ch, 1 destech.nl, 1 desterman.ru, 1 destileria.net.br, 1 destinationsofnewyorkstate.com, 1 destinattorneyjohngreene.com, 1 -destinopiriapolis.com, 1 destinoytarot.com, 1 destinyofthephoenix.me, 1 desu.ne.jp, 1 desuchan.eu, 1 desuchan.org, 1 desuperheroes.co, 1 desveja.com.br, 1 det-te.ch, 1 @@ -11237,17 +11225,17 @@ deuxsolutions.com, 1 dev, 1 dev-brandywineglobal.com, 1 dev-pulse-mtn.pantheonsite.io, 1 dev-tek.de, 1 devafterdark.com, 1 devagency.fr, 1 devalps.eu, 1 devb.nl, 1 -devcast.io, 1 +devcast.io, 0 devcf.com, 1 devct.cz, 0 devcu.com, 1 devcu.net, 1 devdesco.com, 1 devdoodle.net, 1 devel.cz, 1 develerik.com, 0 @@ -11593,16 +11581,17 @@ dipalma.me, 1 dipl.io, 0 dipling.de, 1 diplona.de, 1 dipulse.it, 1 dir2epub.com, 1 dir2epub.org, 1 dirba.io, 1 direct-sel.com, 1 +direct2uk.com, 0 directebanking.com, 1 directelectricalltd.co.uk, 1 directlinkfunding.co.uk, 1 directme.ga, 1 directnews.be, 1 directorioz.com, 1 directreal.sk, 1 directspa.fr, 1 @@ -11775,16 +11764,17 @@ dk.search.yahoo.com, 0 dkcomputers.com.au, 1 dkds.us, 1 dkravchenko.su, 0 dkstage.com, 1 dl.google.com, 1 dlabouncycastlehire.co.uk, 1 dlaspania.pl, 1 dlbouncers.co.uk, 1 +dlcwilson.com, 1 dlde.ru, 1 dldl.fr, 1 dlfsymposium.nl, 1 dlg.im, 1 dlitz.net, 1 dll4free.com, 1 dlld.com, 1 dlouwrink.nl, 1 @@ -11859,17 +11849,16 @@ dobrev.family, 1 dobrisan.ro, 1 dobsnet.net, 1 doc.python.org, 1 doc.to, 1 doc8643.com, 1 docabo.ch, 1 docbox.ch, 1 doceamoraviverbem.com, 1 -docemeldoces.com, 1 dochimera.com, 1 dochitaceahlau.ro, 1 dockerbook.com, 0 dockerm.com, 1 dockerup.net, 1 doclassworks.com, 1 docline.gov, 1 docloh.de, 1 @@ -11953,17 +11942,16 @@ domainkauf.de, 1 domainoo.com, 1 domains.autos, 1 domains.boats, 1 domains.google.com, 1 domains.homes, 1 domains.motorcycles, 1 domains.yachts, 1 domainsilk.com, 1 -domainstaff.com, 1 domainwatch.me, 1 domaxpoker.com, 1 domeconseil.fr, 1 domein-direct.nl, 1 domen-reg.ru, 1 domenic.me, 1 domesticcleaners.co.uk, 1 domfee.com, 1 @@ -12038,17 +12026,16 @@ dooby.fr, 1 dooleylabs.com, 1 dooleytackaberry.com, 1 doomoo.com, 1 doomsworld.com, 1 doomtech.net, 1 doomus.me, 1 doooooops.com, 1 doop.im, 1 -doopdidoop.com, 1 door.cards, 1 doordecor.bg, 1 doorflow.com, 1 dopesoft.de, 1 dopfer-fenstertechnik.de, 1 doppenpost.nl, 1 dopply.com, 1 dopravni-modely.cz, 1 @@ -12116,16 +12103,17 @@ dotphoto.com, 1 dotplex.com, 1 dotplex.de, 1 dotrox.net, 1 dotshule.ug, 1 dotsiam.co.th, 1 dotsiam.com, 1 dotsiam.in.th, 1 douai.me, 1 +doubleaste.com, 1 doubleavineyards.com, 1 doublefun.net, 1 doublestat.me, 1 doubleup.com.au, 1 doucheba.gs, 0 dougferris.id.au, 1 dougley.com, 1 doujin-domain.cz, 1 @@ -12407,17 +12395,17 @@ dsgvo.name, 1 dshield.org, 1 dsm5.com, 1 dsmjs.com, 1 dsne.com.mx, 1 dso-imaging.co.uk, 1 dso-izlake.si, 1 dsol.hu, 1 dsouzamusic.com, 1 -dsrw.org, 0 +dsrw.org, 1 dssale.com, 1 dstamou.de, 1 dsteiner.at, 1 dstvinstallalberton.co.za, 1 dstvinstallrandburg.co.za, 1 dt27.org, 1 dtbouncycastles.co.uk, 1 dtdsh.com, 1 @@ -12967,17 +12955,17 @@ eductf.org, 1 eduid.se, 0 eduif.nl, 0 edumundo.nl, 1 eduroam.no, 1 eduroam.uy, 1 edusanjal.com, 1 edusantorini.com, 1 eduvpn.no, 1 -eduxpert.in, 1 +eduxpert.in, 0 edv-bv.de, 1 edv-kohls.de, 1 edv-lehrgang.de, 1 edvgarbe.de, 1 edvmesstec.de, 1 edwar.do, 1 edwards.me.uk, 1 edwardsnowden.com, 1 @@ -13310,16 +13298,17 @@ elevatoraptitudetest.com, 1 elexel.ru, 1 elexprimidor.com, 1 elfe.de, 1 elfnon.com, 1 elfring.eu, 1 elgalponazo.com.ar, 1 elglobo.com.mx, 0 elgosblanc.com, 0 +elguadia.faith, 1 elhamadimi.com, 1 elhorizontal.com, 1 elhossari.com, 1 elia.cloud, 1 elian-art.de, 1 elias-nicolas.com, 1 eliaskordelakos.com, 1 elibom.com, 1 @@ -13553,17 +13542,16 @@ endlessvideo.com, 1 endofnet.org, 1 endoftenancycleaninglondon.co.uk, 1 endoftennancycleaning.co.uk, 1 endohaus.us, 1 endpointsystems.com, 1 endspamwith.us, 1 enduranceday.be, 1 endzeit-architekten.com, 0 -enelacto.com, 1 enemiesoflight.de, 1 energie-sante.ch, 1 energiekeurplus.nl, 1 energisammenslutningen.dk, 1 energy-drink-magazin.de, 1 energy-in-balance.eu, 1 energy-infra.nl, 1 energy-initiative.com, 1 @@ -13694,16 +13682,17 @@ epay.bg, 1 epaygateway.net, 1 epdeveloperchallenge.com, 1 ephesusbreeze.com, 1 epi.one, 1 epic-vistas.com, 1 epic-vistas.de, 1 epicbouncycastlehirenorwich.co.uk, 1 epicbouncycastles.co.uk, 1 +epicdowney.com, 1 epicenter.work, 1 epicenter.works, 1 epicentre.works, 1 epichouse.net, 0 epicinflatables.co.uk, 1 epickitty.co.uk, 1 epicpages.com, 1 epicsecure.de, 1 @@ -14095,17 +14084,16 @@ estate360.co.tz, 1 estateczech-eu.ru, 1 estcequejailaflemme.fr, 1 estcequonmetenprodaujourdhui.info, 1 esteam.se, 1 estedafah.com, 1 esterilizacion-perros.es, 1 esteticanorte.com.br, 1 estetista.net, 1 -estetistarimini.it, 1 estherlew.is, 1 esthesoleil.jp, 1 estilopack-loja.com.br, 1 estoic.net, 1 estoniantrade.ee, 1 estonoentraenelexamen.com, 1 estoqueinformatica.com.br, 1 estrietoit.com, 0 @@ -14133,17 +14121,16 @@ etccooperative.org, 1 etch.co, 1 etd-glasfaser.de, 1 etech-solution.com, 1 etech-solution.net, 1 etech-solutions.com, 1 etechsolution.net, 1 eteesheet.com, 1 etelej.com, 0 -etenendrinken.nu, 1 eternal-warriors.de, 1 eternalabyss.int.eu.org, 1 eternalflame.cn, 1 eternalsymbols.com, 0 eternit.roma.it, 1 etfacta.com, 1 eth-faucet.net, 1 eth0.nl, 1 @@ -14180,16 +14167,17 @@ etresmant.es, 1 etrker.com, 1 etskinner.com, 1 etskinner.net, 1 etudesbibliques.fr, 1 etudesbibliques.net, 1 etudesbibliques.org, 1 etv.cx, 1 etyd.org, 1 +etzi.myds.me, 1 eu-darlehen-finanzierung.de, 1 eu-datenbank.de, 1 eu-gamers.com, 1 eu-stellenangebot.de, 1 euaggelion.blog.br, 1 euanbarrett.com, 1 euchre.us, 1 eucl3d.com, 1 @@ -14429,17 +14417,16 @@ exgaywatch.com, 1 exgen.io, 1 exhaledayspa.com.au, 1 exhalespa.com, 1 exhibityour.com, 1 exiahost.com, 1 exit9wineandliquor.com, 1 exitooutdoor.com, 1 exmoe.com, 1 -exnovin.co, 1 exocen.com, 1 exon.io, 1 exoplatform.com, 1 exordiumconcepts.com, 1 exoscale.ch, 1 exoscale.com, 1 exoten-spezialist.de, 1 exoticads.com, 1 @@ -14723,16 +14710,17 @@ falbros.com, 1 falcona.io, 1 falconfrag.com, 1 falconvintners.com, 1 falcoz.co, 1 faldoria.de, 1 falegname-roma.it, 1 falkhusemann.de, 1 falkus.net, 1 +falldennismarketing.com, 1 fallenangeldrinks.co.uk, 1 fallenangeldrinks.com, 1 fallenangeldrinks.eu, 1 fallenangelspirits.co.uk, 1 fallenangelspirits.com, 1 fallenmystic.com, 1 fallenspirits.co.uk, 1 falling.se, 1 @@ -15355,28 +15343,28 @@ fish-hook.ru, 1 fish2.me, 1 fishbattle.io, 1 fishbattle.net, 1 fishermailbox.net, 1 fishermansbend.apartments, 1 fishermansbendcorporation.com.au, 1 fishermansbendtownhouses.com.au, 1 fishexport.eu, 1 +fishfinders.info, 1 fishgen.no, 1 fishserver.net, 1 fishtacos.blog, 1 fistu.la, 1 fit-4u.ch, 1 fit-mit-nina.com, 1 fit-mit-system.eu, 1 fit365.jp, 1 fitchannel.com, 1 fitinclass.com, 1 fitkram.cz, 1 -fitmeat.at, 1 fitness-challenge.co.uk, 1 fitness.gov, 1 fittelo.cz, 1 fitzsim.org, 1 fiuxy.bz, 1 fiuxy.co, 1 fiuxy.me, 1 fiuxy.org, 1 @@ -15436,17 +15424,16 @@ flashgot.net, 1 flat.io, 1 flatlandchurch.com, 1 flatmail.pl, 1 flatmatehub.com.au, 1 flatpackmates.co.uk, 1 flauschig.net, 1 flavinus.fr, 1 flaviu.co.uk, 1 -flavo.io, 1 flavr.be, 1 flawlesscowboy.xyz, 1 fleep.io, 1 fleetcor.at, 1 fleetcor.ch, 1 fleetcor.cz, 1 fleetcor.de, 1 fleetcor.fr, 1 @@ -15499,17 +15486,16 @@ flinch.io, 1 fling.dating, 1 flip.kim, 1 flipneus.net, 1 fliptable.org, 1 flirt-norden.de, 1 flirtee.net, 1 flirtfaces.de, 1 flirtos.de, 1 -flirtycourts.com, 1 flixhaven.net, 1 flixports.com, 1 flmortgagebank.com, 1 floatationlocations.com, 1 floaternet.com, 1 flockbox.club, 1 flocktofedora.org, 1 floersheimer-openair.de, 1 @@ -15719,16 +15705,17 @@ foregroundweb.com, 1 foreign-language-colleges.com, 1 forellenpark.com, 1 forento.be, 1 foresdon.jp, 1 forestraven.net, 1 foreverssl.com, 1 foreversummertime.com, 1 forewordreviews.com, 1 +forex-plus.com, 1 forex.ee, 1 forexchef.de, 1 forexee.com, 1 forexsignals7.com, 1 forextickler.com, 1 forextimes.ru, 0 forfunssake.co.uk, 1 forge-goerger.eu, 1 @@ -15802,17 +15789,16 @@ foto-leitner.com, 1 foto-leitner.de, 1 foto-pro.by, 1 foto-robitsch.at, 1 foto-roma.ru, 1 foto.by, 1 fotoboxvysocina.cz, 1 fotofaerie.net, 1 fotoflits.net, 1 -fotografechristha.nl, 1 fotografiadellalucerossa.com, 1 fotohome.dk, 1 fotokomorkomania.pl, 1 fotoleitner.com, 1 fotoleitner.de, 1 fotonjan.com, 1 fotostravestisbr.com, 1 fotostudio-leitner.com, 1 @@ -15894,17 +15880,16 @@ franken-lehrmittel.de, 1 frankenhost.de, 1 frankenlehrmittel.de, 1 frankfurt-am-start.de, 1 frankhaala.com, 1 frankierfachmann.de, 1 frankierprofi.de, 1 frankierstar.de, 1 frankinteriordesign.co.uk, 1 -frankl.in, 1 franklinhua.com, 1 frankmorrow.com, 1 frankopol-sklep.pl, 1 franksiler.com, 1 frankslaughterinsurance.com, 1 frankwei.xyz, 1 frankyan.com, 1 fransallen.com, 1 @@ -16061,17 +16046,16 @@ fresh-networks.net, 1 fresh.co.il, 1 freshcode.nl, 1 freshdesigns.de, 1 freshdns.nl, 1 freshempire.gov, 1 freshislandfish.com, 1 freshkiss.com.au, 1 freshmaza.com, 1 -freshmaza.io, 1 freshmaza.net, 1 fretscha.com, 1 frettirnar.is, 1 fretworksec.com, 1 friarsonbase.com, 1 fribourgviking.net, 1 frickelboxx.de, 1 frickelmeister.de, 1 @@ -16420,17 +16404,17 @@ g10e.ch, 1 g1jeu.com, 1 g1s.cc, 1 g2links.com, 1 g2pla.net, 1 g2ship.com, 1 g2soft.net, 1 g3d.ro, 1 g3dev.ch, 1 -g3rv4.com, 0 +g3rv4.com, 1 g4w.co, 1 g6666g.tk, 1 g8energysolutions.co.uk, 1 gaasuper6.com, 1 gaaz.fr, 1 gabe565.com, 1 gabeb1920.com, 1 gabecook.com, 1 @@ -16784,17 +16768,16 @@ geldimblick.de, 1 geldteveel.eu, 1 geleenbeekdal.nl, 1 geleia-real.com, 1 gelis.ch, 1 gelodosul.com.br, 1 gelog-software.de, 0 geloofindemocratie.nl, 0 geluidsstudio.com, 1 -gem-indonesia.net, 0 gem-info.fr, 1 gemeentemolenwaard.nl, 1 gemeinsam-ideen-verwirklichen.de, 1 gemgroups.in, 1 gemini.com, 1 gemquery.com, 1 genchev.io, 1 gencmedya.com, 1 @@ -17233,17 +17216,16 @@ glenavy.tk, 1 glenberviegolfclub.com, 1 glencambria.com, 1 glencarbide.com, 1 glencoveny.gov, 1 glendarraghbouncycastles.co.uk, 1 glenhuntlyapartments.com.au, 1 glenshere.com, 1 glevolution.com, 1 -glicerina.online, 1 glidingshop.cz, 1 glidingshop.de, 1 glidingshop.eu, 1 glitzerstuecke.de, 1 glloq.org, 1 glnpo.gov, 1 glob-coin.com, 1 global-adult-webcams.com, 1 @@ -17399,17 +17381,16 @@ gogonano.com, 1 gogoodyear.eu, 1 gogroopie.com, 1 gogroopie.ie, 1 gogrow.com, 1 gogsat.com, 1 gohon.org, 1 gohongi-katakori.com, 1 goiaspropaganda.com.br, 1 -goingreen.com.au, 1 gokhankesici.com, 1 gokmenguresci.com, 1 golang.zone, 1 gold24.ru, 1 goldclubcasino.com, 1 goldcoastasian.com, 1 goldcoasthypnotherapyhypnosis.com.au, 1 goldcoastphotographycourses.com, 1 @@ -17446,17 +17427,16 @@ gomena.io, 1 gommista.roma.it, 1 gondawa.com, 1 gondelvaartdwarsgracht.nl, 1 gongjianwei.com, 1 gongjuhao.com, 1 gonx.dk, 1 gonzalesca.gov, 1 goo.gl, 1 -good-tips.pro, 1 gooday.life, 1 gooddomainna.me, 1 goodenough.nz, 0 goodfeels.net, 1 goodhealthtv.com, 1 goodquote.gq, 1 goodsex4all.com.br, 1 goodshepherdmv.com, 1 @@ -17717,17 +17697,16 @@ greenteamtwente.nl, 1 greenwaylog.net, 1 greenwithdecor.com, 1 greer.ru, 1 greg.red, 1 gregbrimble.com, 1 greger.me, 1 greggsfoundation.org.uk, 1 gregmartyn.com, 1 -gregmarziomedia.com, 1 gregmilton.com, 1 gregmilton.org, 1 gregmote.com, 1 grego.pt, 1 gregoirow.be, 1 gregorians.org, 1 gregorkofler.com, 1 gregory-kramer.fr, 1 @@ -17785,17 +17764,17 @@ griyo.online, 1 grizzlys.com, 1 grmp.fr, 1 groben-itsolutions.de, 1 grocerybuild.com, 1 grocock.me.uk, 1 groenaquasolutions.nl, 1 groenewoud.me, 1 groentebesteld.nl, 1 -groenteclub.nl, 1 +groenteclub.nl, 0 groentefruitzeep.com, 1 groentefruitzeep.nl, 1 groepjam-usedcars.be, 1 grog.pw, 1 grokker.com, 1 groklearning.com, 1 grolimur.ch, 1 gronau-it-cloud-computing.de, 1 @@ -17894,16 +17873,17 @@ gubagoo.com, 1 gubagoo.io, 1 gudangpangan.id, 1 gudini.net, 1 guegan.de, 1 guelo.ch, 1 guelphhydropool.com, 1 guendra.dedyn.io, 1 guenthereder.at, 1 +guenthernoack.de, 1 guerard.info, 1 guerrilla.technology, 1 guesthouse-namaste.com, 1 guevener.de, 1 gueze-ardeche.fr, 1 gueze-sas.fr, 1 gufen.ga, 1 guffr.it, 1 @@ -17947,17 +17927,16 @@ gume4you.com, 1 gumi.ca, 1 gummibande.noip.me, 0 gunauc.net, 1 gunceloyunhileleri.com, 1 gunhunter.com, 1 gunwatch.co.uk, 1 gunworld.com.au, 1 guochang.xyz, 1 -guoke.com, 1 guoliang.me, 1 guozeyu.com, 1 gupfen.ch, 1 gurkan.in, 1 gurmel.ru, 1 gurochan.ch, 1 gurpusmaximus.com, 1 guru-naradi.cz, 1 @@ -18048,17 +18027,16 @@ h3b.nl, 1 h3x.jp, 0 h3z.jp, 1 h404bi.com, 1 ha-kunamatata.de, 1 ha3.eu, 1 ha6.ru, 1 haarlemsesaxofoonschool.nl, 1 haavard.me, 1 -haazen.xyz, 1 habarisoft.com, 1 habbig.cc, 1 habbixed.tk, 1 habbos.es, 1 habeo.si, 1 habitat-domotique.fr, 1 habr.com, 1 habtium.com, 1 @@ -18620,17 +18598,16 @@ heliosnet.com, 1 heliosvoting.org, 1 helix.am, 1 hell.sh, 1 hellenicagora.co.uk, 1 hellersgas.com, 1 helles-koepfchen.de, 1 helloacm.com, 1 hellofilters.com, 1 -hellomouse.cf, 1 hellomouse.net, 1 hellomouse.tk, 1 hellotandem.com, 1 hellothought.net, 1 hellsgamers.pw, 1 hellsh.com, 1 helmut-a-binser.de, 1 help.simpletax.ca, 1 @@ -19488,17 +19465,16 @@ humanzee.com, 1 humass.nl, 1 humblebee.at, 1 humblebee.be, 1 humblebee.bg, 1 humblebee.ch, 1 humblebee.co.in, 1 humblebee.co.uk, 1 humblebee.com.mx, 1 -humblebee.com.ph, 1 humblebee.cz, 1 humblebee.dk, 1 humblebee.es, 1 humblebee.eu, 1 humblebee.foundation, 1 humblebee.fr, 1 humblebee.gr, 1 humblebee.hu, 1 @@ -19531,17 +19507,17 @@ hunqz.com, 1 hunstoncanoeclub.co.uk, 1 hunter-read.com, 1 hunter.io, 1 hunterjohnson.io, 1 hunterkehoe.com, 1 huntexpired.com, 1 huntingdonbouncers.co.uk, 1 huntingdonlifesciences.com, 1 -huntshomeinspections.com, 1 +huntshomeinspections.com, 0 huntsmansecurity.com, 1 huntsvillecottage.ca, 1 huongquynh.com, 1 huonit.com.au, 1 hup.hu, 1 hupp.se, 1 hurd.is, 1 huren.nl, 1 @@ -19647,17 +19623,17 @@ i-office.com.vn, 1 i-proswiss.com, 1 i-red.info, 1 i-scream.space, 1 i-sports.cz, 1 i-stats.net, 1 i-telligence.de, 1 i-verbi.it, 1 i00.eu, 1 -i1314.gdn, 0 +i1314.gdn, 1 i1place.com, 1 i2b.ro, 1 i4m1k0su.com, 1 i5y.co.uk, 1 i5y.org, 1 i66.me, 1 i879.com, 1 i95.me, 0 @@ -19680,17 +19656,16 @@ iam.soy, 1 iambozboz.co.uk, 1 iamcarrico.com, 1 iamhansen.xyz, 1 iaminashittymood.today, 1 iamjoshellis.com, 1 iamlbk.com, 1 iamlzh.com, 1 iamsoareyou.se, 1 -iamtheib.me, 1 iamtonyarthur.com, 1 iamusingtheinter.net, 1 iamwoodbeard.com, 1 iandouglasscott.com, 1 iane-ccs.com, 1 ianix.com, 1 ianjmoriarty.com, 1 ianklug.com, 1 @@ -19745,16 +19720,17 @@ ice.xyz, 1 icebat.dyndns.org, 1 iceberg.academy, 1 icebook.co.uk, 1 icebound.win, 1 icecars.net, 1 icedream.tech, 1 iceloch.com, 1 icetiger.eu, 1 +icewoman.net, 1 ich-hab-die-schnauze-voll-von-der-suche-nach-ner-kurzen-domain.de, 1 ich-tanke.de, 1 ichasco.com, 1 ichbinein.org, 1 ichbinkeinreh.de, 1 ichmachdas.net, 1 ickerseashop.com, 1 iclart.com, 1 @@ -20141,17 +20117,16 @@ immobilien-badlippspringe.de, 1 immobilien-in-istanbul.de, 1 immobilien-wallat.de, 1 immobilien-zirm.de, 1 immobilier-nice.fr, 1 immobilier92.net, 1 immobiza.com, 0 immortal.run, 1 imobile3.com, 1 -imoe.ac.cn, 1 imokuri123.com, 1 imoner.com, 1 imoner.ga, 1 imouto.my, 0 imouyang.com, 1 impact.health.nz, 1 impacter.eu, 1 impactfestival.be, 1 @@ -20196,16 +20171,17 @@ imrunner.com, 1 imrunner.ru, 1 ims-sargans.ch, 1 imscompany.com, 1 imwalking.de, 1 imwnk.cn, 1 imydl.com, 1 imydl.tech, 1 imyjy.cn, 1 +imyrs.cn, 1 imyunya.com, 1 imyz.tw, 1 in-depthoutdoors.com, 1 in-flames.com, 1 in.search.yahoo.com, 0 in.xero.com, 0 in10tion.com, 0 inabox.ro, 1 @@ -20438,17 +20414,16 @@ inksay.com, 1 inkspire.co.uk, 1 inkthemes.com, 1 inkurz.de, 1 inlabo.de, 1 inline-sport.cz, 1 inlink.ee, 1 inmaps.xyz, 1 inmatefinancial.com, 1 -inmateintake.com, 1 inme.ga, 1 inmobillium.fr, 1 inmoodforsex.com, 1 inmusrv.de, 1 innerfence.com, 1 innerform.com, 1 innerlightcrystals.co.uk, 1 innermostparts.org, 1 @@ -20528,17 +20503,16 @@ instead.com.au, 1 insteagle.com, 1 instela.com, 1 instelikes.com.br, 1 instics.com, 1 instinctive.io, 1 instinctiveads.com, 1 institut-confucius-montpellier.org, 1 institutmaupertuis.hopto.org, 1 -institutolancaster.com, 0 institutulcultural.ro, 1 instrumart.ru, 0 insult.es, 1 insurance, 1 insurance321.com, 1 insureon.com, 1 insurgentsmustdie.com, 1 int-ext-design.fr, 1 @@ -20602,16 +20576,17 @@ interior-design-colleges.com, 1 interiorcheapo.com, 1 interiordesignsconcept.com, 1 interiorprofesional.com.ar, 1 interisaudit.com, 1 interlingvo.biz, 1 intermax.nl, 1 intermedinet.nl, 1 internalkmc.com, 1 +international-arbitration-attorney.com, 1 international-books.org, 1 international-nash-day.com, 1 internationalfashionjobs.com, 1 internationalschool.it, 1 internationalschoolnewyork.com, 1 internationaltalento.it, 1 internect.co.za, 1 internet-aukcion.info, 1 @@ -20999,16 +20974,17 @@ isvsecwatch.org, 1 isyu.xyz, 1 isz.no, 1 iszy.me, 1 it-academy.sk, 1 it-enthusiasts.tech, 1 it-faul.de, 1 it-fernau.com, 1 it-jobbank.dk, 1 +it-kron.de, 1 it-maker.eu, 1 it-rotter.de, 1 it-schamans.de, 1 it-seems-to.work, 1 it-service24.at, 1 it-service24.ch, 1 it-service24.com, 1 it-shamans.de, 1 @@ -21618,17 +21594,16 @@ jessicabenedictus.nl, 0 jessicahrehor.com, 1 jesters-court.net, 1 jesuisadmin.fr, 1 jet-stream.fr, 1 jetapi.org, 1 jetbbs.com, 1 jetbrains.pw, 1 jetkittens.co.uk, 1 -jetmirshatri.com, 1 jetsetboyz.net, 1 jetsieswerda.nl, 1 jettlarue.com, 1 jettravel.com.mt, 1 jetwhiz.com, 1 jetzt-elektromobil.de, 1 jeugdkans.nl, 1 jeuxetcodes.fr, 1 @@ -21704,17 +21679,16 @@ jinliming.ml, 1 jino-jossy.appspot.com, 1 jinshuju.net, 1 jiogo.com, 1 jirav.com, 1 jiripudil.cz, 1 jirosworld.com, 1 jisai.net.cn, 1 jisha.site, 1 -jiveiaktivno.bg, 1 jixun.moe, 1 jiyusu.com, 1 jiyuu-ni.com, 1 jiyuu-ni.net, 1 jjj.blog, 1 jjjconnection.com, 1 jjlvk.nl, 1 jjmarketing.co.uk, 1 @@ -22223,17 +22197,16 @@ justice4assange.com, 1 justin-tech.com, 0 justinellingwood.com, 1 justinharrison.ca, 1 justinho.com, 1 justinstandring.com, 1 justmensgloves.com, 1 justnu.se, 0 justpaste.it, 1 -justsome.info, 1 justtalk.site, 1 justthinktwice.gov, 1 justupdate.me, 1 justyy.com, 1 justzz.xyz, 1 juszkiewicz.com.pl, 1 jutlander-netbank.dk, 1 jutlander.dk, 1 @@ -22259,18 +22232,20 @@ jwjwjw.com, 1 jwmmarketing.com, 1 jwnotifier.org, 1 jwod.gov, 1 jwolt-lx.com, 1 jwschuepfheim.ch, 1 jwsoft.nl, 1 jxir.de, 1 jxltom.com, 1 +jxm.in, 1 jydemarked.dk, 1 jyggen.com, 1 +jym.fit, 1 jyoti-fairworks.org, 1 jzachpearson.com, 1 jzbk.org, 1 jzcapital.co, 1 k-bone.com, 1 k-homes.net, 1 k-netz.de, 1 k-pan.com, 1 @@ -22357,17 +22332,17 @@ kaliaa.fi, 1 kalian.cz, 1 kalilinux.tech, 1 kalkulacka-havarijni.cz, 1 kall.is, 1 kallies-net.de, 1 kalmar.com, 1 kaloix.de, 1 kalolina.com, 1 -kalombo.ru, 0 +kalombo.ru, 1 kalsbouncies.com, 1 kaltenbrunner.it, 1 kalterersee.ch, 1 kalwestelectric.com, 1 kam-serwis.pl, 1 kamalame.co, 1 kamatajisyaku.tokyo.jp, 1 kamikaichimaru.com, 0 @@ -22776,17 +22751,17 @@ kgnk.ru, 1 khaledgarbaya.net, 0 khanovaskola.cz, 1 khas.co.uk, 1 khasiatmanfaat.com, 1 kheshtar.pl, 1 khetzal.info, 1 khipu.com, 1 khlee.net, 1 -khmb.ru, 1 +khmb.ru, 0 khosla.uk, 1 khoury-dulla.ch, 1 khs1994.com, 1 khudothiswanpark.vn, 1 kiadoapartman.hu, 1 kiahoriane.com, 1 kiaka.co, 1 kiano.net, 1 @@ -22915,16 +22890,17 @@ kintore.tv, 1 kiocloud.com, 1 kionetworks.es, 1 kipa.at, 1 kipiradio.com, 1 kippenbart.gq, 1 kipriakipita.gr, 1 kiraboshi.xyz, 1 kiragameforum.net, 1 +kirainmoe.com, 1 kiraku.co, 1 kirbear.com, 1 kirche-dortmund-ost.de, 1 kirchen-im-web.de, 0 kirchengemeinde-markt-erlbach.de, 1 kircp.com, 1 kirei.se, 1 kirig.ph, 1 @@ -22942,16 +22918,17 @@ kirrie.pe.kr, 1 kirsch-gestaltung.de, 1 kirschbaum.me, 1 kirslis.com, 1 kirstenbos.ca, 1 kirstin-peters.de, 1 kirwandigital.com, 1 kis-toitoidixi.de, 1 kisallatorvos.hu, 1 +kisalt.im, 1 kisiselveri.com, 1 kisma.de, 1 kissesb.com, 1 kissesb.net, 1 kissflow.com, 1 kissgyms.com, 1 kisskiss.ch, 1 kissmycreative.com, 1 @@ -22979,16 +22956,17 @@ kiteschoolzandvoort.nl, 1 kitsapsolutions.com, 1 kittmedia.com, 1 kittpress.com, 1 kittyhacker101.tk, 1 kivitelezesbiztositas.hu, 1 kiwi.com, 1 kiwi.digital, 1 kiwi.global, 1 +kiwi.wiki, 1 kiwico.com, 1 kiwipayment.com, 1 kiwipayments.com, 1 kiwiplace.com, 1 kix.moe, 1 kiyotatsu.com, 1 kj-prince.com, 1 kj1396.net, 1 @@ -23185,16 +23163,17 @@ koka-shop.de, 1 kokensupport.com, 1 koketteriet.se, 1 kokoiroworks.com, 1 kokona.ch, 1 kokumoto.com, 1 kolania.com, 1 kolania.de, 1 kolania.net, 1 +kolaykaydet.com, 1 kolbeck.tk, 1 kolbeinsson.se, 1 kolcsey.eu, 1 koldanews.com, 1 kolin.org, 1 kolizaskrap.bg, 1 kolja-engelmann.de, 1 kolkataflowermall.com, 1 @@ -23409,17 +23388,16 @@ kristiehill.com, 1 kristikala.nl, 1 kristinbailey.com, 0 kristofba.ch, 1 kristofdv.be, 1 krizevci.info, 1 krk-media.pl, 0 krmeni.cz, 0 krokedil.se, 1 -krokodent.de, 1 kromamoveis.com.br, 1 kromonos.net, 1 kronaw.it, 1 krony.de, 1 kronych.cz, 1 kroon.email, 1 kropkait.pl, 1 krouzkyliduska.cz, 1 @@ -23436,16 +23414,17 @@ krutka.cz, 1 kruu.de, 1 kruzhki-s-kartinkami.ru, 1 kry.no, 1 kry.se, 1 kryglik.com, 1 krypsys.com, 1 krypt.com, 1 kryptera.se, 1 +kryptomodkingz.com, 1 krytykawszystkiego.com, 1 krytykawszystkiego.pl, 1 kryx.de, 1 ks-watch.de, 1 ks88.com, 1 kschv-rdeck.de, 1 kselenia.ee, 1 ksero.center, 1 @@ -23539,17 +23518,16 @@ kurumi.io, 1 kuruppa.xyz, 1 kuschku.de, 1 kusdaryanto.web.id, 1 kushtikidsparties.co.uk, 1 kusochi.eu, 1 kutinsoft.com, 1 kutny.cz, 1 kutsankaplan.com, 1 -kuttler.eu, 1 kutukupret.com, 1 kutus.ee, 1 kuwago.io, 1 kuzbass-pwl.ru, 1 kvadratnimeter.si, 1 kvalita-1a.cz, 1 kvalitetsaktiepodden.se, 1 kvalitnitesneni.cz, 1 @@ -24634,17 +24612,16 @@ linext.cn, 1 linfamilygc.com, 1 lingerie.com.br, 1 lingeriesilhouette.com, 1 lingotaxi.com, 1 lingting.vip, 1 linguamilla.com, 1 linguatrip.com, 0 lingvo-svoboda.ru, 1 -linherest.tk, 1 link-sanitizer.com, 1 link2serve.com, 1 linkages.org, 1 linkat4.cz, 1 linkdr.uk, 1 linkedinbackground.com, 1 linkedpipes.com, 1 linkenheil.org, 1 @@ -25132,27 +25109,27 @@ lorenadumitrascu.ro, 1 loreofthenorth.com, 1 loreofthenorth.nl, 1 lorientlejour.com, 1 loritaboegl.de, 1 lormansas.com, 1 losangelestown.com, 1 losebellyfat.pro, 1 losless.fr, 1 -losrascadoresparagatos.com, 1 losreyesdeldescanso.com.ar, 1 loss.no, 1 lost.host, 1 lost.report, 1 lostandcash.com, 1 lostarq.com, 1 lostingames.de, 1 lostkeys.co.uk, 1 lostserver.com, 1 lostwithdan.com, 1 +loteamentomontereiitu.com.br, 1 lothlorien.ca, 0 lotl.ru, 1 lotn.mobi, 1 lotn.nl, 1 lotnonline.com, 1 lotnonline.nl, 1 lotro-wiki.com, 1 lottospielen24.org, 0 @@ -25252,17 +25229,16 @@ ltba.org, 1 ltecode.com, 1 ltib.com.au, 1 ltls.org, 1 ltn-tom-morel.fr, 1 ltransferts.com, 1 lu.search.yahoo.com, 0 luan.ma, 1 luav.org, 1 -lubar.me, 1 lubbockyounglawyers.org, 1 lublin.toys, 1 lubomirkazakov.com, 1 lubot.net, 0 luc-oberson.ch, 1 luca.swiss, 1 lucacastelnuovo.nl, 0 lucafontana.net, 1 @@ -25538,17 +25514,16 @@ macnetwork.eu, 1 macnetwork.fr, 1 macnetwork.net, 1 maco.org.uk, 1 maconnerie-dcs.ch, 1 macosxfilerecovery.com, 1 macoun.de, 1 macros.co.jp, 1 macstore.pe, 1 -mactools.com.co, 1 mad.ninja, 1 madae.nl, 1 madars.org, 0 madbicicletas.com, 1 madbin.com, 1 madbouncycastles.co.uk, 1 maddi.biz, 1 maddistonevangelical.co.uk, 1 @@ -25581,17 +25556,16 @@ madtec.de, 1 madusecurity.com, 1 mae-berlinistanbul.com, 1 maedchenflohmarkt.at, 1 maedchenflohmarkt.de, 1 maeln.com, 1 maelstrom-fury.eu, 1 maelstrom.ninja, 1 maeplasticsurgery.com, 1 -maerzpa.de, 1 maestrano.com, 1 maff.co.uk, 1 maff.scot, 0 mafia.network, 1 mafiaforum.de, 1 mafiapenguin.club, 1 mafiasi.de, 1 magasindejouets.com, 1 @@ -25651,16 +25625,17 @@ mahai.me, 1 mahatmayoga.org, 1 mahefa.co.uk, 1 mahjong-navi.com, 1 mahjong.org, 1 mahjongrush.com, 1 mahrer.net, 1 maiaimobiliare.ro, 1 maidoty.net, 1 +maiebanatulfruncea.com, 1 maijia800.com, 1 maik-mahlow.de, 1 maikolfish.it, 1 mail-de.jp, 1 mail-rotter.de, 1 mail-settings.google.com, 1 mail.com, 1 mail.de, 1 @@ -25760,17 +25735,16 @@ malik.id, 1 malikussa.id, 1 malikussaid.com, 1 malikzinad.com, 1 malinator.net, 0 malinheadview.ie, 1 maliskovik.si, 1 maljaars-fotografie.nl, 1 malkaso.com.ua, 1 -mall.cz, 1 mall.hr, 1 mall.hu, 1 mall.pl, 1 mall.sk, 1 mallach.net, 1 mallhonda.com, 1 mallner.me, 1 mallonline.com.br, 1 @@ -26886,17 +26860,17 @@ meric-graphisme.info, 1 meridianfresno.com, 1 meridianmetals.com, 1 meridianstore.com.br, 1 merimatka.fi, 1 merkel.me, 1 merlet.eu, 1 merlinsoap.com, 1 merloat.club, 1 -merloat.com, 0 +merloat.com, 1 merojob.com, 1 meronberry.jp, 1 mers.one, 1 merson.org, 1 merson.tv, 1 mertarauh.com, 1 mertcangokgoz.com, 1 meruri.com, 1 @@ -27159,16 +27133,17 @@ mikakalathil.ca, 1 mikakalevi.com, 1 mikalikes.men, 1 mike-bland.com, 1 mike2k.de, 1 mikebelanger.ca, 1 mikeblog.site, 1 mikebutcher.ca, 1 mikecb.org, 1 +mikedugan.org, 1 mikegarnett.co.uk, 1 mikegerwitz.com, 1 mikeguy.co.uk, 1 mikehamburg.com, 1 mikehilldesign.co.uk, 1 mikekreuzer.com, 1 mikerichards.photography, 0 miketabor.com, 1 @@ -27517,17 +27492,16 @@ mizumax.me, 1 mj420.com, 1 mjacobson.net, 1 mjanja.ch, 1 mjasm.org, 1 mjec.net, 1 mjlaurindo.pt, 1 mjmedia.co.za, 1 mjmnagy.info, 1 -mjscustomcreations.com.au, 1 mjt.me.uk, 1 mk-dizajn.com, 1 mk89.de, 1 mkacg.com, 1 mkaciuba.com, 1 mkakh.com, 1 mkakh.xyz, 1 mkasu.org, 0 @@ -27757,18 +27731,20 @@ momirfarooq.com, 1 momjoyas.com, 1 momo0v0.club, 1 momozeit.de, 1 momstableonline.com, 1 momut.org, 1 momy-genealogie.info, 1 mon-agenda.org, 0 mon-partage.fr, 1 +mon-trafic.com, 0 mon22.ch, 1 mona-antenna.com, 1 +mona-dress.com, 1 monachatdeco.com, 1 monaco-automaten.de, 1 monad.io, 1 monakasatmasr.com, 1 monalisa.wtf, 1 monalyse.com, 1 monarchcleanersnc.com, 1 monbudget.org, 1 @@ -27790,16 +27766,17 @@ moneypark.ch, 1 moneytoday.se, 1 mongla168.net, 1 mongla88.net, 1 mongolieenfrance.fr, 1 monicabeckstrom.no, 1 monique.io, 1 moniquedekermadec.com, 1 moniquemunhoz.com.br, 1 +monitman.com, 1 monitman.solutions, 1 monitorchain.com, 1 monitori.ng, 1 monitoring.kalisz.pl, 1 monitzer.com, 1 monix.io, 1 monkay.de, 1 monkeybusiness.agency, 1 @@ -28099,16 +28076,17 @@ mrkrabat.de, 1 mrksk.com, 1 mrliu.me, 1 mrmoregame.de, 1 mrnh.de, 1 mrnh.tk, 1 mrning.com, 1 mrprintables.com, 1 mrs-labo.jp, 1 +mrs-shop.com, 1 mrsbairds.com, 0 mrserge.lv, 1 mrsk.me, 1 mrstat.co.uk, 1 mrtunnel.club, 1 mruczek.ga, 1 mruganiepodspacja.pl, 1 mrv.li, 1 @@ -28426,17 +28404,16 @@ mybboard.pl, 1 mybeautyjobs.de, 1 mybicc.org, 1 myblockchain.cloud, 1 mybloggedlife.com, 1 mybodylife.com, 1 mybon.at, 0 mybonfire.com, 1 mybusiness.wien, 1 -mycamda.com, 1 mycard.moe, 1 mycareersfuture.sg, 1 mycieokien.info, 0 mycinema.pro, 1 mycircleworks.com, 1 myclasscam.com, 1 myclasscam.org, 1 myclinicalstudybuddy.com, 1 @@ -28454,17 +28431,16 @@ mycreativeartsconsulting.com, 1 mycreativenook.com, 1 mycreditcardcenter.com, 1 mycrypnet.io, 1 mycrypto.com, 1 mycrystalgrove.com, 1 mycuco.it, 1 mycustomwriting.com, 1 mydarkstar.net, 1 -mydaywebapp.com, 1 mydebian.in.ua, 1 mydentalplan.gr, 1 mydevolo.com, 1 mydevolo.de, 1 mydigitalweek.com, 1 mydjsongbook.com, 1 mydmdi.com, 1 mydna.bio, 1 @@ -28802,17 +28778,16 @@ nagb.org, 1 nagel-dentaltechnik.de, 1 nagelfam.com, 1 naggie.net, 1 nah.nz, 1 nah.re, 1 nahura.com, 1 nailattitude.ch, 1 nailchiodo.com, 1 -nailedithomebuilders.com, 1 nailsalon-aztplus.com, 1 nailtodayminneapolis.com, 1 nairobibusinessreview.com, 1 naive.network, 1 najany.de, 1 najany.dk, 1 najany.fr, 1 najany.nl, 1 @@ -28891,17 +28866,16 @@ narada.com.ua, 1 narakenkoland.net, 1 naralogics.com, 1 narardetval.se, 1 narazaka.net, 1 narduin.xyz, 1 narenderchopra.com, 1 narfation.org, 1 nargileh.nl, 1 -narindal.ch, 1 narko.space, 1 narmos.ch, 1 naro.se, 1 narodsovety.ru, 1 naroska.name, 1 narrativasdigitais.pt, 1 narrative.network, 1 narrative.org, 1 @@ -29375,27 +29349,29 @@ neuhaus-city.de, 1 neurabyte.com, 1 neurexcellence.com, 1 neurobiology.com, 1 neurochip.com, 1 neurocny.cloud, 1 neuroethics.com, 1 neurogroove.info, 1 neurolab.no, 1 +neuronasdigitales.com, 1 neuropharmacology.com, 1 neurotransmitter.net, 1 neurozentrum-zentralschweiz.ch, 1 neutralox.com, 0 neuwal.com, 1 nevadafiber.net, 1 never.pet, 1 nevergreen.io, 1 nevermore.fi, 1 neverwetturkey.com, 1 nevntech.com, 1 +nevolution.me, 1 nevoxo.com, 1 new, 1 new-black-order.com, 1 new-boiler-prices.co.uk, 1 new-ms.com, 1 new-process.ch, 1 new-process.com, 1 new-process.de, 1 @@ -29490,17 +29466,16 @@ nextnely.com, 1 nextnowagency.com, 1 nextrobotics.de, 1 nextstep-labs.gr, 1 nexttv.co.il, 1 nexus-exit.de, 1 nexus-vienna.at, 1 nexusbyte.de, 1 nexusconnectinternational.eu, 1 -nexuscorporation.in, 1 nexwebsites.com, 1 nexxus-sistemas.net.br, 1 neyer-lorenz.de, 1 nezrouge-est-vaudois.ch, 1 nezrouge-geneve.ch, 1 nf4.net, 1 nf9q.com, 1 nfe-elektro.de, 1 @@ -30170,16 +30145,17 @@ nxit.ca, 1 nxth.io, 1 nya.as, 1 nyadora.com, 1 nyadora.moe, 1 nyan.it, 1 nyan.stream, 1 nyanco.space, 1 nyanpasu.tv, 1 +nyansparkle.com, 1 nyantec.com, 1 nyatane.com, 1 nybiz.nyc, 1 nycoyote.org, 1 nydig.com, 1 nydnxs.com, 1 nyghtus.net, 1 nyhaoyuan.net, 1 @@ -30231,16 +30207,17 @@ oatmealdome.me, 1 obamalibrary.gov, 1 obamawhitehouse.gov, 1 obdolbacca.ru, 1 oberam.de, 1 oberhof.co, 1 oberhofdrinks.com, 1 oberhofjuice.com, 1 obermeiers.eu, 1 +oberoi.de, 1 obesidadlavega.com, 1 obfuscate.xyz, 1 obg-global.com, 1 obitech.de, 1 object.earth, 1 objectif-terre.ch, 1 objekt-textil.ch, 1 oblast45.ru, 0 @@ -30283,16 +30260,17 @@ ochrepoint.com.au, 1 ochsenfeld.co, 1 ochsundjunior.ch, 1 ochsundjunior.swiss, 1 ocim.ch, 1 ockendenhemming.co.uk, 1 oclausen.com, 1 ocloud.fr, 1 ocloudhost.com, 1 +ocni-ambulance-most.cz, 1 ocolere.ch, 1 ocotg.com, 1 ocrn.nl, 1 ocsigroup.fr, 1 octal.es, 1 octanio.com, 1 octarineparrot.com, 1 octav.name, 0 @@ -30381,31 +30359,31 @@ oguya.ch, 1 ogyaa.jp, 1 oh14.de, 1 ohadsoft.com, 1 ohai.su, 1 ohayosoro.me, 1 ohchouette.com, 1 ohd.dk, 1 oheila.com, 1 -ohhdeertrade.com, 1 ohhere.xyz, 1 ohiohealthfortune100.com, 1 ohling.org, 1 ohlmeier.com, 1 ohlmeier.net, 1 ohlmeier.org, 1 ohmayonnaise.com, 1 ohne-name.de, 1 ohnonotme.com, 1 ohol.se, 1 ohreally.de, 1 ohsohairy.co.uk, 1 ohyooo.com, 1 oi-wiki.org, 1 +oiaio.cn, 1 oilfieldinjury.attorney, 1 oilpaintingsonly.com, 1 oinky.ddns.net, 1 oirealtor.com, 1 oisd.nl, 1 oita-homes.com, 1 ojaioliveoil.com, 1 ojanaho.com, 1 @@ -30511,17 +30489,16 @@ omegathermoproducts.nl, 1 omeopatiadinamica.it, 1 omertabeyond.com, 1 omertabeyond.net, 1 ometepeislandinfo.com, 1 omf.link, 1 omfg.exposed, 1 omgbouncycastlehire.co.uk, 1 omi-news.fr, 1 -omifind.com, 1 omitech.co.uk, 1 omlmetal.co.jp, 1 omniaclubs.com, 1 omniasig.ro, 1 omniasl.com, 1 omniatv.com, 1 omnibot.tv, 1 omnienviro.com, 0 @@ -30843,17 +30820,17 @@ opus-codium.fr, 1 oraculum.cz, 1 orang-utans.com, 1 orangecomputers.com, 1 orangefab.asia, 1 orangefinanse.com.pl, 1 orangejetpack.com, 1 orangekey.tk, 1 orangenbaum.at, 1 -oranges.tokyo, 1 +orangenuts.in, 1 orangetravel.eu, 1 orangutan-appeal.org.uk, 1 orbitdefence.co.uk, 1 orbu.net, 1 orca.pet, 1 orcamoney.com, 1 orchideenettoyage.com, 1 orchidlive.com, 1 @@ -30970,17 +30947,16 @@ oswalds.co.uk, 1 oswaldsmillaudio.com, 1 oswbouncycastles.co.uk, 1 osx86spain.com, 1 osxentwicklerforum.de, 1 oszri.hu, 1 otakubox.de, 1 otakurepublic.com, 1 otakurumi.de, 1 -otakuyun.com, 1 otchecker.com, 1 otellio.com, 1 otellio.de, 1 otellio.it, 1 otherkinforum.com, 1 oticasaopaulo.com.br, 1 oticasvisao.net.br, 1 otinane.eu, 1 @@ -31121,16 +31097,17 @@ ozvolvo.org, 1 p-fent.ch, 1 p-pc.de, 1 p-s-b.com, 1 p-t.io, 1 p.ki, 1 p1984.nl, 0 p1cn.com, 1 p1ratrulezzz.me, 1 +p22.co, 1 p2av.com, 1 p4chivtac.com, 1 p5118.com, 1 p5r.uk, 1 pa-w.de, 1 pa.search.yahoo.com, 0 paarberatung-hn.de, 1 paardenhulp.nl, 1 @@ -31256,17 +31233,16 @@ pan.digital, 1 panasca.is, 1 panascais.co, 1 panascais.com, 1 panascais.de, 1 panascais.eu, 1 panascais.host, 1 panascais.io, 1 panascais.me, 1 -panascais.net, 1 panascais.pw, 1 panascais.site, 1 panascais.tech, 1 panascais.us, 1 panaxis.biz, 1 panaxis.ch, 1 panaxis.li, 1 panda-community.com, 1 @@ -31373,16 +31349,17 @@ parisfranceparking.de, 1 parisfranceparking.fr, 1 parisfranceparking.nl, 1 parishome.jp, 1 parisprovincedemenagements.fr, 1 parkeren.in, 1 parkfans.net, 1 parkhost.eu, 1 parkinginparis.fr, 1 +parkingpoint.co.uk, 1 parkrunstats.servehttp.com, 1 parksubaruoemparts.com, 1 parkviewmotorcompany.com, 1 parkwayminyan.org, 1 parlamento.gub.uy, 1 parleamonluc.fr, 1 parleu2016.nl, 1 parmels.com.br, 1 @@ -31592,16 +31569,17 @@ pavando.com, 1 pavelfojt.cz, 1 paveljanda.com, 1 pavelrebrov.com, 1 pavelstriz.cz, 1 pavio.org, 1 paw.cloud, 1 paw.pt, 1 pawel-international.com, 1 +pawelnazaruk.com, 1 pawelurbanek.com, 1 pawfriends.org.za, 1 pawsomebox.co.uk, 1 pawsr.us, 1 pawsru.org, 1 paxerahealth.com, 1 pay.gov, 1 pay.ubuntu.com, 1 @@ -31618,17 +31596,17 @@ payment-network.com, 1 paymentaccuracy.gov, 1 payments.google.com, 1 paymerang.com, 1 paymill.com, 1 paymill.de, 1 paymon.tj, 1 paynet.com.co, 1 payoff.com, 1 -paypal.com, 0 +paypal.com, 1 paypaq.com, 1 paypod.org, 1 paypro.nl, 0 payrollhive.com, 1 paysera.com, 1 payslipview.com, 1 payssaintgilles.fr, 1 paystack.com, 1 @@ -31758,17 +31736,16 @@ pehapkari.cz, 1 peifi.de, 0 peippo.at, 1 peirong.me, 1 peka.pw, 1 pekkapleppanen.fi, 1 pekoe.se, 1 pelanucto.cz, 1 pelican.ie, 1 -peliweb.com, 0 pelletizermill.com, 1 pelletsprice.com, 1 pelopogrund.com, 1 pelopoplot.com, 1 pelotonimports.com, 1 pemagrid.org, 1 pems.gov.au, 1 penaugustin.com, 1 @@ -31788,17 +31765,16 @@ pennington.io, 1 pennyparkerpaper.com, 1 penrithapartments.com.au, 1 pens.com, 1 pensacolawinterfest.org, 1 pensador.com, 1 pensador.info, 1 pensioenfonds-ey.nl, 1 pension-am-alten-waschhaus.de, 1 -pension-waldesruh.de, 1 pensionpilot.ca, 1 pensiunealido.ro, 1 penslabyrinth.com, 1 pentandra.com, 1 pentest.blog, 1 pentest.nl, 1 pentesterlab.com, 1 penticton.photography, 1 @@ -32433,17 +32409,16 @@ plaque-funeraire.fr, 1 plassmann.ws, 1 plasticsurgeryartist.com, 1 plasticsurgerynola.com, 1 plasticsurgeryservices.com, 1 plastiflex.it, 1 plastovelehatko.cz, 1 platformadmin.com, 1 platinumexpress.com.ar, 1 -platinumpeek.com, 1 platomania.nl, 1 platschi.net, 1 platten-nach-mass.de, 1 platterlauncher.com, 1 plattner.club, 1 play, 1 play-casino-japan.com, 1 play-charades.com, 1 @@ -32496,17 +32471,16 @@ plinc.co, 1 pliosoft.com, 1 plissee-experte.de, 1 plitu.de, 1 plixer.com, 1 plny.eu, 1 plob.org, 1 plochka.bg, 1 plokko.com, 1 -plomberierenga.com, 1 plongee-phuket.fr, 1 ploofer.com, 1 plot.ly, 1 plotbubble.com, 1 ploxel.com, 1 plr4wp.com, 1 plsboop.me, 1 pluga.co, 1 @@ -32574,16 +32548,17 @@ pmklaassen.com, 1 pmnaish.co.uk, 1 pmoreau.org, 1 pmp-art.com, 1 pmponline.de, 1 pmsacorp.com, 1 pmsf.eu, 1 pmsfdev.com, 1 pmt-documenten.nl, 1 +pn.id.lv, 1 pnakosoft.com, 1 pnakosoft.com.au, 1 pneu01.fr, 1 pneu74.fr, 1 pneuhaus-lemp.ch, 1 pneumonline.be, 1 pnimmobilier.ch, 1 pnmhomecheckup.com, 1 @@ -33587,17 +33562,16 @@ punitsheth.com, 1 punkapoule.fr, 1 punkdns.top, 1 punknews.org, 1 puntacanalink.com, 1 punte-juwelier.nl, 1 pupboss.com, 1 puppet.pl, 1 puq.moe, 1 -purahealthyliving.com, 1 puralps.ch, 1 puravida-estate.com, 1 pure-gmbh.com, 1 purecabo.com, 1 purefkh.xyz, 1 pureitsolutionsllp.com, 1 purelunch.co.uk, 1 purevapeofficial.com, 1 @@ -33628,17 +33602,17 @@ pusatinkubatorbayi.com, 1 pushers.com.mx, 1 pushphp.com, 1 pushrax.com, 1 pusichatka.ddns.net, 1 put.moe, 1 put.re, 1 putatara.net, 1 putman-it.nl, 1 -putney.io, 0 +putney.io, 1 putomani.rs, 1 putrock.be, 1 puurwonengeldrop.nl, 0 puxlit.net, 1 puyallupnissanparts.com, 1 puyblanc.info, 1 puzz.gg, 1 puzz.me, 1 @@ -33726,17 +33700,17 @@ qctravelschool.com, 1 qdabogados.com, 1 qdon.space, 0 qedcon.org, 0 qelectrotech.org, 1 qetesh.de, 1 qetic.co.jp, 1 qewc.com, 1 qforum.org, 1 -qgblog.org, 0 +qgblog.org, 1 qgustavor.tk, 1 qhse-professionals.nl, 1 qianalysis.com, 1 qianqiao.me, 1 qiaohong.org, 1 qicomidadeverdade.com.br, 1 qifu.me, 1 qifu.org.cn, 1 @@ -33847,17 +33821,16 @@ queextensiones.com, 1 quehacerencusco.com, 1 quelle.at, 1 quelle.ch, 1 quelle.de, 1 quelleformation.net, 1 quemeloquitan.com, 1 queminventou.com.br, 1 quemmeliga.com, 1 -quenotejodan.cl, 1 quentinchevre.ch, 1 queo.com.co, 1 quera.ir, 1 querkommentar.de, 1 query-massage.com, 1 question.com, 1 questionable.host, 1 questsocial.it, 1 @@ -33905,31 +33878,29 @@ qweepi.de, 0 qwertee.com, 1 qwerty.work, 1 qwertyatom100.me, 1 qwikdash.com, 1 qwq.moe, 1 qx.fi, 1 qx.se, 1 qxy.ch, 1 -qybot.cc, 1 r-ay.cn, 1 r-core.org, 1 r-cut.fr, 1 r-rwebdesign.com, 1 r-t-b.fr, 1 r0t.co, 1 r0uzic.net, 1 r1a.eu, 1 r1ch.net, 1 r2d2pc.com, 1 r33.space, 1 r3bl.blog, 1 r3bl.me, 1 -r3nt3r.com, 1 r3s1stanc3.me, 1 r40.us, 1 r6-team.ru, 1 r7.com.au, 1 r7h.at, 1 r811.de, 1 ra-joergensen.de, 1 ra-micro-koeln.de, 1 @@ -33937,17 +33908,16 @@ ra-schaal.de, 0 ra.co.ke, 1 ra.vc, 1 ra4wvpn.com, 1 raah.co, 1 rabbit.wales, 0 rabbitfinance.com, 1 rabica.de, 1 rabota-x.ru, 0 -rabotaescort.com, 1 rabynska.eu, 1 racasdecachorro.org, 1 raccoltarifiuti.com, 1 racdek.com, 1 racdek.nl, 1 racermaster.xyz, 1 racesport.nl, 0 raceviewcycles.com, 1 @@ -34028,17 +33998,17 @@ raidensnakesden.com, 1 raidensnakesden.net, 1 raidstone.net, 1 raiffeisen-kosovo.com, 1 rail-o-rama.nl, 1 rail24.nl, 1 rail360.nl, 1 railbird.nl, 1 railgun.ac, 1 -railgun.com.cn, 1 +railgun.com.cn, 0 railjob.cn, 1 railorama.nl, 1 railpassie.nl, 1 railtoo.com, 1 railvideo.co.uk, 1 railvideo.net, 1 railvideo.nl, 1 railwaytech.net, 1 @@ -34439,17 +34409,16 @@ redwaterhost.com, 1 redweek.com, 1 redwoodpaddle.es, 1 redwoodpaddle.pt, 1 redzurl.com, 0 reed-sensor.com, 1 reedloden.com, 1 reedyforkfarm.com, 1 reegle.com, 1 -reepay.com, 1 rees-carter.net, 1 reesmichael1.com, 1 reeson.at, 1 reeson.de, 1 reeson.info, 1 reeson.org, 1 reevaappliances.co.uk, 1 reezer.org, 1 @@ -34480,16 +34449,17 @@ regain.us, 1 regalcapitalwi.com, 1 regalosymuestrasgratis.com, 1 regalpaintingfdl.com, 1 reganclassics.co.uk, 1 reganclassics.com, 1 reganparty.com, 1 regar42.fr, 0 regendevices.eu, 1 +regeneo.cz, 1 regenerapoint.it, 1 regenerescence.com, 1 regily.com, 1 regime-anticellulite.com, 1 regime-maigrir-vite.com, 1 regimebonheur.com, 1 regimecellulite.com, 1 reginagroffy.com, 1 @@ -34582,17 +34552,17 @@ relaybox.io, 1 release-monitoring.org, 1 releasetimes.io, 1 reliancebank.bank, 1 reliant3sixty.com, 1 relocatefeds.gov, 1 relojeriajoyeria.com, 1 relojes-online.com, 1 relojesseiko.es, 1 -relsak.cz, 1 +relsak.cz, 0 relvan.com, 1 rem0te.net, 1 remaimodern.org, 1 remain.london, 1 remambo.jp, 1 remax.at, 1 remedi.tokyo, 1 remedionaturales.com, 1 @@ -34944,16 +34914,17 @@ rimeto.io, 1 rimo.site, 1 rimorrecherche.nl, 1 rincon-nsn.gov, 1 ring.com, 1 ringingliberty.com, 1 ringjewellery.co.uk, 1 rinvex.com, 1 rio-weimar.de, 1 +rioshop.com.br, 1 rioxmarketing.com, 1 rip-sport.cz, 1 ripaton.fr, 1 ripmixmake.org, 1 riqy86.nl, 1 ris.fi, 1 risada.nl, 1 risaphuketproperty.com, 1 @@ -34968,17 +34939,17 @@ riskmitigation.ch, 1 risparmiare.info, 1 rissato.com.br, 1 ristioja.ee, 1 ristoarea.it, 1 ristorantefattoamano.eu, 1 ristorantefattoamano.it, 1 ristoviitanen.fi, 1 ristrutturazioneappartamento.roma.it, 1 -rit.space, 1 +rit.space, 0 rittau.biz, 1 rittau.org, 1 ritzlux.com.tw, 1 rivaforum.de, 1 rivalsa.cn, 1 rivastation.de, 1 riverbanktearooms.co.uk, 1 riverbendroofingnd.com, 1 @@ -35033,17 +35004,16 @@ rnb-storenbau.ch, 1 rnbjunk.com, 1 rngmeme.com, 1 rnt.cl, 1 ro.search.yahoo.com, 0 roadguard.nl, 0 roadtopgm.com, 1 roams.es, 1 roave.com, 1 -rob.uk.com, 1 rob006.net, 1 robandjanine.com, 1 robbertt.com, 0 robbiecrash.me, 1 robdavidson.network, 1 robert-flynn.de, 1 robertabittle.com, 1 robertattfield.com, 1 @@ -35129,31 +35099,29 @@ rodarion.pl, 1 roddis.net, 1 rodehutskors.net, 1 rodeobull.biz, 1 rodeohire.com, 1 rodeosales.co.uk, 1 rodevlaggen.nl, 1 rodichi.net, 1 rodinnebyvanie.eu, 1 -rodinneodpoledne2018.cz, 1 rodolfo.gs, 1 rodomonte.org, 1 rodrigocarvalho.blog.br, 1 rody-design.com, 1 roeckx.be, 1 roeitijd.nl, 0 roeleveld.nl, 1 roelhollander.eu, 1 roelof.io, 1 roelsworld.eu, 1 roemhild.de, 1 roerstaafjes.nl, 1 roessner-network-solutions.com, 0 -roffe.nu, 1 rofl.com.ua, 1 roflcopter.fr, 1 rofrank.space, 1 rogagym.com, 1 rogeiro.net, 1 roger101.com, 1 rogerdat.ovh, 1 rogerhub.com, 1 @@ -35583,17 +35551,16 @@ ruska-modra.cz, 1 ruskamodra.cz, 1 ruskod.net, 1 rusl.net, 1 rusmolotok.ru, 1 russellupevents.co.uk, 1 russia.dating, 1 russiaeconomy.org, 1 russianorthodoxchurch.co.uk, 1 -russpuss.ru, 1 russt.me, 1 rust.mn, 1 rustable.com, 1 rustikalwallis.ch, 1 rustralasia.net, 1 rustyrambles.com, 1 rusxakep.com, 1 rutgerschimmel.nl, 1 @@ -35714,16 +35681,17 @@ sacrome.com, 1 sadbox.es, 1 sadbox.org, 1 sadbox.xyz, 1 sadev.co.za, 1 sadhawkict.org, 1 sadiejanehair.com, 1 sadmansh.com, 1 sadou.kyoto.jp, 1 +sadsu.com, 1 saenforcement.agency, 1 saengsook.com, 1 saengsuk.com, 1 safar.sk, 1 safaritenten.nl, 1 safcstore.com, 1 safe.moe, 1 safe.space, 1 @@ -35788,17 +35756,16 @@ sainetworks.net, 1 saint-bernard-gouesch.fr, 1 saint-cyril.com, 1 saintaardvarkthecarpeted.com, 1 saintanthonyscorner.com, 1 sainth.de, 1 sainthelenas.org, 1 saintjamestheapostle.org, 1 saintjohn-bocaraton.com, 1 -saintmichelqud.com, 1 saintpatrick-norristown.net, 1 saintw.com, 1 saipariwar.com, 1 saiputra.com, 1 saitrance.com, 1 saitv.org, 1 sajamstudija.info, 1 sajdowski.de, 1 @@ -36776,17 +36743,16 @@ seobutler.com, 1 seocomposer.com, 1 seoenmexico.com.mx, 1 seogeek.nl, 1 seohackers.fr, 1 seohochschule.de, 1 seohouston.com, 1 seoinc.com, 1 seoium.com, 1 -seokay.com, 1 seolib.org, 1 seomarketing.bg, 1 seomen.biz, 1 seon.me, 1 seoprovider.nl, 1 seoquake.com, 1 seoscribe.net, 1 seosof.com, 1 @@ -36817,17 +36783,16 @@ serenaden.at, 1 serendeputy.com, 1 serf.io, 1 sergeemond.ca, 1 sergefonville.nl, 1 sergeyreznikov.com, 1 sergije-stanic.me, 1 sergiosantoro.it, 1 sergiozygmunt.com, 1 -sergivb01.me, 1 sergos.de, 1 serialexperiments.co.uk, 1 serienstream.to, 1 serigraphs.co.uk, 1 serinamusic.com, 1 seriousclimbing.com, 1 seriouss.am, 1 sernate.com, 1 @@ -36975,17 +36940,16 @@ sgtsnookums.net, 1 sgtt.ch, 1 sgutranscripts.org, 1 sh-heppelmann.de, 1 sh-network.de, 1 sh0rt.in, 1 sh0rt.zone, 1 sh0shin.org, 1 sh4y.com, 1 -shaaaaaaaaaaaaa.com, 1 shad.waw.pl, 1 shadesofgrayadr.com, 1 shadesofgraylaw.com, 1 shadex.net, 1 shadigee.org, 1 shadiku.com, 1 shadowict.net, 1 shadowict.tech, 1 @@ -37182,17 +37146,16 @@ shk.im, 1 shlemenkov.by, 1 shlmail.info, 1 shmibbles.me, 1 shmunky.co.uk, 1 shobhanayogsadan.com, 1 shock.ee, 1 shockercityservices.com, 1 shodan.io, 1 -shoemuse.com, 1 shoeracks.uk, 1 shoestringeventing.co.uk, 1 shokola.com, 1 shome.de, 1 shooter.dog, 1 shootpooloklahoma.com, 1 shop-hellsheadbangers.com, 1 shop-s.net, 1 @@ -37518,18 +37481,16 @@ simon-mueller.de, 1 simon3k.moe, 1 simonastallone.com, 1 simonberard.garden, 1 simonbondo.dk, 1 simoncommunity.org.uk, 1 simoncook.org, 1 simonfischer.info, 1 simonhirscher.de, 1 -simonkjellberg.com, 1 -simonkjellberg.se, 1 simonlyabonnement.nl, 1 simonmaddox.com, 1 simonpaarlberg.com, 1 simonreich.de, 1 simonschmitt.ch, 1 simonshine.dk, 1 simonspeich.ch, 1 simonsreich.de, 1 @@ -37754,16 +37715,17 @@ skommettiamo.it, 1 skontakt.cz, 1 skontorp-enterprise.no, 1 skortekaas.nl, 0 skory.us, 1 skou.dk, 0 skram.de, 1 skrimix.tk, 0 skryptersi.pl, 1 +sksdrivingschool.com.au, 1 sktan.com, 1 sktsolution.com, 0 skuldwyrm.no, 1 skutry-levne.cz, 1 skutry.cz, 1 skwile-cafe.com, 1 skwitko.com, 1 sky-aroma.com, 1 @@ -38234,16 +38196,17 @@ solidtuesday.com, 1 solihullcarnival.co.uk, 1 solihullinflatables.com, 1 solihulllionsclub.org.uk, 1 solipym.net, 1 solisrey.es, 1 solit.systems, 1 solitairenetwork.com, 1 solmek.co.uk, 1 +solmek.com, 1 solomisael.com, 1 solomo.pt, 1 solonotizie24.it, 1 solos.im, 1 solsocog.de, 1 soluphant.de, 1 solus-project.com, 1 solutionhoisthire.com.au, 1 @@ -38444,16 +38407,17 @@ spanda.io, 1 spanien.guide, 1 spanjeflydrive.nl, 1 spanyolul.hu, 1 spar-ni.co.uk, 1 sparanoid.com, 1 sparendirekt.at, 1 sparkasse.de, 1 sparkbase.cn, 1 +sparkforautism.org, 1 sparklatvia.lv, 1 sparklebastard.com, 1 sparkresearch.net, 1 sparkreviewcenter.com, 1 sparkwood.org, 1 sparkz.no, 1 sparprofi.at, 1 sparta-en.org, 1 @@ -39041,17 +39005,16 @@ stevenski.com, 0 steventress.com, 1 steventruesdell.com, 1 stevenwooding.com, 1 stevenz.net, 1 stevenz.science, 1 stevenz.xyz, 1 stevesdrivingschooltyneside.com, 1 stewartswines.com, 1 -stewonet.nl, 1 stewpolley.com, 1 steyaert.be, 0 stforex.com, 0 stfrancisnaugatuck.org, 1 stfw.info, 1 stgabrielstowepa.org, 1 stgeorgegolfing.com, 1 stgm.org, 1 @@ -39148,16 +39111,17 @@ stoneagehealth.com.au, 1 stonedworms.de, 1 stonefusion.org.uk, 1 stonehammerhead.org, 1 stonemain.eu, 1 stonemanbrasil.com.br, 1 stony.com, 1 stonystratford.org, 1 stopakwardhandshakes.org, 1 +stopbreakupnow.org, 1 stopbullying.gov, 1 stopfraud.gov, 0 stopthethyroidmadness.com, 1 storageideas.uk, 1 stordbatlag.no, 1 store10.de, 0 storedsafe.com, 1 storeit.co.uk, 1 @@ -39237,16 +39201,17 @@ strictlyguitar.de, 1 strictlynormal.com, 1 strijkshop.be, 1 stringtoolbox.com, 1 stringvox.com, 1 stripe.com, 1 striped.horse, 1 strivephysmed.com, 0 strm.hu, 1 +strming.com, 1 strobeltobias.de, 1 strobotti.com, 1 stroeerdigital.de, 1 stroginohelp.ru, 1 strom.family, 1 stromaci.sk, 1 stromberger.org, 1 stromzivota.sk, 1 @@ -39279,16 +39244,17 @@ stucydee.nl, 1 studenckiemetody.pl, 1 student-eshop.cz, 1 student-eshop.sk, 1 student.andover.edu, 1 studentfinancecountdown.com, 1 studentforums.biz, 1 studentite.bg, 0 studentloans.gov, 1 +studentpop.com, 1 studentrightsadvocate.org, 1 studentse.fr, 1 studenttenant.com, 1 studer.su, 1 studiebegeleiding-haegeman.be, 1 studiemeter.nl, 1 studienportal.eu, 1 studienservice.de, 1 @@ -39699,17 +39665,16 @@ swiss-vanilla.com, 1 swisscannabis.club, 1 swissdojo.ch, 1 swisselement365.com, 1 swissentreprises.ch, 1 swissfreshaircan.ch, 1 swissfreshaircan.com, 1 swissid.ch, 1 swisslinux.org, 1 -swisstechassociation.ch, 1 swisstechtalks.ch, 1 swissvanilla.ch, 1 swissvanilla.com, 1 swisswebhelp.ch, 1 swissxperts.ch, 1 switch-trader.com, 1 switch.moe, 1 switcheo.exchange, 1 @@ -40087,17 +40052,17 @@ tatara.ne.jp, 1 tateesq.com, 1 tatildukkani.com, 1 tatiloley.com, 1 tatort-fanpage.de, 1 tatsidou.gr, 1 tattoo.dating, 1 tattvaayoga.com, 1 tatuantes.com, 1 -taunhanh.us, 0 +taunhanh.us, 1 tavolaquadrada.com.br, 1 tavsys.net, 1 tax-guard.com, 1 taxaroo.com, 1 taxi-24std.de, 0 taxi-chamonix.fr, 1 taxi-collectif.ch, 1 taxi-jihlava.cz, 1 @@ -40175,16 +40140,17 @@ teachmeplease.com, 1 teachmeplease.ru, 1 teachpeople.org, 1 teachwithouttears.com, 1 teahut.net, 1 team-azerty.com, 1 team-bbd.com, 1 team-pancake.eu, 1 team.house, 1 +team3482.com, 1 teambeam.at, 1 teambeam.ch, 1 teambeam.com, 1 teambeam.de, 1 teambition.com, 1 teambodyproject.com, 1 teamcombat.com, 1 teamdaylo.xyz, 1 @@ -40424,17 +40390,17 @@ tenpo-iku.com, 1 tenpolab.com, 1 tenseapp.pl, 1 tenshoku-hanashi.com, 1 tent.io, 1 tenta.com, 1 tentabrowser.com, 1 tentations-voyages.com, 0 tenthousandcoffees.com, 1 -tenthpin.com, 1 +tenthpin.com, 0 tenyx.de, 1 tenzer.dk, 1 teoskanta.fi, 1 tepid.org, 1 tepitus.de, 1 teplofom.ru, 1 teplomash24.ru, 1 tequilazor.com, 1 @@ -40674,23 +40640,21 @@ thecompany.pl, 1 theconcordbridge.azurewebsites.net, 1 thecondobuyers.com, 1 thecookiejar.me, 1 thecrazytravel.com, 1 thecrew-exchange.com, 1 thecrochetcottage.net, 1 thecuppacakery.co.uk, 1 thecuriouscat.net, 1 -thecuriousdev.com, 1 thecurvyfashionista.com, 1 thecustomdroid.com, 1 thedailyupvote.com, 1 thedark1337.com, 1 thedarkartsandcrafts.com, 1 -thedebug.life, 1 thederminstitute.com, 1 thedevrycommonsbrasil.com, 0 thediaryofadam.com, 1 thedisc.nl, 1 thediscovine.com, 1 thedocumentrefinery.com, 1 thedom.site, 1 thedreamtravelgroup.co.uk, 1 @@ -40850,17 +40814,16 @@ thepb.in, 1 thepeninsulaires.com, 1 thepharm.co.nz, 1 thephonecaseplace.com, 1 thephp.cc, 1 thepiabo.ovh, 1 thepieslicer.com, 1 thepiratesociety.org, 1 theplaidpoodle.com, 1 -theplasticsurgerycenterofnashville.com, 1 theplaydaysbus.co.uk, 1 theplayspot.co.uk, 1 theploughharborne.co.uk, 1 thepoplarswines.com.au, 1 theposhfudgecompany.co.uk, 1 thepostoffice.ro, 1 theprincegame.com, 1 thepriorybandbsyresham.co.uk, 1 @@ -41108,16 +41071,17 @@ threedpro.me, 1 threefours.net, 1 threelions.ch, 1 threema.ch, 1 threexxx.ch, 1 threit.de, 1 threv.net, 1 thriftdiving.com, 1 thrillernyc.com, 1 +thrivesummit.com, 1 thriveta.com, 1 thriveweb.com.au, 1 throttlerz.in, 1 throughtheglass.photo, 1 throwaway.link, 1 throwpass.com, 1 thues.eu, 1 thuisverpleging-meerdael.be, 1 @@ -41270,16 +41234,17 @@ timweb.ca, 1 timysewyn.be, 1 tina.media, 1 tinastahlschmidt.de, 1 tindallriley.co.uk, 1 tinf15b4.de, 1 tinfoilsecurity.com, 0 tinfoleak.com, 1 tink.network, 1 +tinker.career, 1 tinkerboard.org, 1 tinkertry.com, 1 tinlc.org, 1 tinte24.de, 1 tintencenter.com, 1 tintenfix.net, 1 tintenfux.de, 1 tintenland.de, 1 @@ -41493,16 +41458,17 @@ tokinoha.net, 1 tokintu.com, 1 tokio.fi, 1 tokka.com, 1 tokke.dk, 1 tokkee.org, 1 tokky.eu, 1 tokobungadilampung.com, 1 tokoindo.top, 1 +tokototech.com, 1 tokugai.com, 1 tokumei.co, 1 tokyo-onkyo.jp, 1 tokyo-powerstation.com, 1 tokyo.dating, 1 tokyobarbershop.com, 1 tokyomakino.com, 1 tokyovipper.com, 1 @@ -41529,17 +41495,16 @@ tomaspatera.cz, 1 tomaspialek.cz, 1 tomasvecera.cz, 1 tomasz.com, 1 tomatenaufdenaugen.de, 1 tomatis-nantes.com, 1 tomaw.net, 1 tomaz.eu, 1 tombaker.me, 1 -tomberek.info, 1 tombrossman.com, 1 tomcort.com, 1 tomd.ai, 1 tomend.es, 1 tomershemesh.me, 1 tomfisher.eu, 1 tomharling.co.uk, 1 tomharling.uk, 1 @@ -41628,16 +41593,17 @@ toomy.ddns.net, 1 toonpool.com, 1 toonsburgh.com, 1 toontown.team, 1 toontownrewritten.com, 1 toool.nl, 1 toool.org, 1 tooolroc.org, 0 toot.center, 1 +toothdoc.ca, 1 tooti.biz, 1 top-esb.com, 1 top-obaly.cz, 1 top-opakowania.pl, 1 top-solar-info.de, 1 top10mountainbikes.info, 1 top5hosting.co.uk, 1 top9.fr, 1 @@ -41886,16 +41852,17 @@ trafficpixel.tk, 1 traffixdevices.com, 1 traficmusik.net, 1 tragmi.ch, 1 trailcloud.ink, 1 trailerparty.com, 1 trailforks.com, 1 trainex.org, 1 trainhornforums.com, 1 +trainhorns.us, 1 trainiac.com.au, 1 trainingproviderresults.gov, 1 trainings-handschuhe-test.de, 1 trainline.at, 1 trainline.cn, 1 trainline.com.br, 1 trainline.com.pt, 1 trainline.cz, 1 @@ -42152,16 +42119,17 @@ trpg.wiki, 1 trs.tn, 1 trtltravel.com, 1 trtruijens.com, 1 tru.ltd, 1 trucchibellezza.com, 1 trucchibellezza.it, 1 truckersmp.com, 1 truckerswereld.nl, 0 +truckgpsreviews.com, 1 truckstop-magazin.de, 0 true-itk.de, 1 trueassignmenthelp.co.uk, 1 trueblueessentials.com, 1 trueinstincts.ca, 1 truekey.com, 1 truentumvet.it, 1 trueproxy.net, 1 @@ -42994,17 +42962,16 @@ usbr.gov, 1 uscloud.nl, 1 uscp8.com, 1 usd.de, 1 usdoj.gov, 1 usds.gov, 1 use.be, 1 use.ci, 1 usebean.com, 1 -usedoor.jp, 1 usedu.us, 1 user-re.com, 1 userra.gov, 1 usetypo3.com, 1 useyourloaf.com, 1 usgande.com, 1 ushandbookapp.com, 1 ushare.ch, 1 @@ -43060,17 +43027,16 @@ utugnn.ru, 1 utw.me, 1 utwente.io, 1 utzon.net, 1 uuid.cf, 1 uuit.nl, 1 uv.uy, 1 uvenuse.cz, 1 uvocorp.com, 1 -uvolejniku.cz, 1 uwac.co.uk, 0 uwekoetter.com, 1 uwelilienthal.de, 1 uwesander.de, 1 uwfreelanceopticien.nl, 1 uwsoftware.be, 1 uwvloereruit.nl, 1 uxp-it.nl, 1 @@ -43122,16 +43088,17 @@ vakantienet.nl, 1 vakuutuskanava.fi, 1 val-sec.com, 1 valasi.eu, 1 valbonne-consulting.com, 1 valcano-krd.ru, 1 valcano.ru, 1 valcardiesel.com, 1 valecnatechnika.cz, 1 +valek.net, 1 valenciadevops.me, 1 valenhub.com, 1 valenhub.es, 1 valentin-dederer.de, 1 valentin-ochs.de, 1 valentin-sundermann.de, 1 valentin.ml, 1 valentinberclaz.com, 1 @@ -43146,16 +43113,17 @@ valesdigital.com, 1 valiant.finance, 1 validatis.com, 1 validator.nu, 1 validbrands.com, 1 valika.ee, 1 valis.sx, 1 valkohattu.fi, 1 valkor.pro, 1 +valkova.net, 1 vallei-veluwe.nl, 1 valleyautofair.com, 1 valleyautoloan.com, 1 valleycode.net, 1 valleydalecottage.com.au, 1 valleyshop.ca, 1 vallutaja.eu, 1 valokuva-albumi.fi, 1 @@ -43178,17 +43146,16 @@ valueseed.net, 1 vamosfalardesaude.pt, 1 vampyrium.com, 0 vampyrium.net, 0 van11y.net, 1 vanagamsanthai.com, 1 vanagamseeds.com, 1 vanbinnenuit.nl, 1 vancityconcerts.com, 1 -vancouvercosmeticsurgery.ca, 1 vancouverwatowncar.com, 1 vandalfsen.me, 1 vandam.io, 1 vandenbroeck-usedcars.be, 1 vandeput.be, 1 vanderbiltcisa.org, 1 vanderkrieken.org, 1 vanderkroon.nl, 1 @@ -43544,17 +43511,16 @@ vidbooster.com, 1 vidcloud.xyz, 1 vide-dressing.org, 0 vide-greniers.org, 0 vide-maisons.org, 0 videogamesartwork.com, 1 videokaufmann.at, 1 videoload.co, 1 videomail.io, 1 -videorullen.se, 1 videosdiversosdatv.com, 1 videoseyredin.net, 1 videospornogratis.pt, 1 videosqr.com, 1 videosxgays.com, 1 videov.tk, 1 vidister.de, 1 viditut.com, 1 @@ -43630,17 +43596,16 @@ villehardouin.fr, 1 villek.fi, 1 villekaaria.eu, 1 villenavedornon.fr, 1 villenvinkit.com, 1 villerez.fr, 1 villesalonen.fi, 1 villu.ga, 1 vilog.me, 1 -viltsu.net, 1 vima.ch, 1 vimeo.com, 1 vimeosucks.nyc, 1 vinagro.sk, 1 vinahost.vn, 1 vinarstvimodryhrozen.cz, 1 vincentcox.com, 0 vincentpancol.com, 1 @@ -43664,17 +43629,17 @@ vinsetchampagne.fr, 1 vintagebandfestival.org, 1 vintagecaskandbarrel.com, 1 vintagejeeps.net, 1 vintagemakeupguide.com, 1 vintageportgifts.co.uk, 1 vintagesouthernpicks.com, 1 vintagetrailerbuyers.com, 1 vintazh.net, 1 -vinticom.ch, 0 +vinticom.ch, 1 vintock.com, 1 vinyculture.com, 1 vinzite.com, 1 violet-letter.delivery, 1 violetraven.co.uk, 1 violin4fun.nl, 1 vionicbeach.com, 1 vionicshoes.com, 1 @@ -43817,16 +43782,17 @@ vk4wip.org.au, 1 vkb-remont.ru, 1 vkennke.org, 1 vkino.com, 0 vkirichenko.name, 1 vkox.com, 1 vksportphoto.com, 1 vkulagin.ru, 1 vladislavstoyanov.com, 1 +vlakem.net, 1 vlastimilburian.cz, 1 vldkn.net, 1 vleesbesteld.nl, 1 vleij.com, 1 vleij.family, 1 vleij.se, 1 vliegensvlug.online, 1 vliegensvlug.services, 1 @@ -44184,17 +44150,16 @@ wanda98.com, 1 wandelreizen.eu, 1 wander.al, 1 wandervoll.ch, 1 wanderzoom.co, 1 wandystan.eu, 1 wane.co, 1 wangbangyu.cf, 1 wangbangyu.ga, 1 -wangbangyu.gq, 1 wangbangyu.ml, 1 wangbangyu.tk, 1 wangjiatun.com.tw, 1 wangjun.me, 1 wangqiliang.cn, 1 wangqiliang.com, 1 wangqiliang.org, 1 wangql.cn, 1 @@ -44206,17 +44171,16 @@ wangyubao.cn, 1 wangyue.blog, 1 wangzuan168.cc, 1 wanlieyan.com, 1 wannaridecostarica.com, 1 wanvi.net, 1 wanybug.cf, 1 wanybug.cn, 1 wanybug.com, 1 -wanybug.ga, 1 wanybug.gq, 1 wanybug.tk, 1 wanzenbug.xyz, 1 waonui.io, 1 wapgu.cc, 1 wapking.co, 1 warcraftjournal.org, 1 wardow.com, 1 @@ -45031,30 +44995,28 @@ winbuzzer.com, 1 wincasinowin.click, 1 winch-center.de, 1 winddan.nz, 1 windelnkaufen24.de, 1 windhaven.nl, 0 windholz.us, 1 windowcleaningexperts.net, 1 windowslatest.com, 1 -windowsnerd.com, 1 windowsnoticias.com, 1 windowwellcovers.com, 1 windrunner.se, 1 windscribe.com, 1 windsock-app.com, 1 windsorite.ca, 1 windsorspi.com, 1 windwoodmedia.com, 1 windwoodweb.com, 1 windycitydubfest.com, 1 wine-tapa.com, 1 winebid.com, 1 -wineonthewall.com, 1 wineparis.com, 1 winepress.org, 1 wineworksonline.com, 1 winghill.com, 1 wingify.com, 1 wingmin.net, 1 winhistory-forum.net, 1 winkelcentrumputten.nl, 1 @@ -45354,16 +45316,17 @@ wp-webagentur.de, 1 wp6.pw, 1 wpac.de, 1 wpandup.org, 1 wpcanban.com, 1 wpccu.org, 1 wpcdn.bid, 1 wpcharged.nz, 1 wpcheck.io, 1 +wpdesigner.ir, 1 wpdirecto.com, 1 wpdublin.com, 1 wpenhance.com, 1 wpexplorer.com, 1 wpfast.net, 1 wpformation.com, 1 wpgoblin.com, 1 wphelpwithhomework.tk, 1 @@ -45695,17 +45658,16 @@ xerblade.com, 1 xerhost.de, 1 xerkus.pro, 1 xerownia.eu, 1 xetown.com, 1 xfce.space, 1 xfd3.de, 1 xferion.com, 1 xfix.pw, 1 -xfrag-networks.com, 1 xgame.com.tr, 1 xgclan.com, 1 xgn.es, 1 xhadius.de, 1 xhily.com, 1 xhmikosr.io, 1 xho.me, 1 xia.de, 1 @@ -45975,17 +45937,16 @@ xn--zr9h.cf, 1 xn--zr9h.ga, 1 xn--zr9h.ml, 1 xn--zr9h.tk, 1 xn5.de, 1 xnaas.info, 1 xnet-x.net, 1 xninja.xyz, 1 xnode.org, 1 -xntrik.wtf, 1 xnu.kr, 1 xo.tc, 1 xo7.ovh, 1 xoda.pw, 1 xolphin.nl, 1 xombitgames.com, 1 xombitmusic.com, 1 xombra.com, 1 @@ -46117,17 +46078,17 @@ yalecleaners.com, 1 yallamotor.com, 1 yalook.com, 1 yama.su, 1 yamadaya.tv, 1 yamaken.jp, 1 yamashita-clinic.org, 1 yame2.com, 1 yamilafeinart.de, 1 -yamm.io, 0 +yamm.io, 1 yanaduday.com, 1 yanbao.xyz, 1 yandere.moe, 1 yangjingwen.cn, 1 yangmaodang.org, 1 yanngraf.ch, 1 yanngraf.com, 1 yannic.world, 1 @@ -46240,16 +46201,17 @@ yggdar.ga, 1 ygobbs.com, 1 yh599.cc, 1 yhaupenthal.org, 1 yhb.io, 1 yhe.me, 1 yhenke.de, 1 yhfou.com, 1 yhndnzj.com, 1 +yhong.me, 1 yhori.xyz, 1 yhrd.org, 1 yhwj.top, 0 yibaoweilong.top, 1 yibin0831.com, 1 yicknam.my, 1 yiffy.tips, 0 yiffy.zone, 0 @@ -46630,17 +46592,16 @@ zaptan.info, 0 zaptan.net, 0 zaptan.org, 0 zaptan.us, 0 zarabiaj.com, 1 zaratan.fr, 1 zargescases.co.uk, 1 zarmarket.org, 1 zarpo.com.br, 1 -zary.me, 1 zatsepin.by, 1 zaufanatrzeciastrona.pl, 1 zavec.com.ec, 1 zavetaji.lv, 1 zawo-electric.de, 1 zayna.eu, 1 zbchen.com, 1 zberger.com, 1 @@ -46687,17 +46648,16 @@ zeilles.nu, 1 zeitoununiversity.org, 1 zeitpunkt-kulturmagazin.de, 1 zeitzer-turngala.de, 1 zekesnider.com, 1 zekinteractive.com, 1 zelezny.uk, 0 zelfoverstappen.nl, 1 zelfrijdendeautos.com, 1 -zellari.ru, 1 zeloz.xyz, 1 zemlova.cz, 1 zen-diez.de, 1 zen-ume.com, 1 zenchain.com, 1 zenevents.ro, 1 zenfusion.fr, 1 zengdong.ren, 1 @@ -46741,17 +46701,16 @@ zerosync.com, 1 zerotoone.de, 1 zerowastesavvy.com, 1 zerowastesonoma.gov, 1 zertif.info, 1 zertitude.com, 1 zeryn.net, 1 zespia.tw, 0 zestylemon.co.uk, 1 -zetamode.com, 1 zetorzeszow.pl, 0 zettaplan.ru, 1 zettlmeissl.de, 1 zevelev.net, 1 zewtie.com, 1 zfast.com.br, 1 zfg.li, 1 zfly.me, 1 @@ -46782,17 +46741,17 @@ zhi.ci, 1 zhikin.com, 1 zhiku8.com, 1 zhima.io, 1 zhitanska.com, 1 zhl123.com, 1 zhome.info, 1 zhongzicili.ws, 1 zhoujiashu.com, 1 -zhoushuo.me, 1 +zhoushuo.me, 0 zhoutiancai.cn, 1 zhovner.com, 1 zhthings.com, 1 zhuihoude.com, 1 zhuji.com, 1 zhujicaihong.com, 1 zi.is, 1 ziegler-family.com, 1 @@ -46927,17 +46886,17 @@ zootime.net, 1 zootime.org, 1 zoowiki.us, 1 zooxdata.com, 1 zopy.com.br, 1 zopyx.com, 1 zor.com, 1 zorasvobodova.cz, 1 zorgclustertool.nl, 1 -zorig.ch, 1 +zorig.ch, 0 zorium.org, 1 zorntt.fr, 1 zorz.info, 1 zotero.org, 1 zouk.info, 1 zouyaoji.top, 1 zozo.com, 1 zozzle.co.uk, 1 @@ -46980,17 +46939,16 @@ zulu.ro, 1 zum-baur.de, 1 zumazar.ru, 1 zund-app.com, 1 zunda.cafe, 1 zundapp529.nl, 1 zundappachterhoek.nl, 1 zuolan.me, 0 zup.me, 1 -zupago.com, 1 zupago.pe, 1 zuppy.pm, 1 zuralski.net, 1 zurgl.com, 0 zurret.de, 1 zusjesvandenbos.nl, 1 zuviel.space, 1 zuzumba.es, 1
--- a/testing/mochitest/ssltunnel/ssltunnel.cpp +++ b/testing/mochitest/ssltunnel/ssltunnel.cpp @@ -970,18 +970,20 @@ void StartServer(void* data) // In case the socket is still open in the TIME_WAIT state from a previous // instance of ssltunnel we ask to reuse the port. PRSocketOptionData socket_option; socket_option.option = PR_SockOpt_Reuseaddr; socket_option.value.reuse_addr = true; PR_SetSocketOption(listen_socket.get(), &socket_option); + // Explicitly listen on loopback to avoid users getting errors from their + // firewalls about ssltunnel needing permission. PRNetAddr server_addr; - PR_InitializeNetAddr(PR_IpAddrAny, si->listen_port, &server_addr); + PR_InitializeNetAddr(PR_IpAddrLoopback, si->listen_port, &server_addr); if (PR_Bind(listen_socket.get(), &server_addr) != PR_SUCCESS) { LOG_ERROR(("failed to bind socket on port %d: error %d\n", si->listen_port, PR_GetError())); SignalShutdown(); return; } if (PR_Listen(listen_socket.get(), 1) != PR_SUCCESS) { LOG_ERROR(("failed to listen on socket\n"));
--- a/toolkit/components/extensions/ExtensionContent.jsm +++ b/toolkit/components/extensions/ExtensionContent.jsm @@ -61,16 +61,20 @@ const { const { BrowserExtensionContent, ChildAPIManager, Messenger, } = ExtensionChild; XPCOMUtils.defineLazyGetter(this, "console", ExtensionCommon.getConsole); +XPCOMUtils.defineLazyGetter(this, "isContentScriptProcess", () => { + return Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_CONTENT || + !Services.appinfo.browserTabsRemoteAutostart; +}); var DocumentManager; const CATEGORY_EXTENSION_SCRIPTS_CONTENT = "webextension-scripts-content"; var apiManager = new class extends SchemaAPIManager { constructor() { super("content", Schemas); @@ -373,16 +377,20 @@ class Script { } } matchesWindow(window) { return this.matcher.matchesWindow(window); } async injectInto(window) { + if (!isContentScriptProcess) { + return; + } + let context = this.extension.getContext(window); try { if (this.runAt === "document_end") { await promiseDocumentReady(window.document); } else if (this.runAt === "document_idle") { await Promise.race([ promiseDocumentIdle(window), promiseDocumentLoaded(window.document),
--- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini +++ b/toolkit/components/extensions/test/xpcshell/xpcshell.ini @@ -48,11 +48,11 @@ tags = webextensions in-process-webexten [test_ext_unknown_permissions.js] [test_locale_converter.js] [test_locale_data.js] [test_ext_ipcBlob.js] [test_ext_runtime_sendMessage_args.js] [include:xpcshell-common.ini] -skip-if = os == 'win' # Windows extensions always run OOP +skip-if = os != 'android' # only android is left without e10s [include:xpcshell-content.ini] -skip-if = os == 'win' # Windows extensions always run OOP +skip-if = os != 'android' # only android is left without e10s
--- a/toolkit/content/customElements.js +++ b/toolkit/content/customElements.js @@ -8,21 +8,64 @@ // This is loaded into chrome windows with the subscript loader. Wrap in // a block to prevent accidentally leaking globals onto `window`. { ChromeUtils.import("resource://gre/modules/Services.jsm"); ChromeUtils.import("resource://gre/modules/AppConstants.jsm"); +// The listener of DOMContentLoaded must be set on window, rather than +// document, because the window can go away before the event is fired. +// In that case, we don't want to initialize anything, otherwise we +// may be leaking things because they will never be destroyed after. +let gIsDOMContentLoaded = false; +const gElementsPendingConnection = new Set(); +window.addEventListener("DOMContentLoaded", () => { + gIsDOMContentLoaded = true; + for (let element of gElementsPendingConnection) { + try { + if (element.isConnected) { + element.connectedCallback(); + } + } catch (ex) { console.error(ex); } + } + gElementsPendingConnection.clear(); +}, { once: true, capture: true }); + const gXULDOMParser = new DOMParser(); gXULDOMParser.forceEnableXULXBL(); class MozXULElement extends XULElement { /** + * Sometimes an element may not want to run connectedCallback logic during + * parse. This could be because we don't want to initialize the element before + * the element's contents have been fully parsed, or for performance reasons. + * If you'd like to opt-in to this, then add this to the beginning of your + * `connectedCallback` and `disconnectedCallback`: + * + * if (this.delayConnectedCallback()) { return } + * + * And this at the beginning of your `attributeChangedCallback` + * + * if (!this.isConnectedAndReady) { return; } + */ + delayConnectedCallback() { + if (gIsDOMContentLoaded) { + return false; + } + gElementsPendingConnection.add(this); + return true; + } + + get isConnectedAndReady() { + return gIsDOMContentLoaded && this.isConnected; + } + + /** * Allows eager deterministic construction of XUL elements with XBL attached, by * parsing an element tree and returning a DOM fragment to be inserted in the * document before any of the inner elements is referenced by JavaScript. * * This process is required instead of calling the createElement method directly * because bindings get attached when: * * 1. the node gets a layout frame constructed, or
--- a/toolkit/content/tests/browser/browser.ini +++ b/toolkit/content/tests/browser/browser.ini @@ -106,16 +106,22 @@ skip-if = os == "linux" && !debug # Bug [browser_mediaPlayback.js] tags = audiochannel [browser_mediaPlayback_mute.js] tags = audiochannel [browser_mediaPlayback_suspended.js] tags = audiochannel [browser_mediaPlayback_suspended_multipleAudio.js] tags = audiochannel +[browser_media_wakelock.js] +support-files = + file_video.html + file_videoWithoutAudioTrack.html + gizmo.mp4 + gizmo-noaudio.webm [browser_mute.js] tags = audiochannel [browser_mute2.js] tags = audiochannel [browser_mute_plugIn.js] tags = audiochannel [browser_mute_webAudio.js] tags = audiochannel
new file mode 100644 --- /dev/null +++ b/toolkit/content/tests/browser/browser_media_wakelock.js @@ -0,0 +1,137 @@ +/** + * Test whether the wakelock state is correct under different situations. However, + * the lock state of power manager doesn't equal to the actual platform lock. + * Now we don't have any way to detect whether platform lock is set correctly or + * not, but we can at least make sure the specific topic's state in power manager + * is correct. + */ +"use strict"; + +const PAGE = "https://example.com/browser/toolkit/content/tests/browser/file_video.html"; +const PAGE2 = "https://example.com/browser/toolkit/content/tests/browser/file_videoWithoutAudioTrack.html"; +const PAGE3 = "https://example.com/browser/toolkit/content/tests/browser/file_mediaPlayback2.html"; + +const powerManagerService = Cc["@mozilla.org/power/powermanagerservice;1"]; +const powerManager = powerManagerService.getService(Ci.nsIPowerManagerService); + +function wakeLockObserved(observeTopic, checkFn) { + return new Promise(resolve => { + function wakeLockListener() {} + wakeLockListener.prototype = { + QueryInterface: ChromeUtils.generateQI([Ci.nsIDOMMozWakeLockListener]), + callback: (topic, state) => { + if (topic == observeTopic && checkFn(state)) { + powerManager.removeWakeLockListener(wakeLockListener.prototype); + resolve(); + } + }, + }; + powerManager.addWakeLockListener(wakeLockListener.prototype); + }); +} + +function getWakeLockState(topic, needLock, isTabInForeground) { + const tabState = isTabInForeground ? "foreground" : "background"; + const promise = wakeLockObserved(topic, (state) => state == `locked-${tabState}`); + return { + check: async () => { + if (needLock) { + await promise; + ok(true, `requested '${topic}' wakelock in ${tabState}`); + } else { + const lockState = powerManager.getWakeLockState(topic); + info(`topic=${topic}, state=${lockState}`); + ok(lockState == "unlocked", `doesn't request lock for '${topic}'`); + } + }, + }; +} + +async function waitUntilVideoStarted({muted, volume} = {}) { + const video = content.document.getElementById("v"); + if (!video) { + ok(false, "can't get media element!"); + return; + } + if (muted) { + video.muted = muted; + } + if (volume !== undefined) { + video.volume = volume; + } + ok(await video.play().then(() => true, () => false), + `video started playing.`); +} + +async function test_media_wakelock({description, url, videoAttsParams, lockAudio, lockVideo}) { + info(`- start a new test for '${description}' -`); + info(`- open new foreground tab -`); + const tab = await BrowserTestUtils.openNewForegroundTab(window.gBrowser, url); + const browser = tab.linkedBrowser; + + let audioWakeLock = getWakeLockState("audio-playing", lockAudio, true); + let videoWakeLock = getWakeLockState("video-playing", lockVideo, true); + + info(`- wait for media starting playing -`); + await ContentTask.spawn(browser, videoAttsParams, waitUntilVideoStarted); + await audioWakeLock.check(); + await videoWakeLock.check(); + + info(`- switch tab to background -`); + audioWakeLock = getWakeLockState("audio-playing", lockAudio, false); + videoWakeLock = getWakeLockState("video-playing", lockVideo, false); + const tab2 = await BrowserTestUtils.openNewForegroundTab(window.gBrowser, + "about:blank"); + await audioWakeLock.check(); + await videoWakeLock.check(); + + info(`- switch tab to foreground again -`); + audioWakeLock = getWakeLockState("audio-playing", lockAudio, true); + videoWakeLock = getWakeLockState("video-playing", lockVideo, true); + await BrowserTestUtils.switchTab(window.gBrowser, tab); + await audioWakeLock.check(); + await videoWakeLock.check(); + + info(`- remove tabs -`); + BrowserTestUtils.removeTab(tab); + BrowserTestUtils.removeTab(tab2); +} + +add_task(async function start_tests() { + await test_media_wakelock({ + description: "playing video", + url: PAGE, + lockAudio: true, + lockVideo: true, + }); + await test_media_wakelock({ + description: "playing muted video", + url: PAGE, + videoAttsParams: { + muted: true, + }, + lockAudio: false, + lockVideo: true, + }); + await test_media_wakelock({ + description: "playing volume=0 video", + url: PAGE, + videoAttsParams: { + volume: 0.0, + }, + lockAudio: false, + lockVideo: true, + }); + await test_media_wakelock({ + description: "playing video without audio track", + url: PAGE2, + lockAudio: false, + lockVideo: false, + }); + await test_media_wakelock({ + description: "playing only audio", + url: PAGE3, + lockAudio: true, + lockVideo: false, + }); +});
--- a/toolkit/content/tests/browser/file_mediaPlayback2.html +++ b/toolkit/content/tests/browser/file_mediaPlayback2.html @@ -3,11 +3,12 @@ <script type="text/javascript"> var audio = new Audio(); audio.oncanplay = function() { audio.oncanplay = null; audio.play(); }; audio.src = "audio.ogg"; audio.loop = true; +audio.id = "v"; document.body.appendChild(audio); </script> </body>
--- a/toolkit/content/tests/browser/file_video.html +++ b/toolkit/content/tests/browser/file_video.html @@ -1,9 +1,9 @@ <!DOCTYPE html> <html> <head> <title>video</title> </head> <body> -<video id="v" src="gizmo.mp4" controls></video> +<video id="v" src="gizmo.mp4" controls loop></video> </body> -</html> \ No newline at end of file +</html>
new file mode 100644 --- /dev/null +++ b/toolkit/content/tests/browser/file_videoWithoutAudioTrack.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> +<head> +<title>video without audio track</title> +</head> +<body> +<video id="v" src="gizmo-noaudio.webm" controls loop></video> +</body> +</html>
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9f412cb6e3d8a26ead6205aa7aae6c292fb294b3 GIT binary patch literal 112663 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%0Dj#F#}cziI!-!fLj>ImUkaE1-ICV^}P zWz^e#Q4HT_phy$KiPKlsifa$(57~;)%7tvaO-|k_ES&KUOu?Swg;yxvu$#~Db1*cZ zvAa;H=5-DzBBRc1$~_G!sWO%F8c{q#IB@taTSjo9;Yop{ZW50nckSnO-41d44013~ zXCak+;m(P-ZRLJaQ{fQIl$n^m-*~1zljbj{BC%}yV>%uLo{29{JnxwMJ1Hq9kEK<x zZhENCbY+r<DDN-6NZn3R3eNhU&f4-l*5@aCyjE9HGpByhV>nbW(YokLaJV1swJc=& z-ROU@(+wX<HgDXUFRo@WROCBU^KZ*fir7$6TwzFNUuT1-f;!gJ_8iJeZZ+#CF%&$< z)dL7fH0usZVD=Y#irJ<G@rK>fLS?_v$D)g4BGDui?g~USEy3Qoo^v|^#(UmR@CY3a zaz$|+i|fQek`Y*`15g^v52f~2yGt9w2H+};>AAycMDgAx{L(!xvaB_K$VsA8(89|e zfHboYbD!ee_{#<fJ<@0<z>-^zoHgkh^UhMgnn8r|xNcg{?qE@z?Pln}mK1a(l;CRk z6=Q2k@;i4ITT?ZtmFbxCKtToe;GvIi7{H22-*;mixQQj@7dAV5G+<V@N_m<f^=jAd z+n!aPuTWy&u)>AhPOfd9#|F#NEdmY470iO5nkw<7D4q``HW&S%?@oVx2z`m=PNAL~ z!ei#-VKa*};FJqEV#T~{D3=4;F4u_Oc&zyx#PO6)-3Z{dBW_^T3TTgt-N_ca`n~3g zw9uNM5PY@|K@W?R<R8%@Lnws(3Nbo1JYw}8_}lsX_i>+F_sd96O6e1JauQ6W#pG=Y zsyrzto0yksrLOp;Epj9ZI<nz3e*K`0U&4f%b!!07@f_3|M=>QUJ4O>fo65C&!Kjxr zeD#CcztwmQ-3&~Y`Y9_umdFc8Q4j4)V<(TqhLG-dc_|mMkoyd#srop*CX0zCfX<{k z9VC>5w>YAN1~Jw56_h+T^#dFMUT%`AvyET?XFNN{I)>c5td?Q`Cd1K-=_@G>_n!<l z>-qh$nNp{QWa}gBGhWeMW4Eqo?`A(~J^FWhsV}CW<_rNS)yTW8$@c085pQo+?ccIU z0$+iG`T}Mw>6W#6(OYAC#{)nPN=Tjy1{7*d7c*rnsz6pU+l#)=yz%UrQzwDwgdV9^ z#7Zj?H0l&xz7yEdOH{3bazc{WNpGv;tHIBk34-ss`Z#F};6Cn@LfbZ*mS!b0)3%3B zYQTd<DJ~Oto#P`i$~by=x?KSwLG?;G)NpUum^Un$(I_|>#p)tRkDvalaDl)cYY+%q zXAXaxLk}oD5fujBA_8qVdw}Xou!<~520D8MA!zesuk;K%g;K1_HoA);sL%uz3*A2@ z*vYoEUi^}Ke;4-09^@4_g?t9C)@sVddPU{bp*hWshelN<F9^G*lv|nuqrW9-&!ARR zD&=|<!*+W|{EQ(-Q;RTxa+KO`C9rLq$(z2xgxE}^@d+J{84_qCe1cCdJ7%?PPM<Jq z%&+$=7<(+y$Fw9n^>-*!k`(sS)z7*es+Y#l@uu`GPby$k|JujECeOOeGe5QKLGS_8 zhV&33s8?aJHmp|&V15W+Ph?2gFeLU2Ci^yE?`a1<qgHEXr<jdKHJEymAw?ntji{C% zWs+n%tbt*uJZ2=7#D7<8k+5{S8eHy+yY@)!<zQCIPyN2=n6YknAlJ5~=kXb7YErg# zqO;KN0^R7@L8=1BQ+W~wAdyxv!=&JK+zN(H_-B7~HWUu+{XOs<wPTAYPX#(u_GZ|j zO!>ds7^<uR01{w7#*;*g!eefyhYd#K*z6Ag08ET%ZBXVu5xB=A1(Y(DY&{wNl2HDG zCUg_lLYFzv=~gRy8RqHFm7~!I3`9f=VtNRmQy9A1KNtb{(7Qxq)sEZt@?!g@1JI%u zDuMk$Sg4ei|M0}HhoteWzCr7^2k&6Yp4<ThG4){K_iE1(mxeVF_{eCBWhwrCqRvpI zlv$#F+`W-blb!uUDNQo?HqFdCpn~6*=(VB-DGrmC@1d)bp-#K!M&FZsptzr;$kCm% z)oyuc!Wf0mcDorZCw|Do&&YI6;v#*yCs@RIgXtg3G>}D`AHEgWLr1uV?WrQdXr;4p z$Ae&w!I;YXes_5C*~Mh>Qz}m2Tsy!nz??D}UrmO3^3C$t@TdC)Yr_lzko&VpieXm4 z<|r$BF6*md0pnyWLO|n1LJ$F9?*IRscLA)y07QFB%J?^k{QuUI`e}Z=@=_B|@N^S( zy_wl6xp<egES+0(+<spn3tdyEIO?@y@cux!1W;hj%=m0OD%2Hq3$1?0&bvGJgPX$n zuF#fL1`2(bL^-q@95|G14eFj2Xzpl&3W{So!~LGt>1Lb+DZx?aktmT^*~uaj#0m2q zuni9xr>S)ydN+dKc(uhlRR%Od@>CS~ftK49GKZ`LOj%{=2oKrd<EAYqH(UCyIxOEp zFHQ!&JutKG91>MVZjZ2Ly<6Ii@WdlD13dYaQIZ>FNquaZ0V+s*ZH@LLx6!|s(7ypX z*ufUTZ+5b51}0HX=;s-AcPZ}HO9+p%!X6zrcQHN{*Vxd(-Y3lSu^(v<1ouV!oM+g( zq4qd^Pp)bserbSlFgI3zc~_Kkh?27|9llxFQTaU;yc>&ue$4uz<ZqfGM=W%3KG2}R z(twHgHm)tOFro?I0J!HvV>uE?VM#7q$5DxIOTzvi`9qv8{YvICKs(2H#N7{W=kkW} z0$s+4f3Z~^TtBR0l(>C(J)5Q#lX#{?tdp^@G0Zft`W46Hud?*Ito_&^2S>#l^)R-I zoUb1?w-6ud(~c8s1w`cjn7iosnf12j_HIs6TAZRbdAw9bFE$zDw@#;DLJQVM5|oQK z9mb&?Az!1yd+yW5P<)XPTL4(b|Cr#w5)8n$AIl4w8Mtqupf}C^uc&HpPaOAnN_rsw z;k;8<ugbF{7dbrnF6A!@T5<-Cs7!~MU@oaUp{b*uoao$JeW5=1_JF7#YF1j1RsTH} z_(C%620c4#`~!N<AM#_u66;~&TiwbSe=bOSE}~wC=Ox`){k@{xeh{{zDe-ql>!8L^ z0MlW<Gm>>;35Eu3=sE29T2Fq%GaOH-2s()`L(upaVL7~_?$g+Rge!<^2A3o?lI+F4 zKr<JSVnd`K;QnzF-Yjv58y2ET>okKVi(44F-wQv~dlcRSckETU2NMI~bwc7hCHNG0 z)=MSh9%BXY$n)GMou7xD9y3Ax1m-F0q=q|tCURIiz`#^z4t<=F^62NmP0N>=lXYlP z+0hgrR_I^pEjvHk%BhkA6@Nar%%|^MV?52nX13|au4_mm<xp{r&S7Dgwm`c@#Av!v zN!~Q?%v|df>t3K{ISkX}MBSQKlEStAo1;9Qs6lv)RQ0m_a+L)S^hQj);oK_0Ssj#h ze81xk;tFE{>kjT&I`cKBe!}Y@+C(hsLyX())Icl}95u1TuQ-WQv=r^SJlOFQL+K;b zriRK_uYns+Cm5ia`6dL!XBT)m2yD#reABd7r~wDcmazbKE;h@U)`f{(hA(+G8O7Y4 z5#hFwu_0{79;ZMVU<VgPteVN7Gr2yENrVF_FjXKXB9oQYluoa&KvjA-w5LBZ{i)fG z4R^9HeODxm901n!Ki(9ufC4bxP|s}ugHQUZ*?<1S8Xz!yLkY<#?DZs-)z~eem^_H4 z;v$ZJ?SS*ATxa30rLABGp%A#a=BzDQ=w0R(a&da;yd$9*!cP?%w@PhxY^Q}z8o>K# zA)BLCr!kE3T^-_|(aY|}2w^GoPel(_7{a&xS;oLU7FH}<D;orrZxWkP8EaDdU{j9% zBRgNi^&Sgq>de)+_HE!+B9kqX3)~9r^-=i-LD;lUyEKj5M9QF&rD22XPQJ{1zw{+& z)k--1-96z#&XtVq$#QD}LOZZ=0aUVxB-M4<j^A}7R|@OTu0H1#d-q`$^=<gx=zy@r z$XP0x9WcLRmVAhEZNVY(KthTgTw<~0^h|ht+sYlP<(VmfTX_g~#g=$pgEnq8?36-J zX4PM9Arj0{6S<4CoUhY4%S(`qiSdYUG=sb(hl08#UJGF$D>QJKBi2f4Buo*_twqXT zD5!L;_2#Oy1(k3+FXbUj!42c{4<_`7-4jGeQ-)1WeiO<YVs#QW`Oz6ffzNYgYa)#? z|3Bcv&Rv}8`|JB(DzgL!*tNL|zyOe%&2M-YK!ClycmnG=h+|JQRJQQ)Qf{IPSl*PJ zd|F6mJ}1H2BGcd_(gIMvq?OmQgwDsMGn^`QQnKbR9&`1Au@;=+p#LJ_{`K`14w*~6 zds-uSwL_QcHZ7bhXd%{4xa)NeNiW8`uez>>mCfK7p{REt7xw%pK536uk_N|}>`Qk7 zqf}Ssr5NASXtZRQ*$0<nznWY^smBb^<iUaa@WaUECw?SB;|BG8@5V4{8Kg`GP+V<2 zGh3Z?;E3vN9?t1hGfR!=8`SH=0gU!V<35(fJXLeGCq-lL@9^n3aA7NFY!qX+(rbD0 z6Y2^yA1AsTwRI8qGZ0a32~UGQ$U)#vYu=QM<n?-_vhWXuh;I1mr{dZzD(oU!FBpsA zS`8A+e2W{QyU(k@!su6c+w6~bJ*f|#S91D(%K!|-#1A!FxMl&nUIU;)7_tVzd6jMX ztJ?O(Td9wi2J=smka_^v*8fCdz!MCBwpYwF|8J(I;+I%WJf~4PKR1iyrTq{DNj8V1 zsB?YE;CcjaxlqlqeE$`tU_RTehS@OfJ(io0pABiC!YcHV#%!`I`Nryk`cccql-uYf z84zPW%a>jC2Z~?ePf^t8(_9wpt!xc3TjA{}l=Iqz<Ig*h-WB2^O$a80hqtIze6%=n zQ*!#zvgTRYa=hOLt*yx&wPhp;O^$Athy=KcC<9MJgjhX0L}qz^Q)OMDTt36zrX%3F z&`1tou6bg#JWSH>(<Cq!x&Fyyi|^A#M5vN0dS8B+8QatSfuoq1x1O-HuZ&cQTp|h4 z^SOYA&j0icBgBb5S}lQP<FNo@tPzJtT_#;!b1J@e(`1l-0HWx&r}e)2Qu#8e?=>qh zu3Zx5>=Bj`x-_tzsl0_{E8XrC2YnDE(oY@Dd!D`L_ytP)=?S6bNdJWE!%$6L9hE0Y zA)qCub??;QCB1a05TGf#l>3yL&T9D1_#>6(K(rH06dE4W$F$b-{E<MFp>_Ws->=aA zvQ1r@3TG}cKugAx22>N#9J;n210m4{=Ey9iw$n`ur~}&~2~-6<4Y{ENF#0%=bTJ>O zgu#NcKd2fP2Ge5@!Xxs)NB!MemO3BUSJ4o1LBdxDhX;M1)f%KvtiYIMubGKgI1|ZM zD+!_G23F3HGq+`Ac$)Fm?selFYemz^8p3^=At?{+fywrFyE4j~<rcEu)G!c}?5`>m z3WokO7^_+-7F0IzFHS)-OHA-~Zow1w2e%BpC!7(eKDgxukFZD>I{@ta|EYBk#Q&d* z%`X;?swVaS3+35(m3Ep_12MCg<XZbKK*SqBU(9Z}r+vwY>s;DiLmyhiLv(Tp*Pm*` zL(Fe_5N+ZoQ;$n?(?RfD;e~uu+{dCjbT#S{YSq;?WO5$j>_A??Bj@(vtlT5ZJcYE- ztPPBDJF5qVMIgm!8SaB&?WFAr6S+*=5RLaN#T$-oH{r9Cmh(4pMN}73o*e<>x{nVi zalhpEOSTUQ>Ye_cr5e#I0g_DZf5q5vST=s=oo-196bIQf<6gVzALK?4<Nzn_@`H=& z#Za3wu`lO8*(IOLMXn2%F;g!c94ZvJqQWQ1EU)l!D1VXL1hZ*NaXa6_1?-lGIt0}Z zh!9f2tGp9*Jnf3Ou;cohcsVpxOlxiSodB&Vhq<#nie&L1j%AjJYRYLXl?&ba)*oZd zR0{AGkQ*l9(OVeHd40;-0beq(gE?&|wZ0sCaXEFhZRC5y>rtySi34I0XV}da)@0dQ z?CFz)i6USW??JgJbbRk6L*dajXP6?O#n6zqoqi9T$h?p?W*oZ)F+A_4ZPsFhADblq z$#_Cm_NJ4%!|@EJ`K6BqFa(HnwL+Jj^%SVUfh|r=a}4qBgoABOF+6Of0spRS6B4G_ zxv2tYJdEqn;){M|uy;{y4GH)VxYFc*b6l3Pl}+WEQjcIAoaLPBgG`}@zjrnrQ$af$ zLzvd{L3WD?hY2ix1-m}`0R>UxXbQicQu{GcO>K1-QBcn^l-1zSoas7YmP00?sg9UU zO^$E!A<x!?U{fJsM+!PXIa~kE0*A0T<2(^ft_StoU~8hYYQ;M`a(kzaDBt36_{usi z8q3UZ6d1~*@v@Xrs{Bp}Dnr{{UVp`FqN?(>t+EVG2Dw;B?ncH7c96uz9?XbijXhfh zj$cheqBZG#pB?#?e5v>C+U!i9wvg0_RBz6mz*WKHD?`li2wSp6i53k%mn`ZFkx$7i zteyCp?g#C(8tcW9ck@DdV9aZ>$LvIH9{o+u*m0GtAJCZQ18}5$Zn4Ad%j^~B%wPZG zyTAe91pgC<pcp6s+HVJ%^S{b)#<$9K9X;@e<BNg-l{bkQJou3{^{rZg<4GDoYp9U# z6IB4V&zH}lPA;f!Jnv}+rt&?q0{R56+nA}<Z0AHA{4fEj5Co^9hMtL{m(@zu+CyaV zB-D+Eq`G3x!KjC{s?DK#<8%AL{#TRd^Y8PMl11cj&!sC^lJtJfJX^;6o??%`g&t>) zw8a9aG96tnOk<am&_>rA&46-j*EdPdx)`!b2h`>1;iG(DxedB^O;>%#+gy#c{`R&3 z8t)EpkQ||?2j{9y?loZ)(ZY(x7hT#L4=X;^%hD6KPUwW&$@GIT2Q)Y0@YEgkaV)35 zY6hYIS20n?Sy#aHIUjXQ#uXoQD$ljpHVt&(mQC%}W-Q+vjDeK(&Tcpu4+*&GS%gaH z<bb`Wd<9v$e>Qjzd*v=Cz}J%s--bb|u&Ytxl*oSwoRxMl|8L4ZXn|SHQ%=w9GLMff z30h^kK3kW)ACfpIbB=>1qsNg5VChCxFoEg*!R(J3!JsHDymXNuf)R(?NkIhqbDY$C zadBWeB+0VDvk_Ns@m(4Wi^uBlUFg@GQc@Fhf9m&)vO5OkrB>hm0-nVidlBOhU#r2) z5K^Q7PcH+K^2@mBrVc;67!&J@EHyD0Eb$cstOjl|dP|jF2gx2CeI`DjNbn;7{LlZw zcR(Bz0B*1F-%Hd1-%2D6k^v)H6dUGWT6m3D6z{sf^3Yt!+W^H$8bo`~p;Peiu<ouE zbDfW>;6bl2bkF{cJ3)1~YVIdm5TN}VW3w<tkPd;Gn5m>%|FQ{g#n$LNZ$HX6Hy7bC zJd+X8wols$e1!Bk(ncy28iZ&L@E`mY*eDpv)1Jd|fEghd@};)mr0eH#{?%`}++R*< zxZR(F{e@!H^{&TVe5PJxQsZ3v#du<caB1$_T{3#k2X_T)f=P_}JOimAB7t7GBv`{N zU8z1zxx}<p3bfGA@M97JM8`;<#>9_S%~B*U+iPbEM1xfMMps1a@{z?$0}Y=IO)VRh z^9Byg{-|v*`2+_v2dpZC05kB;)ekNACBw5nuGNv_KD;+Csx+W<J5<XTS6V(mLxQHj zmsGEFv(4}6RnW<&lF7VYpEWFTYzF+0Ktul97ST-=xCU08>2uqq9c1Lq8zxx3db^Ez z7Ys;LB;oy0&C(~52Ih3Qze1LsZ8)e&M!${Ua=mowX1W5?$1E|Yr3)bO89{D`;zKW& z1VV!tac|6aACcwA>Lo7E8_v(-kM`CfNp{sx-i73RAhZh#dHZ4OgMl?@wcUX);s?AU zqR6%3ss5fZs@E%w&h#N(!jgOdPkn}!{X6ad5BPln;0FH#e_sL=fNpOB8$1Z~>(`$C zUmq~SJA%7vZZtvXu+PQDIa^!J>QlpTRJMn^{=9~i%#090@nC#p&reNr?I3?{sOb%L zD$pA=lgbCse$3pJ{4)y@wk~U_p{T)Od2%{()Oi?Sy&Fd}R%u|U=rMb$-wVcm*Dv?H z!-q7TO=l3XBoH9wT@@c-B6-%n4AMxxP-Al8P=kE4#0i9eQf`QlRcds~!fZ&PMqP{` zMPG!J_8JnOT7Eu^zQPo91Ce=e!8@SwR!tB=c;QEdl`fQ&d#zMYwk@bFpOfCd&t=Go z-76#O=1#di)RsN*#Wl)6Fj*R?R4d&8<&2LU(}0jT%3Y{cS0XJMj+<9Jr$I~?smCFt zBauJL4iQ?apjX3hD(t1AK-x$gpt(x@kQb1JjUi09IS{_&IY~gIpTElaYZloH2!t5m z4GMO06r<P8Q0Pul-q*!DqGcCbLEph+G?nhxL)6qV{CW30rJD%E^j0WV%7&*_3oQ9S zz$h;AKO^Pf*6))MqkcJS{)eUig`27-0zhY|4SkWrbq@AqYA#sJkljWsrjUe1oba;6 z=f+hA0E+Shz=QsO!U-3k_y6Dd*8Xq)$b3rm&Xz`%{i#R`GyuH#e-loB5`_S~-gS3+ zwpzQMl#JO|?M2IZTnpoAjXNq^ZECcZkak1hyE_sfE_MIjo%tNUW2~Ni#3FRAFKyZ` z9^L<I43NPF<YuM*FgtS@81I9w^^}i^SMk?hNKUw{-R(ivPG0^==NcPdS8?h2oZkG_ zZnd1t@W%`!*IIh@=8itG510ZBRk{;Y8A@UwT92M{x8XD*1y@!PLyq{bB<sGQ4E$I4 zRXR2XgN*@S_(oe23>)j*t^N7J-9n9yMd5QyTofwO=D5(In~*N0Qi46sC*aTn%fMa| zww(MC7$>Py-j=4R3n*?8KCV+nbxfSUip<?r`W`uy>Vo%g3&+zsVhNwfM~=5EAEBFU z#{v6$J5E;t=dYM~t0&|q+8T3Pk3r%x`m-WazCUeXbQup<7;19@)*;D9E(MSu*&r!z zFwo#3uz3+~1>ZPveOoosk>p{oVI_o9%u~TyU5N4@TVg9ObhvSR;>Y54kOnF)P}R7c z#b1NBVV1LkXl#<caWJuy(h9aH%V<9pZNnde@JTt1;*kGZHdXQ_I<<GcXheAC_`jT& zCy&*eC?867WgY5UQ4FrIw%A?*akZtsL~pm+zDHTgD)le7+j~#!zzF#5OEh~-l@7|# zjytN7X`t1IGBOHraoGJB7FY~p=fN)8`mGvqOmUr7!BMans089=vY3vMDIN60)@%?M zdGL^%n^JoquKWTtc#s(<toDS$@YqKdV{2IzcU~>8?Lo%U0U}7vxpdr#yzq!Uq-y=< z&=*-E^DFpC2=H9h88oZAQ}qyKOvl5K!NLf<Pj?v-VLh7xfUgyl{;Oej+u-#HOkN<( zQsMTc4<1>t16%quQ#Xf_x_6N<1kvZTQDyWZ54noVO;6=;-&Xq;&BVfgiw=LZJyA%} zH7q7%1jwuFk@EgfG=!}LO7p7xOJ##2C<*<Lj1oQZI|?)H|80LeH`Tr$eiK)TK$bu5 zDw>?%390)wr`vJrzq_idy7kI;zV!YuD<ZM^xZS{N2(Vb@O5y7hwV^u(@NHochE10j z$Ei2H3EsCL!3ovLn^w1h3T$P{RxmnFc$>ceIXL5RzC`wy^94rDFYzC)*rH}eg#P&p zkEuL=kCH$RpLKyY!~>!Sb0VhSa(#rp!s2+{c%jbHGV#Q<2J!BZKM~Mo8fPO!;_Kmr z6gLeQCZzQsF6Vy#CkXq@HY^nF*>3*FNG0PmAhBFv>I~(h?I|gYeUwui7^M%XAk}kd zI>LTsXZB1KY4Ls<^G5wA&RwcCfkLGTDlFY??4C~=r^rru&Er5=c~uLbzk+^T>@hRb zoJ)Jx^FfC;Kt;Y6_$^FSD-UO!b<wI=O9dP#y-w0AZ1Hc{Bxw%{0J=D%DJtTG6I~ZH z%f8tqYd20M7g+omS3DT9tp4>iHKiNvTD?&;V7(xPj+n+`_}FYWULfynW3jW(pdPQn z1QW8{V#KlUh-595KsS|mwNxQk**ib;o;}H(a8R^AYNNK+tXp}q7xKqKqo;h2e%_PK zPv0<|R=M1*S0S&ZsQF5rni}qefzHL$d<5r3N6|-+AX-6bz;oYszSH9%L$fs}yzDjZ zqVhtISZub5-qvHmiJJf->#3dX2eBQ-4v4*yvU*xgEo!`!TkwbeM25+wO)wnpD6S{; z8J>pCNhu|qbih0=**AyjWvaK~A+V;5XTJa)0J7D<IKc)tvkDm!a~;SfCv7yOe)dtP zmd{k%Y31J-E;Zd^Q$cghhQcWz%WF?=b5{M!3fBh9B}p!ulYwVzk$p8?yCnsj#m&mI z?VU;!gKPN8O;Y-_)+eO|UsKVmcvhbK9d5Xktw@j%paLiR!`LS|7a<O>C#;zvaVQq; zzLQy^1GXo5hy-2}J3yNBnyzvC9M3rX7p3W1$5hz@;c{gpJ@VX%5uF*V3nD_b+n$RM zmtVevlq#}w`7N9p(KFV30$U``+-&e5i;Mk3G1+KL3~9$>+4;upQbcsz9kXGt<2|2O zME@~onH9!wj;JM}=>Qn(B73}@X7Nx}1w^s!S@i%$KR0hdh4WdAX*eMoV>hx9b2X*} z12aBBJiTXLpAN|M<oB6dkwRdnJ3+5|Czq*z4Tlxa?m_`N>$`-M0P#I1Knh9|aT&-r zfBiPue;$r?-5O;eKa3BqrGXMl<Xba`Hr=rL3Va7b2Sh-2B+dY#MjsB*|3e-hB=8TT zt_IemY4#&lG6|Xn84>fZJLQ7LzxvIG{!%(W*gi)pt9;;&B#W(A9Cl91$?{_n-TSxv z2aP-4On+i!^*=AVNd4|*62<EDwY@jEp|Z?4b;bO-x2dY4QK1XxVJ@j)K3h&7gvpqy zF?iXI>mCZy4Fu?w?p+r#YbZ0VJa;dwG??DO`Kalms@HMc6f4bv4}E*z7A%!it)P}V zl|y*4>!(0dW+>z|p1|W=s-6B4L3GqOHJjov0~HA|b{@QD{x7EkG%H8FFz=eb#1VCk zv#@(|XX4);1xaPINotEw_X&g{c?QSH6@wZ|?oQ;~|62DtVyGhnpBV~7esngjKYIxc z`5x@H?^(gp&12siHT&!{;9@NgQb($Vc;=41(4hF9q0k=>$uj-snh1haNZ^*1Vj=8P z>la(EXfJb7`t3;ReJm1nX=V^X+X+jP*_uY1I^uQ8C$XZI=l@vUHdq+n$^0csk)J|k zAsq+{F2K1_Xd*Lq$2nfcBs%0|m~gv{2jH+ZjW~X&Om=kj4E3ol9tEt{^RzL$sF1m) z2-p#J(?RN9yt=rZ8)*-QE^fn7yy!td0^_HPJstNXEf5FGzv>BXkFe$ACMXi>m@mRW z=w2T@zXn1oI@jIKiH&|9ab*A6R)1fH{odXcX>Xe|Q18kg6Cw94(LjiNODC#9V@ts+ zD4#=rNmZ;oUA>>14+^W1Dx#RXAs@m21L6IeYbX+{tBnocZdx9E?<xmCY12W#*-h|3 z_FVJ>{8&|bm_Tk%=(TS(!+)9>;=9o`94fN@#D1<IPOi;Dl*li9^rUGu0O!t|_an>W z!CUwtEOnfDR%C-eohP|jx!JF#;)?ifDljyxSl%WTT$h=ApEk)|&7pMm;ytNoBNb2U zg0q4dLN+Sbf0|WJkr@G(HNcNA)pLJ}NgSspp)jwdZ#kWfdcDP2#g%pc%`lvrd(1kX zsKsZ`KyXXd!eY*3#Ju7q+L-q`ZU-@bcU2EjybPJ`aYTR|FdfM$HnIv$aTc7dkadg; zM&9Fm%g?a!Wm9Dt?Q?Vv{&yM{v&s+4GVnt|#r`Z*32(Ffe>{BygC^U~?%TGlY1_7K zbK16T+qUiLY1_7K+r~X-@9&;Juu@5$Je5i%D;v<8QqxQGqO^zuX+Q$ya<+|06%W!A ztp*Vi$Nlp@W~#b|W`Tu31W}w|vK$LdAGg>|v`}&&)TYqmCN@jRbtfl5q>3DL)H&l; zn6yTzXun49TF#<43yv9n-5@G!K%}?K8x$yzTw|&l&r=8^d%w4XpzguX4|AENh2p9= z#srl-B&#XJs~Bhw#d!8OaIiQQ?E5?%lu3RQ=j;@OV2KCo3-bC^0{q>UiGiGDkXX?i z+q@|~eSwh$!Ev~?#=cX$xmOLW<w3c%F@<m4^mcAh1ZH+X22E3w=o{mvkBdVy-ql!t ze>&fMo>jT%#AMYU?-?0XH`6?4xlLBdE0``R1SD14?W>V|sC5kKR49lp8t;#gxGHe> z1E8BVE=u4AXg0E4{Ohad5fnEJ|L{uaCn(>5IM}*1MofVOLz;!Wz&CT5pL@Bj`L8n} zvw7c#o<r!|l;1rD3XR9y&bRsA0!>qq-6b*l8Douj7SQeo78SF5!lkQ~4p>{z)`uI+ zBI{(24Y%`eF@L}hnsi%WACNE=9esd#gVRgSFF9Lx!(?9DsC#)ny&mm5R;3<ScnawU z7yBRI_0tw~-}Cbf6~XRI<%boSguzXFitZVlmt>c^0AsnWr+B<GktJ@s7zkT9v;OcF zHArYj3oPm+qS&D2KQu1t8xEO8>G$?8#R)!b?dNF-2}vPt;zZ0shROu#iF}1~h*HLN zOMy8+CK?3B4)*@JJ8{8JhgV~m7_M;z0WWhgvkkAowEW}zo5Prv|2L`~Sa#t$ccVR% zG{ijw#gwsIPUYxi#Vfn*b~cMUAv+D&mP*}uGgM=<gKX!#_)>jw@<6*NZP^q^1HJ$u z;f~(=oA0>ZK+XbU#_`WpQq|evJA4V^^NO+9`kLN3uJ8zN(!4A3E^%1X;0jbws$4yO ztykYBoC+C*P!X?gqky^nCtku<w&)OI!%<8^yUY{NI2!YsgI;yB7O&PjuHm}m?67{I zqv~g$#*#1yePBNp_+UBeXnKexuULPU>KESBIb@Q_{GtU@`UMx_Ym9TBnv(^NWe?N3 zas?}FQ*f)s=WOgQJf(*Ij?+0s*LFpbae{L<F!wZ?{*L&aI#%&{aIPA{3`ieE!@!<Z zRXteuf2ez5&Oq1FrHI+63x&1?{Hw~RU~q0qXxt<R3I8-Q5E~T_r<1MY2(UMnL%wo1 zxog;tI-zh)!5e)mtv&d##X>huGsV&Cz4rT1{1un4bMH||7RkuA4qhG3FG4dhs!H|7 zQ&HaLHL#iC%_GX?kjcS`<5l$R5#FB@{*u%N{9+IhBF^~1XN{1v77bmT^|!{H`!Pd= z1wo&mVwB(~?L}s&##P^wRu&ZBSdz}#UdFsGj?2cXJY}A1y3<K+?$!gbmMV8KZ}kqi zKjr-XdskN)$rVSVBD)(aO(oT$awxuGwXpCL?7Bm>FO_shWOG{Em&sL0pMwX!ULQCk zu*Ap9w3xZ(_QpDxs)6MGCq#c7NnId0b!jwE-RIw_=@8;6Cp=A!a@J;jAA>ew0vWi> zE%fHe#=&T4wYP*j-6;&>>USwIaR63ACuoBxBAvC6%M^0y`$v4|{4dqK&|3@Ydv`g> z5E!-1(&2^(ir~tqZW`)dqvA(*oFA$yOU!39063hOP|x}L?PGl#nVoK4C?B7+y|6)x z&RXb8q*U^6(@c22rG_RxZ@pmzgZC8Rm$8!WtmijV`&n><(kY_!W~iPPJ~3RxKo>Wj zxaG}j-$IKnqp~10GipV%bV<JkQjLDlPOt_1U~K=9L~MvcbM7&jp+~-TI_3;62<B>A z`tc0;oB1IcC^f1aPQsh=($;hNNSTHk_ntpn&&Hm|+%bofeuGvKzOHL&O*HKi{=O+7 z1N6+~6XmR)tM%(25t?R1LuwZ+*h}b0(%vqX82z;lmRMU;?#;ugvN0eE{G_{jFqufL zH);FeYbS`dqDf$wZ8D$nnsajPO(i!sbtbhVlSxiNRX~evc~p^)h)Je+tk{d6T|T84 z#f2z)iW4_@%pDgeKI0=tDeINGdb{5Cend2}Na<}Ml~)Ubv@&yb_v_GAylPCvV4EXE zIDK(MskEr&V6LcYr-3hX*a08@3+AQeS0Kt`mVM`9Z@o#saH*%?v7JX-n4`-CRTkl@ zbuLN@zmN&bRuC0r6pGZoZfgYI^Ma^KbG2*PXEJ<WIHIzgTM&7PSBSOxQK;wcbEwc5 z9lXRzJ%yL|H<N#^CAluU4}(t8m&pu1pvND$OAxERM>XedelvenT>Il<L)nDYXXd>m z3k{>1Wq+t5>Qjt5sP>FxYJIV`DJpvDI;7LWSc&=5Sp*trl;L3;4f?8wg)?Xa-3~l} z@*YNbK0u@iiFyX3MnzC-PW^8B%JiI<AFU;x200bnJ!XJdJ$V(+#87Olu>Ny;lt!W! zY^sHnj?g%fZhxru9n_MvQ~|>e`>Y9^YJS(!YdbMH4=biIF{7i5hF)NR(Xq5TLt_xF z;`JW+&^W&>Vj?b=?8w5EIt_jIM`9|4_m7tvXTf)Qr3ynQe{_Wc!5v(*D6ZfD7(|S` zKMd%;Ax#>WQ-|9(e#l9S*>0Ls0d8DJr}1KYx0EG*JJGFQ=;(5xbO39|z`?m^Py#u$ z(V*vet<dG0_kJk5-0|ondN~d>g0SO6sn0Ld785dbtK~YKiG=h4%U1EfE=+%iEP0S~ zltT;t8g)IE!bIKJq1D5&o(Nn)?vx`LK@G0cCqfR>=1l&~eEKOLvo7rMVhJD7A(-B) z{&>Akg+$CF4YacUDCAJsGV#w%3E=EdAzJHZbP}_f5a%9Py<M}yL0RD8?vo>i$oX2G zfSX5w6uwxwIWNlo(nT0i*>Ab?8X94j91~GLoR;nV#U(bm3|?<2YZ$>Zp|V1ZC4pre zpL09mdV8*QLEfM@hiM~C9wi)%UKP(V+2_F@^L-U2t*7oc`k=o*fu#p?zXZFi;8u9P z{>#5dfN8M%%3btLnB!7}oCNY!W9*$9=e=;p;HwBxwggSv<oNZSrinv{EfPj2J6c8D z-U4~2=zC1b(BlMDlNi9X9IXZp<8XF1Eu6u^*S#JaDq~i5wEEX%VqINH^p~4><<YB} zp<6K5szfZ04PS73i*!bBY7G~*qQFd=42II6TMc)*{x9{!P}2=EJh@1m^L0rX^aojV zd^?qveO`8q7EN|@xbXe~%Gz*XroX@P51|=AtZbDfOW}x79FFH~a62m0ATknfs3h3l zL7%jAO(bCC74Q0=XLVn45j=jL;2aW`XTH@6nXYl1iEp5-FM?s#G|VCCAHB|pQIgk4 z&VSF}RTxj)ta~DSa?24O?FvoeGW>2Y_QCv%GN899A-n42j*By(u_94+bhq(CQFR+` z^Afa+;YEDt%K=0#TJdX90nxWGp7&N)>P;kCLR$~4mMadQBH#?hB3_IIM1t^$MDHEL zVTZTjlu7%0gPms{tt(J`ucKl#J&p53UTaq|ffeh1Xr^dvAbl_KQqbo(eBwVr+NiJT zdN2Bj{@@13rse1_ww8h*A*-iQhC)OPdyHlHHqw9|M{G8`KH;K=5v<5l!R8^t<5cI+ ze^@|yFj@eWvLeBLwaRI6?@m^B{E;JK!N6EJ4MH5Z(F}~hY@l_)J84EA`+216i0#Fl z$LM#-)}#uQj*5f6#M8KsdnUej0k10eyJ4C|w%-NpdhgZtIpDHTUdm-JI1dQDm9ZN+ zHhVp@{E_MF33qXj(5QwQ1d<AhGYSg`eCCNkH<F7$T_M?Xk;Ndc2L=RJyQU5M@y#F# z0v=Zw3SK;}#lSBc1bEENQHX4j66ES>E($N1&I6<IN8$nv3&yPX?=T^5`yb`|fO4Yp z6I4#H=DE$DDkE_<C{Wp0lV^l$2Z813>b<{P5LYp7(P_GifP*VQ2S%e?aeX3QlBo~4 zq~KNOZ1-7YOVQ*h9kvv!-cZUH{~9q2C6iRhoL>7jBiIoFW<)~w_ZAgJ@RCHGZbIV9 z-*@WG9<8_O*j8>glZ;uvhn16nMcg;FebqlApdX_UYp?`4A_pg4Bk8(>Aa-twR$!D_ zE1<APV>x$*!KFbBzQOtmCdI~QEVq$sbdujPO7kxC*{OYu6u+|Rm)>$~;^qLLlqo8Z zY1q_VeZRc^-1HIEfM}7p$etrTxq0p2Ro~-OxYXsqTzPMq|N5yh*Kyly19A_Mi7x9B zB2~S*E*y0)ZeR4?oNc&mkSI|BI!rB^s#9B@o;#G(eO=VdeHt+W*3CYl8?alf+eS2{ zE~K(OQUoe@{%eC@e*fAf;~U0_54$<4inQfzkF4IvdfLB5qBkD`m#t}jl-Vr`swPFU zjva`)><*qJ&pdm^L4e@T`<RO8>Dr4q@EdW_5{M>oXLW;u?DPG!R()C9W5ap3wS=m$ ziTKg{g~f7yV~4_=@2ld{H2E*yMDE~^Q!|7Y_+>(;%+N%)MZF{+@pUy&RADee*!Ynp zZHzXZp7tzxPG&H8w}+S)!9$zQP2K(52op?7Yd!4k2WiXE$Z3>B^B-7oO9KA%UKr{p zN<(Rq-mI0{b=p@`8t?s<@Aw`@VSa*s;j>xk9MZnyLGao$V2=0+Of422k%M)_@Sr@g z7gz8mb~-1nMm(B~8{8wr(E1k=kJN9&0dx^lhCh54O;7Q)e~U%+9<j;1vbc=rRkvmu zP~`n^%MQ)xN@LT~$3;|4MGzU|!ak>6wht{ERik2OqriVbPJ+%T@5O!EkmU4=78BeL z^<Kvrnz;}Eu~mT?p}H=#C##JKepDvCJmi)oL-Cn=-e(Lp5ca?mB!ao(gXBp>ErLxP zPP(}?<pf7U^l{8F$hYN#`UCAx2x_VF<ZKlHMnylJWJ02Q4rjdy3K`D%!O3XhNy#<{ zJ`MD`sC`_jCz%$7pswVt5v(Et{q_(wB}}vbbdHLS&|jbNT9P9*0{aKj#ruMDFpYD! zJN1Xrk9mX4idUZ#l|m+P%)Nmb&^P$+K7%_(8BhSG{Zt3K>kW!P@%=yd`?ts$$sS9d zlv}q!bof%u@C2g%H1f2jhNF{RH`k*BVXzv6Z0xc<y2$aw!VoYq?fLFoq^bjx?AzjI zNWiLPdM>)lo?CTM+$7%^Mnb{AC;r-u*}gYigD$603JoMwk2oCE-;<<&d+v(ukCJ=E z0rK4UzxX{RP&0VUcp>dKizr>syn#|MtK}oI)?3Siy&tYG5TK?EE{vCyx8h1?;)_kx z3V1r9^Y{Pr^Y%qAnUnu50b|!j0PutQO~E4^-Uz)5k^0j8D3IjjgCht;e*he}BW(9# z&fU#jfB`;O_}aE!sfA_#l~`Spw3y*FtB0WbgfVMgswwQ$M3spsYq7P9wftA=I`u?5 zn-vlSe@JZx?v@VMA8!}2e}W@(s1do1-!rp??kX#1`+XX-D_ZL>(P0GF=pRom0P_~s zO-hz2gK&g<yJOp@ido+{oif#&rk@5K7OWjFx5I~6vBChTvxdZ#I9%G0H_3kNE#R*; zFCxvBokyhG7<SzSUF%mn9UH9g?ZR`{7x51Q_1X&xPz$*3Tcc&T1Vn%=&KXX!=O6nD z&9Dn#&WL-UHbW#FjA^8sH#~$}$uaF5dtS4im{13}&~^W5puN}ejn|K}u-}41gQ7?i z1rxW?$MDcriJEE#glpPF6dPZx9ubO3&;2vzGAzlG?r=Q8E!Zp|0znt`YZ0*4N>T0X zkqS*TZR9uW{dVG&9k<+Yw|ebyIx8Ly!;JMCy;^9VY%Gs#<Z4uNt_hncXjaLjrJy<w zd`n(XpX4FFg0bj3H`Veg@e}@{C5I`yV_}$1z+**176ITx|A#+0Pyph8l6Z4~@PB)C z0nwUQ41t~G_)9O+c*V4Gd+WG%KysKnVAZqBSE}Sm_AOI#N5pzwAKkp^sX=yg!IERo z_GAylHU7<|d_YcqqS&2DNVt)0kwaQun^-vFI8GxkLFB4FX7Fmo&?r`1lb|q*L7%uB zuctoAk`0Mwh_g;`bI>OzK(;r0t2-!hbA*QYwH$T2<f+e$NdE4-Rgv&~dJt`3P{kyI z$Yli!=b}pu?<yC+6&0X5vR*wzaV@<N=YPvneOxl<#}VzT8T4RkM{E_zNlN>!&`d&i z-<a<DJi?x#!NtBp4_jM)13hfRQVSMlPQ=s*p`G9FdUk^UvIpLd={>n@%D+jAx%MIn zy+P>FOa-4$pQSFEB(V(xjZMEgD?BU(oo|bkI7e75&QYAWq_(MJtE6?(YkY&0&bjnI zDxomYppx{&t)k429k(BAhMmn8+w58bCP*9z2*4)Ui5=f7W(QW|_$i)Xb6R)5IoVd~ znH#~Vjg}-oFLuBU9uRd`3`Wujld5F{1Y1G!==k%(A~bXOxZQ+BO7FW*on<Y|Th0<q zJ7?P<qkEZEmkL?pTL24*k2>`CS=LH_r|Tqz>w{@k-#taCjiBt)To6Ulbxb=TkaH0| zX)5~M96kt*NCHy>+eUQamJI@3@uzY_HIosFGySHE`AXV=&2g@p1A^h_QL4_1D)|gF zbAyAviO@KcFI4aP%x`Og*X6oC#(Jqd9)!2-ZK_N(ItaLvAzdGNeIzns%U0#2542s& zCIjdMadhCl<rkX@0Jx!J!5Xm20YyUi0pKV9hc!h|0JObn!9RaxV-2Hul7dm51Vp;` zMBDO9$8i%(*7@frf`l!3im&=@oOcHwe{x%<3>{~M40PV@FIa`154wqJ{&scj8)?r3 zePSUs8A$hHRrd>=p@O;i<721$1y-<w%^OkRNv7u3b1hP!E^{%|Vi?UE6u`h2CYvg% zNcE>KQ^+;oOm{HYgIZ+8=$e&F&S%xjgINPSfcO)$QVsIp@^<!h74@)5wHuT$4)&vs zcNr7)P4st-rurO{y)p{o=4`rJAV_aGW?jl7)V_`qJ7{QZJfEw(Em5M*D(Z2^+iC8E zh*|4xL0e2(l{Ez#ygA$Gb1{0ky17#zhg!D-VnNp>(QFZ1m-f5y2Og6Rp3O@AQ1r?1 zq)58yh%;7+IpzzvvHW+gX_;>LtRM@qdHv&fxbD1icyGjeIx%YJfcLb|+g@HH-z{XH zNU)S`t17haSgd%!KukTz7cS0W^^tDDwL-CT{DVg9w2F_c^Jm;MC_%5%wr4oCZ60-# zM`SjM8O*L)`*2Ltb<{>%1=sku?;EnD>>pJ^cC7<(4sy-yiX!j*cWa(wOjtEJjMsxa z5<Bk0lwNRZ$f2}oT588!I5Uc5mWHTpZ|Yvr2JnCq^hp;J8-qYwrf<Gf-_#<g`Xd2U z@a2@5CYjD^Dic1|^X1@&j69+HfrE#OFQi5an$wW=00V<rW>OYV{~{rj00_u`5%NbV z`2Tm^1Sn|f-U_CeHg%(nWztM;JL@tK&WTh>@Ng0XPo!@r$VdO+v&r0lzWsU2(UI$k z;bknalGaX$YH{=_WT=yca?v%gPAM*kW-CfSqmLfP2enzIGtUKrG&zAZb(DdYf0Pv~ z8=TyEESzUXH;tL(3f-^=6+W*MJd&>)%T7v)?gjWoXn@YustSS#lLGDip!m9wMa@%L zP|m)iyhz`ein{5)IXg@3wT^(G!;qJ@BJH&Le-LwW9OS?`iNb~e$1&=!6G8}U7xo(! z{Yv?>93c3kxj58Q51t?^^R&MhjPglfbE;7Kw!N@?^I`zdb7SM8wtC?m{7eIh?*{Sn z1TVK-E&AlF;bKZVIB-o;WpQs68nkureHU{=7@onVVp+=eCaK$+Q;Sq1pAJ1qJ97{Q z`VcAT+%E*ZOu)4I%UBPr0(HAd)Ua*R`bb3WFLwzonV6Ko*=63(cEj8Kxq=7m1N7<_ zM3c<~-nnF46Pv>3@K<o%ssNi+Bg`(4M(N;9s<$l^$03@aNZNbzBng-V^H_s_A>t&_ zv>cZz1&+XVHGd`zZzd8Lf?cv=VP|mBV-w1~fEaeF!}V11m7RHfKE9aeiBFpo%}Ipp zUT-!h-8*@32cuMd#|R>u$<s~{;;(fE6YNuzn@!O{951lo-VwlFaHSWyWqszKhCB$$ ze^H^R@?YLCf&GU!{1j@AFP5aUQQ!mIGkoSpfOx<><{C*=c6E!GM{CfI0E^j$mJFfx z<ucI>S#Ky{)_<q&&Q0c*geHQV2Uf6B+}=*b5MY4%WtS!qo3~%>WE)*SbFE8^SVOus zn+c^r=CE2K^Q(;LecE6H46g2igmz5yao4fyp69VRZIMv`erSew@t2}G)Qgqs>F1PO zm>tCS%t`bj{6&a&u8@7H0Uqd{Cfn1qfdptAvEehS;@PAg$rM0wZ%URwLJpBrFj!fM z)O%E{F?a94wshL2()U@8e?=3nx?@+YYUJJ0<xK`{Q-_{NCpYSFKurZ*?5YlPewC=k zRDh@u)z^8Hl=Byw<A;m9rrwb);}WPlgyZw${!xUY3xa3{BSZw0KH%nh{Ia^8B0bqv zTPQp*DKOz9n!^}wMMW5kuvY5AL&gGWT1E(zdEUu?s5Z}>wKlZx*hE8!re_ntwWk-} zlptl`!)<qBrO9ov8xZOyG22!kMX1&gU%}N^>;d!GI7Ciku&Yj(gCV(dC0r=+=-bft z->oRUKS1SlRgV4pG#=nVC^rSN6_;#&C;mjDVE}wNxtk;7-M{QkQvzKb@^+R4a(WuV z3KDe<+Jr>IO6%+A!tXSzcyjEhsdV0)yW2D?nL2z>;v``#P$ak<03rP^2#{1k0q|~C z`oQA<^kwQORCOfkkxH<F#8y61N_|Y;lHqWP%XZtFoznY5^9TMsjyiw`Lcly@-ACDp z$AL0iewNjjX^y`}dW6LVngW=Dh8{>&Pz{I%)A$oLHj_h4JVu)}RS5>#bV26)-DI!d ziR*tL+n2DB0lux%e>bO0gni9V7C7}8@r|t3dk&#KGLX&GkeI;rIYh;cf<<0|4)gk( zxg$Mo!5o%3hPl#RRLhPqX$As{{_y;XwnCN?)BXxdVL0?Y@TURHsky`T!c6Nc57;rl z5OOy5E;Sj|m1CK1r_kJd%@ex*q1_av|F!%V%0-c1<7$2+T`9nC<e31!N(2N>W0FZ% z=L(md?8`>BY2-AANjJm5kYUZ46x}IH6<ii&Ml;sPidDRTT)DT^TPA-?lAdaXbd9>Y zyR+q12dly}ntWgWu(e9n{<r3FVrznFYa`yq?>lR^v?$jh!@z!W5T0ReUY0kf_Lg;7 z?^{pLN!)&NE1*k9E!YsBX9H@dTejEx_F`2%Ahyyz8dQoJb5$#p_a_I@FgnWdrvi4X zVgS1uN?9tcW?YBvzT8PkS@HM0vi$LhF=F9X|IVWdO%1%Wf01B80EG2Fj=cv`{U7Ix zDR|e2Y^a&;jB$i_`|y4Pd;l8?@Ew(&`@CeO<Z>HMD*j$XIGvKuKK{-yj!6o?^(TBZ z2Tvuc_K&9h4!U%Wk)9+et^saZ7%gdRoU@rnYJ%~3s4LMf#VM8od=dDhfmp@g{cw-M zXC|~P;{e8!4u`+(CQpsdWr-Re(Y`78k)cPz@~6rc(V@A5!xi#6HRO3IqgY-SGdo?h zUKB`L0$R^F61LF5ikEw7wpGVo&zl%xPj({`!U4<nH>#k9?gXvaV{Pemz;Y(pBZ9dy zw-vTq@hTIeqEwoud6Am5MHhD?nuC#Z(m~)S;nO5hFQKWdm_nFUK?zG8ngV~q(Hx&l zw}q?wNk8|rsiToG7C9zh4EQmB9E%ExCf57*Hhudta-mbSTG&@ip21AfzxJ!F8~8j* zB=CIt@SeuSER@HQLJ@2S7({XyXlv{aK(+=c<DRqF0<NKbkC2;&AqhrUYc%>izR9Ns zZ?TIEUM@vGC0BVRJhhCoL}OUye1FkhELR8x@U4gfiUcJCAY%Rvz5><%b;F7%1Q9$y zeYiy%BVA#p1r%;v|7aoLlgUYYw;CBFvzJC^@A7FbCVeGaL6LMvgPWV|ePY#YTB{H= z?+pMgzeErcksbn^`;y`f3QP@Ud*t-HnECzl*#>`W0nhy4e16JE(hLv=%{n?!G$%Kg z_hOUi=tLr&9w&}QaED}y$!NIFnRPB_p28@MVsVks#EZ-<sOk&y_7mYEC;`R$TqwWh zABX_>$dSvc^09v>TOVG_p{-LEU}ooQKdsS!n5`j!bO*rCh?ya>vmO}o8b4blAxp_2 zDZpW_S9pe>eO=`Q76vVa@80J<sm_TkWZ+ycXP$7dh`21mn5|oquMVts3}JM)^N=ar zP6k=!Up~F8RMla4CCO;YWwq{2<CX+7P$?a4EBGNd4wj|Fe>VbI504TQ39bb|)ctEq zL8brM(p%vd)^OnWD;Y%4$7}cpA9F`#%3@k&-F^L}?V^!<VoMqU8cq`tyM)YU#|*9F zo)u9@9&qq(rApM#wETJIeAAYL<8}%sViuH1sn!h5h-P~eD!d=xG|ajjYXiVN1-aJe zieeZ$AWZezXmbV~@gQQjkUn+!ie5ge#oq(QO#3@Qx=KOKX{ur2rWfaI)Q?+Vb?osm z;9+pLu0TX-v2?sSVsf5YbQ2x)HlB6!V?t}hOx_ryfQ!)-3T1K+D7us`^P8*2B*FG_ z`F<v=EmAZ{wU-k1in$azUW0}=^XDjuGYYuzBRhA<CRb|RKoJseMuDV;lAUHFboVnU z87w=ZG-#$C2Qvcvtkv*G#(A_L&1p$-K{=926U#ZX{p^QxGW-s|39m>j<HYIhS5z`y z4s6h(5z&)^ULPGMD^eS<h24KXzYEUfca~=GgOmMC((>+}reWp;!CqtTjn<O(<}fTK zcld)yHICmQmAD&VB7m(?kz`eV9z&6Z(G=+!o1TvhZp~$tjDWvNi=QlIB<)M_EsPRn z#qDCREvk7l!pSi7`rZuugw~kK7IY#f@KG7bL3@6D4aHoTvO_P5RsD+!10ZJq+0lp# ztG5RL0g#pJD*fNyP4h^9+p>`3-6EOL0EoMPH#GXE_XDt9Z|rY$^PFN@m|#P~1z<FW zO3j6NHF7BayBQI9)j-(*u2__>288eQy<Zrf3v+{!@Z;_qqS;|zeWwe~#3j;K2L<kE zvd@La`_an38JzG!0iztE@ZAn{Is9+X(JdN?g<E?EuT)Xs2U1UFm%m`tRl|(uL1z+F zwx_bJs8V+^{bVIAwvT^OHO03G_AstK-N$yQ9OUriFl9Jys8(LAhDo1N+)L2-pxP!c z%r}P>Cj=#bY?(Gxz=;vsM6z}D8fpR$A4`mP1mf7cmG)l$QeJQg)^#5!fx1`JFEh53 zV+HuwxR-aTR%5aR#rOGX?w+0X!omI{jyDwi-01#g(Du%RbfTT+fKpT(_4n|*Q>Rd2 zQ4o0}lHPWu#;^IC$T;)&A0K~+$paAm{+&2AS`x>?0pc-?H((i56`6YE$wTL$d*pMd zL=ArH5m;MP=jB*g?NNAy(qWBAXds|YDk05g%Rk(a(uSj699bTt_aHAvL)R(ruZ7zd zY+ayvaMiEnLVfMwq#dtwOYisqrcwBmijSv*O(<C(<5zb}o*>jEG^*a!ZWAt(;>ld* zhefp|>9+LR?MQ3BRW<4FL8~^>qb6~MJihh%7yKSWT1L5kT9T&na3(WCt4bZdxY6hE z235^h8W;*NRK;su?&4v%L?&$6%(D|Q_foR&=J(BFFj?&!AUgpfX_e`>2F+i0yA|lR zIARkmf|h<oYVMG<+ltA0=VvMcgC>NxyC&1IqHkF#=8~rO96YuUO;T$1mAdfF6HHoj zeryrB@(v%|4To)OEM+m7Ltc*8OxCWtYPcy2YOf-rlhSWzhf_S!otcBML|m_-3Lk?5 z=dGiP2kGEP$<yz!M<W29)3UjHZ>$5UV>!wz2#{aBDa_Lf6P5?cv&N$VWP=KEsZ_=< z@L;zhw+vk{L9r~sHbg9zy5ohWBksoQYr@yw*Nja_2jEWrTF-1hs1kE9H2Sl6mu5YQ z(-R$tbt*jL*?P{_053&|m+C3Yq*9J97%Y~BRV>yz55cH&K%2zZM&%WB*{=N5%Gw0# zd?`!+s;lslf1N@tzJKfN2XSCPXlINIa>|+inA-YfFd=|QfZzs3iv$NacJgVE&9RF3 zT+XTNuo4g@N;Z49cY0+J^2=*I<A#>At05A0Fn-@fVy!};kB%!Y;L|ew_maif;w=X@ z|5oeDadD<8bGS?p@FK;p-9p@3;L{E1OLFF1Q>HeQ6|pq-2SYj1m4>e@;FdC!E&9$R zm-sIX9U;tlfoY9Wqb-fwezo(ju*}0i3CL|(BuSUcntn!tbxj^rT4psebR-N*S5<-7 zaEl~iQl$`xm=o@^Tnm(FB|}-|Xu^JWOZ{G%oM5m0Mkomj8O-)4!SrjX#A&o8GUhP( zk;J`^-WrWmrFXT70a}^n_B#D&1+qx|y|pLUc%C<5CjtQ|7-~4A65I@)N%IcoP4gFx zOMEeBua66sG@+i|ydyZD<PJ@a!tWp#dG-3Y1QKQ3Z(%;@XE)2cMCWosN2YN2aKw*` zMm@C;{PgZZyPZghEp*u{Ny)6KiU`zf_H`urA48yz2-XXI)ty8WTWF>`!gr>JUu&(& z9d_iQiQ*!$SVOErO}I=tg3z{y9WFc}>Nb5*wU563qGjlMr|DaTGo6{Oe1cwh20^Z& zYtvD!tba?U{(w>kXy4*A^ZuFT%A}Jn?&zELvQJ&5u1B(BEg-)JgY3?lN2G7+n~evW zVaD18+c{bNE(T&&cT4_dq3<|pmd-EL9qjkLqxD2Zw16a^%UvjsKF;4+0vujGURWJ{ z7>fO_F7Nhy-3*S~jYJX(Z!$hl1c0y5%Bst7hGhP1YP=3Hlowj3B4ND5Id#*^i8K?2 z_VYNyeLiJ^@FDBy%UKRE@s00t82`YCN+YQ!$~#wfMQJe;R~3vSf!{SKkJA8wNcD_8 zL}M7(M*tDOaGp<FCJWgbL1DvWUM?tHbe<7u97wB<Fe5h`4^`%&N~qA%k8ni_cs&d7 znsd9G;adlP?nzqaBRrn}Zk(RpMs!fTnD4R@RP75$nD%|gRsZ#NI&y|$U_CXtB@;pR zJmC5^c?AR3E^Ue@>0*G{`zi7fiw_aUeH2JNRkQoZ*w|oX%HJ##;Fj0F@D;X}3q`&~ zde_(`gtY~YY0Z`2140+q{{d}^?O~vr-&Y7~%2Hf?({bb|A<r2Wt)nZ;6F*_3xMZFf zNX2P;g$NvOMZE)LgEOUK|D9Z{d|5T#I!M~xh4*!dEoPIYcN0;oK0Vsk(RH$pPVacF zC+vP5)q1(|gz!YY=GO0!z=2n%tg<9~v5l(ZyV-}<A)k=U12abRTX8+MThm9#wMhV; zE}rFWtom+qEoGX}wh~Uvb^4T!ot~RTmlO+G940~<8->Qfk#TMrg?eyHjTNbPPwVsY zDnDg^q0ZVwBB{;%xVIA8Z%P>R_lY~wl-pJ|<Zcg%Hb)84NPAxD;@a#UEiJ_bzlDg2 z!NYomrCfPL)^s=C-ySb1=clKf_lo%w&<70|00X-$rVVz=D&8&o;A^%lqDT1Bua%Ai z*NaHpunwPP%Gnig)1N>K{@FGr`P=3)V*t>{GK*6+SNE}V57C;P2q-%Bgk7~mF@I~= zb#)xvnsd-=;8{cWibj$hbqESl44=##22Bgpx%v^f4}PrNGL})&*bk{Uz146Vy?2tV zkY3uU_x{onL5|pd?rIzkSF3tdwrUH=u0*nQttHN39a9*#26z`iiIx@}XudKlnc%3| zXy0~XTiR~NlNMW%g2F1p0AWVQR;PK~G-rv9GJ*(5og*enxB1|*w(*g##TBNrpTe+g zY54Vb(k2kxL|)z7q*+@~mVjkFRE+c??##?9uhb)i`DEBHBK2SzBm&Gz0DSR|;SB7Z zy$>^FQ4E)Wn6pd%q&}-JVR<5boRbIs7AWR@WT+q&W(4mUC82O2TyZ1THWzni5vz<3 zRR9fZY*xYVCWop*BA2Wzfw7uJA_*MJ-?4do@p%NAzrREo-q0nA10FJEkpYM<Mre+X zjXG>*yl8ZM1sYr%0U<WQwjQ5*ar;2=xYm--ZQ&HPiV0C9grf{1Q!QWdujrf&wI2X& z{q1|~g|$DtCZtym=sp_yX;mO8w8&sw&UTAaAiWij7kFDQt)`0nIS`>OHjDD~Y|cq~ zIf{fPGv&%p+@1;z@xdf+<Q`asVEKVye6O_U+7kgv&6GW~P(uE}v|^;Ap_KWDhQrQr zb$-@%nKcJp?1@Q){BZZ+*4kad?pG}YH8|yOSu@;yMU*e!U2clr)HN0>HQiu`h$U=` z)P(6Q-1=0f_`Rb>&f4L-_+7;!$68WGN}WpI!kT2H-l3!?iGXic{POkIUTfaJ;hmHI zK$U8S=l}<m*<B+uVUgkl+uf2~7p~sl1D0@1lP;06h6%xhs~R-5(ln{TzgChJu#Tsu zVw$>b<g>d1=Ok`Kz2OUzHu?_(yzDKq6X2Bnr&~pGSkx4y2oxeFJo$Z<gU!j>%K!sA ztBtodceX#1JfVAtQSY3V&dg^j-CuoX4Pxy#(|AggM2;wAuNU5<nLkMPvS6f)rhzn! zjuUNtcdJD*SVd*Y?ET@J5STM68QZ1<>?4EGEY{9Emo(_da#a4bMdK9tK8CQXKoftN zjxKPkdiD!{q2CkSPK9(jdWY01Qtg@lJ5<Z45ez_d<1`2H=>8`+)>Djih}7S+gfFj4 zC(RI#$0U>!s$xM!>p3(d+r|>YGyyv_N+c3wdjpq6JILhi<a);p8H2s!?8r+S5@mBx zlZwP9HFuFB6#O|Ku?mc+l5{V23d_eTNxcOXh%QJ0_+c#(5bA4Vli62EVL9u4uVirm z&0AQy2vA4oiZD2E-@|JwVY9{UX(^?8{^=|5aeY(wMD>e1BjE>(x|FYSD=T)u9OR-i zi-_kXjeLY66uzL{`EMd_M}BZL{^H{d>`3YR6`<Og)(b<{X*XZW!7C$rj`20xbPfll zO-Ox>O{&L}p7*uoms`_{TS^HUn0-OGyQSsEP@N0JD0ymqdY3^ITS<*wK&VFXo<Xn5 z<2rG~#=2wJ^g`>5-r0dUwp|D!iYT8L_sS!HzFD{lo*)C#Gv*ma{b89f0j9Lyh8Xk` z-h6&XznARZmVxb-p!`9ej=wBxP1W93>l}Bx_acY!C`{zI$nq+a(huTNl|S|j9SSs7 zBv=*ziSn;Y4AlQuc+ppka=HCFm-n&Kp?9?{4RQbR^(k5X{j{4_3XY+}-{ZhN;wn?G zc0=-g>@*uMyLS#0n7v|P1{RvzQiv1|vE~nn;j8o;ctNl+M5KlM9T1gj{lh|_%d%M; zt_Z6mV4?52_v)$opRD>kzFMiaVvn~vY3A{6oKc*vKv5J{l{9jgn2mh`^Jx3I6*T8- znCq&RQY;@RuqM;RZtl=G-`!Cy8M}jo{>P>sVcQc8m~-i>HX6rwm%Zg$uwh;4mQycY z8AT6U9V=Fnp{lh8bB>t~RzCOLTW}niL(Jw<BwDRLU!#_Wd$MnWJNq_80*1qosbd(t zx_>N^FDfzFo}Mq#&f6Uc<=T+mNw5{<)51NU6&xoLtu4uN45<|NqlYxe^rJt1Jk6+^ z`VcifXQZ$-UR;vTk9cy)!u}&39>u*EHyCI!>?SE*r-_-ZYMTl9a&GvlB$V#k?ySzP z(`@N}>H5aRw1eQjjk8i7C$-9;9muMB<LYkZGv@W_ZY36xl;W-_!+$uzWMH-O%z*^} zC=xUdfMogCQx0nXD;Y>AMj?l7aurNeh;YY)-^{qMGV58*8l*dIqv!q|4^*Pu$m+zF zM-^;b+`>swB<+=tQ`Mo>Y?`5-FB7=%Us@M+0jOtZHFN^J9%b#Emb9<rH=o=apv%xF zMa8!`5Zql_P9dMFNA)s%RUj1*dU^XyRC+HFsgxxv9wx2mlm%x^qxSxAcMfNT3Qz_U z>^b}$GzhAeb#v^rA@L`lYd|RB7WM4rct|lSvhCZS0CVnDYpX*xjwekUaQ8ysWyO8H zom(j3kfQ5E^Jsl8iUnEHu*QgMWj1q%|7l3*Jt;%H1y?vqhs5*RP|nX8P8&1QTpO3@ zdkNUX|GmJ%Yn;|KNFX3Fu@yZ$*^?Jt&O0Yu`Z%I+JWrNbTWCFJJR>eu`67GcPlT0W z3CSZR^pKke?B8{@-PFYtl`7z2bA7=nY&!Gfy_muBZZa#N@a|tE@EHK9`mdP-RDuDp z_Lc~J|1cD(!YJ~*dQNg&GEJ#K2Q9mCj2g1UC!Ri(<ooiSKiak1Ak~i%i(Bal8kOj) z^|ir%64emPbLooMw(B@$cw8d<3DWOV1pmsit*4REGzcZ4uW&3gd?D~h@%I0`vTwsH z!cE;7Cf^hvL;#zz@m%+<8Gj#V;PD(+87TiW=`gG&BebFIwcj27z(3F`o;eOi;5mGj z97`cU8uHIbtE*6e^6tlDco@1=^)*KqpqOr{U%iR&-j)<*)n7F<RrrvGZ4GX7gd6XO zj*5<ttB?f<>p?foZCPH1H*7HUJr(38PDEho7YTv|K)U^_KA|$`f7DmqX#f1L`s@mE z3S70ntFsSYed>00U20xOq|xEo<Ek-o;W$gF2CqYpwHyk@5kT%|&6tie{`6f@s<OY$ z0-VKuy{KrQH~>_?kSH6EVjL{oescG00$P!Ycqh>-`;}~YvNGDe)24q@KCUACiDb)* zRLn(mfxvd_T`A-YJI*K*k<Lf}DfV^o>6H(~suN&()PMIK?68iC8SQ3akz58r$!ebq zRsG$3-5l7#R8`GIFiqpgB{EsEXM(dvq2EBwkY2#{W4)K;%vyycJN&`007t^S7_g~d zbqndxft+#(gW0rxtEi$o_?g9!u`vc%7VZTU35*9orvE$rouK$XUL;o<ApYhb$S(*n z(FX?x_8jtn4A$<`ULlf6mkGJMBCM#$=~0K30XU0@6kDq&#XZgN$Q{A85*xC)gV(y# zEG-DWTBZ-Da;^vQL4i^(#lMli_N}jsB{6g^jH`qOkoqDf=_>BPI?Cf?_^+Q2sF~4p z(2mX<443Xc`2hK8tDW43Vpb~DeFhu3)G$b{(nC$9rbDSwo(8FOv9>t1qBOD9akgeq zLYv9{YSIvRq~!*RHcQwoIuC$s`}d|p3Kc>CkiWjme?5w+6fFJAv9}TAx7#h81LWU# zTl#tP0BLc6TXWqEOu`TFMt$-_p>fssPP0<yd3DW*mELM;??e{UAdLvCuEjZG;w872 z=qyEf3U*1=`hKMvRm*=2HxU52@vkfb<vsu~fFx`8zrv7}(%nskw<E9%SlAD^YX-2u zGp*D|U+=1ww>DHUjM8mID9@{=buOJ*N(Q$WqVkvqy$bw`$^#%j|2+(#9Ppn9Cocc* zS>Q@$nYge3lSQR#lir@nSZzM8qJjV@y#Jf^{{3IEWTpQEEtn0<c`v|*{pbKtB!3qG z#s7c9-l;+WNPBG`MHRJw3Um7gccvW!lJ-9*Z^uY9{68~)x$Fkrsod<c&~9BbK6)R^ zq+>tL{G$2Zq3nJH$z~N3-|{qjI{DHJO0&)Ty`~?=>^L0!fl2MU?Kl{XaOZY12=D4N zA@&8-berMvvD|G<+{$zxdD9*T5w=*1Wfl?hxaJrMFHd@C-4S%vtKtM2&K+Ka%$2Y{ z;s)h*Uxm@WXz57l<y>N_ofGxskE3h-8hPcW!!S|dMb0*sCS)SNx@G~&cl=}0s;7T= z-KKz(GW7jRH{|vHpj1nqcTF?EVa5-dl9ROyt9>3W3&MzndDk0)gnURABb{x<cMqnQ z-c2`bYbBWpBL#d)nNKH5m}o+8eM)GDF3K@oDG`pn`jrURlX>&cE-++cm3Kqi4R-7n zA)Czuwb2`FJF)X&^z6K4ld@ueZr{tT+MxHh>Gan4C?e$*bLZT4n=DNkdxE5HOa`7U zr$z9h4VxS%aP><dNV9W>iD`d4at!d#0PyMJDVFE=9hO3c7iW6C@^F@RqGUx*zUz+e z^wo?PsHPp~^Ht`SMPEme3Y(F(h6}@&nkKrQ;eS7%GG658RU{HA`n9wD)jf~Ta5bx9 z^(LF!#)^KE(V1@6Qs)xB8Th(=SgjaR3ly7y>B3$QN|}p7*w?U9f4h%|*UT6r2}Lpe zv!L(ca!ew^;%MuI*;y$~O-d3(*Ft^SQ>S39h=^c1RwR~0kmnW=5N^9ue(yR!@63!s z>BCrQz#`xZ+zHPGgv~#Po3Jq&9)B?81zX%q-dT(IE#((%aAPf7RM?a0KE4o0f;-z7 zk+vi}brGa9JupL#sO;>lw&AUlTCoY=AYsUO5L<aO_6<>c;RE^O2e-wh=~9%>P>fw< zR(>U_PQwBo8kR5DGa(wvQAXGdKwD8ae28oXn{{?rNxY9_cF)VakR7nM2^?`gd!T8V zSUlH7KX{E-GENTa@7hgxI7@P#8J%}zv@n3-&le3+V7pa7CIShIzzPQo&zq>~H_Y@; zW(I^?0npj=15GR>o4N;LHRgWVM#Ca!xEcoppig<fv#th$atnrgjv)FMm}{dI8LBVt z?;oD_Of}4xaS5?%q0+S<1jf-f_dFQwHF*)IA{F8p(BoxzbeA%<m%6fa98*tea!JcV zH#KKI&3AdOeOgoW@nv%R;P$jWC3kgR-+d@V`mNy}OCwsPZUd0{$;{UXmuL38;aU9@ z+X7S8zY8Y0RYhN%)#~2Q-XGAfJ{?9)mVFD35TwM>Od#^RAb8QP)T6*`ceT}<#V7PU z4NSX7-zaA>#{QEcGR+X!$1*8niAaS~-?vBEsh_!giIrX4J|fqlpa5CdkZBTIy9&2S zVCsK%h>(E6iu<gGif>b=fUFR^Z~wi2U{t5DX?Opy>4fv>kjkHG;X=A7tmuK$uQ9Gk zwohDB=u6AB){^vFRB{cbRjx(Bh&L8R?VG)1j4HFLGco2jAc9Ke;;6aS#1Dd^5^j5x zhnjRruykp>wv~0T(3p>g!>gy>_m&h4!FPXcYt3;~cf8t^Eef@j{G5>$JJniXkb4)G zEtHj7Cdo`CQmy=zGA;mtJERNXKR*hI+clAhhs}=HBu{K%K0P$NbctB8N3H55BUG@L z1i!)0;O^?X>OwUougedXQ_Yzo0QfOK!#5537b?m!`fztT2*&tZV^ujejj9d7z9)N4 z+mav>@c@5DEtRmLzR3}zHG3?<=w91x7Ial7>>N(?M_KZo>^|?24$8TqU(M$ULS)il z6|rEc+}h)}bd-!VkbJ9{lVAA?4XsdN)9m0=gI_rW5`Nu{8AajNXdon|Aih&2LESiZ zFz@#zS6&%;Ki=5Kk8;*fIrVUwV1!_hxO?hQ>k4azWvu|aoE{hiNl~3So>d})9(t@d z`fxkVlnabgm;Lx0yBVM}xRk;+jWJ89`<J(%h=F0VY!%C?lBgi@b1Quh$Sr@bO1<LZ zbu#sLURmH__|9{$M>xp|kKhz+atkg8J^wkp`D`ZTJmBBUgP7s)UQs9(+`i5Zv6wjN zg*eeKDZrXz8jO<9OWD})l)k-cHhO>x=lD?fLPK@E8;J+CK~kqqNs>Q=@=FP5%)r6{ zX=>8w!@LA7Cm-_aA-IWsNDm*cenS}Xvu{z_(|x+<%C*x@gSzt(-|ddc5|=v9zWs}U zndIA2vg}(_h8!J?G<0Ayt@(TJ?iYhtuL9K^KA{rvA@}M@F$9Yh!ScY+4ub~#XX_TB zFt8?!uLRlJjD6fr>2kUlDqo?tbsK4_KG9#PECxZm?M^jj6+e^;Eh|)Ad9@<qH3$7$ zWxb}SMy@%%HVYvWAq~aq=m#)`q)37H#1{eUpkpy8_K$dm$fM)6o0PmwcQP66exk8w zKfH74=$T(dsEc?sI9xjEgrj4OZffUAW8@muj?+eR7({_)N}86ecAJ7wJBP48y|b+x zl)k&vv+-fK7$gUZN)er?naf@r-6CyJ;zI@`s5KJmSgD}Qa^QkNd)jh#cp7J{LH!K* z8V<D3VjecSzA;+de{kH|*MT;%Y2%|ctY1A|t*A%Ih6~vgR!G)QsJ@2WE%(0uLY~*D zW|Q_*2q0E8QeREmH_yt4AEDz4y8m6}Tc(&4cAd~NBVz5g4-+26RXNA75-WDf%!Wed z4I5s%CQf%n=q)6x+ZA$dJ-22@=~q(_0<}>O_>C~=YDI~to^5{nP9$bqV%W;|jVe&r z70Zv^tFqj-LS5o9w&GZNxpo*)+i@7Yw<fMRSNx=E=^*o^tyC<`oRT<YFKurpB#UzE zlJ_B~R$25g554W>b>6cc<$JU}2FoOTjTo#pn;UYx&ba7n5ge9_!VyuTxUcfocIbpc z(oipO*htwoGhgrBFjiT{vHO_Pdm7tS1r19=X-U2okyzPxw~-}d67y=4g*+HFL4ngT z#Vv$0Ycez=$g#sCalm0T8vcz~&}+3u`8;plPMQFEROIUB03DJo0WBMsHbqhvC;JUB z@+*5dh1H-?4JW%d!WTMa!9KCTOCBvY<L{z4Q1i!|^{AAO;nwr3#ih4x8MxM-s<Mo0 zi6r+U7@6Gq8q1simCXA?;KzYxFYRBul=3BK6FvWufdS|oNOCQHXCTAO6ef1>X=F0! zKke};YA9J4Wq#P1USQIu9&l<cReEVGdbjnGm68PoArkZOL}}{SUKT?7_C^2XQLc$8 z&q#(?+t(!SQ{{c`D?gaKIqE`>r|*1&O=bM56!TE?^tB|h0hWF2p2~TS?e^4NtnuA9 zHaFL_j>drJBa$K@4+4Qt5@4{JZ+gA#Xk;c+_<g3x`F)>i?QjIEdL5%#{l=J}k-YvQ zFyzXI@UnnZ=smhSArY&$UP)2}a*oI5-0~Eks<93!fWzLm=n3+S1)Wk_aMWw4I?%-z zsZ4?>hA&RbeclHYY+k>M#kXLKNcl_Kn!Q#8_t+7os+MQ>I%ukBwbf0Uf8mX7UM&}i z?4>e?zH9PshIW(P)jKxTk%|D;GBx?o<lX$TNS@J#KGr3}i?&B>2HX6-&XcHP36so( zCcyE_rtm02+O=aR?nSAjTQX7VA*4RW`6%EWs=+)0jLKRJjzalfFp@FE$x6n|7=2WN zBC)O+Y=@j$!@1k2+lB1@p1+CG|4*!WiVYq1d_E|r)*EGbwt&cv-@(1Tws=@MdAaNd z_Dzi{??pv5C`g^DyDw_esc`7Q6daNHhtOj8;HdS8fk~~1KLja<t4BdLGXUPdru zUm56GT~Z|nh_a)JK}hwYEg>$v$PfH9E1l@UR9K4iEP)0`&PdG45P@fD8>#Rglc9~6 zi77>&>u45fpiPgk&UgOOlDsX*D17W%7^jqT$T`rIQ=VEJL2~IC@T_ia+0E#X>2l17 z^X&F<?e`qlbe<14LYG9oLN+X-1oAPs>#Y@z?zM8lTmw_QOaUt6prYvL^M#<cKF5Tz z<eAF~Q~SorBCKA{kaC}j5FG*J9=0)k#t|^)bi(bwo@OLGIGwd~;)tZdkAC%*+YE2Y z(XAVQ#$<WDC>p-$>g89xw}4xvV(Q(McJ1<FtfOD5k+UN#VkVtmGnt0p=4EP-SYY&x z8Eu>h)<ZF`z#WW1wcRgjtGpHt#hhNEfco@HK(q|n?7dBepM{_i9HHqIu9FQ<U;3Re zA#RpFEt<n_-d&|`N=|G8wiP81;LE4bl%TROD|lcQ99|-%h9zQYH^1yVbyu}zy1WaM zEB6wOze8#ENZB7uGg4T%1m1;Zd`Zc36|rSm^uH<R&4C7<u6O(6FXB-nLUnR6#vc~` zA5-rbrb(A{joxKfm%41*wr$($vTfV8ZQE9tZQJIVXJ)>6&+p7DGedhv?uZquOsfj* zuG6ZGs}8~{_gTLS=nVn$qqu&L3D;Cq0x3WJ3*xnE3{O8U8}!F%Q^7Z+MT@Dy66%v* zaO}-tRcxr}LEw*<_VL@J<EdzzDGoCvu|3*1JrUkzq0{_xyC&T(-e!1NRlBJ=sz$<V zDnz%yy2}#ZH<FbM#G_~L)@>a<{G<;>Wj2lHkyiUwJQ>075drOtYe}!6NDIgC?Bz|o z#bn^IFpicl12XGOX0WMrCur;65S~C7zugTVH+dbOr-gjW@2GAllKaW}_v_3CfFLFC z9kreZV*2l4NY9b;AkHN;H<}MU%XnT?+fLANwiJ@+2ExB~l9^i$52a;I$_`eF{597L z(Vb|iZ$o6$?Q`9Jay=8tM`culi2cdWgypYee@T7r{Iq<nA}3`Jdf@l$mBPM%O1FrP zs}*WD)0M;<E}(ppO>(w4tuLSQ3Od*Vqe&c@sTIQtClJ8#%N#N81<S9<ivT(9T%3*q z-1<U-*sgh_XToF0T8ChUr2?orkcH4xH*BeQyQ*EE+krzlZvQB+R(=NIZ$s)q<o%H= z&!^(jN9uZh3fZjuxx4B8F4_oqs2v|qJ-2%)f6P}*-Etyge^+`t%ygmARryFhpoYfA zV97+4Ef%DLi(v(#FA-;v+1{fqi6vmMl}Uqc<bjx>HyyE}ni48KDRal;+OyVMYVrML zNZjy6V%r5<;!DMjV0u{0aH?}FCr(Ky=FZknn`?NpdGkoJ8-#C#Eo8uQ%@DF3c=&sq zn-)CM??AaTf6Rgiz%nIbV!$OkI}GBAPRx67>g0@aEO2@sIYS}ft?$b08-%&B$Mk}D z-w>=2-3f|*fldZb6VlAa<kC1&C`~ssfdA{rKNcj0^s63{3qR=)j$Ib#*=9wkON7p9 zi0_h4^%O`A4eJS@kMxJ~-2z`Ew)cZ8(;wEJDtx~@eeB<zP+8b2KmcGr{YCqKx?TXt zigw$mZegzkgX86FPBVpm+`9lRH(k0r+VTSIp^r{e*dhN#wbPN-<qvpyYINoT7XD2~ zm)3*UeP1nH^6`{k3V`v#Z+|HL|2&*nIUfMzXQ%zoF%Gt(!}LQZblTKe7}LkSv|%!4 z(8v$V3+WnpcbT6a%1OJZ8WO^YWtdy4aD2cA2Pwom!DR#Bk)4}N)j_nj1sln2P*K`& zJqLVI@_8*>P+b#*>xm9K`A}R`%fY3xXSH@J*qY#|;h$rqVSgz9|9pVFvcNymxtac( z6M;q1E{@9&o`1nO{ucwoX@d^9c1#w{n-Udc6=G(4j0EFox>4)yI*q=zyP1$DEpZ3P z^WS)W_fuqinQ<|`auWz8l&$sZcTI8VD6gGZikdX$`Wn~3#20Iiq3C;F-=0ZKaiN!J zv&v8LBp?v2(>Gwp5usKAjkgiP7G7aV(9`@EY96rD;{N-V+)xtfg_4>mDX4c|={L>` zjwj=dWJxrd!W$dG(0RetbhKGOp#YgbRN;T*P*&RemmGGwuXg{)!J%Bt@)jLnjhwey zmKGv#GrYD>;l&d^kXLKWdX7QO!a5?L`E5q_J1i*~zXFExwl!j!fgXN8KM&u1ztsKV zHhH&AU3edIMyQIO(#F7&utF6gD`$JkF&~yLFEGd(>s$1jec8<l&dcfIJk#@(c|qW! zXtOUkz21r}P<)ej)nkbQX5yK#ggTK+4}#obDz~KGuJdr1DF6+c7HL;Y<{d~TG)iHv z$0)J*Q9FOpqv3u$0ht<v`uO>?^-{dfyqWKb)kZ#Rw6;ak=c|_PP{X5WgLkR%&hVfL zduO{6FSKpl%!s{xUCAS?Cqlh;%Ca;;q_<BX2@wt@1bW;(VG{yEX|bL*lyF&|+n)KK zv5{r|P(%OGl)h3v00dy?#+()NkE-~Uh8y^zQtP5a`mBzW;s15%mt%JyQ0&>on%|ZE zg7D)QbpHX&^Wq=X8#m4g)P3W>!ap)gzndPJw`5cp76SktgOGJGJTJ;y6sPyP8<Hwr z^%N%`{sK?aI*-Y48-HoMJZ-p#s5nHRzmyM@-u+IWKv<RpRU%MN`M#$eQ#uH8;V42< zb9oa2mj{o|F~$-d#65xg>+Eqp=g_bAg`1_0&0$mw?s)JpwF<-dN9KY&!2JNQUTc`o zeL#oo-jAJmDhGdA#{5za+fE)hCtIc>X$kq*aEG$^j1S3qE@9TZSmJ+pd8^LiC<+W> zsRvCoj2>{Kbyc;~G>6~9FG1pVnMGJ82D?i3zh&&XOf{(s-c~nXW(Nj{<y3LI2*o>- zPY~W2&D`x<bb-2}_A;vn#7G{vc-c4zzTm(QJ|X+$5OM3$*%CyWGbhb!ED+&YNq@Wq zF+1&Czb_*bQ=?CV45^pg`<;vKo+sO&@99~Zwk7)@;=|+e-n*S&x5n=}4HYi-GkON$ z^f4;^bOD8e4E|6@|LrE1`QI6@vivBT&dzxZDtWKXDTEUSiOmG>1Lyi=&3@yIz2(wf z9oZqr-r=eftR1Pol@wOdOFzQ{d6=iBVg)wIG^g<)e+?wA5-|EDEg!lM*~EO#0hwS^ zobPYu4NAl-#C~kJlp?OI`@S~Cu#1fcx{s6y#LVy|9c94rqHeHgZV&$FbkMA*meUr> z!#u46$!{LXtER_4#%XvaMeK?@Xz5m*Jf!=}Eu=0@tV@kjhG-MI0WmC-J6sUIhJj!0 zw|UfEim|-_6^N;Mq4AWn$`A_B;`2Mf{RQm^V<EBRTjfR}d!837e;eqcGk*(2<4Amu zw;X0v81;UGFM&xj#suO?<OODK^;%M)oG)zN!RAv0LXk8m^U+45D)tV>b9<vW05J{@ zr}&{Ir3LNYC!x6?>yq<Hq+nF>yy>YGY}|`$MXLP(O;8`-UQy%EO`W4sV5$CP`>L7^ zBz?utZ_^ylNg_?iM{JxH)Jo!adDDG~Bdw1bN-+jz-Y%UU8QyUe`28YY=pyZu9>AAM zZrdA5Es3eEAV~a?r2Iterzcg)F?i4h5UMvq=T|nXH7GP3;r4AK*i-XN1-KtM0;_9O z6-xQS<KGbqe(I0JBUi&RUXW)yo!m<gjnCnUKZW8SRE9q8i%|YNM|FVuc!n<Sg{>2f zN`3VmW&;Ry%^g4TzKhsDZDdCAbB7vi?9Ecw1lc)v^0o(^xm!{I|MHnce`tvR`i%5H z<)O;p2>pMeJ5Fx$o)K|}r&wT3=|;KK<FC2C{JN9tp#*<_U+odRc^W6%IpRl6U9wdr ztV`MX`O!*31lvuhXk)7LrQct$cyb~-cV06imslDxvEWlXm2}4yg{o&sle=4Bq}m8a zs!7CPz%X~0zA&uq^pgqpjKZ`T3Iijw>pEu^79yO>&9AHK!Z}-@m}X@J<QSo`O%xAb z&Xw0qYTQYJ$53xCW)C`yQ03Fmk;3yX>&^69)$~z)jzrCbNQrA%Dt}5w1aUj4lJgTz zxOo+LOR~lbI@||@HK$4qfcBg77U;t<s>1%eVTRmTW6zA^41dl^rwcOWo5EH>RWI_Y zkJuP;f<!EwAAFM<<ys}YT*|1~@g_%7M(DvW^U^>21Q$=p;bK>mL$7_nh$?bt&6>QF zX<+d?nFp%h?K)IZ#~5tNN#q1;S^-b6TYC4hFL<}CW$8LU2HmesaEQ#$KDTH9SzlKD z-0r|F6kMu#3*DA&>p<}C!U8YO2-+>6IB3PyOg{(D+vCucdu65MM;4*cn{Q$Tb9+}N z8ZUT=nc>bVs4TBM!k4>?3Xtm1<r_&$8QU&bG0`xu6)(~O?#J{5S3Yn7iXK|~G8e2) z`ZVOUovvXw;amp?jOCx~+wwCNKOin&i)(L!>|^*Cbc{!38HU|%U`xMQX_tPCffppw z=);iqlWiLR_H6vqV4<<hCE9HJ8up_<6;t-sU+_e^?`L7N1;dnL<x!WCNZ4os7uL!6 z11xUi1Zv5<n~rA^wPeqHb5}2J_02vU2O!FJrkvv^6gw%u%w+W6J1q;7)$pW|cEexw zpZje284J`%zb1a|^j&n=IDh<={+Cx;_(PNbw>4iL6oB9gYYu{G{qHm?Q$CV@QMMVP zo8)k_Qu;)^hfbpKfPd!`6T@OS%v6NTJxZrgB@km^+5Rdj=>3-^g6y!IrCy3&vN#M7 z?#SF4-Zo9JH_)Bktp>1kvB9$Q#~t+Mq;9_UQYP5P)_VOgKQOv146U6S+Q3n!L6Qqc z92^VzEQ2J$_41>l%!(x#;^o*nL4%#^2E}|6z{F6biKijYuMDmYV%rwrBB$$i`SjX? z({k&=NvmURjDJV-TSeH2+dTnXSCSZQ6H$AQhn{t4Vd`%_DVigddZU?q;#tV-lw+|5 z;`2xkv*rP1ok*4=dL(SU&x=Dmphz7q<&JjuH?Qcj{U0LJOyEv@G=KR69Q8hTDCiZ) z&$1bELBXQXLrGH)wJW6c0uKVxJ!K*+aSe>-zkwWxK(wQCGg;cof%n`Zl&Ta5)JEMW zjx=;M)?qH3)9GFK6-ppBsE*+sK~uUzg%+)HNZpcr_&dt%W@D6Z^W^O=A#$PpGXy7$ z_Ij?hev`*kQq(m8>_+j(FVDqwj?f7Hp1|*xxHlrZ84VGWY4j(-<tx~ro$g)Vk6;l$ z9FXV94YNP<kwGx<w2ntHPZJ(&OTXsY)KO=0R~BecN$fdn;bmCIeN1m3uJ$Wn_?s0Z zH;YZ5n1{zILP~%xm8Nac5l6KT!N`}D^_IpjpTK+Gp(%VF)X3PvlTRi!b_}L`JZDGv z-3sZ#no-Ugsu45<I4MXO_)y`Vf8*^4FWLJQ_$jw8EX%@*LPe^)s1Xx|7+QUcD^gzy zbOwW4b7MPlSx~R}{VT(n@rRc9ud^uy0gxO!tL9hf!La}FHb;3^xI-RI(_2Hgmn+?u zQqyId7;Qt}qKm|Z?ot~cMOwOtl_|R6<=R-$dS8`NUE?H=+%20h{WC`BK#EsCH=7Kq zzq_{*UK7hI=`LjOrEK!4)4JBb4jip>m2o13h^2Fvz<n`+`&zT`JZa)t<t0dD)O|J7 z7Je$&%7W4g#N~aM#291T>BLckh*oPGr;Gs=V^{uDdSAr`c<8<6hA_%r&B{ejWaK#_ z3jqNR4kUZjXMJ^qxK_o1jx-Qq!**f_*Vt%qtCG7%J)WKUnC(~-s13_dtlo?bCt^G& z@yUKQ?a>8rOnNrt+^^+*u<Gw1eqb~e#82Qw^it&=Bj@`wUY(@PKz~(u3<Q_BwE&x# zC?f#htEupf1-c?u=0W-LY9*O$XA?8!t@Ve=AkKqU)IU@^^b(A)`Ngi}e;Ze{qIogl zZ?!%%{T$cy+DBBjcJZKLuR1Fojyphss`}6?Db^}@z9LBDqW+br84u<=1fS&EH9rKL z<QGP&hdz4mH5e^lr4f(qrQa;c$XuBw2sUk!TeLKkEx;)ZzcA1YUFhe!tuS($JfCq( z(r>o^YxOAbhqn9=U;*$Sz(U3U01M?%el}fpgSUlp8~)Hy{{bwhrwIbkU2%FYD2rvZ zETjUdi)gnN1zhf)-~YW4f}-n3vI`L+Yiku4a_Iuha49x_Or_o(hc6A9DTNZQ-vhfl z;pmCmGDeLOO<IpH^sC_*_&njX{VwRpOI44A;Klp<fSQb_H>Pi4X_-3oM<)!E1nxfr zh}M{>drUw-MHnmBOHxWuIhG|=h`IGk_PzS1h2ZH`aFiiOZ4)1$>Y<6bL#Z)amBCD2 zn|+fe4*sN&bv;@|$K;e}?hn{C{QfCWNj}T^F^Wq~t2G)_^w5*SPyJkkt=YLuhi{AG zTl{(OjO`H21quXmqM_unD(NuC(kJsP<wn!=sIQemgCT>!yB$U-<^3eE;S8t-*K=vs zDzxjK)*{Ci`7o}u2`(6myK(WTK+3#)$cghzP*LEIN#4#Aui^}oyWT#T_Qvblf_A=w zVH4ZO=@PC;b>LDsGzh*Jj1Z9V`$Wi1y0_V27*bmrJ7<MryH*9gX57}P@v$WIm$-3a zaSPlG4Awp$q3RFJMuDH&B`Z2SRX1v1Ig^{>2{dyiQp$0L<*7Y}TYl&@eO^e9J6>G* zS|OOZy%@Ov`<s|+L8XXosXYfy^C)f1myo?}Q>AJVyf+#DeExDq@ax1MC~VnnJ+!Ej zAb@lvKQ!k?f4HUe!0<WU&7&jl7tq7C3ZHN6iVSunMzt-NCPjpYL<u@cHv0n78DB1K zL5_N~_t3Um0g3gz;B{yv_MP4#Ym-HfW$*+a$22;xMhMT*7p9IWy*+8l60LqmoCSLi zNUO`RDlj<HKELve12D=JpbrK;8HRH#y9w>&OxFpgwrxl9;DCKTV}$h}Ex?mDhjD6u zt$6;WRc^v3ShU!CBxK^yNDcp1B=;ral%RUMpM%jO6j~fDb)!$-%2(j5mZ6B#8C?H} zQaMx_)S^dVj*qGP>q&CQqIgme^U)V3AWmZ*S3?kZ)QNXKeCt`*Mc~~kj??&*tP(|s zoF<+cjA(3hM%JXH+pKcN%o$9Z7iD}nA5Ys{!=x}2K+qTm7vBZ;_>s@mm7;h2`QFXX zEM)dRktck@S26Y~q}0D%-ttiE?8f~!;1j%yp$1DIzX9=2z;QNndeJ?j|BrVyVOjs0 zT!mmoW@h*a%CTLZNBBaL+w3-_HOG5az+9P`S==uhM!|vtabZGESgC{~OdRPWz12Uo zvU6LwG;c$3U|J*SD4;o*_gTLZ7>As_n`g0?mVP6aBjps`i#dd*^Zvc4;|AUq#T&*f zNI39~`OB=*;|sXg#&Z5#j^yoM5fy2QHntQIwb|M>96VSb_YJ9wc?iZThBVESu+cSM zSpM@&JK`1(_2iz#NoqY69Jz`&qrCWM8*Q_1c}Am4cFo}hrQoM;h2Z|9Gj{KpI{(aj z%n}E2Be#&Px4NrCnNTTF1-oo#vd=2Il2(@87vuAH4)K+zivdV3UmH+V$Bb9d>+-8d z<xwL65ggG@Z%m#nO7p3c{g&z!9ziue5acS{MB&$=>5@_7ub<!_%c$`pSamd&6f6Zu z1U(2%uRFkJF0n}g!o!E(#zUxrxm%$YCWpd{XDKTEk)GIFRjdd;nTUNo?-FTfkV2*F zm+?ikBXs+=-`pmcr>7LPZrYk+OOLh_9Dc-sY%HfENojueM9orw@Wn~0{b9r+4$^yX z7tt8h3p0!Kn6F}6%Vje;8N1v1dQl5Fq6|ZJVGFm{x-v+gpFP`BiF|KT4TjF(1cYT7 z`d<~eZQSnT1MfI%b~j)lnAWr!+)uoxnkCpRdi=1Ly^JQ}(N~YE^E5)noxz(<+lal7 zK$eQJZevp8K6#t7AzEI8J(;+vgPN)zaz!gR+E0kkQI|tcW1$68J_%!Ml*)d5O)D<; zx6&_&(izoebZ~w$jY|tQs8PejdBn{$2Uf?{X9ZvW+2)9D+zjRW_qf?2PdD+ESACqQ zh)blbUtfM~R@w&hiK<kQ>)&U!_z*}Xf|h6}Ivv>-nHFJF4jp}n4!5}V`cwYicsdhz zAFrRo`X^)pyFoZm+g-#cTz|!15aFR?^Da{twRJiT{AdwDv}d<xZ6r*-Bi^E%&q9@q zO-D!T<H{qesJ19Jm3V?GvY0)+hY?1mBR<_&+sUEpH>rX;_U20)efxcq>0R&PI=B1b zuQA+*>1Syu=}4bxfJTz77R!_>*G33eM?YG$;0kTy;*gOjm4ZB(lGvC148f}ap~30$ z>kEy<h%YPrHHvUszRtzLkryQTI_p%B5jB&AIpP8^Fm|~P+eg>Mc_EEiL5Fq%pc6NC zu&%M>9p$X@X0dV-o^$qeQ@hCz-WA^w{q#+vC4pO_UoA1cRZ^GeVff<XtLg_3_Y%Ld z$j$li(&YjoH|JrH3<pKq;Ub863O7KD{4~Mh8ZT_rV%@!dL42h}%a^}|Uyx;$Pm2cG ze<^YLerd8+zZGU%Z{H#Bpa`rY3|np)i9>Fec*nX!>LSCM=puCc6K!sK(%aO@UrUXW zz(eA`lSvQ>^H3hSx8iuT>NNXz&?<##h8sJDCE4l*D~(XH$#-Xvd%XRbY`3PufEt+$ zxs<A_z*VIqDF-*us-);mtm*Un6bdGVHVy;JU?9#Q)}^~YX^yk^K=Wq9FK8v|cMC<0 z?7Zr$XujOrb#jX6N^61Oyk)b`PwsnNHp(&4x5gc(Iaw1!XI$*H+ekuP%K2HNI`s%O z+z<qDwy3EEg{dW7ohR;FG_p(l{WsG^AyNho$(LMxwb#u34aDIwEIs-sF{Hl_TDMT@ zoev1dEJzWHeFbUFt8Rk+cNOCXU#%?YA;c*Y>YMgieQw$CFHpA^%pd#;4%S8GS(x&U z3GKPYn>tnoJaosbMOD$Ymd_%^fHE{}dGE<Y7Crp}QSRwhqYn+&Q^){zb%Cy!_;10p z7QzKXaQS@!fGqVEYd@voi+1|k#YR%_Xk$I$kmPASrr-`MN`Vh03hzS?x(;<nYn+H) zRmtt0=kzy+3kU)H3wdF=no#h1wUd4E6&f^Wy~-~!&tegcALqPq&C~<B(SdRr?AL8d z?@QU5K{@QEi1S(^feY0{k^BJ@w%VBeyorHDP)-m8b9Pv$0=&LoEk+<!o(EI*VYb@* zU%O?^R=<G@-AZZF*+}h%`5-U3!a#`m(+;kLclAbcUCet{YA_1ekQkt4n9Bl=GZRra zwC`a8-4g0Vfek89-L8Fym;x=PK@d-sSbG@)JE9yDMMmG#E>TE}s!j5Ye&uvRlaiQz zsINi=WH5?5?slSW522BwrKs-a_y2BWp1fgrRPI6LKm6!UJs?2;SsdWGE`*_K4Y_L) zPm4B4eT3f>hDH6|(jPufkWlk$;<ugsTHgdy*-;k>kL&a23j>nmba}u#LTIKVj>TtV zzJQVc2HfI@F-eEDF6Jf07shX)z#FM!N!<qlT-$!y0i=b`y#BEc8xFJTqAuiPqu}RH z?k;$0i-NQlFe>f(cQ8BJKpImPHm=brrUa4A_Q`3h8$-wh4OEtwzQhcki!y>m0vR$^ z!X<@)P8T{0x^uqZtROb~LAyBvt|_g##~1L#gi6;W<S{I68!xPeR=`iePWJ^D9C6J2 z2d|_~G8D8)Jv*W#nuOK9vff89rJHDNfGKZTy0}&Pwa2hLImC$WP5rD-Qm>jz5A?#; zRti|KMGZ?$E4nxt`S^QRrA+(<#&pN7|4pZFLiHWD*K{d%8ATYgo!TL^Ssc|<U4>(z zQU)tQqvWtAtH+8Udg+Zvjaou&%e;a|<eIq|Q+j$SQS#qapo?PJrQMxz1hp!&1tz0W z=rG0bZWBv>veNnpFNc=rYkj=+q;gj;!Kfzfs@N*Qjy^7OV5UXR+&`9SQMbvrz2vJ7 zwd;reo119-JxnPYEE32j>tPi&KssUzUmuAfORaJKv?<3xsn(u<PPfvNGJZyu(2Tcn z?UQF;bzS^4;qW2@Hmt1E8y*$ASmGwbGCv%c?a&QUUu!y-9f%Mq#>@m+_a(s|^qkw5 zIF6BgpPyI0@#lK_I=sN8OJ*5|Gt5A{1sMY4*t{wdmpP5ywBX*IcS}IAAzO(@eZSs6 zl&;?kou8sGtcgxSwjPXPMFQJdTV3U~p2KR5`I6KCejN@C0NxD^-sMUC5!0Dxvv7=V zBQiJKc2BOu1(>DZ#oxK~+|Vh0fBc9SrBycJa0QvMt#Dt&A<2O56G{WP?tRs>%|nHY ze-_SE_L&S1)hP}^B2T@~_7*p&*^4MLoAfLp!+Ib%ormzTB?48Yqe!IO&W-$R`|mrN z_GbN7B#Tf5cTGh5%>v~$(d%#2DbM&JKCUxaQ;F4S%nYVw!eiYrr9TUy-7J{S@3KEa z<)rY*(A#UStu343Gf$LT3tiaqJQM50byT>I<1N}tyy-ySP;#7Vgx}4ug4kv%afqcO zHjhvjSgNyw@X9GM8^FiX$d1r(g`~NG12MAvwd)%LegreY==g_4_<;CY+spQ}=v!4B zJk#t-fH<pj!k+Q4*0%I)MMSCL{p-xz-19n08W51VIEqlE`8pDDJWI=g1+qpnj}($C z=<IlcKq^!Xh_Ho8Ou>*4uj_Pi<Z`(PGF5yD@x@)&AC~{ZgUnc^hA(wb|6*&>D@r-h z!hVHuB}c-&%7y<%Dx(w9$8CrF(U6*9tKQ?az?4X4FZ~jTS_P-+iY_i(J3mp(Fdka5 z9fim;Ibua~p*lGwi@EK&K&qH42@yQPG0)(P*#y-_*22Xv%M6$79c)h2Cb9kFB&TvO z^E8Y~r)6@zrOO?A1Gi3-a{>%<==5Klf?5y&-mWsQs^Q<ilXeQ;Fd^Z|z_T&1enWC@ zL?Ja^fZ-K$(b(iWrka@rTXWFu9B0V<-0f2$h=DBjf-7Z21p=){H5z#;w@ewK-qfz~ z?lbBWLz!>6NUkzhC0eIDbO^G#8re5n_(WaYfG|j{weR|1KIh&l$Y^~xc7R8UW>FU` zDuqWH&`kMKDxo`#ZNNycCvbsZ&V>8u8wo6+pyqicj-@j^10LK7)&Nds1y$kfp|dBT znQ?z-nG9s%P;|8J5y?eG_|?%*?3)sQqx6$+FYwPvz5`+COKauwFB2-DcF52o@p`+f z_#4njPKX;$gg53sS<;{>8i^i~E6qnP0yh6h&2YcBk`@9@y$}n#iS;9elz3U4!vYKa zH+MSQ$PllRk?t+vLGI9W!p=eQigTtucAE6qXFk1jH|M;0nLWh}tIdsFRj4~#?cBW) z*?5b=axo)(-VmkLzRj$3wQ}wf{YgDoBIi?0c|DByktd(I!mbuQvu)M0&0vf!CqvNQ zxUI>d^|x8MLR6;x6{i_Wcd4=Q1D+uMaZ32of5_X({GqG=ZL@nsRZsweZ}Or3DZ;;v z=Aa0#c*5G3R|8xuHTmc6>_VXoS45HqEN#=M@RyaS^z}^rs{6A8gqiQNC8!0$Cm*b< z$NARjT%oCg6(8su`1H}qD)Y8strkD5ebW?GQ>|#1uC0UY<zvnIYO`kd32<&4M;Izg zvw$oxBN04cU|x*eeFF3QlHSheT23IEy<LIQz72aHK5wOU(y@%?DSw}bvmE=FO|&wD zSN-l~sy%xY{i!1q&ab9%S*p{x#o(ryoL=G;2AGa%O;nqpdmV?bv3wI>QNy=01qmzD z1)QU8<pQ1L_hz{VCcH8!%uM;P#1AO8Ajj_6RhU^ABpK61G$@z3qrkW81q)+_FR_?A zKjc`Lq`fS!jnjNEcak@K%r^(paV`M<j>S!okafy$g}(wF9y+?GaYcNg8a2q@pxlm} zkj89aYmABbtsxajQq_FqR9D-r)e0llysudellc$-{^8?7-jn;03fFQ{YFdziBy77N zNR5>``A0kPqFN9tJzBJX$;cW;`c*pPh3N-@u4nRJbsUV5?CtldZOyPcLq&gV?tHGj z<?}T{pIMOvPkilGq^-X^uwk*6_0Yqc1^EDP%_MpJhT*A}fFE6{k6nWX7f?K%P8^mj zcfwWY9$4y8hBDxB8ug-}dcwr%s#*~1(k+WVNIs*nlbsBtTD(wVregrlB~{kV`~bWE z^P$_q*m_=}Adx@x-~U8+yc#F~*3q05==>i)iB&`-Jd~#Ob<PYD*(20^K;l|gF?OLa z89;G3bk8r&ORdbw4LZg1*xyUEh(r`SvHlq``7DIQ=v|VEV7%-i;~0E*Si{%_rbOgt zXi%~DM{2ZA#0L=5Jy|M(4a|dD8X^`i?os{P<yMt#{H`wgK~P1aP&D+@lawl&$B2R) zG2ga}W8t^i-YHEKlvPdi^TmVhLOo`JQJIt_8K&zfAVxP*#C|EwpX0`$ofA1pn=lAz z%dP}sS3P=3!zIGD_xB;46(DNq+bvIkfaker1SAjbcZ1e`Yih-=AU!?|$Mbke@Il5i zD$v|$I=+)TL2`9BfD28>IiyLYFoy-$lErCEOF!K3iq?Gldx=4%9H=Ss{DHKsnjujR z>|W!sUW_JNcCUm>0m<5U5`y)0J9bT4-^wM~PrmDMo%JiN77O5G>Qj%wCsoX%QC#Iy zM|~Gp=<rS8>Y1B=*_%hmO|2+K{d01Gc2IuGTO+yc_G6%Sj{V6X?V<gZc?&^0_T%!l zR~U(;QJd|Ykv|Cp6xl23!l4<yL?ZtXErk15vblXk0i@zUCRJJ&P(&!nJx8FlCUie{ zAg(W4d;fZz$hc2lp8k+f>FkXOGb_|^=SUG?iZ6L>M{k*qc}waP4=n94HXLl}wfZ2n z%XmQ67h5@r+x3IEOL$~F(V_uF)E&RQFKKKP&c@@8Unua~ANuycUZVcL$|{4x5x39p zg1;%6PeysJaSpeeA<<f#PT0iJsO!kd&WO_NrYu<!?^1du92aa1y(EykZnW=RyrQ8? zs6eX3xmgjCUah@YVLd*2?2h`dCubE+`~>f;4#xAHs{9yAT*+WsgnQ!9#vqfe9l|Ht zXY8YrZqyZGHD-qb35C-jT9r`XjhtF;Vo4cXtO}YVf7VTbm`9)d=8S2jdLi6-quQ@T zN!p5AI!S>eaCICVfyt3Q^3lgYxYd%WF|o-+bN{~m?6ej`kXOrg@Ug5I8M^aN!;7O2 zloczun|u-mYUN7Ss%kX;+2S?vrXQmkWe8WV$H%uqjMGMi)rykeS6BrU3KaUoApVzC zR{4K=(NpkFSJy#-pWcUO!^%v}>SRu{?Jx>~Q^!XD!M|i1pp#HqKMm1l{cf}gI7=^G z;Jd2Sg(u!m^AD~fh~XMp?Pn7j9P73F(IChcDX&3Rt^hbq4LUTE{~BrxzjbXcbN$1t z&%k5fuM?VDP`D_(nDqClO;+LK)f`l^$%4sZuJ7=WzCF%kcAU58l{MaN3Un<ZawMxy zJ58ngN!eWPjOen73g;I8A%F1J9*;~lKQKvSg5j##G&)p2UtcSu65j9xuXj4R!Xygu zikMjSHGmt}rnTU)g0+zQJF)A8()j9vZ`<P?g5Rm0>-gHS%B0OM;Ck0NE|x%*|L|S$ z0deK+SD4+f6&wyIOa1f;?e3S50NtyRTJ<KgzDA63vALVVp^Ly5&BXa0Qi_Pe0_S=D z$*2?{MIgsN<9mfT^zN<ZQoO8qBN$Y@4}+K_b$Jzg?LhJ7<VSPB?Sf6?`z|8{l@@lB zZPv(<)yj5A5ft$OQ3(7zPzV4J44T@o+tSMi%o+!sF9*BUzx>m}k?#+~^#7~``hS>M zZ}>UpHI);%KM+jn1-_>U$xD*569=HC@}VUQy=>zt&xJO?E#a47mo<o_*wel-!JQea z(Y;Q#uBZt5>8Pov0S&AWg>RFbb$w!SXa>R+fAr@e$NV2eAs`%;q2K*Hfpgbe99i5P z6_i+cCysuwfo@f&_;++{y5F`$>{_`<#Z{_E0whBzKfxXD27#gJm9Xnu4<E)ncx{o( zEwza7JOkXnEa$Il1g%&z=KJ*~-Vl@}HfGmHC$nN9rN19U`vqR^sH%-_z{dQCep`=z zI=$SQeTBs0@O&kHOPU<!*_wM0Nu~2LF5P2p)6M()FKJx2_fVp#mWv<M9F>49H?U6n zpA!%(Yf)0E8#21!B!d}i*Q+Pf_BL}T$i-rvpCG;_sO5mYT>^3(p`V!mMaNj(QDjjy zb*7*V8<w#B?B8>1y>lAf2THiKrw~g_siBTqF@`qV1wJ~sgZ6@6x-e0dFg=-flf0-X z0p4p;K5ZgHourls!J7o1-R5UV(~27NCc1@vkcWUmK~R4f<^R~IUg>|46r~8C#Hjjb zOHDNz8y<ua_u$XOkw!8P?T%ev0(@T&1mAZR7XaS-2!89k2i_I7S#MiC&XnLL3`vLR z@O*D(A4VQVXjW7qRuB=pP6087>MN8zgxCY<eI24nIbJnMu&5f}NwRzXNiv-mecY<w z?uC0Ql)bO<^@m|!{$!3Bp@z=jsmEw|QBPTI4B$Qv!4wK*ly41jnH`wUVuRob!Qk63 zACZ}k_OF*~&t@mQCu*ud$LZ>HJwLQg>+P2DH1-m&JB&Zy-PYwy&+I}e<mKG6mKExN z#z$Z3$LFAvS{jURr^wH8UeW8EQn|+A=*-GcBIPZX_M;Wv^7lr21Ag~?WyXzS<qm78 zmIopr)rUyHSpn`d<o3~MGVE?dsCh-%ai95aCH3)}Qb*x}wRnDo3Zu-Gg<&LN7AzEM zwuf-={ekmX$iW8=`(=bQ^5QrT&*NM>bV!;piFvLMC1{0^@`0k0KnZ*N8z+<@e=Im6 zA1$HDqZ(ZF<tZO49g~gMiPAR7N(ll?l<(C}!h$?m+y17s5(-)giwxUFJ4Yii+f32; zD5!k&bpeI5hWKT(gz`$nPhA^^8`yw15OaIAwh)e|t3N@no?w@w)^q69tQ)`O^?4@b zPreh^l+%8SrA~EhwhK%#Fn%U&UZFsyKaBH#H=6%jPz@En24j>n8)k`#M5Jt`0=w=B z<IYdMC%-bX70(qJAjdin){Ok3p+ixgZ&$2^L}sdhRPFELqg-<%YJ$xWz#<Y}QlUX` zOg(>N`D_v*MLZjCY`wz)z3(%T+EZ}OKb-8C`{FL=8VHB>TKBS$f(GO1usS*C#=Ed- zu=`=jTq1je@aukbl#BkhbFJR?W{23e=Nuc0B8nu~j`O<~LF5}jZebWpMK8|cDo;zP z)qLEI)e_yNYr1>vA*^4A;GVsvO(VnbGR8Ki!K1uw+<4AG9XF-2-R0N!MTMOCYK99g z#rj~Ng!w@rfMrpS)<e3a%VC&NLd@M=j{92&fJ?+Mba<_Vd;`H^pcBnY{R?N?fWF61 zY3s5NEHUt_)m;xqJ|Yb@wR(hK(TD0wIF#8`9M2ffyjAl$PA|;QJ5a@HT5wfCIXcxE zY<EQOV(gnw-g?Q?2P8~QvP|xflpDJ&(`Lo+Q9i)GzrQTlaT;_astEyY55qsI(CFgr zt)b>x(*;fFU)JgNhe`c^VB-H-$59c!ZQQvu1jg?7vC_*gvSG$d7C9B062BZZ*QP52 z<+v0U*!PB8Owk@ndFPV8D9eSC%E+?QTEzWN6{?YJEHHwI!sAZ^7zpK9%d`X~{FLNb z9qAO|;Gv&jhYVDK)YhOOj=2>c-x@chYarih=0v+XfG<*#(VQ~X%xAS4qZT$41w>iS z<0o~Oj;X=MIg#e=VWRl5-D(LIib+KN1mO(<c_cA3DOltk<Gx>imw>?{WH`eQUruB1 z9}W%)NJ={hv5xs;1te%L9d{o*t`)fy3EorOOQr@ziJkJ`&!j`jCZza}9tO&yLdurU zyedU59nmcbm_JZ2l2`FceeZ#W5mVoFeqzVdBx(V0HkgM9(bEZR0z1ojs1j!BaF#r& z!^2*<;2?B`bJAaMHbFWi`mCDTXtR7K{>?V3272{81+)D-{YEX?!1U9jC{346oD%&9 zEd}#LOX<ldt1!s4-_Q8EW7uRlP`0SK)<s5{vxjxMC51pP#$lDDdPFzKWT_#T(h0D* zu88XI(L(cB=9*f{K{t0rwg<68n6+RyTgF5UY`ca3+6UYI1FB{J4}o&Uf6K!Axgj>? z#`S7`h0=TeFl+w-)!L;C0-zj)00Pfs+yC4KqG}n`gWA9Ah+OT!iY4%%A>YpkS87GU zN|Jvy=!hC_+f_awk)Q45;73APjbgwy0y>tli8|#PrvhbQjKs*uHDB`k?X3JsZKcfy zedlf5c8S{+D{K8*@kmsU@wVzLGJf`BgUNRPvu7^WYvX4H-^|})=fnU#w#;2bE)34* zW@SUYSsm_$r$#hrt(-a^p5KQ?P_44N&Ewg`9n3!uq}B%f9=-)L7bju}aK2kaYT;Sa z23ZvoMZ3qhjsjX6gYl3#_Ukb2FIG+ghkCe?cRQ0;dz4s7@>!kuRVEvR+YJiF)e57< z<Y_uR;l8NItz(@K&6az?_^+VM=<iIl1VAdbJu|W|n@;lg7}B-`F?V(!Hqok~qS#gQ zcx~JJnz;XWx@%?8YsPu=pQM_&Ku2O0TJ0WpWhTWJCwe0w5+9}(f5oe_enFeJ3!;%! zuuZwiKn3e>TEygBlf6H!4n+o8`61H)J7mO6&@sQWm6L4md|xG7)1|B({fW)k=LC?1 z39m&^$j6#*j6QR#5P65HL%0JEUz6m`I(ApxZq2w{hNP^gnZ@m+_?$s6aqoq|`^PL5 zX_NZoyJ$ve2#lf{|ACM42^O-nCZ-kjFfJ|B!E>8En&bRGVEA)VT;j{E5mH-LdUiOa zQibtuXx*!H2mUsba}u`mv9jpY4a)oY(LKF{$S03QmU*`f11?T>UUApW>tEhUS4YS| z;ZhWe?nY0#Qrt@cs7y>%95HFEhq{(O7IaqZMYpE)9+n6Sc4>00QjZ5sMYisJg*%NX zouYz#N7m<sLVYeVbnRG?LvQ4{X2_SS4vt`k6yn4Kt=Q$VQjJh!%J2mZpR^iZ(vpRg z!h?K3Y8BA7j`8mM9KG?22=d#%ItEutDJEh1@{Uyc-}0aI!NkzJWk6SWQjvl4%iLas zwV}v0)2S^0c|Q{Z9#RS(MHg~GciqR^3R-PzKFrjetSv%hYgFZ2{J;uHlANbzACxxb zrGqhxOjq7gOSoZTt3KaDT>^viD$idCav;xM(<!TX3zvma_&rDQHD2RU`<^#+eRj_= zHgyAcu^P_N9@2;1<;nH-`Ul1s<fnbQJk-srmK>_?a^HRn@VTu-Xw9OIg;88@03`sx z7t{wS$EyYfmTLT?GzsvOe`rX4n)bN!!rk_9|NEBbEqB92=J9^ZF02+cP$MWUlHyaE zgc}>MV&i$@7ORG+iwDo0tv+o+TY-y@Yx@%A9xl$zdt~JL6Dj@xeq_9wi+VhdenOEU zE5D2`Zk(xkpPT<8FWlyIZajMBWl+O_(Nz3Cdry|iIz%gu(W;t<2FE#vS-J`ap>;IU zhDCV?{~ceEVIazq*uY3z-Y$^0fE>{ZrIA!bC(^4r9hpre>!k${@ekrP@(16=+>$rR zilN<RV@~OL<Vz){M%-Si9@9jRLaB#2^_5o+CA;{*7UPJ#ft!a&tu4E`E7U@Gh7ZP3 zl;1Oek145o<qUo4eff$?(1L=r!i)>)r3Z-2CVoO7y#yNt@$oWWoQ_y)eZBAK2BCT8 z^CT7`DQh6W$xEEBByLVXHkpq$Q{G)lIcB?rE5c7z5UFEpkh;Sof2kAW2m!dgD~G_@ zW=n)w_vy8yX<&RU{SVjK$>S8{on!AyaJ6_1rj1)09x4a^=%{Cvi{yb3tgBzZN950i z%^+a33=mwepTXLM@h28>A!&nY9f)!0mIss!;cC`{#G>xYr!_#>WLx{mQCAm85ox*+ z?y2>UNhz&ukakHjnvbgyArE(A*8)~}`0cdGXss%SccE@XV+_7u7d9B%;o!|#YA&hE zh3eupL3#9sHVB5#BT9S=0y?Mqdg-G~y)<D$#O7O`8~dEU=_p4>a0qlubODIkgHBcD zPs6_;KAsuBr^%x&*q4EJTWlA{y<LZ<m<n3(A4NhOWWjs;boPVe%4hyIv{#81oG{rD z-2b=^iY&m<74!$m;ca@eIx3KDO&Oa%oWh4}qaTMbw+zh%7X;9jarm(b!9DY$B}B2> zyk@lU@c4-9sQY=vNlRz^fL0|7Gwc5m1JpEI#B6fRArf!)^de^ifRWw0fg*vDVRNS( zh;c89Ps+J`hpvWC76uqOMPqv)xm0SV2F5)IAqJbH$q5R5yx&I!Ab}vSW7{hRbI~h8 zX4B*KD=o$R;!>vdZWO=q!<ZHkpl=pG5shw+>^Ji6y!O$8yPQk@f}xK?l52cX&{f1V z<9s63dVD0<Ei_@`HN?}Shf5_A$%7l3!2-jQVr-F|UK({LU!06m%AP>z%~YbR=$uT# zu_QxlEn*qoHT_|k6tix0Ni8IliA-RYWMN1gVlQjt&*&H>o#w+9UA`{lT;J3wzFD*% zE8deD4J8dfvoG;CMk2QgSrt@f(!|;b>ems2lB>Augrl`DLjKE>U`v{e6V~(Rn5$n* ziCHCSWPIfL(SYhxWRt3&b8Gp=uTNDuw#06wQt{Qj{ywb(`AS9b<Ky--J|hqu(W#UF zJ{=RV(M)q(!CwXZWOJ?Xz9y>4a_MSd(QtV<A+GK_fX>L>7Q3f+Cga65I+p;(ly{EL z{2hkP8Zuz8C*C|pP3`KekgDXHQ)Iww+CHj7Nf;IYGxFOk*zqYm2czG}o}#l5#GH=! z4WcV{&sCXX++I@S)Y%TXD}4dw)Lmg{L9DiWaxGO3O*P-l{&`ajReH(-UJaI4@**?! zT_BlFaY$qf5l^pEI0~G1nipaEShI(qCj49A?-mYAfiDo4#KU=P4f6<{`e3-2lo4%8 z6$497j78Cc?#(MFvYi*ny3fv`&D8=oQU81woNMP!gwX<Q5?{5UhqgA%0>|lkd?=UJ zB=KO5R3IFaHG5KtTySM!1Gsy(GH;4>8K;d?8vZw`A?py)5qZ48T$&~bRuM$2M9EN$ z=xBJd^~rXm-jzVBIUE?yeikJaoI%yC5VCS<+p?x}_;P8vir+8c8g@Txvxw_r-wN6H zIR}3@!t*dN$F>S^meq<`g%c$Y{>F$rBvlDkVda!rMD|J}n#}%D)9S;PzUBGvIrJ{^ zUM=F#{l+$t_S#arYGgGZnj2?XZ>LRTR!<bsK*6D_>Xqd;qli#KRCV++X48jX{368% zI2gjI5=Yc+4xJ6#3zN%n&eOmOvNteOE@-72VQC(?eUqZJS}PP~OtI~cQaAW!iIAn0 z!DM1tLXOAgHCb_!M7uvhgbM`e<Xd~`^`B_5<nuI!@OD4EDz!j_4mu>ABUS528IBp9 z7{f%m5+YUI)hO&5v-C$jox_w@Nc&AsYa%XIq4V|OAKVFuT=QmYOvucL4@&(}D|v>q zt_B4!`1{J$x1)X%%016)@uU|hzzgl7)`D)4&-168SWs${?+R9u=WgnSz#aM#BsHjm zck*sbTaAz3P#4x+eegtcO2{F<XQt368pI#s%-o+$NYSyVDY9wBp8l4{Zht<}i^H)W zl6U|~1A{wQLByPqsaZlcbkAH%5x^o_TQeHcMeKlL&nWnl=@TGt_#H$cJOqJ{{MKd$ zH}!~{kxaoOgJ>fbOB8CqRL-KN@yB!I01FdZCL3|gw28H_43;k!Rd0!WU_EVhrSLj^ z=1qewNknz?;`OQvAX<;K+9kaNZYPT*#}Nfd8xdzxh*}>2-%8!Za(sIE5+W@-j8WXh zh-<>q#%D79kku<4sPiS9h2J(vrFqxB(d=WuUB@P4)N(SyziD`u>QAuCm`C&vAMae| zHK{epG^l;@3gAZ6LRn*S+cucaXI{!PHnwlzA*Oijeh&*eco07laErDp|K&6#3Dx~g z@vZD#!~5vmw$DSwg-Q@N>0?HbLgx1$ZWPUbSTHIB)&I%0EfsZOq9!K{iA>NXq<lcs z6Y%W#0(JJll^YWJ#ngU}F?w8yv$0fz@Z{UNSzW4fbpgrLh?b_6f<quQGmt+}xb_E` z`tTg?Po~9BWA;z+ncV~_4C60!YieEqab%#F{4M8yzxvtihtJOfxN6Um&wzSB;R5A2 zD}--WNDkAyw@iE)PtfnbS<4n)gjD7RE<MowEYudt#nl6OwaI#|Z4Vq_Gc=oVDY%Ys z+Yzxf2>uEHA?66F`a#j3mDQ1|JCY&0)|#D12lj82r06I9TPc>So`cYsTuy1+-|NGv zQjcxt)s_BHWo^)?>N(b}h;&C(q(oD~)Bc)I-`46mcFofsDB|0zXHuPhdMXjjsyYfE zFh19jH7U)oIf`i6Qpu7RYuxg+>fvZ#Hn@Wq*zDYG=8tnM_n|!i4Y4q3kxpYqgN5V^ z<P)x+l5PCf3O&H*-3J)Ag)#qUM&6x2%*TJp3I6Xi+fiZXN%wCBLFLUG>7fco@=S7^ z+*ECh33*G=nh|VuPx@asG<;i$`mOHlx~yE$FR+Nk$gfNw+)7=Epxk|B^LgKR4Lxoh zN-C`w+SZw#Kx<@*J;xFCj~Ys5iAFyK@w~N^uToWpA)k+;7ZaLtnj&HZKMyypRB%lF z?zAT&IqW-Oe(W)5X^oemCa(6nNV)q~;i3+TUnS13dg0N@EBIRuf2EJj`gBdpZUSb~ z(s(5-nm|(rCdgmhw0lJlU8bXRR4|4LW9C^&?oG$g5gsX9KRYKK`BqLR2ky^ktroIr ztb)jC2r$CNi&X`PSEMV?J?sz=z)Q%svhZ|Dv15j^A$j^J+046ZHv3#tg6%OS*jJ(B zNdV?lA;upQbbdJ|LMNe6ZA~EIC9>HS6$<S68%~4HXZ>u(TpMNNLG!GvgyxwWi;%;F zeB|*vZ<RMEXGi|A%sruXBwo8B_u(mNQkG`qFS+tH;=G*5I+y2%By=e>OQxlqcO~mH zh|fd_paVKf^a=C76pFuvu7{o*M(YvNAE^?F>2Q<FUePM-UTbzo?lo=C*gZ@KIq7#c zslDA$ABi$KTNI4U`h#4E#n_ZEeOalsG7lVWE(3Fm_R^WM_58OoKmdgThW@bF|7miM z|G&A2Yzo^Ql1}qLKLDaQ7x`>(4F+irp43RDDYiep;Zy0QJv9OxWYrj@9^z6YYGk(p zpO|QNPNehz4^&v`zbwPTw|i^~Jwl>-;E?!1o0``lmuMH{oBUbYl-R=uCI%IEXV*7z zc3j6#kHQwS#+#?nAg`&pG)Bvu255g@PYklzJRYuOv1j>BOU1K?$YTw5m{6K5E5~p; zaB~_lOs(Q1Amb<It!sF_Et83&_gy<;ClW~)L^fu&mcZq*(SHw|Rr!lnve~coP6AuC zqA3tnpeZ(lSl&6ro6HTP40huXQZ!ZTuLBkn&djYmJt2onQzNOp=yN1O{w#i&dT&6a zH`p@JgDm*}o*B1?jVMpbLw?ZeSQDPv<u;xllos1wZuZ&F>BQR&B~RSU4n-Gpe%c6m zL(?NUNOmf*AUEqk__%VbE+FeJEIQiZ!~b_V1eWJNO8)<iG?Y@<mU$iXIdv|km#Avz zi<#(5N0yn?PxlSgqcn+eFpHqRjOiiR&%z`SYV?xBgy#ze%?X4tT9g~!b*y6ZI8AYF zv)p~~yJ8^D065*hWDket{gez+k8qk)lQ?eC)fYs~_KbalGbiglmC1nqEDn8mEEw12 zxtx`eI$>-yU_M-ueF3cCG9OAJZqO@lw;n->k-0<Ci~Nolhhnzu94=)o%H4z5NbA1! z5|FG>q+ccpTX;?@VOjFqxR>BUl=bg7o`lVX&@&tJMxOdo<Pl`K5Qsh=LZ+%{#J~FG z@Z*2eoxo593KjK@@o!y0MIUU)slagFpm>k$?CkTLtN+OD8H1*#>-$id$Af&tzcXN3 zcV!=`j}$<LF1>w64Iu{C2EDRkw_og2I_({)(0EacP72Y5JIO9um5=>ae8_B|;x@uL z-tb7^u5qXwLPiDk0xE_Q&NsMV<9IfOWQ&g>?%h}FOb&k$r1~kJRHke0(-;$P+uTNj zOeDxb|5yG+7N0dcVr9;a$TJ<}S16$553Be8n3w(+3WAF2HUw+1fg#S9&xHeK%6TrD z!13=00+(3&{8Q3~aVB4Jbc6KKrXmzUI3rmRG5u{AKBm?82Ixbu*bMhnnWAj~_nD!T z_Soh6cdVbyI6I=?qa)NxaP#o)vu~=^Wx(M>Wz|cN>^>qc+|Kg+=#FkX3*-mnq7HwT z_02UbeVylWe;d0(C2mM<?_dHo?LNTSvv5jRnCGQLp>HmaC@VFDIemm)Jb1751tJ!M zCaW=M&XXd7Sji?4{7;|Kd+<4R$cxI+?<=5OGI99nLB??;+7<19whW~$hD&y#A$*$0 z{Bs`MqrLCszF@2WkF9SEjPqUI-l(x{+qTu%wr$%^8mmd0q#Ij}ZQHhO=RN)5od1XS z`!(9<*`3*$xv$%)PB)sL!5&?GfHESnOEd>7^Tzc_tRlrq;F4(Z*+B)Lcm-!EXiBZG zn0Nhq^Lya5+183e!Qr=Mp&PiF02Nj>QyBPf^)xfc)ucXyU|{zDdG{HD-~#`-2T$d{ z?>?P!LgH*s^9Mq|Q(-%k>W&24OwlnlLUEPn8oE-AxjIvvb07pVaf<&@Y%0K2XP#B4 z6pH~YhT;xh@th59EaH5n$SUqQU*<95=ZD94oH1{FUVwf^rtPYip7iuYT$*v>YZ?^^ z3aNAB`|_3wy3$<mjlow><C2zFmd;iYg!mNK*4n8o{JlY~N~lvOb|28OZ<W@R!%v0T zEF{rFy4whD9eaNJY@|l6lrb87^Nq7>t@Y@*VLM>r^YHa94k>#LAIteq&a&6))!*db zBdf|d)NelCZXuvfYx7iSA2`gcNI{J?Vh(?KY|F>RStj7HIux_%;^6D*K(I7(rAP80 zkg-Axj36e`od&WImIOhxWQ8RF^rKJ!!2KY&ynhZ}{vl)}#rjkC;HrI1;N(|CW;LGB z#CJh`H~~T~(Piu%KfNppSyl%c0Ab_cQg4~`fJx|PdYzcj@C#hM3G`;kH7x}Drt^;X zkg_OP5E~-))a`__IDXoivA~8PxZb~yZ_ED0mH0R1AhdD?2-03iqN|Wib`@zx*zrul zLgV$}5dEzK*?15aJOEf21h@B(++Vzh6vclN5NZx=Qy^J!YjJg@-wt%;0&{}kA^tvW zBc@~YAN@rCYpL4qv+@Ce67NCqlz*SJ;Yt$$kb5|HrtkVzNgY=fXSF2y9-%E_gQ%1Y z-(!{EY4et}_uVab{?PzhrD#hs5O%0Vv3RH$Yni>zNq{?=rQDs+%yqZy<Or1hMpyd0 zz04aqs%?|IK*5lZ)HYI*5S8Pim6>^KP92=4QK<{Iy<$YyqzS79kF}JXjxm*Fc=%>2 zGY-#r@h$OzRx<)Kp9znBI>Gpu2)rdEK6|#V{6W4&o-^#{M-NUi0dI2GTw2@YP~7S0 ztS6K~3}Qg|hlPXR)?LJ@vQ12hmg-5yY*tF#DyQ4+m!%?URJl?RE$VOr5OJz=7>AtT zaGIw>ryoJG;0-q7(~O1cc!UOnJol;!{CwU70?XMq3biC8gEByGJ2jOYh8m7xX5Z_O zuuP}0i&MgdO|0Q=%%F>Ps)n^x)00!I-Ck5IgWRPFcWn{f3`Gjn4hk<6;<zt@3*CnU zUm5}+8@&|BYTu@s)O>BwiaA>J<Yw)pR;`8<t%ZpzC@+?X{2`~QGttB9CPSL*GC{9C zEgV8r^2o%)<6bxJjz`Zw>(if8pt-djtD2Z_X^9T%&6QIGa-u}j5YBvay=UK*wOW*Z zOW}iE^$#Kv{6_qtyu9;bN*C6rm?T)LCDR<vAC``C$(mt&8t<UtW~ZZtQZ<AFRuWUP z@L7PbzrYED5u83CrqPjYOredO$AjohDP@;mt+G7`XgtRJnZu<gE%`%X(AF#dQCRIM zErH9;Vd~Hjd?RI5-0qY>rxr!uVd63O!}k3^&BVlHd`;|dHM21CHZl{Xj-dsuRVC(v zt3TG@N>=&XBYv`1U}Z#r7SHS!mNF9(-(v)GUF<BsS-mp`k<PLR&SIkw9WZpSno}p2 zbXQoA(Sf(A(2~~`39dsWJCC^=Bu0B79JGuh05h4Lm`IETx#!(96mFf+9&>x3dka-T zK7N$c*nW;I(K}iPssY1n+^6s9_pV@o6^~R^q<^pGAg#nT=<zLtahtX?0o>(nhCUhU zaVxhIh%DGXR>;h1N|rboMBWS`N#J<F1W`v%tY;-1T#!d<>xPBa@mIit_jfOs&6)9^ z*jD!`?=p-CnfgbXKZug5AV$0;2>a5&du+XtiL8+)71zo_1_B;N4wn+hU>s}E)Y9EP zN{QaZvaxy<9wAbz0%aFREL5s=ef9xaB0bYc1rBd~ZN(2fwujL#N_Sb@gs9x8Uw(_1 z0)gE?`iP3&q%_$jhLyq~C{Uu-q1{}Fb>zGsEzC%txiATbl(fE~CH)BEQs#@5Kj810 z-6wFfRKG#2$f<=OMa!Jh10IwzFZVT)911LI0ebmpPnQ=bsprfa*o@53=xaBGnP!#> zJ};&D!8U`r*wma$Sa!9NmCY&{>|Mn=c|(>|vlw*co^7yqKJCeM(ZZ$BzVYV-5=k&5 zqHtvmNZB7KP9sjPrZ3Kkw<H}Yc&$iAUR7arWj&f<+2j_lWP{>PezpM%bw~C~_HMV` zkG5_gwDRSSM6FEIHIrJ<=<d>U$$IXBkAlIrbmE!8tCNKx;K~GAmpQ&yJbF0cLuJ+l zzaUs4l!Yg<uX<+~vv?@txq*I7oK1zH%}%Vp`cYrQ?wltUjfnWKE2Y}hx7y;2VQS(n z^LgW?I26(J<?7p}YZ!eG1cGJzeDat$76hBh5ec$dzNrMU3dwjWHCC%NeG)jOhz-HG z`3x~XVZq?Q5P{~>8nX3orD=tVt7T!S#DMV+R2ju9G@K{}UqETi<>?OU9ZLvVgRi=U zCms$-yATU_mRS7QWk?AVJ0<n2IA6$W7@*!#Z?6e1_iNcq6mXYB{q<r6$y><j#*2Mi zgqVb81ja&=D*2@q6JA<M82gnRfAWC{S;K|INipYp8R(Qkz|i}sQsC9zFWpX09;1^L z@u>>YcBt93AywIi{bE>*+%^vnF1eFOG*{0@QZ9Y(koD?Z(^61=s4V&%%5GEh#TCTT zN7$tA1SKG**zQU%MBV954}7K2rt*?AC{V#cvH0vX&z8<_AYXNd2k$MJVz12{K+`WF z)C@p3lkxqT7U5Lq>ROzi$i9uRQeS{!X6(d`lf<@+$UH!N<O^t4{bUfL3enGUM(u~w znnfReXQ%W3<(E+J<XQ5)7eVRN;7hozp!~-gGh@xZm&Uo*kze?(#LIPTUL5FYtgFo( z*L_2mX&Mz=OVujPEQ0WHS0?8tiYLv4DHTFOyD*pWIN}m1iYt}?x=TEE62Z-hk#Wp` zc(-|7J3UQfsa4zymW`#J)>ZmL-}{CE%RVK>*JJ(6@6AhWLmDE1e{uKz;r019k;1Bj zuGhQ=?3RXg0jx1?!%7By+>s*Dt7aJkhX=pV0fvD^LGWMy;r#uJvgdC(2-S*uKY$vq zP|Pcfk+g4K9u*K61aI{(Q22kDRQ(uJR{c{WMHq{vF7OX1=3fTk?f-(l=+(uH2?wfw z^50xPME)mt!<YXH`oAV?*Rd?s61qHvzQ{yV0WAOE#{b3rFLy&~nq<krG9lS@Gdq)j zH9HXf3E}cz-2Z9_aMg-pM>SRJZ%Pmt+^Av9dPKndAOxg;fXdtdCxoL%fX)ZSf~#|H z!II&B)FCkci~7IrRqApEswHIjQ9mSHYV2SJ{-?G;Q2A?Kn+;GC{{Ph$YSBRmu76K! zxe|H+Tpn&NJH7$^SDOkX(HWP1>+@`#$+3gOKYyHNb{0<$MNB$GysCXOf)%BA7d%~h z^)hMm#G&*1qZV=v_p~U7$@bd%LpQdh8i3VweX#)&kdNcLln&1s2t+9PRjaTX5B(z6 z-g4Ht&+++Igs)Fya<x$=V`~#2DfI->Zj@j-2C~^AILS;jhkaUg<`>4U&CbnFXE1U= z4FICfM_x_|(h|a%xWZM8lh#rbmmMGfFrFaVYa>@#H~VcW-xg>O?(eOHR%@i*=8ta? z^|{T$77K>|bQy%6Ig5A&`$%PUC1y%N_n>7VB-9_{MZ!)KBi|q)gwGz^Qi6}vIM1Se zifIYsh;<5FWYF)czpoaXHhslFvMOv2RG-DAN?ckPw96EzIWI~IqHJco<b~qvNFHAL zaN!$dz-bd(r{vX;NEl<3jISeOZE#j+sY#?qjGkIGKx*EY2@bEif5accEs!L+qF4~X zT#zF<SqX=cE5?iCTh=~TDO}-d%af~hIUF8scf_IWth}Zx^uT4KG*f_^hf(S<5iPHV z{ylD>nt?rfNvipb*<Zk%Y!L0xj=n+W<A)s)*&+=#4lT%S8O(2Q-u_jXIN&02SX4%= z%7*K0f$1sAv|C1E1Qb85ci3A(A{}ZYdF5bpkd09J48h<_C`1~SyMMJPRW}FDyVGJ; z@Y+eO=v4-C0Vh5+lN<DmB}zn5kMAx8d~z$OJCC~64Sc{;9tN3>%^E3x_k|xlZKpG8 zqYI^mNFfm&)oy`=)fZ59_t4F2YFG3FsCngay_x;eV$12JKKSCvWDfrNd+I|#Zr5x$ z4Ra4FRO7z+2hC=Tvqu}T+EsYPxNf}#fiDIr5%~hjcyN`!I%&g2W>j9817z%#oKZ2% znvuuak#BJ;zC$cz){=r)JvPL2c<}k;VjxF>`((~t`^_FLwOaoImpZB-3DoLM-9gVR zZL9a8vie2xPj4%MSLgI?$;9d`qwGv~jP)m8XuTYTx?OT)o8;~@Q;&J{fwzY%2XER$ z6ew^%OWBF%ky2aeY%cFeLLn9}72Z*d`^M#*{OpGO1*Rqt9aEgO^qkU<sX-%i=m1*! zV^gEvlxjTVT%nVQOo9*Cp*p790i6z|(*+O?8Yf&4k$E9NfMUHMjTBig&W4IHLGfne zr^<&3h)#ch^v^VgN7i%c<2!`N2L5$#Fb99EibUh^D08TMR1K`lKucL5PL^A&X6>na zt8>RjAlslW@jypdwO%iskRrglyL%-*CP)D366Jb;U)0?b#5^2#Kg{|!L9s6h!n7WY z$y!fLB`YPeXnHfg<_=AxL3rCh^xi`4e-dCZC54!bzb_u6k$S?ypnOZA4x<DUVt=&C z%ZICmfL<6ktLaAl>9rW)gmype6g|}XZ~LFuAD~|IL}U+yuo0{j+6wmmDuAla-_%5( z*pFH*m%nX{<*|D*F>#~V`qYz}L8JR*7K3Kx;_%eZRQ<=!;}0V$IEAWa_X7r&>ZlTM z={(gkexu&b$eUM+3xz<aB=F&fq@z!*Z&9#iX;Uub9(^X4DE1ctv1Yg7J;KQWStC3t z@WMg)kXiOjiVLbBdzg>kzeX~dS+(xl$Noqp=2&{CD7yw>h*p^o#~|`U?plhD`9@g0 zy2q*yJj3<62XXZ_MdqvH@bo6le$-FA7UY$d`p9A@*Vzz08ASZ`0U4Vv6pe=oFG@qC zOw=>@ZuC{ZoUu9$0S5Z}^04+7;AQFv^)~m;q0|gceny%*X>QXuMR3t=W?AEQuzN}K zAwMi%3bijBom;$g4Yy2<zA>5Nj{B1I?`&CRB@L*E;0FeD9W)^+<JG~t$h`y1?4T?m z$uNzUe7H^h3f2Qua7S)xrc>X&>*b8G&UESMly^vfPf{+9bgJM1P1VwJ99HpH%fA8U zEi}b{1%3q>JrQAFEUHjAjeGJCP*r=NfxHgT1V-Yn1UDS{km)wzwjBV!w~c%wLCGpT z@M!?eENXxO!6HwTYda7(=fA$^)=fz8hXUcy-F)nW_|Q|*u%$CDQG%<~+kP~0XKq3c z9Sx(4z84+(3Zt(!0@aUTgVhRtU;U%SPT*@EUeNT-Q+1CX!z=y}i!$2o!Hy~I{C-sR zcN4PJ2gA>ih)(|u_wTS;*`TDx>n?M^d_G<F=vOZLAn}{;<q}U-H_;VfR=kgobRwjI z=5rFuSa18skV}{c5uZHevLw5xs|~gpt(#uW*L_J-p%DG{&-6S+jGdM)>}9?}YLA}Q zpcEn7fxIuLn0$+Jo&k_9Bh@rP7_@+KFElbgn|)uwWF-Wh+?hR}G5j&5fk~k!OL!rT z(rq-MDSGM5mOL<->S1fs<*E?ZewZVTMooK+PTCZ(?W3P0*hpPGF>z#9GEmf0H1<E~ zG>Ip8xREA`(fZekpQn3#-sr3~OcT#D&d_%wyyRx(Gede7`qUNXkVqgbXYY}na!&1Z z!RHHty(9s*Lnnb9#kohcLt;3=%juoDIzaK+n&OBj<u06kjH@2vwm8gtLGwtTxTE?4 z$+)9I&d84r!_|!VnOh&nX&j9_b<LV!%Si8tYL0=v{S3G}u>gt{K~vB-xB<VuHaqHC zCEFZt*4PTz(Q=8`rU<qdY7+rH=_DeMBH^f(1>j(BZ_HbZ(CiLbVgfUUQL=6XXC7N9 zn&%lJ3<=m^&}vyGGilEIu?Og*AGq~0BI6e!xa_2>ra2yN@7i8`K_k^iEd@FvLqGr~ zmtMej7%2`68gtm0kB)5vU;Cuq=8YECvbc~hFy_~QZqCw}FBCou0E11MHSjgTRokhJ z;CWAkXuQx)m-cG_<y?>0I&lywq>+kJV)CH~45Z8lZoV;{bPRMv9aR-1j#sgV_c3Vl z#^J)s?@0+=tTq-hlkqq6`VX;qULGP-R|#MH+Q#Z{Z;aa|c~%fXef1^*!AwLK8WN!r zPKQ53LI<+iU|@M~3~N21AT-sc?C2&zbU7a}+DwpzM-$=Gm^x%MDD@>KT{fVJeitJc zO)wwfnQ~iSzo%;0{!&Qqk3rErjTm6cajqcFcG6{ZF@^1U;}ot9DRb~3-`8HIz-NIP z2)M0^AQE3GLJ4cBgR<cMXw28Ke1cmY!{OHGC8;2WtSm{Icxg~vV7o){RGbC&kHK&Z z+y_;n$nn5_&(}<5=CddhO{FWzmis}Lw`Pb3C3^b%$)<3J=EpTDJjRV!eA1e*=n%x+ z#-U>6U~ps#?YC2#9$V1WB4VVDvCqM`cT8pRJu~X9wWpYakwNV6l(-3y9t8eWxHfgG zDk4ZPEtTMujbOAz2=NO{-I3r|L>Tu*<py_0HghF0iLGs4w!?Gj(Fx76vvtyQ$R5hc z=e5p=(i+JAQ2QjrcU`XA)Kr_HnxzYgbf!KTLfCotEB9D&$os_||7s4}m@XU@190Jv zD<d3vD+|+EWR?48@Yhc2Wd>IcwuAUDu(8GpC47)Z>uwCTFAdi|&wisAq5|XPVaD_R z3Bwr8+dnkV>y|<;y+nQyMp+ff6Aj5NGCNdcXI8{sv8c=Z@VJnw&>@n9arDDi)658( zbxWt)4%tq7Qi%h?(56Ug7bWv1p9ltxf5h0JYX!HB&<l2f5z?~A!FxlMYf>ngZ);N$ z(9z5zMJLj*@vEqUavH+=)HgdtT2!?}^NDpj*ydAgk98TA<$(m%sqU;(iTCaWZ_W*w z*s6{LV&y5}f-qtf!WYzwFLd@!<}WYVi;QYyvhwbnVdKyN(u9cE-=A$0tLHzGNeYRv z)k;<SjWnnZ{HZhC#+)k;2Wld&dYi7q1CzyLV;DcX$<7-!7U<43<t~`9&Ym^ykR(s2 zMUvjD7kj^K$Qr~(A3Q%3h4M}>yBM<S3f37sYw9@pOGMt$=*^I<d}BcQVZfB5;1_JK z{>DM8c0MA!M80u$T0~<}lHSACc?b@2FcZVo^ju}s0Yvs#qsOkESld&h7WYozyWm@1 z)>K9cZ}dWHA}w(*;AD3Cj!&%=aZ5PsSR@|<Ev<(!0Bwq2gfhQ=>5Ry+%&#>nI2MW= zzSc(rQoE|R0A1qcf>n8L-)W&8WvA5lP%o>uB!49mK|v<VYMBvZSxAo*UMeRpMByic z-R!-X=}&&e!Ml5uOIFx?a^yGYsL?7y@QX{eJy@B%>K^(tmUynI)OgC!^U}4^dlR=i zd<+LO?=p_533cV2o+@%;Y`~DRwp2JiQh66A;M=XaeZpEVM)!L9rCLsF@V$c&zs3C5 z9jhA}HxU{VQody~ikyL#4|$;x(d?${EJ}-_tIIEl{JF&Wyc%N+o|)k9@roU-3SUn= z`-0{+9SJ0`v=%8zeoLIlpqUmSk23-(yXX!OawF|WoFsS1ZHOYWbKWHG;oXwn@XgtN zS7wT_Sfbjx0S3=6u@B#d?21@LnxdI&ww8IUpnC5!0Y$?BqSiPkER=z$%W%3UD!OS} z5`k)oPMJLN_WBdo48<xwzmV*JN~CCgk@xfoJvnvNOe8lWfiaA_J5Os}=n|6-u$A^x zU%7lFrhP<_&ZfX3wcTk)w!OWUwxR^SNf+bP<v?Y{uu@)TP&DwPe&TAHeUdx9_4vC> zrOwu<HU%v6VzNNVOeKupXHW)B%N+dt2{%@GpJM7#j4nvHy;5mwz#A9velNR>bPB$0 zKKF(~5rQzQLO9uA%YcE2b%lp@0t&YD)x-#l_+#6V=fG&(-Lpqpy;thx&0oMdD?YPj zHnv?VZx_!W<y!bQkmDRG2qIHq&MydOwY8!jeB}sI4t8;M>nVnhY~}*B>?T1qU&;Q9 z=bI4J`<F9G#}V5szIO;w>{((fu9zu4iJ9|lSa&q~q0;g7v%?0W2+fk+9q<yrA)Ix? zTA(Pm21qA=eO_?ZgQMhdJ*y<+xE06wOnH104h}D@*V#i=x%$+o_;{O`K?M`JvEmG_ zZzGvnL96>KTqc4GKKPzyXt$l^8x=!TnYu$iU_Zujw>)nRkKLsBsALFQqzoZa&c*Ym z#N;3p*CX2Msf{Yy=8f~yz1r7`k+2#tj*X7SK)QB`DNLILDsz`(hUAg#gN?2F#5%t; zfo+?mW^*$yr^A)oojD~}4azq`-4Wq6@3?K)pJci)*lMe?v$>qk1<ry2SEy;}ChKtb zIQL>&OEa?kYS}B^RpC%XSeHhzgNWOdSKKLIkvxBxzK;1la#C;I2#t_Yvc5~ow=~az zPWpGv59PlC)Z>K$X}>q-y84(nt-R3i{z5>ZLTD{W(l`=D2^a}~I{582L)y&tlY#6? zBgvwp)@w&(02k83<Cu1%3dG`9%_0(OgURG@dpUjd^|z=>-4lQ`ACGm6JK<yKE4ra3 zK1Q*CRajq`ed*hwFg@1Imw-54JX`q)KXHwpPCCWK#`;Ngt`gIuB4gzIh0-;o&waU& zWmyT`P%~?+zj{>t0=o$9fj<hW#7H;&BvYH<uw5~CZX0x^g}f*_tE+tMPo{%?;@H7H zg^r1Klzc}@e_n4iX(i!+p^&3#B1-kR6bwq!nrhp%(Y0K2OyG~ZN7tR{UUk^BBB>D% zJuOZmDj;e5PYUiM;~lHF+BRP@#N`!x!}12l$zTA3>OjqEHhWJ?(<S4<`iFezIwaX= zIQh*h9NFUv)?5jIwSma{8!7OwOsFSt9tl19UTHdeEzd2o1yi<9MCeKB{s=_AH&dv% zk`Q&}jg;UnW7(}kWmzx~GT3#3LWx0v(}u6pht~i3)<zlom@-gbC{nkbO*el<y(=Pg zwW}s~CE`SxNONScFDj;&Lx4|^N0RR|CpXNwOP|{!;k~DUf~dMg%XsgEKI(a#=t(|@ zImPbdCIavfskV=8uyv>9>YgKw;sDN8>YrX>z!UMKcTeEqg}jT^EWKi_Y_EO;M7WP~ zig`J95<Ds{$fflUo($E;{MQqb!BX{^P%&Wog700wP@um1F9oo@x26oJ&uHVc23^dX zW;1=awWMvBTNznoS*(Bf)@WWH_o~|`D#21q<?@=@#l#qSb*bQ*Z`1}UFogFaLb?r^ z>|bf>;uu7F{;7$J)R9T5^!z*_B3DV*9uKRUT)NtIkb%!Vh?)bk<Zo7k;DXq!{isL? z{D|G~KW1!vHZkw*(1j&fMa{`}!)=v~tfNo%JQDV|QOs)@uggLxK0T?<p2S5d3^IKj zy;~^AmM0IM`MNY5nxJOG<|%~q4tjD6{}e5z`o%h3%)eTCa~j`(mzzap#^yULQ`ylx zvdSbsX5}j;fcPCnx&BrNgjC3bB@c<OSQ@f|qZi<)y%judgh*WAw+IFlt|O;BaTgel z?-Tb*3f2tmZzjR8BlPN6R(UtPawQrCc2yV`<gj>j90K3r%Ld@v9b{TTiQHM$Ks_w! zF4HG-Bb89rsc6s8eq8vIpgT$sqY%;%(KGljD6GskoNLDFcl3Rm<xQhk%)G+b7Q0cA zI_*dC`%0z3Fsff3t0MPCBA<IVf?--rCIKok+W8S{>M?luWYC-XPHL|{{o&QbDvOb8 z2U;h|yFcDhwsAN?z&mXT-*?)1YCwi|-f@V@VC1Qj)nL(3aRjQ9o>|Rg<4p2H1X|dW z)*!FRFr=bZ9?{WC8Xc!28!~FuzlMQLW$^|fj@)hlKnNBD&uWflYT*Hn<KsQNY9M|B zKi*U};q`U;1$b8Gj(FhzQ}^Tpv-)JTuuXzuf<h+dK-s*UC;UWtRVzr$s_-)4$zi;@ zEUEl%nb9#Wx9&T`avvm%fumOTx2|lNFF@uVm%E7O9$~Nnyt9iStgLz)6LWbdW}zR5 zIG`wLW<SBoQK-IFyU5!rY<~RIpc>qy3!_mGXVT9FBQV=S&)pN_n1;*7>8T_LCy*jp zfX=!U5(^1}4ToQZP3_Z21E+fzRkV%kX$RShD^KxjJa?mVguJbRz5KFcSwwUhl1)md z*o~1`tnw%b=I=A8LOfS9V81Xw_liMuP5Pl^Dn_|^(S$@vgf#<Nx&9IEFMx#^o^I&p z*bA}$f^SzS)7@#;yh#&dUw&z98)b*|Bl?zixDQlL;-NZS3q7k5jUDbpq{qfa9M@-p zd)$HG6i-b0O=cp}AD<9B*fn>L%vrzCb+#8dii_7HnHX9)Zar58I3DUkCy*%7PEl0X zc*izgfWyy@Emum$ZiZGOC9k>lL%+Pu{bOB2$Tl$wWIEnw(KWgS!{@6V(ccqaEah$h zXdvkvR^Xq0E1Wu*^#Sg<|CD$Bkf99(8Kg%3&@)m4{%yiEZc)_psL-%1IvZdZSQ~_p z`nNoia?pRfweT7k@?U$+)G3-IMl}tMBs}@J2G`aRdr!<(m;u0^AcV%hWx$n%|9g`k zwp!cQdgRUe2VI4dgWu6Z*`K^qPo}5?mH<8Q-!*oXEoEVETr1mo^+o_S0B|}8Vd)>j zePs{;7{G8YDYfa38XV<*%&~JEyRvEe)~9Wu_CY}%z2x$D6oU$YZd_|U+!(>raI(0H zjIw5U{eu>zlb#Ez#z9N}OCYc+2;uo}l>nvg|8}UMl>1-n{B^MdwTrFjbZQNb`S<WR zkFa9b0RM>{5%-@sl>T?IAFOhpc*21n0jIUNp$gtFQqxxPFvt8y_XeF@Pa$A+5F+2d zMvVT?WWG=H;~Df|Do{7MX_!j@df}%KAg)LC>!KrYCkRpRZwVr$|J{2?tvuK-tyHHA zom>=Hr$OUubDVL~tOv6(z@M2*VV)fi&TvP2B^l42j-;La)5oq=7;AZNc+WY?!oJR^ zEffR#M}{%0Z2{Njy|uhF0C*aN81T0ZG{ryUnTFHOD}OymD%FAgFHN#XA?T-LUK`kl z^9KPuUS$TleK=tTd<&Xsf}4^Am@+yy0NvDjHB9UACYt01W1l-k_@y=C_f6FE?Q0gC zDKF9tb+fnIFOP8;Y30?xydcEfzm^BG0h<4t7eLsoNMz>P6O6o9Dgq^{f)Km^ULW|H zAOgT~4_Ck2s)lTT2uOo}|CGFr%{hPR4P}D;BMNGPWM>94M-{f=!nB%{c2OZGMNyQ& z`xqJabrjrG+tmVJnHnrHxuX7onnjlPEuKfC&q2+?#<F1iAONw6Fu1{dCQDA4@r0J- zObO<ufDMg~SEf`6nN+B@cLyOF)Us++E}mnP1=8vi!pQ7GmJ#Ra^WZ$~re7N<Du3%S z1;Y;l(z}wwU+($Vn$VDPwe&qC4_hBbkdHH196o}$e~rx<PwI0d^q23jo#z4i=Un^O zIj*fYaj@O0t^`sp4BD@9T#Vnyx}PfV=;*WHX8E>JPRdinmyeW&1J;g6#S1P|kJu>k zI5V@N0&JzKV@K$fU6fe4X*H`nY{Y&;0}YdgcHB6h6*inDu@^$&AjlBGCshua*IctV zW~1tJmJfr6U9^Tcymo<vvxe%~+9mUx^znC-B&&GjJ!d93Wt;&wZc`~UC?gvL3C_J` z=I{$z^Z2yf5#PC1J9?PfY*;a9moFRKVq)+qlyI%uN~OF>hQWmY^A}z0BQAY1O_<dn z`Ewm;--CK}Y6HGX?{8p(g)Yqo7My`fo273{wflN+&=ybR{9JBWsNxQ#*W0vY%x{nm z*9SMQzfJ6iY+@_%ApOgRZUybW;^PPDHMG_%Jw<}eZ|KlR7t+Q7%I1V2;ppc}<)&ho zDHdKPy8Ct;RLM1U_Hyg>>*dg`<Lbms-E>*c9h5?7*@M#6I+HTcQ^-gDwe0SEpYPn( z=&#J>1ZKnPQWPO8w!s_*D3;gHI~=ns+M{-T#Hyu6^P$`{qzanq{g;7&s1Ul*=M>Xu zxbLT;_Kl~A@Ie?FYckcTOzza?^gfsX|4m+|^Uev4k)*as5-P0`$9@AUVRi1(LOT)E zJXzMAyyQ^TxWN4cknCU0`+nzWmc!Q(m`@WcS{F5uUwpay1Kcizr3Y{<y70EYX)lKa zX{~6DgTZ!+TGR0eHxgUF(Y1e1=x^)%^sec_c|{*Lc3Ig2QYKi>F~~PpL$8p*%|bG| zDkSY~Be1i4oL=Y1HlL1$33QDdr8>+~^u{qUzolV}9z`O1U=nP)?z^FcV8Uf#id!Qd zhhlb6cgV}j6EQO-J-ec0aN9m-c?GfKGI3d4GpdKtntVOM_NEvVSWHm@++s<rDSk}z z%wHn!&_?qf5lmKo!FouR#z!i(V8u7BuqKL#JazUg)Uxh$(M1YrEtc1y@0C*|b`nRQ z_!=}bE|EcFIY^P%VQ<W~)DNb{Tb;J{vHcuuf`sdGkQaye8H1CCrTM)d-?ct@EhzOo zkhwmvac}HAmC$lQb^w1S`=W&e6Dzl8H9I$6Dn@1I@%wo@yYL4a=Q7c4`M^f23%5Zx z7`0Fjr+wk9TV9A{*c25TwbZb$q%Nvh)w&2j!VmHs0eEd{wHVBvmuyXz94iSu39uB} z`p~q}&qp`m6#Tk9-!W)#4OeoZLL(20o#SLlEXRvF$<8#!hb}ZWPvapa)1+b(zft4^ z6s}^CWprw@B;B#yy>SV1hbrNl7%}2HnD$+Tg<*SLKs?LF26%k6+cej6Hj-gALQz@E z$6n0SS?jxAdX_C{%;m2a5PLES_pFe>Ea$Ii5D5~)8_XL$01{BTJ*?mLNt$nyYUs$2 z1~V<h%P}A)l66g%fjbNJ@kJ8u3G%ATI9^C*u`JS4zv5GvIE-5SoEEpEQoKNFsiP0K zo3A3+SKwN*H2JYF$f<mLDR2?9nifM~l)rjP7T9M@5{TH<91(Xr{J=|5UQX=ID07Ay zI90p)LATRIKv}@NlDz>@t<2{FkQML*CyjCkPpMDeQB_4UYg{yN!1Tr@@h1{WE_A{L zzmQ)!ulc?gTX56?9<{<I1T)ueqZ@fw7$9+i0G<o$hgsTgdW`R`?v6r}nS^miU7uRI z%e#zu#@M!h1F92-vD<+IEf@eA5S<ft@|_%)t4bPA+RI2w0E5GU88NNIz_V;1+DtPQ z=*?azxIcp*+9A*VO`@B%n)KE{_Y%!Y#rSu99arh_WDB+XwTkcVodbWN<tAz%y11s- zFtAAwTJ2Ew%6~bPJ*%(b5UdbJ6`WR(gcjxPJk-j9dx&$(y(Qv#7k^nI@suic=`h3} zuW$ERDngw8>1Q}(A=9r1LTqboh+Ok@<|X2xh1Z19_dMed&qOSQsyUKDy}yUmaDP=O z|7P~t%3aI6m0v4e06We4wKy3N50T-3FBE^(L5RD5OMokb{5Pq=sY+hm3Kii?a!q3h zsdgJV9l_CbP~@eC&5=(5fJH$_;Qx%omHyOThVy?30ig8S6pll9?!Rihn&ll8ZUGB| zkjVc9{;$Y_(%8)D^~h<i)_6q^oazt){t7~p{1^6rw(_*@7_v1l)9yz}x&Xl9ASBDb zF;IV16aT2vyvBWOUs5vEGLI8}xL#;e3<S0ZAw~U-{8JNv0x0tSf+DGpyKmi7L(6|u z{BYt99Rk>1m(3Rw{w6HHsj3{(yT*8Xzrw9i1kMH_mHqR9DCYeM&hN`#g(aG~eI#h5 z=unlle$b<uKnC!umM}m~ADk#st0!Si*kgkLM6NnHm%|fLTOTq0jtN`zVXUSm;0>F9 zQwZ1^gf#X~go;N0t%aafBbThAG!Ki9)YLpp9o<Tz*0Q&N#*78KsoKr{Fav(gRb^}d zU``Oy`9F&V>i>7KV2FsycBDSZ5vVE>gpBz2Vu4{?4}ieK%Imm+POt>l*4mU7E$F;z zH!zm4J@m&hjkfDwI}?oo)GHN>5hy?G?(W%sbe<cG>(viz_9*J<KInsnK55EmJ=T6) zhhnRFEOBkJq%QY8IZDJJERTqEKR5(sBl6Q8Cis0>vF`EecrtE=&tr_3ogeWS45VRY z?=NjDq2z37bgQ!EG5;+yh_8ms;p~h@Dws%_YmTNkyd+!plW%JqiR;7}{|*cO5!2$$ zOqXaGUQ6X@ydq;x*@|lrx=yx`sAw#!k;J|*D?=gdovKht1q|wId{MwCpD6}zq~E+X z{V!qKqfU$!xzCSCer~L}YsE2P+K7QQ2MbXh993b|D{n3IqhP=0SI1SLnvANQ-XaB4 z_IvUqYEOFa%?xqu3!Yi@QllASlxicb-*}m`G_u9K++MeFJPGjVlX(CsH`sm|%}V*c z)*lUtX2|keWYfG4?#5M?t{RX*UK`<7I7hk~9-!vRXHtTu)#DwT2lu5g_vzam(G+Y? zD)P2xjop`!lNkQJI}5m!uKjiY1^#G6F&38U?I4NGxjtYH!>F^g*E&BE$<97HTT10K zo&p!e^jbmQFVoMM{+uAT#IySR9>@pN5`%Nf8#i>#HB<?kaqrMQJ7ESKzJ0!TI+X~g z;`ZTd&Zo})5>06V+<Q8s7^pXt4Y(PsMkR?05k5aeljt~EF4P2L6Qch4vg>sZFola@ zMYbdv&UVs3i{{ijc=kLTOu3`!(R`5Gt=JT9Mie);Bl2r9K@x~psNqwEMQSias5C8U zWxk~k*ZTK#4~GgZZl>QkP)N)B)>o*q7fVy^xsC*+R0?~>EMk@>3L>I1dMI}bCa?g| z1nq|)BRARY3DH@}g-HPvymaNd1G7s#Q$q2|S}1%Sq!9MZz!iF9&b*ma@7e*~OL{V7 z{BMbCobPNU^YKrV;SEf;xyHtlFkgZ&r9F83eFcl5I73b;dIShL8rwddGC3^ruP%CW z$WtL<_YYs_?TM}I%04z^D~*a?#S03Twbk{7$W0`f)I1?Qv9mS0ZGst42nQJ)ZRZ<$ zu|$ZWq&~QI?zxYHBSKy-FQD}FoY)x+7=|d@?8$cz+UjIWOtcgb=Nq9=@4kVIj6peu zsOy3V?}0#}o^|hV7qHLs)$`N{-al7ySqeby18-5H?0jC1F)uJ&x`>|)m2eOZQ@j$| z6na{;+mQ+4b-xr+=3g?>rFSm8AzCP}bsP$fBS)Xr^4~v%NzU(-*wkn|Dk{*jxkX6j zUNbPKJ<bhjoSeJ)^v3iyD{ihS@ayibYpM}9ri^IUo*egWz!56<l#3f7p=@1UVgy4` zalL#R1us{|Vf-8*ral03<+vaXr&!diIB$61N#VYk`AK}DYp;Q`@lG8)uAHI6VEaq? zn+~em*%@4F^5djPbKfOUBI`jsd<0LI)~wOoV4?%&UQ%)(m}aL}k|e9n9=nVGUGNHy z%WRSK6s=Wuh1OSFH+3w8v9LU!jv<Mf8Z}j+@G4gl7-kqEEq6eI?q#E20=7e8abvL} zlY?h~Vm;t7y6qxR#=rye@*?uBA^c+peY<7k!e*hwVVcb|)prc_<EQgOQXt4q9Sy2K z))4eMROcMxr{F?*(27^bFtI`!qpw3ihSmDwY+0n2W0(Ioum-e6$Y1V>iqylNB@JU| zgqD`c8(R<kJrt-3-CU`nzxm=X%Fi>#V)T3s=Z%0Md^B%Lk-e>;$$e;j>F$vYKWH>% z!+E>d$t1|Qq99BKLgB~I4Cq5X?G_}<O7gM+L#HAC`B^<V`<m68|DcqwLa9Q_*5B!s zf!9YE5>JBqHls#IO+YrKOF^QVY;_bFya#d?mw6_kjnuwM#nuM-Z4V}M^1a@w=eRG9 zfY8K)B_qcqYh93nmm9Z0Mge^xWj|jymOnnVt*^JDCu}6srb+ad`tT~Y^65&vQHPrL zEX6K~4pC5r=!!n5P!*cZD9ziY;&MBBpCp#23hov%Ze_Aq{SEC9diea>NEqu!7bWMl z6aqRG&J>s|OkEV{$T(HLWY3N9r5c7(N$)W=mj%go-v*cuzPqC3FIqMk2oixT%Zpe8 z!+z=>##5*|K2N>g*0>1wy15W=tBU#V*++>9NP1jj%Tv~Enk1>zlezPIG{W!1t-pJ_ zockC2TN2p!u<wsNxUumBl}lpu%D#I+<lzxMOiJWKBkjt^#^kDC%@=;C+M{BOSD{o# z=b^4iu%?v*6*vUo8WVn=nx-6p+Iv0t)-VeHsI7)*j#-nuTb;Nw^Ldc(mB<&E68Xt( znIJU59{$XOixs$|D`pBOv;G8h@NMBj)YGh~<U;+$?&?AK4XZ&eNrp`l``b~qw4PhQ z&2_&FXs{wcEP3#9OY3vOH1F`XPq*vy1!S?WR%m3p8u8k*Au}R}2A}2#!TP32q9jSO z9C~5i8q6|lP(PsnecY;Kb#zN<w_3sahctJ0ioP&q49pzYj;Ii49<zo$*W}^U?>JaZ z2?@SDw8wJEhuMqzp-_?|u6hY}@}l2n(AWsGFeAUdEHq>h(4nwuc@>uoB25xa5mL=E zy^OHI@^MC6?cmaJ$!8K+Y{dR{PK@z|3W*AkFquy_VAZY7FFjwr-3VPPJmeWv$}#A> z9D?*+X1j*|g$m9~zD>o0+Q1b+t%uj52|pkzmvkisBCC`@BNzIG$Te+gqE4*p&NjoF z=r_;BSUvYq@}5V1R}sA1QiN)X5H0REd`<U3Y;@Me>M94$C~!$>%M{Qhti63I&%2}Z zY-fE1!0wp6=(M+$i%73T{X|a2WE2g)+a&x%FRsW#i@w-pXB;*ow<zx~m`HoCLN~Qp zf*6wbXKa6sI&8yNTaEkn@nY5GrDb8s`Ae}F{(Ow4H#j9QZ`WS&BV?24i7n<SsTm`e zBK0#iTZ1lAQd4M5*F-ENik}z^vrT$Ma8aJ7fZo~YTw;*>JT87_BD78Z)8+=bvk=?p z@>Jl^2O@aGc}@)9)nGf4<wP1x48@Kx`Q6d?<lk`jyu=sOMD_%aoH|x2M4ge^va!iJ zsummH&|a$CRp_r=2XN!oWqk+z`qVhF;kst8GPDUl+?ApV^F1JkwtSnR&HIX*;XpHa zX>CNGT+Y+X!4)%U-6)Fk-NSR1efJZ$1Z_Ht)^jdrqnxF+Ba&L;>a;`J(}(gsvP|_5 zS#}G}`&(mP0gC4Ag=v`Apa+&Nt{-*IToU0Ph!-=e*WP)&O*NK*c&6XXd91uKHeGr- zy>BgBPaIWy@<8~IlL3{dFRnu?WP9>49>iC}v&uXIjV6p=axF1A9~Y$`TKGQB8NT#_ zp`ej($-grv8>P|qYf4>*DwH7VdN|7U$E$VvQFE?jR2-wzk}EXKT=zUXxW0toDJ2-S zTyR@yc&q|9CQ<1r1H-buDSy0?{92^jaHhX$L_Ierk4d;K0qC9XNTiJi0|4E-4Araa zM~sG`#AK_Ua(EJX-^(LQl<Gl2^>QsX?=UzGefk$n&-eoIaYb70l;wZ?dV?!ERIcSO zbFX=ANz1x2cW5VJ{RkzWl??g1P+vq5qwRA;sDH|i!sR3m#_GdKwRsgGaf$S+wEdYH z>2!qJ4pD-|dsbpGL+0y5{)TnL=7XD@P;Ui;fHj-N!>6t;%}9vstB{svtwpfrU@70g z3lBhF^sJe9k9pZMoy2-G%}Xr#)2Cg&#A}j=3jx<Q%&m&RfVEl5!qQ1guRbHx+X~~J zhj7fZ0W#N2*5&&gYswZj8k|1+P$6}<HNQ8rnx@jWs2@_xXM?f(7O=C1y9XI*P{>Ao z@kimSqZR@57il1vE@P2ImnnAusCfyMDE(a$arid%2XLjCgUXnc7qW4IRPd;rD{V5L zL$faQHzTx``)qh;<8i%0MKsGjx76Tm&ZS07@@#rhCWd|`OnAKtk(|^7Wii%z3~BUm z%;OE-sHmO9M`eVU$xQz5!;#;N0*HY(nA773Rf<2fV^m=b-WX<h-5$oME9h(+w{>uo z47%b&y3;H8Fd*>lT_e_=6Y=`I{hpgO+pz6YWWIkl2~nCxU|Y8#_iK_sda(Apqdk!* z-Yb(BKFdp1y1lwH+7U8w=ffFPawBLy63Tz^TBcyqK~!sp_Z80K|INWP9|*OILz}uU zR}n{@fC)Zdd*J1+HPBEz7O+br|Axzk(ysK5nCRJMFQFQLLvnj6UHT%*SjYVecNT0? zW;)Pi$G-09kp$Kg$CE5-gyC_RSNgLP@8C)7XpN93)aB=DAvE7a(V<!%!dFgOz5|rf zYTup5s)Z9;q^gdeZ&AT|7;?=ID)@2dZ>Z=W$5yDLKVjtJ6Q|V(1k(xFtg1CYSu}K? z;g4Bh9(EAoO=%PLZOG>@I>yZQ#XGHdIA`#Ez$%wjT$M+Ah=?-I-sj_Une}A$O05QA z(oYGN!ilp+Ps_@@hNA?2N2Gnvm#oks4?Vg!ZQNOzjuQUmNs5#PdiLYH(NnZ#Og6ns zqStoriW6;IUN&L>1eQr;d~ysg&sB&7^URMQD00{np3qP0h2u8G-}Q=$%zM9=ZpU`A z_etK_mu5J00g7u*Tj&i*`(tJ|6RaAo+qBh9bw#@zJjfry`UrKd{G)lkfGM&~=$`0{ zCN<AW*s3{&=Zc$#8#<VWXjP%u3_pkp-jEAN;dXq_)P2f<VTIvd42`_SwgNFza?dW) z$<bXqD;07<tEHPe7(_x@{+W+zVuQ3c)waVy^(rcR5Q)5hlG2S{7UR+fY7gw-(gxvC z;7G4u<Ygu2+BFskFRK+8o-7`;?7dY@2!q)sISJE3#sIs!b14)N3BnYMk79l?rzUYU z0V@uCfy*D66xt*n-YhOqz7lNaps`p&yVE62<`=6xXb<Erg*`blQ#Rx(n3u0dhFE15 z4Dv^w6O_-9416NXLB=Bz#L4&(8Am1sMwwx(B{^52kD;QRIvkGnM0w#nvS%SVZQ%`h zQ=u!?KY$@Cj)P87JtV~jPjISnjwxb<Y*%+;c`f)M+=*Q&aPBHq*Y2lLQ5Y6J)LdR( zDcjTaLrvmz|LPTL%>B)SE8W3L8o+7Rh;Y2faHK1ARpzRvVDiG^Gsi2c1ba;5^Bx>8 z`IKbiR+W}$nz+}O9iK-wW}!VE8%ne2Pdo&!=Nbk7rq6J-kg*Q03hma&wkwmLXEjs- zXs5?~w<KQt&a#_l%r29b!WGQm$m3i*^I=w3N&H2+ip_%F52nm|xCWr?WbAq5uoJEt z3mFq)cHtK4FjHV(huAdD33IP*L3y~n;jSEw;DO#u8JqztUPyEyvE^K6H`!&4hTs#r z2<<bn2*F5aS^qMmKV^T#i;7@5jy*JA{d>>aDkjPNS0Ba3fg&u;mRUnkLD`*DpQ$ba zV*3CLjFX+2QwOX=I}U{$`j*8d$Kk*bIw2;iN5NPPbH2+^o=}Q#KgUm6GwJ4~P--&9 z+&t~H=Q}tgIjO01#$wWST<%|2FKPB2zM*%d+wP%SbM(~65ml<zZ}Wi);#?x4J9EoF zKjx*<uZq3Hk&629ZOK*+-VuqK+OchzHM&8WHNtB@+fG+!R#^uNK-(@id80d{Q^+Aj z-#O^G))QxQxkXnF!67J0JWDgE={j<&=12*LBWNn)IS=r)A-C~Rt(CxOx4Q=_j$TxI z<k>$W!ew%^DE4XTJyxi`5nXySwoQ|nA&%{0N>lkm$yBTGBidDm$=MHq5VC(48bs+< zyoU>YY;-TPB~6izNywN<43Tj+$_gSGKC3oXQ#^&b*4a#W2BmBNe$YlvDm-ZI!~UrJ zR2G3~v-98t-63pos6go*&n4wo(iLD4Vsz*R1lhdEGBmmBIk>9a>p^L{y2HtWcV?9z z%R|C2PNKX@s6MuD3rAGTprpa+FpolCIi+5ka`A7ZDEMio4rZ)kv**`8xo>Pdmae2& zem_#!R1-}3TqQCTa?lyUOH}B?*=2NuL^Am79s<zzn87^#DI+gB*xReyJtd*4Tq9H* zqSC>O2wiQZ9CJ!pLP65*!TS6wH;Hq|J%SoZ{%$G@4LhVxjt?pyIjF00wOk=Nj~X{u zsUSS+BKhg=qf{Y-<dztr$>L$may-Ww<Fe5FRdR$kE`js*=~1<*n;GX7TPH&`DpBA| zz^}-grRsBmHPyw0kNq~JoG7r=W!KQ0vrt#z7~{xl&WIFDLyH7P-FY;SR?80rYFp9V zzBJi(4LP{1cXx=P%$*9NL`@xxca?E4V($xcK>haj=XP4;(`(D!Q@y3h&u(?}PUB7t z?I|7o9hw8+SY?=17fJ?|Oiih4cx$vGmWjhjZ=^r&*K85W$d=F$B%MsR;bKV8$J|$A zVUzIDYvmzQQ3AI((BZ0<_!emQ-yWciiN^Cug50b!{{Alr`ei6%v3vaqcuDG)dcv4n zxB*3tCA(wdUFfIBgea0v>;Adr07aD_PC0Ieub9JYgN&e}@?|fFs65CS(bIhVnxKlz zPq{n$(^D-*YgF^WCAO1Pgg=kmu|X_)eZVrUKYh<`Z>wQ_i3lswM0inthOPT-k$kzA zwAr_}Lk`oab;_FR!I*PXn@f~#1ZS#tN+5>I+)k7Y#}lTgy1)>nxdy4RcdDz|m*L_g z4lHWej~z>&LrM%LGi*B(^ZH`IT1~zjzaAgXc#lZWi8yw`^v@7m$p`@cXBeC!Cph(| zN5^ZHDqwh}S#?Db<PWu~f|IIZh@RSITX6R6+A*k*&m+1Fdcv;6T)-e8_6+?&k89OM z(8@iKUNCnhU`r2MG2LpU^a_yxl9ow6r;C<%O5lmk8@sVgPYjhPsi!yQyCVc{bb__- z{;DHjxCu27Fbot*3qt<K88jv0zh<emI!Aw8;Zg}VP3~eAJ2`m=dhispcM8gMipgPl zB6^{tW7Xc#;xvbSwk*0mhQ$$d7d92(EAS0pipr<z0PKB9_;VV&PfQ-F76hzt<Ksvn zT^62n>Oz0|z$l2CICe`ujQBG4GARPDk%7;~-N4hppIW`zEGVy>mAxA6zul@L#+ZPY zLC8w~oAH7M8oHkv{&9;~#f&3gJNC|w`LSg+`uGb)xy8qhnp49-T&sr^t<2dGK(0E< zZ+9+=R1>5#kgh_u9_xDAJ%P9bSR<cfqZ3E^JBfaagUCZ=Aw|3U0-Ic(wtIJ#s0{#Y z3PN`I+aR3cpA%nySpy)dkzAaRP7RPAkq^v8X##XnX2Rz}XsvB~K6o|wM-#pd0f2o$ z$SMCk&;QfrMN}T~b-&bqTdXHeeK$q|sBm($hMo+OZ<SK2R<v9f)>`CP@Ki+ienoYn zb=(L93PlAW|NhqjkUtT7oB!nllj@}AxX}`nPITlsPJ%}{lZD9IFdkF9J~WVlBl|P@ zQm3)AHbBilEro^?O%<CGpi3A4#be4MXRm^rOVxWOC}>tDwevpV&ga=vxu{`e0m%>Y zRxFwZyG$JGl*GPpY1uma<qECqxFDyEYC<T`3;+}g4?<r2XIDUB`@bP^DUYgPqf&rx zMUz8lZabzsDAM(q@KU&nt$wxtGDnKwItq5#X?yFoD*~H3N%Jbfup7p-h<kB)rM(Fs zcX5&g&TMl*6h{w=;|>s6(Ae`{$9^uRv*9XrM^Je5uRF4czx?630vi%BcM|{5u#esn z2)qwMe)?x$Lm}_Ke$cAuVbeMbmN_@-x7iVp$-^wpW!)WjDyaybF@5u?%-8lx-c{0l zt0RLU0{A%0`W5>bZg0AR2DS`Bq|fFWsj|e{M*XhlW|ZvgOt1h14-3OXldE;cGr*EP zS71m6|0n*vAQbF>?HU0f0EQXgwm&vENd9^!q*QE5ZCG{RK)xvu*wv4I{CWk`8Xnn{ z7b017di{T0ePeVcYt!`|I}_WsZB8<=HE|}kZCjH}tUI=C+nU(6o$v5D@A`grukNmW zt*&cz*REYvdz|If!h0I$XLq5AN~=cZ=tt3Qp|5oxyhC=i#I7rrH;bL_!&(a>Bje4v zewHD!qE(eG>XY`feiD#7a=$Zz8n~knM%IhIC26CzyR`+U&y%4N|6HTsZ9q_{%V@7p zY$FuZ{QbPOgWb8)cN{wqD+9NP)iJI)CI}zkbsD&AnE{x}^ZBee-kM?&7D1y%ZAz=A zYzDDB=#?4^2XNiGeV=h4_5P&*9GL!d2q_BhKSM~hiT^)ogY}9F+*v;WsJh^fqW!nF zfhkr5fbA;lL<DRrV`=<)^m37*44^G(eeY5{{_|F7J6ABWTnbf>FFK^;-L_1*e2sMq zCO{TKVq+bgy~7YDf3u&nm<q_HOlmB<5NG>nzsjIQ)wmI;sC|d_7mkRgEH0rmCLpX@ z#22`S1WvtJ3d(n4%>dxg<&mrhMnLBPOi`_3eM1GU!2ssblNosfqzDSlR{g!6VrCqM zj{{mY@nVd3d=rVrb0QLygaHk^_?((BkxOJBvhlv6u_2F-97(3CH4Vt<WEwAaf-L12 zqsNYx5>Ja5sn5O>%JAdhskL|Vl*L+`=Q$1a<|GuqA&><MTsIXqOsgNdcdGVxY?H!* zjpFSOYmH%4@Kl>-GR&i(s5&CHVuui}BeTQdj2rCzI)aTUoaVKHwdT2`+jgPtQ-wt1 zw~dSXLTTSLH5!k3{bF)cscThHGSKTfJny8NLchOZ@5K??9N{}rY(7udevOWjbJuVa zG%zPfw4a@9o?EYNu_4HN6ETYT;;lZWLYJ8yADTBPKLFX^aJBpC*3AfhPZa0<L5{GE z+ZMU>y}d4NA50_Zs|ae8ht8YTtMJrUbXaCjWuhZbL}_4`?e}sVu)}8mYZaoXkRR^? z-CF`qqm|VvMyK{{^<;J$l9#N7!JfqxM*u!I&=hPc0b@#hPI>R5eKJ;IA0&)vCPQq& z>&hN_O(?jPl4N9vny)YSt{*E$iF}`*1yT*XP(C<xZ=y!CjN>on3=0@{ZZDTrV;5Sv zCWBoUa;SU3Qd?kZQQ|?M4wcO@4yz;J>Vd3VJOU2~v1D(UCV>iI5~4@z^myh-d+jnz zS=Mg9lqK#$v>u67+2qaZzkp}Sx8QuQ<6NNG5`9Er#G%fDnb52v&JepS3k+?$+bu;O zshz8--x~DO%WH@vR&9qNFiXAX42s{<LPIkj_{Q{JHD!dd>iF)jz15ARqzD4Vwh;?` z@49^|K`>>;vJTW7LL}PgN;(!$>sZ-dih;=(AA@#yHIpkUkt=dz1tOK7O#~G*f!qs% z#}ZTbM21kRnseV$Dq-}sB`y6<&s!onL`b1^?acGej)vm8w)IOv3Kb?i>^CI=GmQSW z6@Y#D7-!afaScs0GTZqfpXxOs%9nlZt*x5|d^Y2Vy;m|u#<ACb1#wh_PlB%a^zEpR zw(wGdw!iua12;f&N9hgR3`)FbkJ?*gg=Pfe^oGoXX;Ui6aRCqXYq;6R-wS$AvRYZW z5FPIeu0dT|s0!CyJr)bz;|<9S1cU`Ceu}oW-M?e`qwAx(Ln$3C=Z!&d|3(d0Yrca4 zAVsX*t}e5jq>4v3yFaF2On*JChhs!mTrZl#*r4&Le9qgKBX_B{&?B08)sn`{)*vTR z!(#ms{yMY!IcD6?O%v)EDgr*<qFn6-?9#RiTM;Px1%X^&J&ZDY@393#^oeMc6j(j0 zk~LH!*4qJpI&F!81I}}8thsu+)~xK(;~0Gk3WzGkluQcaa=eh-Zv{K5Aq>}O6w)OR zoV^8`N0}+VVuVWmjyY<WmO3m-=xg3Nl%SY3kcO(_)6zkA+`ye!%XJ*c1h?EB@YYxY zQo!qm9;dKEN#u5}MO%tJraOOKhZ*pLvcjP~M4Kj>HK>1o?uoJ5q|g=|AyJ9Z6o(l$ z`AJR_X<{ye>|vN&yA8RoYpfd{=7DY50O465LZb3q`6p#@@+`CAx%J{PD7+c7S7hY3 z_%oi=0U5K={5bg%WH1%cY03o!bU-X*Coc^}DD>J9rdb_N_#1XM#^G&)<FlJ)(Jdi^ zw!f#luv`+1D*>XByN7)v*Hb3zw@i|xrxYs&kWq`!ycI%gFl$#~?X|h@)pH-tybSFI zV=L*xG??*$UrTc);=5kVa3`AHyqfmI_nb)vwg!i_JIUdG#8n6<;l+2B-#`~%Y;<&q zlx@k6`vQ<3Y(R&rXFboTm~S#=>iqI$<k^4xIs?Cpo~M}Ty(oZVBa`V)*3t^}jA%Cl zTXi^0&iSeTt~MKh22gJ22Thi#);9dsspF*ZKG$UAu3mB(g98l50_`QDRwsUv!cMOK z7;2AYqNIA<%!<EPz&0NWN)oq5=nRm7r?SO8avVHP<yN&@LYLFilzPQk62ATFK=i}x z)N~XcYx;&OI#-ht%xEpw{(uUWSjNzz-iqZq@?r;8V<GJZ#5joUv>GlZ)w?AL8li)~ zCo;3Vhr-*6r@zC=WGKa46gJfVI`7*@a)*neY|^dFZUUW8iq+IfH>QhqF~f>C!5mCV zwMCx-G};D}zFoTdIJ!mNU`lnPI^VocU_y5i+n%QLQ_a>;Lp{s3&1DFgZq@+K05ch8 z|8ilomaP+SBk*g!+><AfP38L&&3U5Qj3%!^PN}B=^Ku-=SnO~!A<3kou1t>lh9*>+ z#hl>55@JgE6{OGCxxUkIO^i}yNgOuW*cJpJ#<<<yE_<}zD_6uZElQ@+{yLb#ZkmDw z0Ma)NQ?nFfNio?ViRixVbuIdlD8X}&pZAAhX;l+s;;1KQYG)kbJXsR_IN{jm`=}qc zUcQIhB0V7z!8UxRjI9^H*@Cpgq2@?2s7H=W1YXFss;Obr&!w2rxQ}0RV!J2F#Dzw2 ztPb2PY;DD`hegLhWjXiHkKCB<3gjYR`(i$?cp<;tPBoy+u;LiY)SLfog9YfxDBpXq zm>xpO_eoYxd~4?={XlOMgyY|%jRpo$831brQ90$~JKMbbOY$-;(6=1dt~+ISbQqdl z5)q)yg+iyvt6C;MdJyz&cuLq^u6|%8*7{`Li49`4%Fe34XCCRm=!DlJPa|#4vG=sY zP*+|!S1;gJbm!`5%J0{)trrlf9aB_O6tEHD6e%)8W;t87k(?E}Jz(`HB(e;BZcH$| zm^*yCf9SdX{3F1F_C+RC$_&`HOEBbYb+FUxWqLJ8+kurDToShmc(Kgnz2xnWurXr! zUQvR6SvTDj6<2<<BJ29yWvqh=(C8xXMQLhRPd&d3UW!6=p}1C)GZFjxk_@R<zI8yo zhekniM!JxhNZHv3?GDj`rIt%1*G;d-OxUs}l5gdA4clbgkG({!oLX86L;5V?6(=M% zgBPBM&JCvJ=dhklV-t6F@W&r*BeXmi6<K(O2X;bEfH=LA*cKWHEt;?)>Eq?<(5a<t zK2K(f+6ps6n=8j1YTDHemFouRZ5I@VKkr&s6buQiMfE908G0#`MUlM?lz_?S!DG@U zSl>o%IgQPeq`mvR7GLhN+U(>)X4_h%)z7diEuD(zStdCKT{m2$JaYB|ljs92;(GYk za5s5X#I0l`SYD?v5e4l^t_O_Cs+e*ZIF1h;UaMRiO^KI!qT1v$?lX5c|6HkKP><+~ z{2xP~{el57+dakTpR{l)g!uv#%NtGbR(PixxjIcE`QQwBiZi&e7a5piuI`?@lt!qI zRs!g7`6L>lvhZ4N<MvvoXN0CP>qy(VGmW5^-XiS2ZfRU2O@_FV+588L%b#uw3(vNk zkvriA?5tq1OMzKgb9S28og2zQSg!JZwR2-7Ci#H?-U<jto?e#M=`o+e&|<^+Pe~Ir zvu@CDF0)cJIzN(tB&V$3<|G~9_uq8tJ~;tPFebQI{sc<3$K<K4)h@`13Mp8n5ZkV_ z;-6_|at9F&@-0J28d>h;N>UQgSOHNe-{>>&^F(~hE2C3quS+1Vw`xk=s2_4^v}4R& zv{{r9o=-921dxX>>W@JuPkqK-_3&tyN};VWUG~8@HlA>@Ye5R{hVLxtBcmfPeg}l7 z1Jklg$r7)uwX1t+(9r0?iQlBP?({Al?-tPN61lu%QO@i0>=^<ZHqF9XmD`^^sx;@M zuXXnEEB1{+WfmFbcne7a7l`}dQi)ZdW`34!fm@3;+i<bzwux4Dt1&vVm&R}cqP1Id z<$P{$nqd2y!<&kg(>Uq)1kr=)ypG!F(qg?-7EF8FEobS;YfA}s7vwuTVk}0Z8u|FD zlQgJs`aBgH0}DlaK*HeEU_0Soqgb-aejSb5*U<G!ocBbw(yxzJ6kTI9HkG@y248?l z({E(OH>>FcFlLLdQS>5+kf$d{y)5Isdh=Xzndq~m;_j&pE4ua_Zko+A4&ze1jnKNi zGNm$BlMs-sVo1UkGxDxa_MXTTe#%DKT*5HvU%MK~Y7q>OHw7O>nFPD!A0z(C88M8D zcZCbh9L!9$5BKJ;&bq^|^U%TZ{y-6RDGN!xuA<5zq`+1;_J=qy3Sm5Zpv-g+fo9{L zb&t*Rb5#y0fZzUXzZVuv32ZTBuD4pBPs*zJ{@C=*hl7o!{gU<Zg+yxO2TuHt)3QUp zl(lk+6;Ul2$G!3-q|jbbSBbtj8vpwAP*lXTo~H*q%JTg7jO#Ui&>$_0-fYHe#p<)1 zTTz?(S%Xw968*6;_uV9$c<?k=s)%|R8G=WM$hmOZ6_Aif?nj46UZ)sh-qYj40q7bA zHOF@^HetTJ4Osx@m)^UQj@juro-ByO4!5J-VQRvuu<?Gr6^5jkVgKSsZUiJalTC9M zot=V&E-(`x1X^oMC(HF_fgP>Qc3ii)jSAF@Kv8r7jq8WFAMqQzJ)D3W^$3=n$#bnd zDO=&}mEyU|K+Bk)52SPVu70xu`eE)wq}Wc;Gl*)FJSuSmIYQt>V(<gO<$a8jBnOBL ziW}x@lEqlm5ujTo>Oj6RDhokEBQ{^q5zu)UH05ZZNh#bgnsHTa+dbn4k6}4It?ETe zqS8+`sceU@N}T6f&j`X2_|PHCnh9GhwRahDmj3;pAur#0ZV(BRiSQyK3^RLX`Vdx_ z;@8w>DGKqd+}}{IBuNP4)Pwv)@rr1YpOZ)R&bJZk!czren~%M=SR?84I6j7ykHUZV zj2mx$`NCAwhdyNF&A5M{50A6jI%e&G_VTH@(cJzi2Q8LrIGlur26v~v-EL{2ax$R0 zY(NZiw*IS*jU8KJ#a7INyn-h+EB=a+l)SocclDlC{Q8#&DOz=yg|hC+P8NoX?Qb+3 z+5r`~<OD?s`c*pEVNfn8=HpKp9aBMTvGZF~sv&)=r*?jSBQRjq7jhLS!A>?a?Qk$@ zni9KlW&~#;6;>+(6)W?-#LwjlX%K6u-vy}#{YSq&&`(?p{bsBaWXx2IPnnFlwWO2@ z-xj4^^o_O$tM_8hY}K`FNjf1Wymq*xMeLoGLvr4EpwldPT}PJg!<kFf*9qsney$>c zLw;;yXdUsUo{IbMc4_upomMYBu#E{ezkO<n&KBa*9vB;(4}A~cKT$Kgmcz4q$pm$> zGa$Ma(;Z9sx~F&i*wEN`($f6Wspi8tA3{G;LTa&O!(UqGHe73S-<0y$#Cq1UpfAp+ zI#pd;5vn2vF(o(w1Z*4|J=xmNbN-Gxm*cAPMWf3?UdhwnB@KJy!sO}SbD1jlLk)^E zsOuz?F(+)yi*w()0f(ouRd1Mg0jtMd7cYXw2{b&?i55p485+a<ziU6k^0Z1aP( zCr{@gHc#Z8J`b9nO$D;JeoaI&v_<2+Mx_g5q5(g;4`7AO!I>X-rH|xSCROjk1ILxA zVtR=8nwsa*e<H`Q)Id3_54AVA&RS1etNf;@I{4^>I2DqJy;a7uu)Bn(WXBwj3?oT3 zn8^8{xV~&V3`VF?X?=->Ln|AIJ|}Fml86^X1?y_2glr7k^*!ioXdZO`z1BfhsCBpI zLFLa?J*iG_gSk=kFg)6>kLejlqAvL4)DS_APX#AI1%~K1d&A!XzXO}r5yVq5Cdp>F zoq}mZl7yE>lZwIr2xyhND@#DRuNl`ufN|M4LC@Ih49hS4t#{wrG#H#xLeXj{dnJ}6 z5RcHY`h&6ajZ*4u%;#kHq&5r%ibS4O0*K<n^5`OnEyOJiYhk|Z@$gzH&O#lf648db zcQH<i25P6J96LIGS&L6Cj$kjLntyy<&uWY54pjfb7u*pzn&@HCCn_dk>>k-^<JTB$ zPHYSt8zdtGn{Q{45ZnWL$>_p>fuO;_kniFq?}tNHZ;;?pt>%!-@ivOMD1?Y~aB@s; z>kf7-Kc>5AiBx(v)4H~}IP28lQZHDHV7Jn{%$ZaSb7j$nq!wEtF8w(|%sSpV#%P2Y zMlL73aka>U9$g<luc>Q-LEp4V*8#yB!8d_Zp+9Z~ZI|0H@9o`Dws@ouV~;3d01|q( zp1a<3%L+LGmH}@2)qu<|fTP-eOEwueRYX~F0eW`KPU6E8$@ajdn0~aL5skK3Yb~`# z+{=LPkdvgeEnfRIdHk2yr()9HL$Vo4oK-<<C2M_8lAq8xJAU^4cy(LPz&j6~XuYBP z;9h@8Bn~>dL)5KXzKrx|Z7>+}7orTC(hZmrTw`E@O=jpiLzbI9KhcN$*qpwyGiu5J z0dV2NBsq09%jeG5z#7)J(hfr6SenHC-Y*G&oB9|iON6~ESyx;9Brd<VB#b9*IiV`` znn&(&A`+3^Z+Bac8Neh3-4?Zrr5C8Kf!lsK3k{6MG^=ouOFwqrt{A8GQaTW8GDgBt z94sEM6eyj<If(8YVK@u<iHKnzG>X}E2&i=sLmnf)a8@r0J2;6iSBfTa@zLqlMB>pc zq_rbi-#>2MepI15(tOK3l^-RA%F24o-<Cw!yJcI0CjIPwszpx7X1yIG6xEO8Eg2;C zXBk7-w~sCq@~^l(`Egb|&1^Bm!ttGTzmkdcG2h|k<%i*#_L&mxa)7~az7Oo2jXuSt z?TOGbMwF9hbBs7*Y0EuYvjwTeDgLT9x}pRi;44VAbWVqIYlCDohuQ+daT_Q1PI-~W z&ET!L!l@gwZZ~(-RR!p&U->zl*V<T4Y4CI?qx2^=ysgLLtmlXw9d3GR!G?)}XDsYO z9#a>@$}Kdlicb?S^F1d`R7iXvlD*`xtYE4QMieY(h;-K37kX1J9Ij9%9J~$Mz}q>d znK_PmjbqP*NX;U`%^75#bq<|N(Ja<YxT{1eC8V6Z2KC1!#iE93FDOkvA<t&fBJt%k za#Y({M!4YActv)S*#5QFfvI*}8z#&kba*uPm;kh4>lwiwF2P~pnvqa4_{kU^lEkjx zf}htx#V%IlWx{EUWlv`7cjpzjJ79s@)~n*+xkosYykYpwgXyS`hXHe4_T_4#A;rpJ zV}_}+wV`atd=8jqEu))h%5yUpM?|R*JDDWzg;CqHMqF{{VO?UjZ-Bqm;6#7b08-|q z5B^2CvMalbu~<Z8!Ee2|Q6x@V6eZe$-R}-62NrH9azLNroq5aEgFm*vn`5d(!1pkt zf@3jHRseKPm6K|_^ysCPD`dc#FG@Awr*qv?S`mlQYGZ;H-|8+lEWKT9(I^(ZTBORk zzw+}x7?N{YcLGMfp$7m)fOq~V-hZQE`ak7^<jShtQ^5s+qgt15hQ7<z@LFM(=ht<? z6RS4x4eRsINQ>U5ivS&}Z<BiDP&N`cwKYzr1z-ar$FJ%RYU=B!4c?5@?WN9v4dJMu zn`D}GUN62=o>&Bc17HJ)f*AlPROFA6{kK`X|5Jo0q8#HJyariQ0_l4l&%}CZLs(!K zHi!Acibdo3w(IOsC<di&55K83)2+Nd#3phzE{<h~>djjH7#fPEC0#;uoOjDoKe+bj zaiEg)NEm@NidQ31Qe-K2P|}43oI>@}MM%gH1(zWs!{mV{YuN$6Yxi}e-j)Gs=dymN z<O*QNHEkUAwtQj#qJkM(8g>(am;w}<_DAXd=XELmm(|f$R^@UyZ|9)J7bV9LeKn!i znUM0h!E(8B;4EahNwiH6k<+Ik7v>hs7nKPFnvU~E>~aV;p?6~t>SnKkD8A=}DV&v7 z5~sZP=GuYqn?4s)${f5u;!&{;K}-X_hhXuNO-pfI1Q&3!@BU8j@r0EwHxAIbR%GH_ zpAYN;bW?ICymc}Ij9x9Lo%M6K(q=i|!%e4OTGHXd2CXr;=<0&Q8bM5_E;76MS+ui! zw8#OGrYWaVi;(M<en6ovf0XUNmxQHA{AY&AOW-dD6jio+*Ow{`vW0W`a(imeh_*N? z*N#EYRoos==eTBh#N-sx^uVphO`z_8W2+;O0qNv<dO`&XQvO_jmu*}Rz8F*Irz0zi zmE{xmWJV4eR!D`yo^})i!kb%h1CFjv<?a@yM7JTsU!s#b9j6~wd9A#8a?FGvktIN9 z@eP`Q*XM=Y0F?NLk(%`~7TU9zZVlAxL8*OZBfQ@6#5d$~D!14eVBw8X4p6Ac9~JEH z6_6?XmzNS!wn+fPvE7jnn<bcQY{83aWa>lzMwe6%q%R0?#jAS#Jzg5lsgy~tVLn3C z7+}ZtYrMRcnxh2(hp8*lKkfkSVKzP|1-4fe$<Yo+JSUh%ibw-p5c6sCqv)<yxZCTp zv3eo&GMAYQSV8$bA-#e~t18&YB4#+9FEBW|dMluVFj+Z5Yf(J1YRrZ@){}`m8E6tw z4C3+_ICMU}2}WsG4HT;IM<x5mofQ7dWbr6_jM0O**V*}%`+RSFSXoP#FYnnL;t(ro zY2V|QJL;K4ie>*EPrT0;nx8=)ozj^{VN&Qzi5i&-u<TqCT{3Di?%ocm?R&tjg;W3X z+`xSO)g;=KXoCSOqSBsHY?CzI4a5)R6ejLE8M}Q_YxHMh!LxUl99z@0K_dY<=IMl> z?M|nk)4loeA+&`+Vnq@5#TEsT<R2R~!yi@rU%Uo?Wh1TsN)L&s|6aXNxh0?DC>Y_U zdBrN_%f`XG7<nF?B7F*;6GEFiX>IIV9iuk&M?OMkX!7Vi@vIdU{$@O1x|UOeB@*sm z=cko#1;P+aJLaE<svc8JXOP<ml>cSk<o30FeLQ;NRNKqJ_{24L(A6HaUYfDjlmzaH z(@y)yTDNu+?F={R_M7M*@NWE3P5**-RU-rrfYdko6PvRUOBP4vjPFb06s@ak8(0bL zcQGW)d!ZVKEHH<XbM&u2oMgF@CYwx0SFr_mPU*4=FIFEt8gDJX*S*V@ab9g=k$Sza zz(2U=Bod`S%#(yG!I&2j?|F5eYNg%zz}VK9$%s63OjYV$P3!60q2*S2x>9!owDq3K z7G-a*%AstUciCQ2KcyFpLGHasy^MCT=D%_f$|(6p2I;I_(58a@yp%L7)%vnxzuP=_ zwwMjRrq^s9U$x3b$vnVA6Ony<)3~OK38A3cdgQn@yCxGd!Z@(bNM%6~WOW;l2h8<H z4f}gEBtZASiXaH<6;T8R%T<alQUIZ7qcg}~XHgsv15itV(xd)=9Q;)yq!1qfKyVc? zKsuzMKs%=({j<CY9O#LG&6D>q!}f~?Z&CA!VIEENuzyESx|HjIE|=W&OL4e#WDE)_ zJ@t|dSN(yAKHj^{McvNjPg186ZcS=mu_2gTL^kCU)bUJ&%Y7<Wde_VZeM$(v6XF<c z?p)vnV|K);O^s@nia<F|K~Mgis<GpC&&9rSJ5_58(@r${L-$jeoUnY*Qmn_7T!f%q zd){~zSgLMpRCJweSVfXXGXFr|fo!WaGMr3g_N3ML*coPbSaO4F&ag`?ZGldnsu3al z`%L7wTBydZK5u5x75<Jesa%1!*AXW6RLf?TNc$;!xyAH2UE;7f`aas<t>bp=_wJtJ zz3j}eAz)n=WF21P+ASV0(zs0C>19OHZSIL&iWZ7y)x`cZV((siH2kG7WY8b5m~b`K z=uW<KB;DI&1#b%~hpr9PC`O1*$hs5foB=11?iP|d;>j3s+%I|us+QTY@QDXT&v8G? zmhh`DkI>1LKNUw7J79JTKDT`5-IbK1*AnnCV6Yb{8-4&wS|(kmK3!c0DI~8A%AuPa zLikP&KSJv?%YSK%O8BK1M+Px;6OWr($H?;=7RQX3Fhi8--C(?R?z%Bo(zR>de$#mN z5${5Vy}E`mc7p6kepCneNbPG<HxcLNrw1q}X>IlICuPAS6Mj)^hE%_=+S<r#WyaWF zcNhe90QF;dshg8Bo|aYg>*F6=cL6w$v8S71{3<#_yMs2zNRFmpUe5OxS|0Rt;4(7- z)t;K_KsE>ap)f#*!M1TzQc`%s7^##hKh%_~6(O!YyH~HolZ~%P<Js0p?Z9TFVXD&{ zPG9yeq$N{L>Fw0;<ly)C5lz#fB<Mce3g!&{_FTb$5T}K1`{Y2nqWyl>^ECZP!W1;` zB#k|=eE{N5AAz|ZqD0(aU=!JfuQjuA{hg9m2M|i)k-%@!QtGF7I)cGaITR3n8Eg|; z<~#MkyRooh8g8}Uy#J~&OQAX{wMY!($kDr)j~QOM>?J->iGkg7-65yBX?mTBZhSbo zyU%n%Si1O&yzGv3qmtD>PK;-5;=|8nJsCz<j0zyb_~>0Hfq<$sek#Re0Ildc=T@;* zrX_%EQGSgckB?I`Mep9t?pTGvD?!)}HJm=rGVI7xxCLGu1=rmL^OZ<w6nr*@6OEl1 ztO;(-EVN%*E!p7r&$fzuZS?x(*m2MWC6c;~LPnT_3|8TB&=u?uIvBp%Vg+a>UnKJj z)mjqgcaRvO+DOHUb%PZogwA3%js`BTcaiJs=N&L7g^a+p`G=f(Ya}$9pPxSOu^bW+ z81i3OwyOQiDSp)Gyp>-C3xf<4>itZ>I}vYb6C65D)1iqg8r~}y5ZRl^cXP<oSVn%1 zfm%mYGm=7^=)G%{#;GUb6;m!OjDP>!@y~cGY9q?F1$1xHlAc1tdmvLj;o(fo@EFWp zlJOEF1AL8NH=5^l9nu6zpCoVE-tv?Q_IWPc5JIwoCFr}1yO584&Qaqa8U5fBc~G#_ z3Bjzsf14P)39c)qnD|k2edj{p_(7avGQeYI?L|mV6eoKZF87e6iq7b+ZMY{OD(^>Y zZNJ%o8KB{F;pqt}fIk!io;vbP6?8^F`9p>y)V&OIPsUK<*li3$R3txOwx&tW$LDct zK8h2f=hqfl^_|@BJ9JTB2e!+XrL;h=1ZmSV+n+d0{w|=3cFfJp5xnm|&Af)jUPPdA z-eDFAd6vbRhpU5!5dk<WARfG^vHGKDLm|Z-fy^ggZu_!GKc|40$dUTCv}pm&M(Z*m z-_=37pRhnV#93+Sqq03IIPRhG@qMUkJrU8X8qb;MZ_dsyah=-%Ps<`MP3e2wc+3qc z+I1Rg@}%nuR50;*SysTPDkgqv<4F~Qk1%J2jgV7u9oLPC9s$i)Jln3@HiSuY9g1av z2L<i@TS!O$`g1CmNYS~w@D_)_V+r-jcho*_(w13CR16EoXhp;tJDUVqQ(MxE?@Oqk z?)Ywp4R<B=KfBry@xLqTG2kho*j10Cy4TJ>en+cG=i*aS2_{J^m~4XNM#P2J&O1o- zd11d49;&dx-6PzvC~aWK13BRb%kxw7f}kfMk%M*Y{mDzirTG3!%pxag%<(C9-9ZW| zcpY>^o#U)OKfEL=I;S$-<Gjqm%6iK1BJ=Y~rXQ46yfJ6q`v=Hk(|Mx8CUb!haqeZQ z3FYs*1ktIo-rF{a)-vhmk&g^47WGSJy}g}k%*^y1#b3g{)?=oOlrulJC?G^yU1L{~ z)@q#!!hp`&3HruGYODyH8PzP$4yx%7WXgWE+O6{_x6XHGu=)Yj+!@f!iV;vzIEuqF z{#BP3&Z)<{rI->f0iI5uYmoF?Um&A(WG+i+W!{;4f3pEFtFb!=$+kB=N7R)a6mr#$ zt>Iu|v<^IOa#Y;0C0X!Ix|>#|m}PSkrU`S^3-VMv)TEx{7kGR;oh|yKVuiX$5b?Tx zxi;wrEO!J3H;ct{WS@P>@=6ah7ez*iBO+yC7jNu>iQB*qM(0;hi|N{At|GDbYznTj zqDvj(DVDsy$66;8Z^|E~pD|96Y5uxmb<j<4H1(iFaUm@)K*E%UsQ9pdpAlZP0W^EJ z!0$L|OU4@rLO+7P#xrv#f$<(zI5ib8etMXXG`el6KiH;*?jy0|_*!_qa9qja)eqh% zAITEk0l9ieqt<G)8+ln%46ZX0C5Luss%WlndS9Qj*RgjAUbF1#k?{c^6GN#*8tvlr z80|2@GKl1h>$9!Y#ibD>OJ(0!A}T#gn1TtfofOyU?X$6a>)NTJp7w&2b4v}AKCFWK za;d8`FDWn>1!djD!z@C;+)kM9`M^?L)(wRYqHb%3W>LMka6#j|$9JKwEx@xroLnSU z{y^io)Cb*(;OL48$*078*6I1BC1V^Buf#qT?jb!A{>_5?I4^I4!mTw1tbq(cyzlyQ z%?rPldWK3_8U{<8Sc_{+W1oV&0Dl(Uakg&9>iRR_#OTK@8%lejgc)Gi{0fq;iz#_= zX>kyonwQj!+{74pRT2rD%1ilDLc!pQ<rt5adr%zk;1Q{r)H9cQYZ7`6xS_tJt+KZ- zn55#-d<K`;p~FhOp*sR{2is6V==~ri=+M)IXPk}(HO9E$6_mv47jBS*K5Nq?=;AZ( zx;UPttLcIcS`EGeCs$<n&EFiP&qgH<T<tqxGgo&MnCAi(=;nsPYs$wxszkp%>Es}+ zoDy#&Xctx$?@qsOr$*{B@Zd#`bJ#Po7V}$cYAxn3fM@@bbRfjYH%;(HxvleoenUx; zr6~y(*)e$n3I1+Ljps1_J`P3kq6R0kVfFdKm}+IP`v|Lx(wiW@S}L5|pZlxT8}uy_ zm$M58Z7%j!MR>w-#Ho*vd^Wh$&jrOG@X);hRN=y?yHH*nT&4vj3KJRzEON-7*-qwc z6P9O#Ss^!~i81>+ff)+%2o@zaqd|Fv+c_ZeHN|m`D%@QWBT8DaMhsPzXi$RQ@M<Je zg+`w9B3YLl8e58)p7*{sqONVL%Q64mJg?l0<4P+|7Y&JZk*qeyO=p=7M*5xUbCq3` zQ|f&jT>5ADJ>1j*BYl*6Y8Qy=`{Zb!lu1s7qmqUOzHFcrEQPO1cNj<i!P<w>ie6+Y z*EE|eUL_{qI7eKOAB}*6`r+O<iyH*rt!T3R0^QS>@}BuYv`8uz6yVA^Na7c&W}VfJ zOJQ^u=Hdl!0t(p*h#5n@@7y*Q0R#1~QlejEnZR$3G1$L|*y-X<!2cSnA9Azln7E)Y zC)VnGYJ*wQ(LxoH3wLBM@N~JIVv+;H6myr-4qxSnc{t}!=UK-6@s~{S%0T9S^N|RQ z3!MWEyL{|B@_do>vo}jaKClPN#%3Nk0|T~f07i>rg^RCea3jR9!G_1vfp9S+%fSt8 zv&hO_;9N_X(oX73d`Q!KlnN`uR(;&^7mVG25nVV#zzA^3A3*YtHR+&#V;(%E5sN7n zu^`ELa}}hkT)IXyl!Z~Z{tlem^HG3~>)bCuG#|ZPMQ4D3N;E{sks&vQCxYq9(=ta# z>+M>(4r{bN0Jz}~5dF8S)_=ne$dr{>;g;iqinR$JMyZ;Izw;39j@ZAUYc1p8)$fL? zjaG0T5NT};)jqbDC*Wtp=0Q(WtyAjBqfktYJCTMhzVP=gYjSn!2m!bJ0YCoje)S)f zLZq~PcCa!>z`gEgJ#wR2MXq%QI>XhkcEy#Czw)xh=%<!!hB`|}DL8fqCIjlECy4^T zP;V<&IHeYD?$KL48|fv1BqSyI!WEDM-0}b8`G0qvQu=TD1DU$LlH*0Tesr}(6YBi# z578A1Oi-Bp@;|<zvL7m3{0RimivXn?egvHbN}@BMQbQP?ww`nWnq{aZXOl1c`;zMC zwA!f6KtKO28UXn04=DOa6RNoVKO6YUCNyl`3Ao1w2VCz5y55KUhXwH(!=4ZV-PeD_ zhDi^OWo=}N)gA`A`!+UlPpg$cybC)Fb4v{nJiMJW2&_p@Vhjx5_TNULboZ~@!L;`0 zvZ+z+N_g&)S}CBO+ReueO!~lkf57m+BJKak12W}=kqj)XvjyLwx_i}vV$J$l7u#V9 z#j-NcN2=2V?f^_5L`ln*>v98A^qeGe{KIzIe6C_`l{5}QH8^~B$3j@yjU#X$Vp1t0 z8dsAx_wa#V5yF*Is97NR6O!VoZhw*%fRn%NvMK&a0@yj_{}o+wD;uHH1h`rj#=cef z7PWEQBa3}22k2IDdmI1UMkIwj(&LMqsp;wIfv$w#Z2O#47e(<0&ayK0`I%J?p9=3W zjR%Ka60WjG1gYk)>QT5Xu_n)*fs&tT-bO7Ik#m%1C)&EiZbqaAlBl`kS#_jm`lc}I zVaWSoK4zMe3N4XXI`%l~QJ8oo-rn)Ht9vKujWr&x0f3eMAaMV}{jU!Sg8J_%iTLwE zz)9wsCXwlq^YeS+V_tv_5irLegzj(sE0gB`nI8sjEgfoSEgx0|0PgvN$o<oQMCq?9 z@?-vTU1cS$<5r!G8=~8<D;Cwdu#`{Z<*?6wru&1Ut3}fW0PVR({3obURvvWJ3A>DG zU!w1<?}r|y;a?za#vRD1Y+o?JC*)xDj=H?tzXE_lKz|V1zs;~I`Tt3_BnJJ3L`>O) zQiHf?3xT&5t&iV<!h0LzDv2CpmzUl;Zfx75Z<LtA!EoaXGsI-*bgY>#9+ZPMbk(N9 z>d!gStG?J1I*R?fdVrDj$9j7cR@7yXi6WL@nZ(A%<@X37*7rS`Vf8P^q3aMH=ju1; zc%M!tBaW=PVpw?U1fq$VA&bSoat1HDMXA!cu4ArQ|3I1U4-)qe`KBcNSC15kf4spz z+`c_Gj!vqgqK%RUp+i7Bdw>AiMRHIO-#(tjE^VOQNedvJWGme|y}3w#O_qr|!TVUt z$&zD4`4m7q1xBHNA!$8BHrtLEm=zfYVMz@G@P4y*DR^^0)-yey<pOK*BQ8XX=z6t? z@0z?b_!t+voMcp&b#>ROf{r%k7KRKV0t$8bgVg?u4&;A(L_*mL^w`!E`zYuc3kokQ zV4v8-<~>Kig@ppyE4af8$NU7=&MEz!(b}uuGPKGj{4Q&<JQibYTbBr#fm(rjA?_6% z*|(*E$s?#A5lL+}KDV+0khln+QSR0MCXd<Qb7^tm*OdE>JYX`ff4U3pF5$7fQq@e= zEp39u_^?{nr?+BR{>g8(W`61*EfB%Ibw2s6NM;k7Mx?BIKlU}V;TRbjy!7o#2q@I+ z4>I>RqvbCF4uIExM(FDPa|LSh<}(f!RptO9peVD|t2^xktEEbKTg>P^|4(v_k~jU` zkeXh5x9+U~5Tlz|Ljz||o6{Ri24<U^BCC?t<bbLL$bvBEl^gpTOaa6+?EvwGp2-jZ zz#}wa+j;sX3p!H7%Km9U=?mO%L+_JWP&}`%77+R}@wtP}B6PkvHPh-y61hy>`?dfj z{gt|Fc$kofTu!1gUzE#E4BOHojdqt$RRQ?=-ib~H0G@K2<=^xZ0J$x;&L7Ye@#qh7 M9ROl?<q!7%00c`kC;$Ke
--- a/toolkit/content/tests/chrome/chrome.ini +++ b/toolkit/content/tests/chrome/chrome.ini @@ -100,16 +100,17 @@ support-files = bug451540_window.xul skip-if = (os == 'mac' && os_version == '10.10') # Unexpectedly perma-passes on OSX 10.10 [test_bug792324.xul] [test_bug1048178.xul] skip-if = toolkit == "cocoa" [test_button.xul] [test_closemenu_attribute.xul] [test_contextmenu_list.xul] [test_custom_element_base.xul] +[test_custom_element_delay_connection.xul] [test_deck.xul] [test_dialogfocus.xul] [test_editor_for_input_with_autocomplete.html] [test_editor_for_textbox_with_autocomplete.xul] [test_findbar.xul] subsuite = clipboard [test_findbar_entireword.xul] [test_findbar_events.xul]
new file mode 100644 --- /dev/null +++ b/toolkit/content/tests/chrome/test_custom_element_delay_connection.xul @@ -0,0 +1,110 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> + +<window title="Custom Element Base Delayed Connected" + onload="runTests();" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/> + + <script type="application/javascript"><![CDATA[ + let nativeDOMContentLoadedFired = false; + document.addEventListener("DOMContentLoaded", () => { + nativeDOMContentLoadedFired = true; + }, { once: true }); + + // To test `delayConnectedCallback` and `isConnectedAndReady` we have to run this before + // DOMContentLoaded, which is why this is done in a separate script that runs + // immediately and not in `runTests`. + let delayedConnectionPromise = new Promise(resolve => { + + let numSkippedAttributeChanges = 0; + let numDelayedConnections = 0; + let numDelayedDisconnections = 0; + let finishedWaitingForDOMReady = false; + + // Register this custom element before DOMContentLoaded has fired and before it's parsed in + // the markup: + customElements.define("delayed-connection", class DelayedConnection extends MozXULElement { + static get observedAttributes() { return ["foo"]; } + attributeChangedCallback() { + ok(!this.isConnectedAndReady, + "attributeChangedCallback fires before isConnectedAndReady"); + ok(!nativeDOMContentLoadedFired, + "attributeChangedCallback fires before nativeDOMContentLoadedFired"); + numSkippedAttributeChanges++; + } + connectedCallback() { + if (this.delayConnectedCallback()) { + ok(!finishedWaitingForDOMReady, + "connectedCallback with delayConnectedCallback fires before finishedWaitingForDOMReady"); + ok(!this.isConnectedAndReady, + "connectedCallback with delayConnectedCallback fires before isConnectedAndReady"); + ok(!nativeDOMContentLoadedFired, + "connectedCallback with delayConnectedCallback fires before nativeDOMContentLoadedFired"); + numDelayedConnections++; + return; + } + + ok(!finishedWaitingForDOMReady, + "connectedCallback only fires once when DOM is ready"); + ok(this.isConnectedAndReady, + "isConnectedAndReady during connectedCallback"); + ok(!nativeDOMContentLoadedFired, + "delayed connectedCallback fires before nativeDOMContentLoadedFired"); + + is(numSkippedAttributeChanges, 2, + "Correct number of skipped attribute changes"); + is(numDelayedConnections, 2, + "Correct number of delayed connections"); + is(numDelayedDisconnections, 1, + "Correct number of delated disconnections"); + + finishedWaitingForDOMReady = true; + resolve(); + } + disconnectedCallback() { + ok(this.delayConnectedCallback(), + "disconnectedCallback while DOM not ready"); + is(numDelayedDisconnections, 0, + "disconnectedCallback fired only once"); + numDelayedDisconnections++; + } + }); + }); + + // This should be called after the element is parsed below this. + function mutateDelayedConnection() { + // Fire connectedCallback and attributeChangedCallback twice before DOMContentLoaded + // fires. The first connectedCallback is due to the parse and the second due to re-appending. + let delayedConnection = document.querySelector("delayed-connection"); + delayedConnection.setAttribute("foo", "bar"); + delayedConnection.remove(); + delayedConnection.setAttribute("foo", "bat"); + document.documentElement.append(delayedConnection); + } + ]]> + </script> + + <delayed-connection></delayed-connection> + + <!-- test code goes here --> + <script type="application/javascript"><![CDATA[ + SimpleTest.waitForExplicitFinish(); + mutateDelayedConnection(); + + async function runTests() { + info("Waiting for delayed connection to fire"); + ok(nativeDOMContentLoadedFired, + "nativeDOMContentLoadedFired is true in runTests"); + await delayedConnectionPromise; + SimpleTest.finish(); + } + ]]> + </script> +</window> \ No newline at end of file
--- a/toolkit/content/widgets/radio.js +++ b/toolkit/content/widgets/radio.js @@ -107,16 +107,20 @@ class MozRadiogroup extends MozBaseContr return; } this.removeAttribute("focused"); this.focusedItem = null; }); } connectedCallback() { + if (this.delayConnectedCallback()) { + return; + } + this.init(); if (!this.value) { this.selectedIndex = 0; } } init() { this._radioChildren = null;