diff --git a/accessible/base/DocManager.cpp b/accessible/base/DocManager.cpp index c10c0acb9d15..7557ab6b8ce7 100644 --- a/accessible/base/DocManager.cpp +++ b/accessible/base/DocManager.cpp @@ -521,34 +521,6 @@ DocManager::CreateDocOrRootAccessible(nsIDocument* aDocument) docAcc->FireDelayedEvent(nsIAccessibleEvent::EVENT_REORDER, ApplicationAcc()); - if (IPCAccessibilityActive()) { - nsIDocShell* docShell = aDocument->GetDocShell(); - if (docShell) { - nsCOMPtr tabChild = docShell->GetTabChild(); - - // XXX We may need to handle the case that we don't have a tab child - // differently. It may be that this will cause us to fail to notify - // the parent process about important accessible documents. - if (tabChild) { - DocAccessibleChild* ipcDoc = new DocAccessibleChild(docAcc); - docAcc->SetIPCDoc(ipcDoc); - -#if defined(XP_WIN) - IAccessibleHolder holder(CreateHolderFromAccessible(docAcc)); -#endif - - static_cast(tabChild.get())-> - SendPDocAccessibleConstructor(ipcDoc, nullptr, 0, -#if defined(XP_WIN) - AccessibleWrap::GetChildIDFor(docAcc), - holder -#else - 0, 0 -#endif - ); - } - } - } } else { parentDocAcc->BindChildDocument(docAcc); } diff --git a/accessible/generic/DocAccessible.cpp b/accessible/generic/DocAccessible.cpp index 056c80f68223..d73df2f5dabf 100644 --- a/accessible/generic/DocAccessible.cpp +++ b/accessible/generic/DocAccessible.cpp @@ -46,6 +46,7 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/Assertions.h" #include "mozilla/EventStates.h" +#include "mozilla/dom/TabChild.h" #include "mozilla/dom/DocumentType.h" #include "mozilla/dom/Element.h" @@ -1460,8 +1461,25 @@ DocAccessible::NotifyOfLoading(bool aIsReloading) void DocAccessible::DoInitialUpdate() { - if (nsCoreUtils::IsTabDocument(mDocumentNode)) + if (nsCoreUtils::IsTabDocument(mDocumentNode)) { mDocFlags |= eTabDocument; + if (IPCAccessibilityActive()) { + nsIDocShell* docShell = mDocumentNode->GetDocShell(); + if (RefPtr tabChild = dom::TabChild::GetFrom(docShell)) { + DocAccessibleChild* ipcDoc = new DocAccessibleChild(this); + SetIPCDoc(ipcDoc); + +#if defined(XP_WIN) + IAccessibleHolder holder(CreateHolderFromAccessible(this)); + int32_t childID = AccessibleWrap::GetChildIDFor(this); +#else + int32_t holder = 0, childID = 0; +#endif + tabChild->SendPDocAccessibleConstructor(ipcDoc, nullptr, 0, childID, + holder); + } + } + } mLoadState |= eTreeConstructed; diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 95b27570e034..44e49063b838 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -872,6 +872,12 @@ function _loadURIWithFlags(browser, uri, params) { referrer, referrerPolicy, postData, null, null); } else { + // Check if the current browser is allowed to unload. + let {permitUnload, timedOut} = browser.permitUnload(); + if (!timedOut && !permitUnload) { + return; + } + if (postData) { postData = NetUtil.readInputStreamToString(postData, postData.available()); } @@ -4360,7 +4366,7 @@ var XULBrowserWindow = { }, // Check whether this URI should load in the current process - shouldLoadURI(aDocShell, aURI, aReferrer) { + shouldLoadURI(aDocShell, aURI, aReferrer, aTriggeringPrincipal) { if (!gMultiProcessBrowser) return true; @@ -4374,7 +4380,7 @@ var XULBrowserWindow = { return true; if (!E10SUtils.shouldLoadURI(aDocShell, aURI, aReferrer)) { - E10SUtils.redirectLoad(aDocShell, aURI, aReferrer); + E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, false); return false; } diff --git a/browser/base/content/tab-content.js b/browser/base/content/tab-content.js index 28bf03798c76..09b8691b5522 100644 --- a/browser/base/content/tab-content.js +++ b/browser/base/content/tab-content.js @@ -704,9 +704,9 @@ var WebBrowserChrome = { }, // Check whether this URI should load in the current process - shouldLoadURI(aDocShell, aURI, aReferrer) { + shouldLoadURI(aDocShell, aURI, aReferrer, aTriggeringPrincipal) { if (!E10SUtils.shouldLoadURI(aDocShell, aURI, aReferrer)) { - E10SUtils.redirectLoad(aDocShell, aURI, aReferrer); + E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, false); return false; } @@ -718,8 +718,8 @@ var WebBrowserChrome = { }, // Try to reload the currently active or currently loading page in a new process. - reloadInFreshProcess(aDocShell, aURI, aReferrer) { - E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, true); + reloadInFreshProcess(aDocShell, aURI, aReferrer, aTriggeringPrincipal) { + E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, true); return true; }, diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini index cdc7579bb6bf..cb9b36d81e54 100644 --- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -135,6 +135,9 @@ support-files = !/toolkit/mozapps/extensions/test/xpinstall/restartless.xpi !/toolkit/mozapps/extensions/test/xpinstall/theme.xpi !/toolkit/mozapps/extensions/test/xpinstall/slowinstall.sjs + file_about_child.html + file_about_parent.html + file_register_about_page.js [browser_aboutAccounts.js] skip-if = os == "linux" # Bug 958026 @@ -482,6 +485,7 @@ tags = mcb [browser_addCertException.js] [browser_bug1045809.js] tags = mcb +[browser_e10s_about_page_triggeringprincipal.js] [browser_e10s_switchbrowser.js] [browser_e10s_about_process.js] [browser_e10s_chrome_process.js] diff --git a/browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js b/browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js new file mode 100644 index 000000000000..5643d27ec8a3 --- /dev/null +++ b/browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js @@ -0,0 +1,44 @@ +"use strict"; +Cu.import("resource://gre/modules/Services.jsm"); + +registerCleanupFunction(function() { + Services.ppmm.broadcastAsyncMessage("AboutPrincipalTest:Unregister"); + BrowserTestUtils.waitForMessage(Services.ppmm, "AboutPrincipalTest:Unregistered").then( + Services.ppmm.removeDelayedProcessScript( + "chrome://mochitests/content/browser/browser/base/content/test/general/file_register_about_page.js" + ) + ); +}); + +add_task(function* test_principal() { + Services.ppmm.loadProcessScript( + "chrome://mochitests/content/browser/browser/base/content/test/general/file_register_about_page.js", + true + ); + + yield BrowserTestUtils.withNewTab("about:test-about-principal-parent", function*(browser) { + let loadPromise = BrowserTestUtils.browserLoaded(browser, false, "about:test-about-principal-child"); + let myLink = browser.contentDocument.getElementById("aboutchildprincipal"); + myLink.click(); + yield loadPromise; + + yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function*() { + let channel = content.document.docShell.currentDocumentChannel; + is(channel.originalURI.asciiSpec, + "about:test-about-principal-child", + "sanity check - make sure we test the principal for the correct URI"); + + let triggeringPrincipal = channel.loadInfo.triggeringPrincipal; + ok(Services.scriptSecurityManager.isSystemPrincipal(triggeringPrincipal), + "loading about: from privileged page must have a triggering of System"); + + let contentPolicyType = channel.loadInfo.externalContentPolicyType; + is(contentPolicyType, Ci.nsIContentPolicy.TYPE_DOCUMENT, + "sanity check - loading a top level document"); + + let loadingPrincipal = channel.loadInfo.loadingPrincipal; + is(loadingPrincipal, null, + "sanity check - load of TYPE_DOCUMENT must have a null loadingPrincipal"); + }); + }); +}); diff --git a/browser/base/content/test/general/file_about_child.html b/browser/base/content/test/general/file_about_child.html new file mode 100644 index 000000000000..41fb745451c5 --- /dev/null +++ b/browser/base/content/test/general/file_about_child.html @@ -0,0 +1,10 @@ + + + + + Test for Bug 1329032 + + + Just an about page that only loads in the child! + + diff --git a/browser/base/content/test/general/file_about_parent.html b/browser/base/content/test/general/file_about_parent.html new file mode 100644 index 000000000000..0d910f860b0c --- /dev/null +++ b/browser/base/content/test/general/file_about_parent.html @@ -0,0 +1,10 @@ + + + + + Test for Bug 1329032 + + + about:test-about-principal-child + + diff --git a/browser/base/content/test/general/file_register_about_page.js b/browser/base/content/test/general/file_register_about_page.js new file mode 100644 index 000000000000..f77d8118a6be --- /dev/null +++ b/browser/base/content/test/general/file_register_about_page.js @@ -0,0 +1,81 @@ +const { interfaces: Ci, results: Cr, manager: Cm, utils: Cu } = Components; +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +function AboutPage(chromeURL, aboutHost, classID, description, uriFlags) { + this.chromeURL = chromeURL; + this.aboutHost = aboutHost; + this.classID = Components.ID(classID); + this.description = description; + this.uriFlags = uriFlags; +} + +AboutPage.prototype = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]), + getURIFlags(aURI) { // eslint-disable-line no-unused-vars + return this.uriFlags; + }, + + newChannel(aURI, aLoadInfo) { + let newURI = Services.io.newURI(this.chromeURL); + let channel = Services.io.newChannelFromURIWithLoadInfo(newURI, + aLoadInfo); + channel.originalURI = aURI; + + if (this.uriFlags & Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT) { + channel.owner = null; + } + return channel; + }, + + createInstance(outer, iid) { + if (outer !== null) { + throw Cr.NS_ERROR_NO_AGGREGATION; + } + return this.QueryInterface(iid); + }, + + register() { + Cm.QueryInterface(Ci.nsIComponentRegistrar).registerFactory( + this.classID, this.description, + "@mozilla.org/network/protocol/about;1?what=" + this.aboutHost, this); + }, + + unregister() { + Cm.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactory( + this.classID, this); + } +}; + +/* exported AboutPrincipalTest */ +var AboutPrincipalTest = {}; + +XPCOMUtils.defineLazyGetter(AboutPrincipalTest, "aboutChild", () => + new AboutPage("chrome://mochitests/content/browser/browser/base/content/test/general/file_about_child.html", + "test-about-principal-child", + "{df6cbd19-c95b-4011-874b-315347c0832c}", + "About Principal Child Test", + Ci.nsIAboutModule.URI_MUST_LOAD_IN_CHILD | + Ci.nsIAboutModule.ALLOW_SCRIPT) + +); + +XPCOMUtils.defineLazyGetter(AboutPrincipalTest, "aboutParent", () => + new AboutPage("chrome://mochitests/content/browser/browser/base/content/test/general/file_about_parent.html", + "test-about-principal-parent", + "{15e1a03d-9f94-4352-bfb8-94216140d3ab}", + "About Principal Parent Test", + Ci.nsIAboutModule.ALLOW_SCRIPT) +); + +AboutPrincipalTest.aboutParent.register(); +AboutPrincipalTest.aboutChild.register(); + +function onUnregisterMessage() { + removeMessageListener("AboutPrincipalTest:Unregister", onUnregisterMessage); + AboutPrincipalTest.aboutParent.unregister(); + AboutPrincipalTest.aboutChild.unregister(); + sendAsyncMessage("AboutPrincipalTest:Unregistered"); +} + +addMessageListener("AboutPrincipalTest:Unregister", onUnregisterMessage); diff --git a/browser/components/sessionstore/ContentRestore.jsm b/browser/components/sessionstore/ContentRestore.jsm index 3c01c63749f3..8d0bd7e335d1 100644 --- a/browser/components/sessionstore/ContentRestore.jsm +++ b/browser/components/sessionstore/ContentRestore.jsm @@ -204,6 +204,9 @@ ContentRestoreInternal.prototype = { : Ci.nsIHttpChannel.REFERRER_POLICY_UNSET); let postData = loadArguments.postData ? Utils.makeInputStream(loadArguments.postData) : null; + let triggeringPrincipal = loadArguments.triggeringPrincipal + ? Utils.deserializePrincipal(loadArguments.triggeringPrincipal) + : null; if (loadArguments.userContextId) { webNavigation.setOriginAttributesBeforeLoading({ userContextId: loadArguments.userContextId }); @@ -211,7 +214,7 @@ ContentRestoreInternal.prototype = { webNavigation.loadURIWithOptions(loadArguments.uri, loadArguments.flags, referrer, referrerPolicy, postData, - null, null); + null, null, triggeringPrincipal); } else if (tabData.userTypedValue && tabData.userTypedClear) { // If the user typed a URL into the URL bar and hit enter right before // we crashed, we want to start loading that page again. A non-zero diff --git a/browser/modules/E10SUtils.jsm b/browser/modules/E10SUtils.jsm index e8968dea600d..0ed05d41b156 100644 --- a/browser/modules/E10SUtils.jsm +++ b/browser/modules/E10SUtils.jsm @@ -13,6 +13,8 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyPreferenceGetter(this, "useRemoteWebExtensions", "extensions.webextensions.remote", false); +XPCOMUtils.defineLazyModuleGetter(this, "Utils", + "resource://gre/modules/sessionstore/Utils.jsm"); function getAboutModule(aURL) { // Needs to match NS_GetAboutModuleName @@ -163,7 +165,7 @@ this.E10SUtils = { return this.shouldLoadURIInThisProcess(aURI); }, - redirectLoad(aDocShell, aURI, aReferrer, aFreshProcess) { + redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, aFreshProcess) { // Retarget the load to the correct process let messageManager = aDocShell.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIContentFrameMessageManager); @@ -174,6 +176,9 @@ this.E10SUtils = { uri: aURI.spec, flags: Ci.nsIWebNavigation.LOAD_FLAGS_NONE, referrer: aReferrer ? aReferrer.spec : null, + triggeringPrincipal: aTriggeringPrincipal + ? Utils.serializePrincipal(aTriggeringPrincipal) + : null, reloadInFreshProcess: !!aFreshProcess, }, historyIndex: sessionHistory.requestedIndex, diff --git a/devtools/client/responsive.html/browser/web-navigation.js b/devtools/client/responsive.html/browser/web-navigation.js index dfba2587e6b7..582b3a1a5b60 100644 --- a/devtools/client/responsive.html/browser/web-navigation.js +++ b/devtools/client/responsive.html/browser/web-navigation.js @@ -8,6 +8,7 @@ const { Ci, Cu, Cr } = require("chrome"); const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm"); const Services = require("Services"); const { NetUtil } = require("resource://gre/modules/NetUtil.jsm"); +const { Utils } = require("resource://gre/modules/sessionstore/Utils.jsm"); function readInputStreamToString(stream) { return NetUtil.readInputStreamToString(stream, stream.available()); @@ -61,11 +62,11 @@ BrowserElementWebNavigation.prototype = { // No equivalent in the current BrowserElement API this.loadURIWithOptions(uri, flags, referrer, Ci.nsIHttpChannel.REFERRER_POLICY_UNSET, - postData, headers, null); + postData, headers, null, null); }, loadURIWithOptions(uri, flags, referrer, referrerPolicy, postData, headers, - baseURI) { + baseURI, triggeringPrincipal) { // No equivalent in the current BrowserElement API this._sendMessage("WebNavigation:LoadURI", { uri, @@ -75,6 +76,9 @@ BrowserElementWebNavigation.prototype = { postData: postData ? readInputStreamToString(postData) : null, headers: headers ? readInputStreamToString(headers) : null, baseURI: baseURI ? baseURI.spec : null, + triggeringPrincipal: triggeringPrincipal + ? Utils.serializePrincipal(triggeringPrincipal) + : null, }); }, diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index a82b60b53e1b..4b9f8bc6c649 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -4698,7 +4698,7 @@ nsDocShell::LoadURI(const char16_t* aURI, { return LoadURIWithOptions(aURI, aLoadFlags, aReferringURI, mozilla::net::RP_Unset, aPostStream, - aHeaderStream, nullptr); + aHeaderStream, nullptr, nullptr); } NS_IMETHODIMP @@ -4708,7 +4708,8 @@ nsDocShell::LoadURIWithOptions(const char16_t* aURI, uint32_t aReferrerPolicy, nsIInputStream* aPostStream, nsIInputStream* aHeaderStream, - nsIURI* aBaseURI) + nsIURI* aBaseURI, + nsIPrincipal* aTriggeringPrincipal) { NS_ASSERTION((aLoadFlags & 0xf) == 0, "Unexpected flags"); @@ -4824,6 +4825,7 @@ nsDocShell::LoadURIWithOptions(const char16_t* aURI, loadInfo->SetReferrerPolicy(aReferrerPolicy); loadInfo->SetHeadersStream(aHeaderStream); loadInfo->SetBaseURI(aBaseURI); + loadInfo->SetTriggeringPrincipal(aTriggeringPrincipal); if (fixupInfo) { nsAutoString searchProvider, keyword; @@ -10467,25 +10469,6 @@ nsDocShell::InternalLoad(nsIURI* aURI, } } - // Check if the webbrowser chrome wants the load to proceed; this can be - // used to cancel attempts to load URIs in the wrong process. - nsCOMPtr browserChrome3 = do_GetInterface(mTreeOwner); - if (browserChrome3) { - // In case this is a remote newtab load, set aURI to aOriginalURI (newtab). - // This ensures that the verifySignedContent flag is set on loadInfo in - // DoURILoad. - nsIURI* uriForShouldLoadCheck = aURI; - if (IsAboutNewtab(aOriginalURI)) { - uriForShouldLoadCheck = aOriginalURI; - } - bool shouldLoad; - rv = browserChrome3->ShouldLoadURI(this, uriForShouldLoadCheck, aReferrer, - &shouldLoad); - if (NS_SUCCEEDED(rv) && !shouldLoad) { - return NS_OK; - } - } - // mContentViewer->PermitUnload can destroy |this| docShell, which // causes the next call of CanSavePresentation to crash. // Hold onto |this| until we return, to prevent a crash from happening. @@ -10524,6 +10507,25 @@ nsDocShell::InternalLoad(nsIURI* aURI, mTiming->NotifyUnloadAccepted(mCurrentURI); } + // Check if the webbrowser chrome wants the load to proceed; this can be + // used to cancel attempts to load URIs in the wrong process. + nsCOMPtr browserChrome3 = do_GetInterface(mTreeOwner); + if (browserChrome3) { + // In case this is a remote newtab load, set aURI to aOriginalURI (newtab). + // This ensures that the verifySignedContent flag is set on loadInfo in + // DoURILoad. + nsIURI* uriForShouldLoadCheck = aURI; + if (IsAboutNewtab(aOriginalURI)) { + uriForShouldLoadCheck = aOriginalURI; + } + bool shouldLoad; + rv = browserChrome3->ShouldLoadURI(this, uriForShouldLoadCheck, aReferrer, + aTriggeringPrincipal, &shouldLoad); + if (NS_SUCCEEDED(rv) && !shouldLoad) { + return NS_OK; + } + } + if (browserChrome3 && aCheckForPrerender) { nsCOMPtr ev = new InternalLoadEvent(this, aURI, aOriginalURI, aLoadReplace, diff --git a/docshell/base/nsIWebNavigation.idl b/docshell/base/nsIWebNavigation.idl index 0de4b85b2ce4..5e74b36eb425 100644 --- a/docshell/base/nsIWebNavigation.idl +++ b/docshell/base/nsIWebNavigation.idl @@ -9,6 +9,7 @@ interface nsIDOMDocument; interface nsIInputStream; interface nsISHistory; interface nsIURI; +interface nsIPrincipal; /** * The nsIWebNavigation interface defines an interface for navigating the web. @@ -282,14 +283,20 @@ interface nsIWebNavigation : nsISupports * that at present this argument is only used with view-source aURIs * and cannot be used to resolve aURI. * This parameter is optional and may be null. + * @param aTriggeringPrincipal + * The principal that initiated the load of aURI. If omitted docShell + * tries to create a codeBasePrincipal from aReferrer if not null. If + * aReferrer is also null docShell peforms a load using the + * SystemPrincipal as the triggeringPrincipal. */ - void loadURIWithOptions(in wstring aURI, - in unsigned long aLoadFlags, - in nsIURI aReferrer, - in unsigned long aReferrerPolicy, - in nsIInputStream aPostData, - in nsIInputStream aHeaders, - in nsIURI aBaseURI); + void loadURIWithOptions(in wstring aURI, + in unsigned long aLoadFlags, + in nsIURI aReferrer, + in unsigned long aReferrerPolicy, + in nsIInputStream aPostData, + in nsIInputStream aHeaders, + in nsIURI aBaseURI, + [optional] in nsIPrincipal aTriggeringPrincipal); /** * Tells the Object to reload the current page. There may be cases where the diff --git a/docshell/shistory/nsSHistory.cpp b/docshell/shistory/nsSHistory.cpp index 61df1aa13640..504f47439614 100644 --- a/docshell/shistory/nsSHistory.cpp +++ b/docshell/shistory/nsSHistory.cpp @@ -1618,7 +1618,8 @@ nsSHistory::LoadURIWithOptions(const char16_t* aURI, uint32_t aReferrerPolicy, nsIInputStream* aPostStream, nsIInputStream* aExtraHeaderStream, - nsIURI* aBaseURI) + nsIURI* aBaseURI, + nsIPrincipal* aTriggeringPrincipal) { return NS_OK; } diff --git a/dom/base/Attr.cpp b/dom/base/Attr.cpp index df05ef5cb698..a6816f3a98dd 100644 --- a/dom/base/Attr.cpp +++ b/dom/base/Attr.cpp @@ -277,7 +277,7 @@ Attr::GetBaseURI(bool aTryUseXHRDocBaseURI) const void Attr::GetTextContentInternal(nsAString& aTextContent, - ErrorResult& aError) + OOMReporter& aError) { OwnerDoc()->WarnOnceAbout(nsIDocument::eTextContent); diff --git a/dom/base/Attr.h b/dom/base/Attr.h index 39ac8b19557b..a88300986a8f 100644 --- a/dom/base/Attr.h +++ b/dom/base/Attr.h @@ -44,7 +44,7 @@ public: // nsIDOMNode interface NS_FORWARD_NSIDOMNODE_TO_NSINODE virtual void GetTextContentInternal(nsAString& aTextContent, - ErrorResult& aError) override; + OOMReporter& aError) override; virtual void SetTextContentInternal(const nsAString& aTextContent, ErrorResult& aError) override; virtual void GetNodeValueInternal(nsAString& aNodeValue) override; diff --git a/dom/base/DocGroup.cpp b/dom/base/DocGroup.cpp index 61cb1ff3d0d9..021853c22e62 100644 --- a/dom/base/DocGroup.cpp +++ b/dom/base/DocGroup.cpp @@ -14,24 +14,34 @@ namespace mozilla { namespace dom { -/* static */ void +/* static */ nsresult DocGroup::GetKey(nsIPrincipal* aPrincipal, nsACString& aKey) { aKey.Truncate(); nsCOMPtr uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); + if (NS_FAILED(rv)) { + return NS_OK; // aKey is the empty string + } + // GetBaseDomain works fine if |uri| is null, but it outputs a warning // which ends up cluttering the logs. - if (NS_SUCCEEDED(rv) && uri) { - nsCOMPtr tldService = - do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); - if (tldService) { - rv = tldService->GetBaseDomain(uri, 0, aKey); - if (NS_FAILED(rv)) { - aKey.Truncate(); - } - } + if (!uri) { + return NS_OK; // aKey is the empty string } + + nsCOMPtr tldService = + do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); + if (!tldService) { + return NS_ERROR_FAILURE; + } + + rv = tldService->GetBaseDomain(uri, 0, aKey); + if (NS_FAILED(rv)) { + aKey.Truncate(); + } + + return NS_OK; // aKey may be the empty string } void diff --git a/dom/base/DocGroup.h b/dom/base/DocGroup.h index 5e0a5171242e..90c7ea10c115 100644 --- a/dom/base/DocGroup.h +++ b/dom/base/DocGroup.h @@ -44,7 +44,12 @@ public: NS_DECL_THREADSAFE_ISUPPORTS - static void GetKey(nsIPrincipal* aPrincipal, nsACString& aString); + // Returns NS_ERROR_FAILURE and sets |aString| to an empty string if the TLD + // service isn't available. Returns NS_OK on success, but may still set + // |aString| may still be set to an empty string. + static MOZ_MUST_USE nsresult + GetKey(nsIPrincipal* aPrincipal, nsACString& aString); + bool MatchesKey(const nsACString& aKey) { return aKey == mKey; diff --git a/dom/base/FragmentOrElement.cpp b/dom/base/FragmentOrElement.cpp index 13a3ea6ae326..87a0b2e7b0ec 100644 --- a/dom/base/FragmentOrElement.cpp +++ b/dom/base/FragmentOrElement.cpp @@ -1161,10 +1161,10 @@ FragmentOrElement::RemoveChildAt(uint32_t aIndex, bool aNotify) void FragmentOrElement::GetTextContentInternal(nsAString& aTextContent, - ErrorResult& aError) + OOMReporter& aError) { if (!nsContentUtils::GetNodeTextContent(this, true, aTextContent, fallible)) { - aError.Throw(NS_ERROR_OUT_OF_MEMORY); + aError.ReportOOM(); } } diff --git a/dom/base/FragmentOrElement.h b/dom/base/FragmentOrElement.h index 65ab7bea0cdb..f3a6a01306a1 100644 --- a/dom/base/FragmentOrElement.h +++ b/dom/base/FragmentOrElement.h @@ -124,7 +124,7 @@ public: bool aNotify) override; virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) override; virtual void GetTextContentInternal(nsAString& aTextContent, - mozilla::ErrorResult& aError) override; + mozilla::OOMReporter& aError) override; virtual void SetTextContentInternal(const nsAString& aTextContent, mozilla::ErrorResult& aError) override; diff --git a/dom/base/Timeout.cpp b/dom/base/Timeout.cpp index 27278bad318b..77250ef91a21 100644 --- a/dom/base/Timeout.cpp +++ b/dom/base/Timeout.cpp @@ -18,6 +18,7 @@ Timeout::Timeout() : mCleared(false), mRunning(false), mIsInterval(false), + mIsTracking(false), mReason(Reason::eTimeoutOrInterval), mTimeoutId(0), mInterval(0), diff --git a/dom/base/Timeout.h b/dom/base/Timeout.h index 07d286908e68..27e15da4ae7c 100644 --- a/dom/base/Timeout.h +++ b/dom/base/Timeout.h @@ -73,6 +73,9 @@ public: // True if this is a repeating/interval timer bool mIsInterval; + // True if this is a timeout coming from a tracking script + bool mIsTracking; + Reason mReason; // Returned as value of setTimeout() diff --git a/dom/base/TimeoutManager.cpp b/dom/base/TimeoutManager.cpp index d5e9e274c3ef..f50d88b4898a 100644 --- a/dom/base/TimeoutManager.cpp +++ b/dom/base/TimeoutManager.cpp @@ -20,18 +20,25 @@ static int32_t gRunningTimeoutDepth = 0; // The default shortest interval/timeout we permit #define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms #define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms -static int32_t gMinTimeoutValue; -static int32_t gMinBackgroundTimeoutValue; +#define DEFAULT_MIN_TRACKING_TIMEOUT_VALUE 4 // 4ms +#define DEFAULT_MIN_TRACKING_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms +static int32_t gMinTimeoutValue = 0; +static int32_t gMinBackgroundTimeoutValue = 0; +static int32_t gMinTrackingTimeoutValue = 0; +static int32_t gMinTrackingBackgroundTimeoutValue = 0; int32_t -TimeoutManager::DOMMinTimeoutValue() const { +TimeoutManager::DOMMinTimeoutValue(bool aIsTracking) const { // First apply any back pressure delay that might be in effect. int32_t value = std::max(mBackPressureDelayMS, 0); // Don't use the background timeout value when there are audio contexts // present, so that background audio can keep running smoothly. (bug 1181073) bool isBackground = !mWindow.AsInner()->HasAudioContexts() && mWindow.IsBackgroundInternal(); - return - std::max(isBackground ? gMinBackgroundTimeoutValue : gMinTimeoutValue, value); + auto minValue = aIsTracking ? (isBackground ? gMinTrackingBackgroundTimeoutValue + : gMinTrackingTimeoutValue) + : (isBackground ? gMinBackgroundTimeoutValue + : gMinTimeoutValue); + return std::max(minValue, value); } #define TRACKING_SEPARATE_TIMEOUT_BUCKETING_STRATEGY 0 // Consider all timeouts coming from tracking scripts as tracking @@ -120,6 +127,12 @@ TimeoutManager::Initialize() Preferences::AddIntVarCache(&gMinBackgroundTimeoutValue, "dom.min_background_timeout_value", DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE); + Preferences::AddIntVarCache(&gMinTrackingTimeoutValue, + "dom.min_tracking_timeout_value", + DEFAULT_MIN_TRACKING_TIMEOUT_VALUE); + Preferences::AddIntVarCache(&gMinTrackingBackgroundTimeoutValue, + "dom.min_tracking_background_timeout_value", + DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE); Preferences::AddIntVarCache(&gTimeoutBucketingStrategy, "dom.timeout_bucketing_strategy", TRACKING_SEPARATE_TIMEOUT_BUCKETING_STRATEGY); @@ -167,6 +180,27 @@ TimeoutManager::SetTimeout(nsITimeoutHandler* aHandler, timeout->mScriptHandler = aHandler; timeout->mReason = aReason; + switch (gTimeoutBucketingStrategy) { + default: + case TRACKING_SEPARATE_TIMEOUT_BUCKETING_STRATEGY: { + const char* filename = nullptr; + uint32_t dummyLine = 0, dummyColumn = 0; + aHandler->GetLocation(&filename, &dummyLine, &dummyColumn); + timeout->mIsTracking = doc->IsScriptTracking(nsDependentCString(filename)); + break; + } + case ALL_NORMAL_TIMEOUT_BUCKETING_STRATEGY: + // timeout->mIsTracking is already false! + MOZ_DIAGNOSTIC_ASSERT(!timeout->mIsTracking); + break; + case ALTERNATE_TIMEOUT_BUCKETING_STRATEGY: + timeout->mIsTracking = (mTimeoutIdCounter % 2) == 0; + break; + case RANDOM_TIMEOUT_BUCKETING_STRATEGY: + timeout->mIsTracking = (rand() % 2) == 0; + break; + } + // Now clamp the actual interval we will use for the timer based on uint32_t nestingLevel = sNestingLevel + 1; uint32_t realInterval = interval; @@ -174,7 +208,8 @@ TimeoutManager::SetTimeout(nsITimeoutHandler* aHandler, mBackPressureDelayMS > 0 || mWindow.IsBackgroundInternal()) { // Don't allow timeouts less than DOMMinTimeoutValue() from // now... - realInterval = std::max(realInterval, uint32_t(DOMMinTimeoutValue())); + realInterval = std::max(realInterval, + uint32_t(DOMMinTimeoutValue(timeout->mIsTracking))); } timeout->mWindow = &mWindow; @@ -229,30 +264,9 @@ TimeoutManager::SetTimeout(nsITimeoutHandler* aHandler, } } - bool isTracking = false; - switch (gTimeoutBucketingStrategy) { - default: - case TRACKING_SEPARATE_TIMEOUT_BUCKETING_STRATEGY: { - const char* filename = nullptr; - uint32_t dummyLine = 0, dummyColumn = 0; - aHandler->GetLocation(&filename, &dummyLine, &dummyColumn); - isTracking = doc->IsScriptTracking(nsDependentCString(filename)); - break; - } - case ALL_NORMAL_TIMEOUT_BUCKETING_STRATEGY: - // isTracking is already false! - break; - case ALTERNATE_TIMEOUT_BUCKETING_STRATEGY: - isTracking = (mTimeoutIdCounter % 2) == 0; - break; - case RANDOM_TIMEOUT_BUCKETING_STRATEGY: - isTracking = (rand() % 2) == 0; - break; - } - Timeouts::SortBy sort(mWindow.IsFrozen() ? Timeouts::SortBy::TimeRemaining : Timeouts::SortBy::TimeWhen); - if (isTracking) { + if (timeout->mIsTracking) { mTrackingTimeouts.Insert(timeout, sort); } else { mNormalTimeouts.Insert(timeout, sort); @@ -680,8 +694,9 @@ TimeoutManager::RescheduleTimeout(Timeout* aTimeout, const TimeStamp& now, // Compute time to next timeout for interval timer. // Make sure nextInterval is at least DOMMinTimeoutValue(). TimeDuration nextInterval = - TimeDuration::FromMilliseconds(std::max(aTimeout->mInterval, - uint32_t(DOMMinTimeoutValue()))); + TimeDuration::FromMilliseconds( + std::max(aTimeout->mInterval, + uint32_t(DOMMinTimeoutValue(aTimeout->mIsTracking)))); // If we're running pending timeouts, set the next interval to be // relative to "now", and not to when the timeout that was pending @@ -752,18 +767,17 @@ TimeoutManager::ResetTimersForThrottleReduction(int32_t aPreviousThrottleDelayMS return NS_OK; } - auto minTimeout = DOMMinTimeoutValue(); Timeouts::SortBy sortBy = mWindow.IsFrozen() ? Timeouts::SortBy::TimeRemaining : Timeouts::SortBy::TimeWhen; nsCOMPtr queue = mWindow.EventTargetFor(TaskCategory::Timer); nsresult rv = mNormalTimeouts.ResetTimersForThrottleReduction(aPreviousThrottleDelayMS, - minTimeout, + *this, sortBy, queue); NS_ENSURE_SUCCESS(rv, rv); rv = mTrackingTimeouts.ResetTimersForThrottleReduction(aPreviousThrottleDelayMS, - minTimeout, + *this, sortBy, queue); NS_ENSURE_SUCCESS(rv, rv); @@ -773,7 +787,7 @@ TimeoutManager::ResetTimersForThrottleReduction(int32_t aPreviousThrottleDelayMS nsresult TimeoutManager::Timeouts::ResetTimersForThrottleReduction(int32_t aPreviousThrottleDelayMS, - int32_t aMinTimeoutValueMS, + const TimeoutManager& aTimeoutManager, SortBy aSortBy, nsIEventTarget* aQueue) { @@ -809,8 +823,10 @@ TimeoutManager::Timeouts::ResetTimersForThrottleReduction(int32_t aPreviousThrot // Compute the interval the timer should have had if it had not been set in a // background window TimeDuration interval = - TimeDuration::FromMilliseconds(std::max(timeout->mInterval, - uint32_t(aMinTimeoutValueMS))); + TimeDuration::FromMilliseconds( + std::max(timeout->mInterval, + uint32_t(aTimeoutManager. + DOMMinTimeoutValue(timeout->mIsTracking)))); uint32_t oldIntervalMillisecs = 0; timeout->mTimer->GetDelay(&oldIntervalMillisecs); TimeDuration oldInterval = TimeDuration::FromMilliseconds(oldIntervalMillisecs); @@ -1014,7 +1030,7 @@ TimeoutManager::Resume() if (aTimeout->When() > now) { remaining = static_cast((aTimeout->When() - now).ToMilliseconds()); } - uint32_t delay = std::max(remaining, DOMMinTimeoutValue()); + uint32_t delay = std::max(remaining, DOMMinTimeoutValue(aTimeout->mIsTracking)); aTimeout->mTimer = do_CreateInstance("@mozilla.org/timer;1"); if (!aTimeout->mTimer) { diff --git a/dom/base/TimeoutManager.h b/dom/base/TimeoutManager.h index eff4a7890139..9497c223e2df 100644 --- a/dom/base/TimeoutManager.h +++ b/dom/base/TimeoutManager.h @@ -67,7 +67,7 @@ public: // order to bound how many timers must be examined. nsresult ResetTimersForThrottleReduction(); - int32_t DOMMinTimeoutValue() const; + int32_t DOMMinTimeoutValue(bool aIsTracking) const; // aTimeout is the timeout that we're about to start running. This function // returns the current timeout. @@ -129,7 +129,7 @@ private: }; void Insert(mozilla::dom::Timeout* aTimeout, SortBy aSortBy); nsresult ResetTimersForThrottleReduction(int32_t aPreviousThrottleDelayMS, - int32_t aMinTimeoutValueMS, + const TimeoutManager& aTimeoutManager, SortBy aSortBy, nsIEventTarget* aQueue); diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index 87edbe425420..493202ce5a78 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -9776,9 +9776,13 @@ nsContentUtils::AttemptLargeAllocationLoad(nsIHttpChannel* aChannel) rv = aChannel->GetReferrer(getter_AddRefs(referrer)); NS_ENSURE_SUCCESS(rv, false); + nsCOMPtr loadInfo = aChannel->GetLoadInfo(); + nsCOMPtr triggeringPrincipal = loadInfo->TriggeringPrincipal(); + // Actually perform the cross process load bool reloadSucceeded = false; - rv = wbc3->ReloadInFreshProcess(docShell, uri, referrer, &reloadSucceeded); + rv = wbc3->ReloadInFreshProcess(docShell, uri, referrer, + triggeringPrincipal, &reloadSucceeded); NS_ENSURE_SUCCESS(rv, false); return reloadSucceeded; diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 543dc0ff9bd1..f65e5af446bd 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -2867,8 +2867,12 @@ nsIDocument::GetDocGroup() const // Sanity check that we have an up-to-date and accurate docgroup if (mDocGroup) { nsAutoCString docGroupKey; - mozilla::dom::DocGroup::GetKey(NodePrincipal(), docGroupKey); - MOZ_ASSERT(mDocGroup->MatchesKey(docGroupKey)); + + // GetKey() can fail, e.g. after the TLD service has shut down. + nsresult rv = mozilla::dom::DocGroup::GetKey(NodePrincipal(), docGroupKey); + if (NS_SUCCEEDED(rv)) { + MOZ_ASSERT(mDocGroup->MatchesKey(docGroupKey)); + } // XXX: Check that the TabGroup is correct as well! } #endif @@ -4201,10 +4205,13 @@ nsDocument::SetStyleSheetApplicableState(StyleSheet* aSheet, } if (!mSSApplicableStateNotificationPending) { + MOZ_RELEASE_ASSERT(NS_IsMainThread()); nsCOMPtr notification = NewRunnableMethod(this, &nsDocument::NotifyStyleSheetApplicableStateChanged); mSSApplicableStateNotificationPending = - NS_SUCCEEDED(NS_DispatchToCurrentThread(notification)); + NS_SUCCEEDED( + Dispatch("nsDocument::NotifyStyleSheetApplicableStateChanged", + TaskCategory::Other, notification.forget())); } } @@ -4377,9 +4384,12 @@ nsDocument::SetScopeObject(nsIGlobalObject* aGlobal) // We should already have the principal, and now that we have been added to a // window, we should be able to join a DocGroup! nsAutoCString docGroupKey; - mozilla::dom::DocGroup::GetKey(NodePrincipal(), docGroupKey); + nsresult rv = + mozilla::dom::DocGroup::GetKey(NodePrincipal(), docGroupKey); if (mDocGroup) { - MOZ_RELEASE_ASSERT(mDocGroup->MatchesKey(docGroupKey)); + if (NS_SUCCEEDED(rv)) { + MOZ_RELEASE_ASSERT(mDocGroup->MatchesKey(docGroupKey)); + } } else { mDocGroup = tabgroup->AddDocument(docGroupKey, this); MOZ_ASSERT(mDocGroup); @@ -6752,10 +6762,11 @@ nsDocument::NotifyPossibleTitleChange(bool aBoundTitleElement) if (mPendingTitleChangeEvent.IsPending()) return; - RefPtr > event = - NewNonOwningRunnableMethod(this, - &nsDocument::DoNotifyPossibleTitleChange); - nsresult rv = NS_DispatchToCurrentThread(event); + MOZ_RELEASE_ASSERT(NS_IsMainThread()); + RefPtr> event = + NewNonOwningRunnableMethod(this, &nsDocument::DoNotifyPossibleTitleChange); + nsresult rv = Dispatch("nsDocument::DoNotifyPossibleTitleChange", + TaskCategory::Other, do_AddRef(event)); if (NS_SUCCEEDED(rv)) { mPendingTitleChangeEvent = event; } @@ -8625,8 +8636,10 @@ private: void nsDocument::PostUnblockOnloadEvent() { + MOZ_RELEASE_ASSERT(NS_IsMainThread()); nsCOMPtr evt = new nsUnblockOnloadEvent(this); - nsresult rv = NS_DispatchToCurrentThread(evt); + nsresult rv = + Dispatch("nsUnblockOnloadEvent", TaskCategory::Other, evt.forget()); if (NS_SUCCEEDED(rv)) { // Stabilize block count so we don't post more events while this one is up ++mOnloadBlockCount; @@ -9556,7 +9569,9 @@ nsDocument::UnsuppressEventHandlingAndFireEvents(nsIDocument::SuppressionType aW } if (aFireEvents) { - NS_DispatchToCurrentThread(new nsDelayedEventDispatcher(args.mDocs)); + MOZ_RELEASE_ASSERT(NS_IsMainThread()); + nsCOMPtr ded = new nsDelayedEventDispatcher(args.mDocs); + Dispatch("nsDelayedEventDispatcher", TaskCategory::Other, ded.forget()); } else { FireOrClearDelayedEvents(args.mDocs, false); } @@ -10580,7 +10595,13 @@ private: /* static */ void nsIDocument::AsyncExitFullscreen(nsIDocument* aDoc) { - NS_DispatchToCurrentThread(new nsCallExitFullscreen(aDoc)); + MOZ_RELEASE_ASSERT(NS_IsMainThread()); + nsCOMPtr exit = new nsCallExitFullscreen(aDoc); + if (aDoc) { + aDoc->Dispatch("nsCallExitFullscreen", TaskCategory::Other, exit.forget()); + } else { + NS_DispatchToCurrentThread(exit.forget()); + } } static bool @@ -10850,8 +10871,9 @@ nsDocument::AsyncRequestFullScreen(UniquePtr&& aRequest) } // Request full-screen asynchronously. - nsCOMPtr event(new nsCallRequestFullScreen(Move(aRequest))); - NS_DispatchToCurrentThread(event); + MOZ_RELEASE_ASSERT(NS_IsMainThread()); + nsCOMPtr event = new nsCallRequestFullScreen(Move(aRequest)); + Dispatch("nsCallRequestFullScreen", TaskCategory::Other, event.forget()); } void @@ -11725,8 +11747,9 @@ nsDocument::RequestPointerLock(Element* aElement, CallerType aCallerType) bool userInputOrSystemCaller = EventStateManager::IsHandlingUserInput() || aCallerType == CallerType::System; - NS_DispatchToMainThread(new PointerLockRequest(aElement, - userInputOrSystemCaller)); + nsCOMPtr request = + new PointerLockRequest(aElement, userInputOrSystemCaller); + Dispatch("PointerLockRequest", TaskCategory::Other, request.forget()); } bool @@ -12450,9 +12473,11 @@ nsDocument::UpdateIntersectionObservations() void nsDocument::ScheduleIntersectionObserverNotification() { - nsCOMPtr notification = NewRunnableMethod(this, - &nsDocument::NotifyIntersectionObservers); - NS_DispatchToCurrentThread(notification); + MOZ_RELEASE_ASSERT(NS_IsMainThread()); + nsCOMPtr notification = + NewRunnableMethod(this, &nsDocument::NotifyIntersectionObservers); + Dispatch("nsDocument::IntersectionObserverNotification", TaskCategory::Other, + notification.forget()); } void @@ -12734,9 +12759,11 @@ nsIDocument::RebuildUserFontSet() // which starts font loads, whose completion causes another style // change reflow). if (!mPostedFlushUserFontSet) { + MOZ_RELEASE_ASSERT(NS_IsMainThread()); nsCOMPtr ev = NewRunnableMethod(this, &nsIDocument::HandleRebuildUserFontSet); - if (NS_SUCCEEDED(NS_DispatchToCurrentThread(ev))) { + if (NS_SUCCEEDED(Dispatch("nsIDocument::HandleRebuildUserFontSet", + TaskCategory::Other, ev.forget()))) { mPostedFlushUserFontSet = true; } } diff --git a/dom/base/nsGenericDOMDataNode.h b/dom/base/nsGenericDOMDataNode.h index 3e2b1cbf0720..49e641915a57 100644 --- a/dom/base/nsGenericDOMDataNode.h +++ b/dom/base/nsGenericDOMDataNode.h @@ -89,7 +89,7 @@ public: bool aNotify) override; virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) override; virtual void GetTextContentInternal(nsAString& aTextContent, - mozilla::ErrorResult& aError) override + mozilla::OOMReporter& aError) override { GetNodeValue(aTextContent); } diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 31c73c930bdb..421cb758c42f 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -8604,7 +8604,8 @@ public: static nsresult PostCloseEvent(nsGlobalWindow* aWindow, bool aIndirect) { nsCOMPtr ev = new nsCloseEvent(aWindow, aIndirect); - nsresult rv = NS_DispatchToCurrentThread(ev); + nsresult rv = + aWindow->Dispatch("nsCloseEvent", TaskCategory::Other, ev.forget()); if (NS_SUCCEEDED(rv)) aWindow->MaybeForgiveSpamCount(); return rv; @@ -9083,7 +9084,8 @@ void nsGlobalWindow::NotifyWindowIDDestroyed(const char* aTopic) { nsCOMPtr runnable = new WindowDestroyedEvent(this, mWindowID, aTopic); - nsresult rv = NS_DispatchToCurrentThread(runnable); + nsresult rv = + Dispatch("WindowDestroyedEvent", TaskCategory::Other, runnable.forget()); if (NS_SUCCEEDED(rv)) { mNotifiedIDDestroyed = true; } @@ -10346,7 +10348,7 @@ nsGlobalWindow::DispatchAsyncHashchange(nsIURI *aOldURI, nsIURI *aNewURI) nsCOMPtr callback = new HashchangeCallback(oldWideSpec, newWideSpec, this); - return NS_DispatchToMainThread(callback); + return Dispatch("HashchangeCallback", TaskCategory::Other, callback.forget()); } nsresult @@ -10950,7 +10952,8 @@ nsGlobalWindow::NotifyIdleObserver(IdleObserverHolder* aIdleObserverHolder, new NotifyIdleObserverRunnable(aIdleObserverHolder->mIdleObserver, aIdleObserverHolder->mTimeInS, aCallOnidle, this); - if (NS_FAILED(NS_DispatchToCurrentThread(caller))) { + if (NS_FAILED(Dispatch("NotifyIdleObserverRunnable", TaskCategory::Other, + caller.forget()))) { NS_WARNING("Failed to dispatch thread for idle observer notification."); } } @@ -12146,7 +12149,9 @@ public: ~AutoUnblockScriptClosing() { void (nsGlobalWindow::*run)() = &nsGlobalWindow::UnblockScriptedClosing; - NS_DispatchToCurrentThread(NewRunnableMethod(mWin, run)); + nsCOMPtr caller = NewRunnableMethod(mWin, run); + mWin->Dispatch("nsGlobalWindow::UnblockScriptedClosing", + TaskCategory::Other, caller.forget()); } }; diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp index 56640d39cfbb..857e4594de68 100644 --- a/dom/base/nsINode.cpp +++ b/dom/base/nsINode.cpp @@ -410,7 +410,7 @@ nsINode::ChildNodes() } void -nsINode::GetTextContentInternal(nsAString& aTextContent, ErrorResult& aError) +nsINode::GetTextContentInternal(nsAString& aTextContent, OOMReporter& aError) { SetDOMStringToNull(aTextContent); } diff --git a/dom/base/nsINode.h b/dom/base/nsINode.h index fe040e0c34e0..7dd1f7699bbd 100644 --- a/dom/base/nsINode.h +++ b/dom/base/nsINode.h @@ -1309,7 +1309,7 @@ protected: public: void GetTextContent(nsAString& aTextContent, - mozilla::ErrorResult& aError) + mozilla::OOMReporter& aError) { GetTextContentInternal(aTextContent, aError); } @@ -1930,7 +1930,7 @@ protected: } virtual void GetTextContentInternal(nsAString& aTextContent, - mozilla::ErrorResult& aError); + mozilla::OOMReporter& aError); virtual void SetTextContentInternal(const nsAString& aTextContent, mozilla::ErrorResult& aError) { diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index b41de68de8c3..5e66d4197a97 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1852,16 +1852,6 @@ AppendNamedPropertyIds(JSContext* cx, JS::Handle proxy, nsTArray& names, bool shadowPrototypeProperties, JS::AutoIdVector& props); -namespace binding_detail { - -class FastErrorResult : - public mozilla::binding_danger::TErrorResult< - mozilla::binding_danger::JustAssertCleanupPolicy> -{ -}; - -} // namespace binding_detail - enum StringificationBehavior { eStringify, eEmpty, diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 2bc95d8ee8ca..66d190862f95 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -7081,7 +7081,8 @@ class CGCallGenerator(CGThing): if needsCallerType: args.append(CGGeneric(callerTypeGetterForDescriptor(descriptor))) - if isFallible: + canOOM = "canOOM" in extendedAttributes + if isFallible or canOOM: args.append(CGGeneric("rv")) args.extend(CGGeneric(arg) for arg in argsPost) @@ -7147,8 +7148,12 @@ class CGCallGenerator(CGThing): """, getPrincipal=getPrincipal))) - if isFallible: - self.cgRoot.prepend(CGGeneric("binding_detail::FastErrorResult rv;\n")) + if isFallible or canOOM: + if isFallible: + reporterClass = "binding_detail::FastErrorResult" + else: + reporterClass = "binding_danger::OOMReporterInstantiator" + self.cgRoot.prepend(CGGeneric("%s rv;\n" % reporterClass)) self.cgRoot.append(CGGeneric(dedent( """ if (MOZ_UNLIKELY(rv.MaybeSetPendingException(cx))) { @@ -8931,9 +8936,10 @@ class CGSpecializedGetter(CGAbstractStaticMethod): nativeName = MakeNativeName(descriptor.binaryNameFor(name)) _, resultOutParam, _, _, _ = getRetvalDeclarationForType(attr.type, descriptor) - infallible = ('infallible' in - descriptor.getExtendedAttributes(attr, getter=True)) - if resultOutParam or attr.type.nullable() or not infallible: + extendedAttrs = descriptor.getExtendedAttributes(attr, getter=True) + canFail = ('infallible' not in extendedAttrs or + 'canOOM' in extendedAttrs) + if resultOutParam or attr.type.nullable() or canFail: nativeName = "Get" + nativeName return nativeName @@ -9231,13 +9237,26 @@ class CGMemberJITInfo(CGThing): # while we have the right type. getter = ("(JSJitGetterOp)get_%s" % IDLToCIdentifier(self.member.identifier.name)) - getterinfal = "infallible" in self.descriptor.getExtendedAttributes(self.member, getter=True) + extendedAttrs = self.descriptor.getExtendedAttributes(self.member, getter=True) + getterinfal = "infallible" in extendedAttrs + # At this point getterinfal is true if our getter either can't throw + # at all, or can only throw OOM. In both cases, it's safe to move, + # or dead-code-eliminate, the getter, because throwing OOM is not + # semantically meaningful, so code can't rely on it happening. Note + # that this makes the behavior consistent for OOM thrown from the + # getter itself and OOM thrown from the to-JS conversion of the + # return value (see the "canOOM" and "infallibleForMember" checks + # below). movable = self.mayBeMovable() and getterinfal eliminatable = self.mayBeEliminatable() and getterinfal aliasSet = self.aliasSet() - getterinfal = getterinfal and infallibleForMember(self.member, self.member.type, self.descriptor) + # Now we have to set getterinfal to whether we can _really_ ever + # throw, from the point of view of the JS engine. + getterinfal = (getterinfal and + "canOOM" not in extendedAttrs and + infallibleForMember(self.member, self.member.type, self.descriptor)) isAlwaysInSlot = self.member.getExtendedAttribute("StoreInSlot") if self.member.slotIndices is not None: assert isAlwaysInSlot or self.member.getExtendedAttribute("Cached") @@ -9300,7 +9319,16 @@ class CGMemberJITInfo(CGThing): # argument conversions, since argument conversions that can # reliably throw would be effectful anyway and the jit doesn't # move effectful things. - hasInfallibleImpl = "infallible" in self.descriptor.getExtendedAttributes(self.member) + extendedAttrs = self.descriptor.getExtendedAttributes(self.member) + hasInfallibleImpl = "infallible" in extendedAttrs + # At this point hasInfallibleImpl is true if our method either + # can't throw at all, or can only throw OOM. In both cases, it + # may be safe to move, or dead-code-eliminate, the method, + # because throwing OOM is not semantically meaningful, so code + # can't rely on it happening. Note that this makes the behavior + # consistent for OOM thrown from the method itself and OOM + # thrown from the to-JS conversion of the return value (see the + # "canOOM" and "infallibleForMember" checks below). movable = self.mayBeMovable() and hasInfallibleImpl eliminatable = self.mayBeEliminatable() and hasInfallibleImpl # XXXbz can we move the smarts about fallibility due to arg @@ -9310,7 +9338,8 @@ class CGMemberJITInfo(CGThing): # We have arguments or our return-value boxing can fail methodInfal = False else: - methodInfal = hasInfallibleImpl + methodInfal = (hasInfallibleImpl and + "canOOM" not in extendedAttrs) # For now, only bother to output args if we're side-effect-free. if self.member.affects == "Nothing": args = sig[1] @@ -14182,10 +14211,13 @@ class CGNativeMember(ClassMethod): # And the caller type, if desired. if needsCallerType(self.member): args.append(Argument("CallerType", "aCallerType")) - # And the ErrorResult + # And the ErrorResult or OOMReporter if 'infallible' not in self.extendedAttrs: # Use aRv so it won't conflict with local vars named "rv" args.append(Argument("ErrorResult&", "aRv")) + elif 'canOOM' in self.extendedAttrs: + args.append(Argument("OOMReporter&", "aRv")) + # The legacycaller thisval if self.member.isMethod() and self.member.isLegacycaller(): # If it has an identifier, we can't deal with it yet @@ -16868,6 +16900,8 @@ class CGEventGetter(CGNativeMember): def getArgs(self, returnType, argList): if 'infallible' not in self.extendedAttrs: raise TypeError("Event code generator does not support [Throws]!") + if 'canOOM' in self.extendedAttrs: + raise TypeError("Event code generator does not support [CanOOM]!") if not self.member.isAttr(): raise TypeError("Event code generator does not support methods") if self.member.isStatic(): diff --git a/dom/bindings/Configuration.py b/dom/bindings/Configuration.py index 2d85d4a3a966..d5a87cff4755 100644 --- a/dom/bindings/Configuration.py +++ b/dom/bindings/Configuration.py @@ -568,17 +568,29 @@ class Descriptor(DescriptorProvider): return self.isGlobal() and self.supportsNamedProperties() def getExtendedAttributes(self, member, getter=False, setter=False): - def ensureValidThrowsExtendedAttribute(attr): + def ensureValidBoolExtendedAttribute(attr, name): if (attr is not None and attr is not True): - raise TypeError("Unknown value for 'Throws': " + attr[0]) + raise TypeError("Unknown value for '%s': %s" % (name, attr[0])) + + def ensureValidThrowsExtendedAttribute(attr): + ensureValidBoolExtendedAttribute(attr, "Throws") + + def ensureValidCanOOMExtendedAttribute(attr): + ensureValidBoolExtendedAttribute(attr, "CanOOM") def maybeAppendInfallibleToAttrs(attrs, throws): ensureValidThrowsExtendedAttribute(throws) if throws is None: attrs.append("infallible") + def maybeAppendCanOOMToAttrs(attrs, canOOM): + ensureValidCanOOMExtendedAttribute(canOOM) + if canOOM is not None: + attrs.append("canOOM") + name = member.identifier.name throws = self.interface.isJSImplemented() or member.getExtendedAttribute("Throws") + canOOM = member.getExtendedAttribute("CanOOM") if member.isMethod(): # JSObject-returning [NewObject] methods must be fallible, # since they have to (fallibly) allocate the new JSObject. @@ -587,6 +599,7 @@ class Descriptor(DescriptorProvider): throws = True attrs = self.extendedAttributes['all'].get(name, []) maybeAppendInfallibleToAttrs(attrs, throws) + maybeAppendCanOOMToAttrs(attrs, canOOM) return attrs assert member.isAttr() @@ -597,6 +610,10 @@ class Descriptor(DescriptorProvider): throwsAttr = "GetterThrows" if getter else "SetterThrows" throws = member.getExtendedAttribute(throwsAttr) maybeAppendInfallibleToAttrs(attrs, throws) + if canOOM is None: + canOOMAttr = "GetterCanOOM" if getter else "SetterCanOOM" + canOOM = member.getExtendedAttribute(canOOMAttr) + maybeAppendCanOOMToAttrs(attrs, canOOM) return attrs def supportsIndexedProperties(self): diff --git a/dom/bindings/ErrorResult.h b/dom/bindings/ErrorResult.h index 56cfded3cb10..6d485661b092 100644 --- a/dom/bindings/ErrorResult.h +++ b/dom/bindings/ErrorResult.h @@ -102,6 +102,7 @@ struct StringArrayAppender } // namespace dom class ErrorResult; +class OOMReporter; namespace binding_danger { @@ -162,6 +163,7 @@ public: } operator ErrorResult&(); + operator OOMReporter&(); void Throw(nsresult rv) { MOZ_ASSERT(NS_FAILED(rv), "Please don't try throwing success"); @@ -537,6 +539,82 @@ class IgnoredErrorResult : { }; +namespace dom { +namespace binding_detail { +class FastErrorResult : + public mozilla::binding_danger::TErrorResult< + mozilla::binding_danger::JustAssertCleanupPolicy> +{ +}; +} // namespace binding_detail +} // namespace dom + +// This part is a bit annoying. We want an OOMReporter class that has the +// following properties: +// +// 1) Can be cast to from any ErrorResult-like type. +// 2) Has a fast destructor (because we want to use it from bindings). +// 3) Won't be randomly instantiated by non-binding code (because the fast +// destructor is not so safe. +// 4) Doesn't look ugly on the callee side (e.g. isn't in the binding_detail or +// binding_danger namespace). +// +// We do this by having two classes: The class callees should use, which has the +// things we want and a private constructor, and a friend subclass in the +// binding_danger namespace that can be used to construct it. +namespace binding_danger { +class OOMReporterInstantiator; +} // namespace binding_danger + +class OOMReporter : private dom::binding_detail::FastErrorResult +{ +public: + void ReportOOM() + { + Throw(NS_ERROR_OUT_OF_MEMORY); + } + +private: + // OOMReporterInstantiator is a friend so it can call our constructor and + // MaybeSetPendingException. + friend class binding_danger::OOMReporterInstantiator; + + // TErrorResult is a friend so its |operator OOMReporter&()| can work. + template + friend class binding_danger::TErrorResult; + + OOMReporter() + : dom::binding_detail::FastErrorResult() + { + } +}; + +namespace binding_danger { +class OOMReporterInstantiator : public OOMReporter +{ +public: + OOMReporterInstantiator() + : OOMReporter() + { + } + + // We want to be able to call MaybeSetPendingException from codegen. The one + // on OOMReporter is not callable directly, because it comes from a private + // superclass. But we're a friend, so _we_ can call it. + bool MaybeSetPendingException(JSContext* cx) + { + return OOMReporter::MaybeSetPendingException(cx); + } +}; +} // namespace binding_danger + +template +binding_danger::TErrorResult::operator OOMReporter&() +{ + return *static_cast( + reinterpret_cast*>(this)); +} + /****************************************************************************** ** Macros for checking results ******************************************************************************/ diff --git a/dom/bindings/parser/WebIDL.py b/dom/bindings/parser/WebIDL.py index 0ec102d03a60..3b851d8b7167 100644 --- a/dom/bindings/parser/WebIDL.py +++ b/dom/bindings/parser/WebIDL.py @@ -4083,15 +4083,19 @@ class IDLAttribute(IDLInterfaceMember): def handleExtendedAttribute(self, attr): identifier = attr.identifier() - if identifier == "SetterThrows" and self.readonly: + if ((identifier == "SetterThrows" or identifier == "SetterCanOOM") + and self.readonly): raise WebIDLError("Readonly attributes must not be flagged as " - "[SetterThrows]", + "[%s]" % identifier, [self.location]) - elif (((identifier == "Throws" or identifier == "GetterThrows") and + elif (((identifier == "Throws" or identifier == "GetterThrows" or + identifier == "CanOOM" or identifier == "GetterCanOOM") and self.getExtendedAttribute("StoreInSlot")) or (identifier == "StoreInSlot" and (self.getExtendedAttribute("Throws") or - self.getExtendedAttribute("GetterThrows")))): + self.getExtendedAttribute("GetterThrows") or + self.getExtendedAttribute("CanOOM") or + self.getExtendedAttribute("GetterCanOOM")))): raise WebIDLError("Throwing things can't be [StoreInSlot]", [attr.location]) elif identifier == "LenientThis": @@ -4255,6 +4259,9 @@ class IDLAttribute(IDLInterfaceMember): identifier == "SetterThrows" or identifier == "Throws" or identifier == "GetterThrows" or + identifier == "SetterCanOOM" or + identifier == "CanOOM" or + identifier == "GetterCanOOM" or identifier == "ChromeOnly" or identifier == "Func" or identifier == "SecureContext" or @@ -4902,13 +4909,12 @@ class IDLMethod(IDLInterfaceMember, IDLScope): def handleExtendedAttribute(self, attr): identifier = attr.identifier() - if identifier == "GetterThrows": + if (identifier == "GetterThrows" or + identifier == "SetterThrows" or + identifier == "GetterCanOOM" or + identifier == "SetterCanOOM"): raise WebIDLError("Methods must not be flagged as " - "[GetterThrows]", - [attr.location, self.location]) - elif identifier == "SetterThrows": - raise WebIDLError("Methods must not be flagged as " - "[SetterThrows]", + "[%s]" % identifier, [attr.location, self.location]) elif identifier == "Unforgeable": if self.isStatic(): @@ -4981,6 +4987,7 @@ class IDLMethod(IDLInterfaceMember, IDLScope): "attributes and operations", [attr.location, self.location]) elif (identifier == "Throws" or + identifier == "CanOOM" or identifier == "NewObject" or identifier == "ChromeOnly" or identifier == "UnsafeInPrerendering" or diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index dd8aa5797836..9ebaebe32455 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -936,6 +936,13 @@ public: void SetThrowingGetterAttr(bool arg); bool ThrowingSetterAttr() const; void SetThrowingSetterAttr(bool arg, ErrorResult& aRv); + void CanOOMMethod(OOMReporter& aRv); + bool GetCanOOMAttr(OOMReporter& aRv) const; + void SetCanOOMAttr(bool arg, OOMReporter& aRv); + bool GetCanOOMGetterAttr(OOMReporter& aRv) const; + void SetCanOOMGetterAttr(bool arg); + bool CanOOMSetterAttr() const; + void SetCanOOMSetterAttr(bool arg, OOMReporter& aRv); void NeedsSubjectPrincipalMethod(nsIPrincipal&); bool NeedsSubjectPrincipalAttr(nsIPrincipal&); void SetNeedsSubjectPrincipalAttr(bool, nsIPrincipal&); diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl index c729f1e50b74..1511a6e55fba 100644 --- a/dom/bindings/test/TestCodeGen.webidl +++ b/dom/bindings/test/TestCodeGen.webidl @@ -946,6 +946,10 @@ interface TestInterface { [Throws] attribute boolean throwingAttr; [GetterThrows] attribute boolean throwingGetterAttr; [SetterThrows] attribute boolean throwingSetterAttr; + [CanOOM] void canOOMMethod(); + [CanOOM] attribute boolean canOOMAttr; + [GetterCanOOM] attribute boolean canOOMGetterAttr; + [SetterCanOOM] attribute boolean canOOMSetterAttr; [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod(); [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr; [NeedsCallerType] void needsCallerTypeMethod(); diff --git a/dom/bindings/test/TestExampleGen.webidl b/dom/bindings/test/TestExampleGen.webidl index d4a5b3cff755..03a39f2007d6 100644 --- a/dom/bindings/test/TestExampleGen.webidl +++ b/dom/bindings/test/TestExampleGen.webidl @@ -776,6 +776,10 @@ interface TestExampleInterface { [Throws] attribute boolean throwingAttr; [GetterThrows] attribute boolean throwingGetterAttr; [SetterThrows] attribute boolean throwingSetterAttr; + [CanOOM] void canOOMMethod(); + [CanOOM] attribute boolean canOOMAttr; + [GetterCanOOM] attribute boolean canOOMGetterAttr; + [SetterCanOOM] attribute boolean canOOMSetterAttr; [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod(); [NeedsSubjectPrincipal] attribute boolean needsSubjectPrincipalAttr; [NeedsCallerType] void needsCallerTypeMethod(); diff --git a/dom/bindings/test/TestJSImplGen.webidl b/dom/bindings/test/TestJSImplGen.webidl index 86e12e74dda6..65ead03025d9 100644 --- a/dom/bindings/test/TestJSImplGen.webidl +++ b/dom/bindings/test/TestJSImplGen.webidl @@ -797,6 +797,10 @@ interface TestJSImplInterface { [Throws] attribute boolean throwingAttr; [GetterThrows] attribute boolean throwingGetterAttr; [SetterThrows] attribute boolean throwingSetterAttr; + [CanOOM] void canOOMMethod(); + [CanOOM] attribute boolean canOOMAttr; + [GetterCanOOM] attribute boolean canOOMGetterAttr; + [SetterCanOOM] attribute boolean canOOMSetterAttr; // NeedsSubjectPrincipal not supported on JS-implemented things for // now, because we always pass in the caller principal anyway. // [NeedsSubjectPrincipal] void needsSubjectPrincipalMethod(); diff --git a/dom/canvas/WebGLContext.cpp b/dom/canvas/WebGLContext.cpp index 97f3e89155d3..1b7642a0f0bb 100644 --- a/dom/canvas/WebGLContext.cpp +++ b/dom/canvas/WebGLContext.cpp @@ -114,6 +114,9 @@ WebGLContextOptions::WebGLContextOptions() WebGLContext::WebGLContext() : WebGLContextUnchecked(nullptr) + , mMaxPerfWarnings(gfxPrefs::WebGLMaxPerfWarnings()) + , mNumPerfWarnings(0) + , mMaxAcceptableFBStatusInvals(gfxPrefs::WebGLMaxAcceptableFBStatusInvals()) , mBufferFetchingIsVerified(false) , mBufferFetchingHasPerVertex(false) , mMaxFetchedVertices(0) diff --git a/dom/canvas/WebGLContext.h b/dom/canvas/WebGLContext.h index 9fd2ff53ec31..6794abab3d53 100644 --- a/dom/canvas/WebGLContext.h +++ b/dom/canvas/WebGLContext.h @@ -331,6 +331,10 @@ class WebGLContext static const uint32_t kMinMaxColorAttachments; static const uint32_t kMinMaxDrawBuffers; + const uint32_t mMaxPerfWarnings; + mutable uint64_t mNumPerfWarnings; + const uint32_t mMaxAcceptableFBStatusInvals; + public: WebGLContext(); @@ -1937,6 +1941,10 @@ protected: bool ShouldGenerateWarnings() const; + bool ShouldGeneratePerfWarnings() const { + return mNumPerfWarnings < mMaxPerfWarnings; + } + uint64_t mLastUseIndex; bool mNeedsFakeNoAlpha; @@ -2029,6 +2037,8 @@ public: void GenerateWarning(const char* fmt, ...); void GenerateWarning(const char* fmt, va_list ap); + void GeneratePerfWarning(const char* fmt, ...) const; + public: UniquePtr mFormatUsage; diff --git a/dom/canvas/WebGLContextGL.cpp b/dom/canvas/WebGLContextGL.cpp index a7f0bf5a1348..083117a66f0f 100644 --- a/dom/canvas/WebGLContextGL.cpp +++ b/dom/canvas/WebGLContextGL.cpp @@ -348,16 +348,17 @@ WebGLContext::DeleteFramebuffer(WebGLFramebuffer* fbuf) void WebGLContext::DeleteRenderbuffer(WebGLRenderbuffer* rbuf) { - if (!ValidateDeleteObject("deleteRenderbuffer", rbuf)) + const char funcName[] = "deleteRenderbuffer"; + if (!ValidateDeleteObject(funcName, rbuf)) return; if (mBoundDrawFramebuffer) - mBoundDrawFramebuffer->DetachRenderbuffer(rbuf); + mBoundDrawFramebuffer->DetachRenderbuffer(funcName, rbuf); if (mBoundReadFramebuffer) - mBoundReadFramebuffer->DetachRenderbuffer(rbuf); + mBoundReadFramebuffer->DetachRenderbuffer(funcName, rbuf); - rbuf->InvalidateStatusOfAttachedFBs(); + rbuf->InvalidateStatusOfAttachedFBs(funcName); if (mBoundRenderbuffer == rbuf) BindRenderbuffer(LOCAL_GL_RENDERBUFFER, nullptr); @@ -368,14 +369,15 @@ WebGLContext::DeleteRenderbuffer(WebGLRenderbuffer* rbuf) void WebGLContext::DeleteTexture(WebGLTexture* tex) { - if (!ValidateDeleteObject("deleteTexture", tex)) + const char funcName[] = "deleteTexture"; + if (!ValidateDeleteObject(funcName, tex)) return; if (mBoundDrawFramebuffer) - mBoundDrawFramebuffer->DetachTexture(tex); + mBoundDrawFramebuffer->DetachTexture(funcName, tex); if (mBoundReadFramebuffer) - mBoundReadFramebuffer->DetachTexture(tex); + mBoundReadFramebuffer->DetachTexture(funcName, tex); GLuint activeTexture = mActiveTexture; for (int32_t i = 0; i < mGLMaxTextureUnits; i++) { diff --git a/dom/canvas/WebGLContextUtils.cpp b/dom/canvas/WebGLContextUtils.cpp index 9c0d3493975f..9264168ac56f 100644 --- a/dom/canvas/WebGLContextUtils.cpp +++ b/dom/canvas/WebGLContextUtils.cpp @@ -90,7 +90,7 @@ WebGLContext::GenerateWarning(const char* fmt, va_list ap) } JSContext* cx = api.cx(); - JS_ReportWarningASCII(cx, "WebGL: %s", buf); + JS_ReportWarningASCII(cx, "WebGL warning: %s", buf); if (!ShouldGenerateWarnings()) { JS_ReportWarningASCII(cx, "WebGL: No further warnings will be reported for" @@ -109,6 +109,43 @@ WebGLContext::ShouldGenerateWarnings() const return mAlreadyGeneratedWarnings < mMaxWarnings; } +void +WebGLContext::GeneratePerfWarning(const char* fmt, ...) const +{ + if (!ShouldGeneratePerfWarnings()) + return; + + if (!mCanvasElement) + return; + + dom::AutoJSAPI api; + if (!api.Init(mCanvasElement->OwnerDoc()->GetScopeObject())) + return; + JSContext* cx = api.cx(); + + //// + + va_list ap; + va_start(ap, fmt); + + char buf[1024]; + PR_vsnprintf(buf, 1024, fmt, ap); + + va_end(ap); + + //// + + JS_ReportWarningASCII(cx, "WebGL perf warning: %s", buf); + mNumPerfWarnings++; + + if (!ShouldGeneratePerfWarnings()) { + JS_ReportWarningASCII(cx, + "WebGL: After reporting %u, no further perf warnings will" + " be reported for this WebGL context.", + uint32_t(mNumPerfWarnings)); + } +} + void WebGLContext::SynthesizeGLError(GLenum err) { diff --git a/dom/canvas/WebGLFramebuffer.cpp b/dom/canvas/WebGLFramebuffer.cpp index 35efa4f160c1..2626fbf2f27b 100644 --- a/dom/canvas/WebGLFramebuffer.cpp +++ b/dom/canvas/WebGLFramebuffer.cpp @@ -47,7 +47,8 @@ WebGLFBAttachPoint::~WebGLFBAttachPoint() void WebGLFBAttachPoint::Unlink() { - Clear(); + const char funcName[] = "WebGLFramebuffer::GC"; + Clear(funcName); } bool @@ -114,7 +115,7 @@ WebGLFBAttachPoint::IsReadableFloat() const } void -WebGLFBAttachPoint::Clear() +WebGLFBAttachPoint::Clear(const char* funcName) { if (mRenderbufferPtr) { MOZ_ASSERT(!mTexturePtr); @@ -126,14 +127,14 @@ WebGLFBAttachPoint::Clear() mTexturePtr = nullptr; mRenderbufferPtr = nullptr; - OnBackingStoreRespecified(); + OnBackingStoreRespecified(funcName); } void -WebGLFBAttachPoint::SetTexImage(WebGLTexture* tex, TexImageTarget target, GLint level, - GLint layer) +WebGLFBAttachPoint::SetTexImage(const char* funcName, WebGLTexture* tex, + TexImageTarget target, GLint level, GLint layer) { - Clear(); + Clear(funcName); mTexturePtr = tex; mTexImageTarget = target; @@ -146,9 +147,9 @@ WebGLFBAttachPoint::SetTexImage(WebGLTexture* tex, TexImageTarget target, GLint } void -WebGLFBAttachPoint::SetRenderbuffer(WebGLRenderbuffer* rb) +WebGLFBAttachPoint::SetRenderbuffer(const char* funcName, WebGLRenderbuffer* rb) { - Clear(); + Clear(funcName); mRenderbufferPtr = rb; @@ -226,9 +227,9 @@ WebGLFBAttachPoint::Size(uint32_t* const out_width, uint32_t* const out_height) } void -WebGLFBAttachPoint::OnBackingStoreRespecified() const +WebGLFBAttachPoint::OnBackingStoreRespecified(const char* funcName) const { - mFB->InvalidateFramebufferStatus(); + mFB->InvalidateFramebufferStatus(funcName); } void @@ -619,6 +620,7 @@ WebGLFBAttachPoint::GetParameter(const char* funcName, WebGLContext* webgl, JSCo WebGLFramebuffer::WebGLFramebuffer(WebGLContext* webgl, GLuint fbo) : WebGLRefCountedObject(webgl) , mGLName(fbo) + , mNumFBStatusInvals(0) #ifdef ANDROID , mIsFB(false) #endif @@ -641,14 +643,16 @@ WebGLFramebuffer::WebGLFramebuffer(WebGLContext* webgl, GLuint fbo) void WebGLFramebuffer::Delete() { - InvalidateFramebufferStatus(); + const char funcName[] = "WebGLFramebuffer::Delete"; - mDepthAttachment.Clear(); - mStencilAttachment.Clear(); - mDepthStencilAttachment.Clear(); + InvalidateFramebufferStatus(funcName); + + mDepthAttachment.Clear(funcName); + mStencilAttachment.Clear(funcName); + mDepthStencilAttachment.Clear(funcName); for (auto& cur : mColorAttachments) { - cur.Clear(); + cur.Clear(funcName); } mContext->MakeContextCurrent(); @@ -709,11 +713,11 @@ WebGLFramebuffer::GetAttachPoint(GLenum attachPoint) } void -WebGLFramebuffer::DetachTexture(const WebGLTexture* tex) +WebGLFramebuffer::DetachTexture(const char* funcName, const WebGLTexture* tex) { const auto fnDetach = [&](WebGLFBAttachPoint& attach) { if (attach.Texture() == tex) { - attach.Clear(); + attach.Clear(funcName); } }; @@ -721,11 +725,11 @@ WebGLFramebuffer::DetachTexture(const WebGLTexture* tex) } void -WebGLFramebuffer::DetachRenderbuffer(const WebGLRenderbuffer* rb) +WebGLFramebuffer::DetachRenderbuffer(const char* funcName, const WebGLRenderbuffer* rb) { const auto fnDetach = [&](WebGLFBAttachPoint& attach) { if (attach.Renderbuffer() == rb) { - attach.Clear(); + attach.Clear(funcName); } }; @@ -1135,6 +1139,21 @@ WebGLFramebuffer::ResolvedData::ResolvedData(const WebGLFramebuffer& parent) } } +void +WebGLFramebuffer::InvalidateFramebufferStatus(const char* funcName) +{ + if (mResolvedCompleteData) { + mNumFBStatusInvals++; + if (mNumFBStatusInvals > mContext->mMaxAcceptableFBStatusInvals) { + mContext->GeneratePerfWarning("%s: FB was invalidated after being complete %u" + " times.", + funcName, uint32_t(mNumFBStatusInvals)); + } + } + + mResolvedCompleteData = nullptr; +} + void WebGLFramebuffer::RefreshResolvedData() { @@ -1354,13 +1373,13 @@ WebGLFramebuffer::FramebufferRenderbuffer(const char* funcName, GLenum attachEnu // End of validation. if (mContext->IsWebGL2() && attachEnum == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { - mDepthAttachment.SetRenderbuffer(rb); - mStencilAttachment.SetRenderbuffer(rb); + mDepthAttachment.SetRenderbuffer(funcName, rb); + mStencilAttachment.SetRenderbuffer(funcName, rb); } else { - attach->SetRenderbuffer(rb); + attach->SetRenderbuffer(funcName, rb); } - InvalidateFramebufferStatus(); + InvalidateFramebufferStatus(funcName); } void @@ -1442,13 +1461,13 @@ WebGLFramebuffer::FramebufferTexture2D(const char* funcName, GLenum attachEnum, // End of validation. if (mContext->IsWebGL2() && attachEnum == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { - mDepthAttachment.SetTexImage(tex, texImageTarget, level); - mStencilAttachment.SetTexImage(tex, texImageTarget, level); + mDepthAttachment.SetTexImage(funcName, tex, texImageTarget, level); + mStencilAttachment.SetTexImage(funcName, tex, texImageTarget, level); } else { - attach->SetTexImage(tex, texImageTarget, level); + attach->SetTexImage(funcName, tex, texImageTarget, level); } - InvalidateFramebufferStatus(); + InvalidateFramebufferStatus(funcName); } void @@ -1526,13 +1545,13 @@ WebGLFramebuffer::FramebufferTextureLayer(const char* funcName, GLenum attachEnu // End of validation. if (mContext->IsWebGL2() && attachEnum == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { - mDepthAttachment.SetTexImage(tex, texImageTarget, level, layer); - mStencilAttachment.SetTexImage(tex, texImageTarget, level, layer); + mDepthAttachment.SetTexImage(funcName, tex, texImageTarget, level, layer); + mStencilAttachment.SetTexImage(funcName, tex, texImageTarget, level, layer); } else { - attach->SetTexImage(tex, texImageTarget, level, layer); + attach->SetTexImage(funcName, tex, texImageTarget, level, layer); } - InvalidateFramebufferStatus(); + InvalidateFramebufferStatus(funcName); } JS::Value diff --git a/dom/canvas/WebGLFramebuffer.h b/dom/canvas/WebGLFramebuffer.h index ac457c09881d..d69427c6f5ef 100644 --- a/dom/canvas/WebGLFramebuffer.h +++ b/dom/canvas/WebGLFramebuffer.h @@ -66,11 +66,11 @@ public: bool HasAlpha() const; bool IsReadableFloat() const; - void Clear(); + void Clear(const char* funcName); - void SetTexImage(WebGLTexture* tex, TexImageTarget target, GLint level, - GLint layer = 0); - void SetRenderbuffer(WebGLRenderbuffer* rb); + void SetTexImage(const char* funcName, WebGLTexture* tex, TexImageTarget target, + GLint level, GLint layer = 0); + void SetRenderbuffer(const char* funcName, WebGLRenderbuffer* rb); WebGLTexture* Texture() const { return mTexturePtr; } WebGLRenderbuffer* Renderbuffer() const { return mRenderbufferPtr; } @@ -100,7 +100,7 @@ public: GLenum target, GLenum attachment, GLenum pname, ErrorResult* const out_error) const; - void OnBackingStoreRespecified() const; + void OnBackingStoreRespecified(const char* funcName) const; bool IsEquivalentForFeedback(const WebGLFBAttachPoint& other) const { if (!IsDefined() || !other.IsDefined()) @@ -154,6 +154,9 @@ public: const GLuint mGLName; +private: + uint64_t mNumFBStatusInvals; + protected: #ifdef ANDROID // Bug 1140459: Some drivers (including our test slaves!) don't @@ -230,8 +233,8 @@ protected: bool ResolveAttachmentData(const char* funcName) const; public: - void DetachTexture(const WebGLTexture* tex); - void DetachRenderbuffer(const WebGLRenderbuffer* rb); + void DetachTexture(const char* funcName, const WebGLTexture* tex); + void DetachRenderbuffer(const char* funcName, const WebGLRenderbuffer* rb); bool ValidateAndInitAttachments(const char* funcName); bool ValidateClearBufferType(const char* funcName, GLenum buffer, uint32_t drawBuffer, GLenum funcType) const; @@ -258,11 +261,7 @@ public: // Invalidation bool IsResolvedComplete() const { return bool(mResolvedCompleteData); } - - void InvalidateFramebufferStatus() { - mResolvedCompleteData = nullptr; - } - + void InvalidateFramebufferStatus(const char* funcName); void RefreshResolvedData(); //////////////// diff --git a/dom/canvas/WebGLFramebufferAttachable.cpp b/dom/canvas/WebGLFramebufferAttachable.cpp index fd92b80f8c36..e8d3bfce765f 100644 --- a/dom/canvas/WebGLFramebufferAttachable.cpp +++ b/dom/canvas/WebGLFramebufferAttachable.cpp @@ -31,12 +31,12 @@ WebGLFramebufferAttachable::UnmarkAttachment(const WebGLFBAttachPoint& attachmen } void -WebGLFramebufferAttachable::InvalidateStatusOfAttachedFBs() const +WebGLFramebufferAttachable::InvalidateStatusOfAttachedFBs(const char* funcName) const { const size_t count = mAttachmentPoints.Length(); for (size_t i = 0; i < count; ++i) { MOZ_ASSERT(mAttachmentPoints[i]->mFB); - mAttachmentPoints[i]->mFB->InvalidateFramebufferStatus(); + mAttachmentPoints[i]->mFB->InvalidateFramebufferStatus(funcName); } } diff --git a/dom/canvas/WebGLFramebufferAttachable.h b/dom/canvas/WebGLFramebufferAttachable.h index a65cf34fce61..e5571445cbcf 100644 --- a/dom/canvas/WebGLFramebufferAttachable.h +++ b/dom/canvas/WebGLFramebufferAttachable.h @@ -19,7 +19,7 @@ public: // Track FBO/Attachment combinations void MarkAttachment(const WebGLFBAttachPoint& attachment); void UnmarkAttachment(const WebGLFBAttachPoint& attachment); - void InvalidateStatusOfAttachedFBs() const; + void InvalidateStatusOfAttachedFBs(const char* funcName) const; }; } // namespace mozilla diff --git a/dom/canvas/WebGLRenderbuffer.cpp b/dom/canvas/WebGLRenderbuffer.cpp index ec076fdbbf57..2dcbcbb54c7c 100644 --- a/dom/canvas/WebGLRenderbuffer.cpp +++ b/dom/canvas/WebGLRenderbuffer.cpp @@ -224,7 +224,7 @@ WebGLRenderbuffer::RenderbufferStorage(const char* funcName, uint32_t samples, mHeight = height; mImageDataStatus = WebGLImageDataStatus::UninitializedImageData; - InvalidateStatusOfAttachedFBs(); + InvalidateStatusOfAttachedFBs(funcName); } void diff --git a/dom/canvas/WebGLTexture.cpp b/dom/canvas/WebGLTexture.cpp index 52b0153a5a38..9339f5b04e00 100644 --- a/dom/canvas/WebGLTexture.cpp +++ b/dom/canvas/WebGLTexture.cpp @@ -33,12 +33,12 @@ Mutable(const T& x) } void -WebGLTexture::ImageInfo::Clear() +WebGLTexture::ImageInfo::Clear(const char* funcName) { if (!IsDefined()) return; - OnRespecify(); + OnRespecify(funcName); Mutable(mFormat) = LOCAL_GL_NONE; Mutable(mWidth) = 0; @@ -48,8 +48,8 @@ WebGLTexture::ImageInfo::Clear() MOZ_ASSERT(!IsDefined()); } -WebGLTexture::ImageInfo& -WebGLTexture::ImageInfo::operator =(const ImageInfo& a) +void +WebGLTexture::ImageInfo::Set(const char* funcName, const ImageInfo& a) { MOZ_ASSERT(a.IsDefined()); @@ -62,9 +62,7 @@ WebGLTexture::ImageInfo::operator =(const ImageInfo& a) // But *don't* transfer mAttachPoints! MOZ_ASSERT(a.mAttachPoints.empty()); - OnRespecify(); - - return *this; + OnRespecify(funcName); } bool @@ -91,10 +89,10 @@ WebGLTexture::ImageInfo::RemoveAttachPoint(WebGLFBAttachPoint* attachPoint) } void -WebGLTexture::ImageInfo::OnRespecify() const +WebGLTexture::ImageInfo::OnRespecify(const char* funcName) const { for (auto cur : mAttachPoints) { - cur->OnBackingStoreRespecified(); + cur->OnBackingStoreRespecified(funcName); } } @@ -149,8 +147,9 @@ WebGLTexture::WebGLTexture(WebGLContext* webgl, GLuint tex) void WebGLTexture::Delete() { + const char funcName[] = "WebGLTexture::Delete"; for (auto& cur : mImageInfoArr) { - cur.Clear(); + cur.Clear(funcName); } mContext->MakeContextCurrent(); @@ -173,18 +172,20 @@ WebGLTexture::MemoryUsage() const } void -WebGLTexture::SetImageInfo(ImageInfo* target, const ImageInfo& newInfo) +WebGLTexture::SetImageInfo(const char* funcName, ImageInfo* target, + const ImageInfo& newInfo) { - *target = newInfo; + target->Set(funcName, newInfo); InvalidateResolveCache(); } void -WebGLTexture::SetImageInfosAtLevel(uint32_t level, const ImageInfo& newInfo) +WebGLTexture::SetImageInfosAtLevel(const char* funcName, uint32_t level, + const ImageInfo& newInfo) { for (uint8_t i = 0; i < mFaceCount; i++) { - ImageInfoAtFace(i, level) = newInfo; + ImageInfoAtFace(i, level).Set(funcName, newInfo); } InvalidateResolveCache(); @@ -773,7 +774,8 @@ WebGLTexture::ClampLevelBaseAndMax() } void -WebGLTexture::PopulateMipChain(uint32_t firstLevel, uint32_t lastLevel) +WebGLTexture::PopulateMipChain(const char* funcName, uint32_t firstLevel, + uint32_t lastLevel) { const ImageInfo& baseImageInfo = ImageInfoAtFace(0, firstLevel); MOZ_ASSERT(baseImageInfo.IsDefined()); @@ -804,7 +806,7 @@ WebGLTexture::PopulateMipChain(uint32_t firstLevel, uint32_t lastLevel) const ImageInfo cur(baseImageInfo.mFormat, refWidth, refHeight, refDepth, baseImageInfo.IsDataInitialized()); - SetImageInfosAtLevel(level, cur); + SetImageInfosAtLevel(funcName, level, cur); } } @@ -854,6 +856,7 @@ WebGLTexture::BindTexture(TexTarget texTarget) void WebGLTexture::GenerateMipmap(TexTarget texTarget) { + const char funcName[] = "generateMipmap"; // GLES 3.0.4 p160: // "Mipmap generation replaces texel array levels level base + 1 through q with arrays // derived from the level base array, regardless of their previous contents. All @@ -861,33 +864,35 @@ WebGLTexture::GenerateMipmap(TexTarget texTarget) // computation." const ImageInfo& baseImageInfo = BaseImageInfo(); if (!baseImageInfo.IsDefined()) { - mContext->ErrorInvalidOperation("generateMipmap: The base level of the texture is" - " not defined."); + mContext->ErrorInvalidOperation("%s: The base level of the texture is not" + " defined.", + funcName); return; } if (IsCubeMap() && !IsCubeComplete()) { - mContext->ErrorInvalidOperation("generateMipmap: Cube maps must be \"cube" - " complete\"."); + mContext->ErrorInvalidOperation("%s: Cube maps must be \"cube complete\".", + funcName); return; } if (!mContext->IsWebGL2() && !baseImageInfo.IsPowerOfTwo()) { - mContext->ErrorInvalidOperation("generateMipmap: The base level of the texture" - " does not have power-of-two dimensions."); + mContext->ErrorInvalidOperation("%s: The base level of the texture does not have" + " power-of-two dimensions.", + funcName); return; } auto format = baseImageInfo.mFormat->format; if (format->compression) { - mContext->ErrorInvalidOperation("generateMipmap: Texture data at base level is" - " compressed."); + mContext->ErrorInvalidOperation("%s: Texture data at base level is compressed.", + funcName); return; } if (format->d) { - mContext->ErrorInvalidOperation("generateMipmap: Depth textures are not" - " supported."); + mContext->ErrorInvalidOperation("%s: Depth textures are not supported.", + funcName); return; } @@ -910,9 +915,10 @@ WebGLTexture::GenerateMipmap(TexTarget texTarget) } if (!canGenerateMipmap) { - mContext->ErrorInvalidOperation("generateMipmap: Texture at base level is not unsized" + mContext->ErrorInvalidOperation("%s: Texture at base level is not unsized" " internal format or is not" - " color-renderable or texture-filterable."); + " color-renderable or texture-filterable.", + funcName); return; } @@ -940,7 +946,7 @@ WebGLTexture::GenerateMipmap(TexTarget texTarget) // Note that we don't use MaxEffectiveMipmapLevel() here, since that returns // mBaseMipmapLevel if the min filter doesn't require mipmaps. const uint32_t maxLevel = mBaseMipmapLevel + baseImageInfo.PossibleMipmapLevels() - 1; - PopulateMipChain(mBaseMipmapLevel, maxLevel); + PopulateMipChain(funcName, mBaseMipmapLevel, maxLevel); } JS::Value diff --git a/dom/canvas/WebGLTexture.h b/dom/canvas/WebGLTexture.h index 66e781f237ae..62a6c61cc6b1 100644 --- a/dom/canvas/WebGLTexture.h +++ b/dom/canvas/WebGLTexture.h @@ -105,17 +105,19 @@ public: // And in turn, it needs these forwards: protected: // We need to forward these. - void SetImageInfo(ImageInfo* target, const ImageInfo& newInfo); - void SetImageInfosAtLevel(uint32_t level, const ImageInfo& newInfo); + void SetImageInfo(const char* funcName, ImageInfo* target, const ImageInfo& newInfo); + void SetImageInfosAtLevel(const char* funcName, uint32_t level, + const ImageInfo& newInfo); public: // We store information about the various images that are part of this // texture. (cubemap faces, mipmap levels) class ImageInfo { - friend void WebGLTexture::SetImageInfo(ImageInfo* target, + friend void WebGLTexture::SetImageInfo(const char* funcName, ImageInfo* target, const ImageInfo& newInfo); - friend void WebGLTexture::SetImageInfosAtLevel(uint32_t level, + friend void WebGLTexture::SetImageInfosAtLevel(const char* funcName, + uint32_t level, const ImageInfo& newInfo); public: @@ -155,15 +157,14 @@ public: MOZ_ASSERT(mFormat); } - void Clear(); + void Clear(const char* funcName); ~ImageInfo() { - if (!IsDefined()) - Clear(); + MOZ_ASSERT(!mAttachPoints.size()); } protected: - ImageInfo& operator =(const ImageInfo& a); + void Set(const char* funcName, const ImageInfo& a); public: uint32_t PossibleMipmapLevels() const { @@ -177,7 +178,7 @@ public: void AddAttachPoint(WebGLFBAttachPoint* attachPoint); void RemoveAttachPoint(WebGLFBAttachPoint* attachPoint); - void OnRespecify() const; + void OnRespecify(const char* funcName) const; size_t MemoryUsage() const; @@ -289,7 +290,7 @@ public: protected: void ClampLevelBaseAndMax(); - void PopulateMipChain(uint32_t baseLevel, uint32_t maxLevel); + void PopulateMipChain(const char* funcName, uint32_t baseLevel, uint32_t maxLevel); bool MaxEffectiveMipmapLevel(uint32_t texUnit, uint32_t* const out) const; @@ -330,11 +331,11 @@ public: return const_cast(this)->ImageInfoAt(texImageTarget, level); } - void SetImageInfoAt(TexImageTarget texImageTarget, GLint level, + void SetImageInfoAt(const char* funcName, TexImageTarget texImageTarget, GLint level, const ImageInfo& val) { ImageInfo* target = &ImageInfoAt(texImageTarget, level); - SetImageInfo(target, val); + SetImageInfo(funcName, target, val); } const ImageInfo& BaseImageInfo() const { diff --git a/dom/canvas/WebGLTextureUpload.cpp b/dom/canvas/WebGLTextureUpload.cpp index 654f827611b3..eeb06439f068 100644 --- a/dom/canvas/WebGLTextureUpload.cpp +++ b/dom/canvas/WebGLTextureUpload.cpp @@ -1185,9 +1185,9 @@ WebGLTexture::TexStorage(const char* funcName, TexTarget target, GLsizei levels, const bool isDataInitialized = false; const WebGLTexture::ImageInfo newInfo(dstUsage, width, height, depth, isDataInitialized); - SetImageInfosAtLevel(0, newInfo); + SetImageInfosAtLevel(funcName, 0, newInfo); - PopulateMipChain(0, levels-1); + PopulateMipChain(funcName, 0, levels-1); mImmutable = true; mImmutableLevelCount = levels; @@ -1317,7 +1317,7 @@ WebGLTexture::TexImage(const char* funcName, TexImageTarget target, GLint level, //////////////////////////////////// // Update our specification data. - SetImageInfo(imageInfo, newImageInfo); + SetImageInfo(funcName, imageInfo, newImageInfo); } void @@ -1523,7 +1523,7 @@ WebGLTexture::CompressedTexImage(const char* funcName, TexImageTarget target, GL const bool isDataInitialized = true; const ImageInfo newImageInfo(usage, blob->mWidth, blob->mHeight, blob->mDepth, isDataInitialized); - SetImageInfo(imageInfo, newImageInfo); + SetImageInfo(funcName, imageInfo, newImageInfo); } static inline bool @@ -2170,7 +2170,7 @@ WebGLTexture::CopyTexImage2D(TexImageTarget target, GLint level, GLenum internal const bool isDataInitialized = true; const ImageInfo newImageInfo(dstUsage, width, height, depth, isDataInitialized); - SetImageInfo(imageInfo, newImageInfo); + SetImageInfo(funcName, imageInfo, newImageInfo); } void diff --git a/dom/events/DataTransferItem.cpp b/dom/events/DataTransferItem.cpp index 393fdeac5855..bd8743241ba0 100644 --- a/dom/events/DataTransferItem.cpp +++ b/dom/events/DataTransferItem.cpp @@ -319,8 +319,10 @@ DataTransferItem::GetAsEntry(nsIPrincipal& aSubjectPrincipal, } nsCOMPtr directoryFile; - nsresult rv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(fullpath), - true, getter_AddRefs(directoryFile)); + // fullPath is already in unicode, we don't have to use + // NS_NewNativeLocalFile. + nsresult rv = NS_NewLocalFile(fullpath, true, + getter_AddRefs(directoryFile)); if (NS_WARN_IF(NS_FAILED(rv))) { return nullptr; } diff --git a/dom/filesystem/CreateDirectoryTask.cpp b/dom/filesystem/CreateDirectoryTask.cpp index d396b0706197..36d0d9dd106a 100644 --- a/dom/filesystem/CreateDirectoryTask.cpp +++ b/dom/filesystem/CreateDirectoryTask.cpp @@ -98,9 +98,8 @@ CreateDirectoryTaskChild::SetSuccessRequestResult(const FileSystemResponseValue& const FileSystemDirectoryResponse& r = aValue.get_FileSystemDirectoryResponse(); - aRv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(r.realPath()), true, - getter_AddRefs(mTargetPath)); - NS_WARNING_ASSERTION(!aRv.Failed(), "NS_NewNativeLocalFile failed"); + aRv = NS_NewLocalFile(r.realPath(), true, getter_AddRefs(mTargetPath)); + NS_WARNING_ASSERTION(!aRv.Failed(), "NS_NewLocalFile failed"); } void @@ -149,8 +148,8 @@ CreateDirectoryTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new CreateDirectoryTaskParent(aFileSystem, aParam, aParent); - aRv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(aParam.realPath()), true, - getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.realPath(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/CreateFileTask.cpp b/dom/filesystem/CreateFileTask.cpp index 203ad10b1fa9..06d271c7bc8b 100644 --- a/dom/filesystem/CreateFileTask.cpp +++ b/dom/filesystem/CreateFileTask.cpp @@ -140,8 +140,7 @@ CreateFileTaskChild::SetSuccessRequestResult(const FileSystemResponseValue& aVal const FileSystemFileResponse& r = aValue.get_FileSystemFileResponse(); - NS_ConvertUTF16toUTF8 path(r.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(mTargetPath)); + aRv = NS_NewLocalFile(r.realPath(), true, getter_AddRefs(mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return; } @@ -194,8 +193,8 @@ CreateFileTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new CreateFileTaskParent(aFileSystem, aParam, aParent); - NS_ConvertUTF16toUTF8 path(aParam.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.realPath(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/Directory.cpp b/dom/filesystem/Directory.cpp index 0e01dcafc15d..2a7c4a7808e0 100644 --- a/dom/filesystem/Directory.cpp +++ b/dom/filesystem/Directory.cpp @@ -100,8 +100,8 @@ Directory::GetRoot(FileSystemBase* aFileSystem, ErrorResult& aRv) MOZ_ASSERT(aFileSystem); nsCOMPtr path; - aRv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(aFileSystem->LocalOrDeviceStorageRootPath()), - true, getter_AddRefs(path)); + aRv = NS_NewLocalFile(aFileSystem->LocalOrDeviceStorageRootPath(), + true, getter_AddRefs(path)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } @@ -122,8 +122,7 @@ Directory::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv) { nsCOMPtr path; - aRv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(aRealPath), - true, getter_AddRefs(path)); + aRv = NS_NewLocalFile(aRealPath, true, getter_AddRefs(path)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/FileSystemBase.cpp b/dom/filesystem/FileSystemBase.cpp index 6c93b93e8ea8..a81641e394a1 100644 --- a/dom/filesystem/FileSystemBase.cpp +++ b/dom/filesystem/FileSystemBase.cpp @@ -88,8 +88,7 @@ FileSystemBase::GetRealPath(BlobImpl* aFile, nsIFile** aPath) const return false; } - rv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(filePath), - true, aPath); + rv = NS_NewLocalFile(filePath, true, aPath); if (NS_WARN_IF(rv.Failed())) { rv.SuppressException(); return false; @@ -134,8 +133,8 @@ FileSystemBase::GetDOMPath(nsIFile* aFile, aRetval.Truncate(); nsCOMPtr fileSystemPath; - aRv = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(LocalOrDeviceStorageRootPath()), - true, getter_AddRefs(fileSystemPath)); + aRv = NS_NewLocalFile(LocalOrDeviceStorageRootPath(), + true, getter_AddRefs(fileSystemPath)); if (NS_WARN_IF(aRv.Failed())) { return; } diff --git a/dom/filesystem/GetDirectoryListingTask.cpp b/dom/filesystem/GetDirectoryListingTask.cpp index e05e9875af84..debfdf2c0bcd 100644 --- a/dom/filesystem/GetDirectoryListingTask.cpp +++ b/dom/filesystem/GetDirectoryListingTask.cpp @@ -166,8 +166,8 @@ GetDirectoryListingTaskChild::HandlerCallback() for (unsigned i = 0; i < count; i++) { nsCOMPtr path; - NS_ConvertUTF16toUTF8 fullPath(mTargetData[i].mPath); - nsresult rv = NS_NewNativeLocalFile(fullPath, true, getter_AddRefs(path)); + nsresult rv = NS_NewLocalFile(mTargetData[i].mPath, true, + getter_AddRefs(path)); if (NS_WARN_IF(NS_FAILED(rv))) { mPromise->MaybeReject(rv); mPromise = nullptr; @@ -246,8 +246,8 @@ GetDirectoryListingTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new GetDirectoryListingTaskParent(aFileSystem, aParam, aParent); - NS_ConvertUTF16toUTF8 path(aParam.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.realPath(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/GetFileOrDirectoryTask.cpp b/dom/filesystem/GetFileOrDirectoryTask.cpp index ff68b014c31c..c330d6b6cf0f 100644 --- a/dom/filesystem/GetFileOrDirectoryTask.cpp +++ b/dom/filesystem/GetFileOrDirectoryTask.cpp @@ -100,8 +100,7 @@ GetFileOrDirectoryTaskChild::SetSuccessRequestResult(const FileSystemResponseVal case FileSystemResponseValue::TFileSystemFileResponse: { FileSystemFileResponse r = aValue; - NS_ConvertUTF16toUTF8 path(r.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(mTargetPath)); + aRv = NS_NewLocalFile(r.realPath(), true, getter_AddRefs(mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return; } @@ -112,8 +111,7 @@ GetFileOrDirectoryTaskChild::SetSuccessRequestResult(const FileSystemResponseVal case FileSystemResponseValue::TFileSystemDirectoryResponse: { FileSystemDirectoryResponse r = aValue; - NS_ConvertUTF16toUTF8 path(r.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(mTargetPath)); + aRv = NS_NewLocalFile(r.realPath(), true, getter_AddRefs(mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return; } @@ -183,8 +181,8 @@ GetFileOrDirectoryTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new GetFileOrDirectoryTaskParent(aFileSystem, aParam, aParent); - NS_ConvertUTF16toUTF8 path(aParam.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.realPath(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/GetFilesHelper.cpp b/dom/filesystem/GetFilesHelper.cpp index eb2487d797dc..fe92602d2431 100644 --- a/dom/filesystem/GetFilesHelper.cpp +++ b/dom/filesystem/GetFilesHelper.cpp @@ -271,8 +271,7 @@ GetFilesHelper::RunIO() MOZ_ASSERT(!mListingCompleted); nsCOMPtr file; - mErrorResult = NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(mDirectoryPath), true, - getter_AddRefs(file)); + mErrorResult = NS_NewLocalFile(mDirectoryPath, true, getter_AddRefs(file)); if (NS_WARN_IF(NS_FAILED(mErrorResult))) { return; } @@ -306,8 +305,8 @@ GetFilesHelper::RunMainThread() for (uint32_t i = 0; i < mTargetPathArray.Length(); ++i) { nsCOMPtr file; mErrorResult = - NS_NewNativeLocalFile(NS_ConvertUTF16toUTF8(mTargetPathArray[i].mRealPath), - true, getter_AddRefs(file)); + NS_NewLocalFile(mTargetPathArray[i].mRealPath, true, + getter_AddRefs(file)); if (NS_WARN_IF(NS_FAILED(mErrorResult))) { mFiles.Clear(); return; diff --git a/dom/filesystem/GetFilesTask.cpp b/dom/filesystem/GetFilesTask.cpp index be876b6633b9..e44505f31d2e 100644 --- a/dom/filesystem/GetFilesTask.cpp +++ b/dom/filesystem/GetFilesTask.cpp @@ -154,8 +154,8 @@ GetFilesTaskChild::HandlerCallback() for (unsigned i = 0; i < count; i++) { nsCOMPtr path; - NS_ConvertUTF16toUTF8 fullPath(mTargetData[i].mRealPath); - nsresult rv = NS_NewNativeLocalFile(fullPath, true, getter_AddRefs(path)); + nsresult rv = NS_NewLocalFile(mTargetData[i].mRealPath, true, + getter_AddRefs(path)); if (NS_WARN_IF(NS_FAILED(rv))) { mPromise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR); mPromise = nullptr; @@ -210,8 +210,8 @@ GetFilesTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new GetFilesTaskParent(aFileSystem, aParam, aParent); - NS_ConvertUTF16toUTF8 path(aParam.realPath()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.realPath(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/filesystem/RemoveTask.cpp b/dom/filesystem/RemoveTask.cpp index 5f9d28b9c1df..7523346532a1 100644 --- a/dom/filesystem/RemoveTask.cpp +++ b/dom/filesystem/RemoveTask.cpp @@ -162,17 +162,16 @@ RemoveTaskParent::Create(FileSystemBase* aFileSystem, RefPtr task = new RemoveTaskParent(aFileSystem, aParam, aParent); - NS_ConvertUTF16toUTF8 directoryPath(aParam.directory()); - aRv = NS_NewNativeLocalFile(directoryPath, true, - getter_AddRefs(task->mDirPath)); + aRv = NS_NewLocalFile(aParam.directory(), true, + getter_AddRefs(task->mDirPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } task->mRecursive = aParam.recursive(); - NS_ConvertUTF16toUTF8 path(aParam.targetDirectory()); - aRv = NS_NewNativeLocalFile(path, true, getter_AddRefs(task->mTargetPath)); + aRv = NS_NewLocalFile(aParam.targetDirectory(), true, + getter_AddRefs(task->mTargetPath)); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/ipc/ProcessHangMonitor.cpp b/dom/ipc/ProcessHangMonitor.cpp index 8b68c28fd2af..7a37b163c9f0 100644 --- a/dom/ipc/ProcessHangMonitor.cpp +++ b/dom/ipc/ProcessHangMonitor.cpp @@ -316,7 +316,7 @@ HangMonitorChild::InterruptCallback() if (forcePaint) { RefPtr tabChild = TabChild::FindTabChild(forcePaintTab); if (tabChild) { - JS::AutoAssertNoGC nogc(mContext); + js::AutoAssertNoContentJS nojs(mContext); tabChild->ForcePaint(forcePaintEpoch); } } diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index 3a84dc2d1878..6a495939070d 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -1098,11 +1098,17 @@ TabChild::ActorDestroy(ActorDestroyReason why) DestroyWindow(); if (mTabChildGlobal) { - // The messageManager relays messages via the TabChild which - // no longer exists. - static_cast - (mTabChildGlobal->mMessageManager.get())->Disconnect(); - mTabChildGlobal->mMessageManager = nullptr; + // We should have a message manager if the global is alive, but it + // seems sometimes we don't. Assert in aurora/nightly, but don't + // crash in release builds. + MOZ_DIAGNOSTIC_ASSERT(mTabChildGlobal->mMessageManager); + if (mTabChildGlobal->mMessageManager) { + // The messageManager relays messages via the TabChild which + // no longer exists. + static_cast + (mTabChildGlobal->mMessageManager.get())->Disconnect(); + mTabChildGlobal->mMessageManager = nullptr; + } } CompositorBridgeChild* compositorChild = static_cast(CompositorBridgeChild::Get()); @@ -2104,16 +2110,26 @@ TabChild::RecvAsyncMessage(const nsString& aMessage, const IPC::Principal& aPrincipal, const ClonedMessageData& aData) { - if (mTabChildGlobal) { - nsCOMPtr kungFuDeathGrip(GetGlobal()); - StructuredCloneData data; - UnpackClonedMessageDataForChild(aData, data); - RefPtr mm = - static_cast(mTabChildGlobal->mMessageManager.get()); - CrossProcessCpowHolder cpows(Manager(), aCpows); - mm->ReceiveMessage(static_cast(mTabChildGlobal), nullptr, - aMessage, false, &data, &cpows, aPrincipal, nullptr); + if (!mTabChildGlobal) { + return IPC_OK(); } + + // We should have a message manager if the global is alive, but it + // seems sometimes we don't. Assert in aurora/nightly, but don't + // crash in release builds. + MOZ_DIAGNOSTIC_ASSERT(mTabChildGlobal->mMessageManager); + if (!mTabChildGlobal->mMessageManager) { + return IPC_OK(); + } + + nsCOMPtr kungFuDeathGrip(GetGlobal()); + StructuredCloneData data; + UnpackClonedMessageDataForChild(aData, data); + RefPtr mm = + static_cast(mTabChildGlobal->mMessageManager.get()); + CrossProcessCpowHolder cpows(Manager(), aCpows); + mm->ReceiveMessage(static_cast(mTabChildGlobal), nullptr, + aMessage, false, &data, &cpows, aPrincipal, nullptr); return IPC_OK(); } @@ -2503,7 +2519,6 @@ TabChild::InitTabChildGlobal() NS_ENSURE_TRUE(chromeHandler, false); RefPtr scope = new TabChildGlobal(this); - mTabChildGlobal = scope; nsISupports* scopeSupports = NS_ISUPPORTS_CAST(EventTarget*, scope); @@ -2515,6 +2530,8 @@ TabChild::InitTabChildGlobal() nsCOMPtr root = do_QueryInterface(chromeHandler); NS_ENSURE_TRUE(root, false); root->SetParentTarget(scope); + + mTabChildGlobal = scope.forget();; } if (!mTriedBrowserInit) { diff --git a/dom/ipc/manifestMessages.js b/dom/ipc/manifestMessages.js index c6bb40494cf4..11b8627df248 100644 --- a/dom/ipc/manifestMessages.js +++ b/dom/ipc/manifestMessages.js @@ -18,6 +18,7 @@ const { } = Components; Cu.import("resource://gre/modules/ManifestObtainer.jsm"); Cu.import("resource://gre/modules/ManifestFinder.jsm"); +Cu.import("resource://gre/modules/ManifestIcons.jsm"); Cu.import("resource://gre/modules/Task.jsm"); const MessageHandler = { @@ -34,6 +35,10 @@ const MessageHandler = { "DOM:Manifest:FireAppInstalledEvent", this.fireAppInstalledEvent.bind(this) ); + addMessageListener( + "DOM:WebManifest:fetchIcon", + this.fetchIcon.bind(this) + ); }, /** @@ -76,7 +81,24 @@ const MessageHandler = { content.dispatchEvent(ev); } sendAsyncMessage("DOM:Manifest:FireAppInstalledEvent", response); - } + }, + + /** + * Given a manifest and an expected icon size, ask ManifestIcons + * to fetch the appropriate icon and send along result + */ + fetchIcon: Task.async(function* ({data: {id, manifest, iconSize}}) { + const response = makeMsgResponse(id); + try { + response.result = + yield ManifestIcons.contentFetchIcon(content, manifest, iconSize); + response.success = true; + } catch (err) { + response.result = serializeError(err); + } + sendAsyncMessage("DOM:WebManifest:fetchIcon", response); + }), + }; /** * Utility function to Serializes an JS Error, so it can be transferred over diff --git a/dom/manifest/Manifest.jsm b/dom/manifest/Manifest.jsm new file mode 100644 index 000000000000..0b97b4660961 --- /dev/null +++ b/dom/manifest/Manifest.jsm @@ -0,0 +1,42 @@ +/* + * Manifest.jsm is the top level api for managing installed web applications + * https://www.w3.org/TR/appmanifest/ + * + * It is used to trigger the installation of a web application via .install() + * and to access the manifest data (including icons). + * + * TODO: + * - Persist installed manifest data to disk and keep track of which + * origins have installed applications + * - Trigger appropriate app installed events + */ + +"use strict"; + +const Cu = Components.utils; + +Cu.import("resource://gre/modules/Task.jsm"); + +const { ManifestObtainer } = + Cu.import('resource://gre/modules/ManifestObtainer.jsm', {}); +const { ManifestIcons } = + Cu.import('resource://gre/modules/ManifestIcons.jsm', {}); + +function Manifest(browser) { + this.browser = browser; + this.data = null; +} + +Manifest.prototype.install = Task.async(function* () { + this.data = yield ManifestObtainer.browserObtainManifest(this.browser); +}); + +Manifest.prototype.icon = Task.async(function* (expectedSize) { + return yield ManifestIcons.browserFetchIcon(this.browser, this.data, expectedSize); +}); + +Manifest.prototype.name = function () { + return this.data.short_name || this.data.short_url; +} + +this.EXPORTED_SYMBOLS = ["Manifest"]; // jshint ignore:line diff --git a/dom/manifest/ManifestIcons.jsm b/dom/manifest/ManifestIcons.jsm new file mode 100644 index 000000000000..90d4d79d1187 --- /dev/null +++ b/dom/manifest/ManifestIcons.jsm @@ -0,0 +1,85 @@ +"use strict"; + +const { + utils: Cu, + classes: Cc, + interfaces: Ci +} = Components; + +Cu.import("resource://gre/modules/PromiseMessage.jsm"); + +this.ManifestIcons = { + + async browserFetchIcon(aBrowser, manifest, iconSize) { + const msgKey = "DOM:WebManifest:fetchIcon"; + const mm = aBrowser.messageManager; + const {data: {success, result}} = + await PromiseMessage.send(mm, msgKey, {manifest, iconSize}); + if (!success) { + throw result; + } + return result; + }, + + async contentFetchIcon(aWindow, manifest, iconSize) { + return await getIcon(aWindow, toIconArray(manifest.icons), iconSize); + } +}; + +function parseIconSize(size) { + if (size === "any" || size === "") { + // We want icons without size specified to sorted + // as the largest available icons + return Number.MAX_SAFE_INTEGER; + } + // 100x100 will parse as 100 + return parseInt(size, 10); +} + +// Create an array of icons sorted by their size +function toIconArray(icons) { + const iconBySize = []; + icons.forEach(icon => { + const sizes = ("sizes" in icon) ? icon.sizes : ""; + sizes.split(" ").forEach(size => { + iconBySize.push({src: icon.src, size: parseIconSize(size)}); + }); + }); + return iconBySize.sort((a, b) => a.size - b.size); +} + +async function getIcon(aWindow, icons, expectedSize) { + if (!icons.length) { + throw new Error("Could not find valid icon"); + } + // We start trying the smallest icon that is larger than the requested + // size and go up to the largest icon if they fail, if all those fail + // go back down to the smallest + let index = icons.findIndex(icon => icon.size >= expectedSize); + if (index === -1) { + index = icons.length - 1; + } + + return fetchIcon(aWindow, icons[index].src).catch(err => { + // Remove all icons with the failed source, the same source + // may have been used for multiple sizes + icons = icons.filter(x => x.src === icons[index].src); + return getIcon(aWindow, icons, expectedSize); + }); +} + +function fetchIcon(aWindow, src) { + const manifestURL = new aWindow.URL(src); + const request = new aWindow.Request(manifestURL, {mode: "cors"}); + request.overrideContentPolicyType(Ci.nsIContentPolicy.TYPE_WEB_MANIFEST); + return aWindow.fetch(request) + .then(response => response.blob()) + .then(blob => new Promise((resolve, reject) => { + var reader = new FileReader(); + reader.onloadend = () => resolve(reader.result); + reader.onerror = reject; + reader.readAsDataURL(blob); + })); +} + +this.EXPORTED_SYMBOLS = ["ManifestIcons"]; // jshint ignore:line diff --git a/dom/manifest/moz.build b/dom/manifest/moz.build index 338794a19a6b..66f503ce499f 100644 --- a/dom/manifest/moz.build +++ b/dom/manifest/moz.build @@ -6,7 +6,9 @@ EXTRA_JS_MODULES += [ 'ImageObjectProcessor.jsm', + 'Manifest.jsm', 'ManifestFinder.jsm', + 'ManifestIcons.jsm', 'ManifestObtainer.jsm', 'ManifestProcessor.jsm', 'ValueExtractor.jsm', diff --git a/dom/manifest/test/blue-150.png b/dom/manifest/test/blue-150.png new file mode 100644 index 000000000000..f4a62faddf2a Binary files /dev/null and b/dom/manifest/test/blue-150.png differ diff --git a/dom/manifest/test/browser.ini b/dom/manifest/test/browser.ini index ad98fe26ca94..65ae0ac0ac34 100644 --- a/dom/manifest/test/browser.ini +++ b/dom/manifest/test/browser.ini @@ -4,6 +4,9 @@ support-files = file_testserver.sjs manifestLoader.html resource.sjs + red-50.png + blue-150.png [browser_ManifestFinder_browserHasManifestLink.js] +[browser_ManifestIcons_browserFetchIcon.js] [browser_ManifestObtainer_obtain.js] [browser_fire_appinstalled_event.js] \ No newline at end of file diff --git a/dom/manifest/test/browser_ManifestIcons_browserFetchIcon.js b/dom/manifest/test/browser_ManifestIcons_browserFetchIcon.js new file mode 100644 index 000000000000..c7a64dceff47 --- /dev/null +++ b/dom/manifest/test/browser_ManifestIcons_browserFetchIcon.js @@ -0,0 +1,56 @@ +//Used by JSHint: +/*global Cu, BrowserTestUtils, ok, add_task, gBrowser */ +"use strict"; +const { ManifestIcons } = Cu.import("resource://gre/modules/ManifestIcons.jsm", {}); +const { ManifestObtainer } = Cu.import("resource://gre/modules/ManifestObtainer.jsm", {}); + +const defaultURL = new URL("http://example.org/browser/dom/manifest/test/resource.sjs"); +defaultURL.searchParams.set("Content-Type", "application/manifest+json"); + +const manifest = JSON.stringify({ + icons: [{ + sizes: "50x50", + src: "red-50.png?Content-type=image/png" + }, { + sizes: "150x150", + src: "blue-150.png?Content-type=image/png" + }] +}); + +function makeTestURL(manifest) { + const url = new URL(defaultURL); + const body = ``; + url.searchParams.set("Content-Type", "text/html; charset=utf-8"); + url.searchParams.set("body", encodeURIComponent(body)); + return url.href; +} + +function getIconColor(icon) { + return new Promise((resolve, reject) => { + const canvas = content.document.createElement('canvas'); + const ctx = canvas.getContext("2d"); + const image = new content.Image(); + image.onload = function() { + ctx.drawImage(image, 0, 0); + resolve(ctx.getImageData(1, 1, 1, 1).data); + }; + image.onerror = function() { + reject(new Error("could not create image")); + }; + image.src = icon; + }); +} + +add_task(function*() { + const tabOptions = {gBrowser, url: makeTestURL(manifest)}; + yield BrowserTestUtils.withNewTab(tabOptions, function*(browser) { + const manifest = yield ManifestObtainer.browserObtainManifest(browser); + let icon = yield ManifestIcons.browserFetchIcon(browser, manifest, 25); + let color = yield ContentTask.spawn(browser, icon, getIconColor); + is(color[0], 255, 'Fetched red icon'); + + icon = yield ManifestIcons.browserFetchIcon(browser, manifest, 500); + color = yield ContentTask.spawn(browser, icon, getIconColor); + is(color[2], 255, 'Fetched blue icon'); + }); +}); diff --git a/dom/manifest/test/icon.png b/dom/manifest/test/icon.png new file mode 100644 index 000000000000..bb87f783b7b2 Binary files /dev/null and b/dom/manifest/test/icon.png differ diff --git a/dom/manifest/test/red-50.png b/dom/manifest/test/red-50.png new file mode 100644 index 000000000000..e2ce365c3c7c Binary files /dev/null and b/dom/manifest/test/red-50.png differ diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 3bb52b76fb01..dbc16ade1282 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -2808,11 +2808,14 @@ nsPluginHost::WritePluginInfo() return rv; } + bool flashOnly = Preferences::GetBool("plugin.load_flash_only", true); + PR_fprintf(fd, "Generated File. Do not edit.\n"); - PR_fprintf(fd, "\n[HEADER]\nVersion%c%s%c%c\nArch%c%s%c%c\n", + PR_fprintf(fd, "\n[HEADER]\nVersion%c%s%c%c%c\nArch%c%s%c%c\n", PLUGIN_REGISTRY_FIELD_DELIMITER, kPluginRegistryVersion, + flashOnly ? 't' : 'f', PLUGIN_REGISTRY_FIELD_DELIMITER, PLUGIN_REGISTRY_END_OF_LINE_MARKER, PLUGIN_REGISTRY_FIELD_DELIMITER, @@ -3008,7 +3011,12 @@ nsPluginHost::ReadPluginInfo() return rv; // If we're reading an old registry, ignore it - if (strcmp(values[1], kPluginRegistryVersion) != 0) { + // If we flipped the flash-only pref, ignore it + bool flashOnly = Preferences::GetBool("plugin.load_flash_only", true); + nsAutoCString expectedVersion(kPluginRegistryVersion); + expectedVersion.Append(flashOnly ? 't' : 'f'); + + if (!expectedVersion.Equals(values[1])) { return rv; } diff --git a/dom/plugins/ipc/PluginInstanceChild.cpp b/dom/plugins/ipc/PluginInstanceChild.cpp index d1accce45cc5..9e0fa93db6c8 100644 --- a/dom/plugins/ipc/PluginInstanceChild.cpp +++ b/dom/plugins/ipc/PluginInstanceChild.cpp @@ -4078,6 +4078,13 @@ PluginInstanceChild::InvalidateRectDelayed(void) } mCurrentInvalidateTask = nullptr; + + // When this method is run asynchronously, we can end up switching to + // direct drawing before while we wait to run. In that case, bail. + if (IsUsingDirectDrawing()) { + return; + } + if (mAccumulatedInvalidRect.IsEmpty()) { return; } diff --git a/dom/plugins/ipc/PluginInstanceParent.cpp b/dom/plugins/ipc/PluginInstanceParent.cpp index 61641c11b13a..14f00d3cdf48 100644 --- a/dom/plugins/ipc/PluginInstanceParent.cpp +++ b/dom/plugins/ipc/PluginInstanceParent.cpp @@ -1206,7 +1206,7 @@ PluginInstanceParent::SetScrollCaptureId(uint64_t aScrollCaptureId) return NS_ERROR_FAILURE; } - mImageContainer = new ImageContainer(aScrollCaptureId); + mImageContainer = new ImageContainer(CompositableHandle(aScrollCaptureId)); return NS_OK; } diff --git a/dom/smil/crashtests/crashtests.list b/dom/smil/crashtests/crashtests.list index e62a08b6ca0e..af2c4f6affe5 100644 --- a/dom/smil/crashtests/crashtests.list +++ b/dom/smil/crashtests/crashtests.list @@ -24,7 +24,7 @@ load 572938-4.svg load 588287-1.svg load 588287-2.svg asserts-if(stylo,2) load 590425-1.html # bug 1324669 -asserts-if(stylo,8-11) load 592477-1.xhtml # bug 1324669 +asserts-if(stylo,1-27) load 592477-1.xhtml # bug 1324669 load 594653-1.svg load 596796-1.svg load 605345-1.svg diff --git a/dom/tests/browser/browser.ini b/dom/tests/browser/browser.ini index 076a734b3677..c9656919c3b2 100644 --- a/dom/tests/browser/browser.ini +++ b/dom/tests/browser/browser.ini @@ -19,6 +19,8 @@ disabled = Does not reliably pass on 32-bit systems - bug 1314098 skip-if = !e10s [browser_autofocus_background.js] [browser_autofocus_preference.js] +[browser_beforeunload_between_chrome_content.js] +skip-if = !e10s [browser_bug396843.js] [browser_bug1004814.js] [browser_bug1008941_dismissGeolocationHanger.js] diff --git a/dom/tests/browser/browser_beforeunload_between_chrome_content.js b/dom/tests/browser/browser_beforeunload_between_chrome_content.js new file mode 100644 index 000000000000..e8bf45d06d8c --- /dev/null +++ b/dom/tests/browser/browser_beforeunload_between_chrome_content.js @@ -0,0 +1,144 @@ +const TEST_URL = "http://www.example.com/browser/dom/tests/browser/dummy.html"; + +function pageScript() { + window.addEventListener("beforeunload", function (event) { + var str = "Leaving?"; + event.returnValue = str; + return str; + }, true); +} + +function frameScript() { + content.window.addEventListener("beforeunload", function (event) { + sendAsyncMessage("Test:OnBeforeUnloadReceived"); + var str = "Leaving?"; + event.returnValue = str; + return str; + }, true); +} + +// Wait for onbeforeunload dialog, and dismiss it immediately. +function awaitAndCloseBeforeUnloadDialog(doStayOnPage) { + return new Promise(resolve => { + function onDialogShown(node) { + Services.obs.removeObserver(onDialogShown, "tabmodal-dialog-loaded"); + let button = doStayOnPage ? node.ui.button1 : node.ui.button0; + button.click(); + resolve(); + } + + Services.obs.addObserver(onDialogShown, "tabmodal-dialog-loaded"); + }); +} + +SpecialPowers.pushPrefEnv( + {"set": [["dom.require_user_interaction_for_beforeunload", false]]}); + +/** + * Test navigation from a content page to a chrome page. Also check that only + * one beforeunload event is fired. + */ +add_task(function* () { + let beforeUnloadCount = 0; + messageManager.addMessageListener("Test:OnBeforeUnloadReceived", function() { + beforeUnloadCount++; + }); + + // Open a content page. + let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); + let browser = tab.linkedBrowser; + + ok(browser.isRemoteBrowser, "Browser should be remote."); + browser.messageManager.loadFrameScript( + "data:,(" + frameScript.toString() + ")();", true); + + // Navigate to a chrome page. + let dialogShown1 = awaitAndCloseBeforeUnloadDialog(false); + yield BrowserTestUtils.loadURI(browser, "about:support"); + yield Promise.all([ + dialogShown1, + BrowserTestUtils.browserLoaded(browser) + ]); + is(beforeUnloadCount, 1, "Should have received one beforeunload event."); + ok(!browser.isRemoteBrowser, "Browser should not be remote."); + + // Go back to content page. + ok(gBrowser.webNavigation.canGoBack, "Should be able to go back."); + gBrowser.goBack(); + yield BrowserTestUtils.browserLoaded(browser); + browser.messageManager.loadFrameScript( + "data:,(" + frameScript.toString() + ")();", true); + + // Test that going forward triggers beforeunload prompt as well. + ok(gBrowser.webNavigation.canGoForward, "Should be able to go forward."); + let dialogShown2 = awaitAndCloseBeforeUnloadDialog(false); + gBrowser.goForward(); + yield Promise.all([ + dialogShown2, + BrowserTestUtils.browserLoaded(browser) + ]); + is(beforeUnloadCount, 2, "Should have received two beforeunload events."); + + yield BrowserTestUtils.removeTab(tab); +}); + +/** + * Test navigation from a chrome page to a content page. Also check that only + * one beforeunload event is fired. + */ +add_task(function* () { + let beforeUnloadCount = 0; + messageManager.addMessageListener("Test:OnBeforeUnloadReceived", function() { + beforeUnloadCount++; + }); + + // Open a chrome page. + let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, + "about:support"); + let browser = tab.linkedBrowser; + + ok(!browser.isRemoteBrowser, "Browser should not be remote."); + yield ContentTask.spawn(browser, null, function* () { + content.window.addEventListener("beforeunload", function (event) { + sendAsyncMessage("Test:OnBeforeUnloadReceived"); + var str = "Leaving?"; + event.returnValue = str; + return str; + }, true); + }); + + // Navigate to a content page. + let dialogShown1 = awaitAndCloseBeforeUnloadDialog(false); + yield BrowserTestUtils.loadURI(browser, TEST_URL); + yield Promise.all([ + dialogShown1, + BrowserTestUtils.browserLoaded(browser) + ]); + is(beforeUnloadCount, 1, "Should have received one beforeunload event."); + ok(browser.isRemoteBrowser, "Browser should be remote."); + + // Go back to chrome page. + ok(gBrowser.webNavigation.canGoBack, "Should be able to go back."); + gBrowser.goBack(); + yield BrowserTestUtils.browserLoaded(browser); + yield ContentTask.spawn(browser, null, function* () { + content.window.addEventListener("beforeunload", function (event) { + sendAsyncMessage("Test:OnBeforeUnloadReceived"); + var str = "Leaving?"; + event.returnValue = str; + return str; + }, true); + }); + + // Test that going forward triggers beforeunload prompt as well. + ok(gBrowser.webNavigation.canGoForward, "Should be able to go forward."); + let dialogShown2 = awaitAndCloseBeforeUnloadDialog(false); + gBrowser.goForward(); + yield Promise.all([ + dialogShown2, + BrowserTestUtils.browserLoaded(browser) + ]); + is(beforeUnloadCount, 2, "Should have received two beforeunload events."); + + yield BrowserTestUtils.removeTab(tab); +}); diff --git a/dom/webidl/Node.webidl b/dom/webidl/Node.webidl index c338e60b0c5d..93dae3f38f01 100644 --- a/dom/webidl/Node.webidl +++ b/dom/webidl/Node.webidl @@ -59,7 +59,7 @@ interface Node : EventTarget { [SetterThrows, Pure] attribute DOMString? nodeValue; - [Throws, Pure] + [SetterThrows, GetterCanOOM, Pure] attribute DOMString? textContent; [Throws] Node insertBefore(Node node, Node? child); diff --git a/editor/libeditor/tests/test_bug1330796.html b/editor/libeditor/tests/test_bug1330796.html index def2372357f6..f8af02087739 100644 --- a/editor/libeditor/tests/test_bug1330796.html +++ b/editor/libeditor/tests/test_bug1330796.html @@ -75,8 +75,8 @@ SimpleTest.waitForFocus(function() { // Position set at the beginning , middle and end of the text. sel.collapse(theText, tests[i][1]); - synthesizeKey("KEY_Enter", {}); - synthesizeKey("x", {}); + synthesizeKey("KEY_Enter", { code: "Enter" }); + synthesizeKey("x", { code: "KeyX" }); is(theEdit.innerHTML, tests[i][2], "unexpected HTML for test " + i.toString()); } diff --git a/gfx/ipc/GfxMessageUtils.h b/gfx/ipc/GfxMessageUtils.h index 8ec266b0d00c..5c8072ac2122 100644 --- a/gfx/ipc/GfxMessageUtils.h +++ b/gfx/ipc/GfxMessageUtils.h @@ -714,6 +714,19 @@ struct ParamTraits } }; +template<> +struct ParamTraits +{ + typedef mozilla::layers::CompositableHandle paramType; + + static void Write(Message* msg, const paramType& param) { + WriteParam(msg, param.mHandle); + } + static bool Read(const Message* msg, PickleIterator* iter, paramType* result) { + return ReadParam(msg, iter, &result->mHandle); + } +}; + // Helper class for reading bitfields. // If T has bitfields members, derive ParamTraits from BitfieldHelper. template diff --git a/gfx/layers/AsyncCanvasRenderer.cpp b/gfx/layers/AsyncCanvasRenderer.cpp index d9a0e9886cfc..4164e9e87892 100644 --- a/gfx/layers/AsyncCanvasRenderer.cpp +++ b/gfx/layers/AsyncCanvasRenderer.cpp @@ -29,7 +29,6 @@ AsyncCanvasRenderer::AsyncCanvasRenderer() , mIsAlphaPremultiplied(true) , mWidth(0) , mHeight(0) - , mCanvasClientAsyncID(0) , mCanvasClient(nullptr) , mMutex("AsyncCanvasRenderer::mMutex") { @@ -116,9 +115,9 @@ AsyncCanvasRenderer::SetCanvasClient(CanvasClient* aClient) { mCanvasClient = aClient; if (aClient) { - mCanvasClientAsyncID = aClient->GetAsyncID(); + mCanvasClientAsyncHandle = aClient->GetAsyncHandle(); } else { - mCanvasClientAsyncID = 0; + mCanvasClientAsyncHandle = CompositableHandle(); } } diff --git a/gfx/layers/AsyncCanvasRenderer.h b/gfx/layers/AsyncCanvasRenderer.h index 404695de4afc..bd014d6ec9fb 100644 --- a/gfx/layers/AsyncCanvasRenderer.h +++ b/gfx/layers/AsyncCanvasRenderer.h @@ -106,9 +106,9 @@ public: return gfx::IntSize(mWidth, mHeight); } - uint64_t GetCanvasClientAsyncID() const + CompositableHandle GetCanvasClientAsyncHandle() const { - return mCanvasClientAsyncID; + return mCanvasClientAsyncHandle; } CanvasClient* GetCanvasClient() const @@ -140,7 +140,7 @@ private: uint32_t mWidth; uint32_t mHeight; - uint64_t mCanvasClientAsyncID; + CompositableHandle mCanvasClientAsyncHandle; // The lifetime of this pointer is controlled by OffscreenCanvas // Can be accessed in active thread and ImageBridge thread. diff --git a/gfx/layers/ImageContainer.cpp b/gfx/layers/ImageContainer.cpp index 38f40ffba2d5..38487b559b2b 100644 --- a/gfx/layers/ImageContainer.cpp +++ b/gfx/layers/ImageContainer.cpp @@ -136,7 +136,7 @@ ImageContainer::EnsureImageClient(bool aCreate) if (imageBridge) { mImageClient = imageBridge->CreateImageClient(CompositableType::IMAGE, this); if (mImageClient) { - mAsyncContainerID = mImageClient->GetAsyncID(); + mAsyncContainerHandle = mImageClient->GetAsyncHandle(); mNotifyCompositeListener = new ImageContainerListener(this); } } @@ -153,22 +153,20 @@ ImageContainer::ImageContainer(Mode flag) { if (flag == ASYNCHRONOUS) { EnsureImageClient(true); - } else { - mAsyncContainerID = sInvalidAsyncContainerId; } } -ImageContainer::ImageContainer(uint64_t aAsyncContainerID) +ImageContainer::ImageContainer(const CompositableHandle& aHandle) : mReentrantMonitor("ImageContainer.mReentrantMonitor"), mGenerationCounter(++sGenerationCounter), mPaintCount(0), mDroppedImageCount(0), mImageFactory(nullptr), mRecycleBin(nullptr), - mAsyncContainerID(aAsyncContainerID), + mAsyncContainerHandle(aHandle), mCurrentProducerID(-1) { - MOZ_ASSERT(mAsyncContainerID != sInvalidAsyncContainerId); + MOZ_ASSERT(mAsyncContainerHandle); } ImageContainer::~ImageContainer() @@ -176,9 +174,9 @@ ImageContainer::~ImageContainer() if (mNotifyCompositeListener) { mNotifyCompositeListener->ClearImageContainer(); } - if (mAsyncContainerID) { + if (mAsyncContainerHandle) { if (RefPtr imageBridge = ImageBridgeChild::GetSingleton()) { - imageBridge->ForgetImageContainer(mAsyncContainerID); + imageBridge->ForgetImageContainer(mAsyncContainerHandle); } } } @@ -344,14 +342,14 @@ ImageContainer::SetCurrentImagesInTransaction(const nsTArray& aI bool ImageContainer::IsAsync() const { - return mAsyncContainerID != sInvalidAsyncContainerId; + return !!mAsyncContainerHandle; } -uint64_t ImageContainer::GetAsyncContainerID() +CompositableHandle ImageContainer::GetAsyncContainerHandle() { NS_ASSERTION(IsAsync(),"Shared image ID is only relevant to async ImageContainers"); EnsureImageClient(false); - return mAsyncContainerID; + return mAsyncContainerHandle; } bool diff --git a/gfx/layers/ImageContainer.h b/gfx/layers/ImageContainer.h index cdf50f0b2cd0..58f8bdca2f8b 100644 --- a/gfx/layers/ImageContainer.h +++ b/gfx/layers/ImageContainer.h @@ -385,7 +385,7 @@ public: * async container ID. * @param aAsyncContainerID async container ID for which we are a proxy */ - explicit ImageContainer(uint64_t aAsyncContainerID); + explicit ImageContainer(const CompositableHandle& aHandle); typedef uint32_t FrameID; typedef uint32_t ProducerID; @@ -486,7 +486,7 @@ public: * * Can be called from any thread. */ - uint64_t GetAsyncContainerID(); + CompositableHandle GetAsyncContainerHandle(); /** * Returns if the container currently has an image. @@ -649,7 +649,7 @@ private: // asynchronusly using the ImageBridge IPDL protocol. RefPtr mImageClient; - uint64_t mAsyncContainerID; + CompositableHandle mAsyncContainerHandle; nsTArray mFrameIDsNotYetComposited; // ProducerID for last current image(s), including the frames in diff --git a/gfx/layers/LayersTypes.h b/gfx/layers/LayersTypes.h index 27e90d2a28ed..b03f09393871 100644 --- a/gfx/layers/LayersTypes.h +++ b/gfx/layers/LayersTypes.h @@ -279,6 +279,36 @@ private: uint64_t mHandle; }; +// This is used to communicate Compositables across IPC channels. The Handle is valid +// for layers in the same PLayerTransaction or PImageBridge. Handles are created by +// ClientLayerManager or ImageBridgeChild, and are cached in the parent side on first +// use. +class CompositableHandle +{ + friend struct IPC::ParamTraits; +public: + CompositableHandle() : mHandle(0) + {} + CompositableHandle(const CompositableHandle& aOther) : mHandle(aOther.mHandle) + {} + explicit CompositableHandle(uint64_t aHandle) : mHandle(aHandle) + {} + bool IsValid() const { + return mHandle != 0; + } + explicit operator bool() const { + return IsValid(); + } + bool operator ==(const CompositableHandle& aOther) const { + return mHandle == aOther.mHandle; + } + uint64_t Value() const { + return mHandle; + } +private: + uint64_t mHandle; +}; + } // namespace layers } // namespace mozilla diff --git a/gfx/layers/client/CanvasClient.cpp b/gfx/layers/client/CanvasClient.cpp index 21ac1d6bff9d..19683a6c82b3 100644 --- a/gfx/layers/client/CanvasClient.cpp +++ b/gfx/layers/client/CanvasClient.cpp @@ -55,14 +55,14 @@ CanvasClientBridge::UpdateAsync(AsyncCanvasRenderer* aRenderer) return; } - uint64_t asyncID = aRenderer->GetCanvasClientAsyncID(); - if (asyncID == 0 || mAsyncID == asyncID) { + CompositableHandle asyncID = aRenderer->GetCanvasClientAsyncHandle(); + if (!asyncID || mAsyncHandle == asyncID) { return; } static_cast(GetForwarder()) ->AttachAsyncCompositable(asyncID, mLayer); - mAsyncID = asyncID; + mAsyncHandle = asyncID; } void diff --git a/gfx/layers/client/CanvasClient.h b/gfx/layers/client/CanvasClient.h index e250a2ec43b0..1e47f085a230 100644 --- a/gfx/layers/client/CanvasClient.h +++ b/gfx/layers/client/CanvasClient.h @@ -184,7 +184,6 @@ public: CanvasClientBridge(CompositableForwarder* aLayerForwarder, TextureFlags aFlags) : CanvasClient(aLayerForwarder, aFlags) - , mAsyncID(0) , mLayer(nullptr) { } @@ -206,7 +205,7 @@ public: } protected: - uint64_t mAsyncID; + CompositableHandle mAsyncHandle; ShadowableLayer* mLayer; }; diff --git a/gfx/layers/client/ClientLayerManager.cpp b/gfx/layers/client/ClientLayerManager.cpp index e23d74e480b8..389e22245d92 100644 --- a/gfx/layers/client/ClientLayerManager.cpp +++ b/gfx/layers/client/ClientLayerManager.cpp @@ -13,7 +13,6 @@ #include "mozilla/hal_sandbox/PHal.h" // for ScreenConfiguration #include "mozilla/layers/CompositableClient.h" #include "mozilla/layers/CompositorBridgeChild.h" // for CompositorBridgeChild -#include "mozilla/layers/ContentClient.h" #include "mozilla/layers/FrameUniformityData.h" #include "mozilla/layers/ISurfaceAllocator.h" #include "mozilla/layers/LayersMessages.h" // for EditReply, etc @@ -660,7 +659,8 @@ ClientLayerManager::ForwardTransaction(bool aScheduleComposite) // Skip the synchronization for buffer since we also skip the painting during // device-reset status. if (!gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { - if (mForwarder->GetSyncObject()) { + if (mForwarder->GetSyncObject() && + mForwarder->GetSyncObject()->IsSyncObjectValid()) { mForwarder->GetSyncObject()->FinalizeFrame(); } } @@ -680,35 +680,12 @@ ClientLayerManager::ForwardTransaction(bool aScheduleComposite) } // forward this transaction's changeset to our LayerManagerComposite - bool sent; - AutoTArray replies; - if (mForwarder->EndTransaction(&replies, mRegionToClear, - mLatestTransactionId, aScheduleComposite, mPaintSequenceNumber, - mIsRepeatTransaction, transactionStart, &sent)) { - for (nsTArray::size_type i = 0; i < replies.Length(); ++i) { - const EditReply& reply = replies[i]; - - switch (reply.type()) { - case EditReply::TOpContentBufferSwap: { - MOZ_LAYERS_LOG(("[LayersForwarder] DoubleBufferSwap")); - - const OpContentBufferSwap& obs = reply.get_OpContentBufferSwap(); - - RefPtr compositable = - CompositableClient::FromIPDLActor(obs.compositableChild()); - ContentClientRemote* contentClient = - static_cast(compositable.get()); - MOZ_ASSERT(contentClient); - - contentClient->SwapBuffers(obs.frontUpdatedRegion()); - - break; - } - default: - MOZ_CRASH("not reached"); - } - } - + bool sent = false; + bool ok = mForwarder->EndTransaction( + mRegionToClear, mLatestTransactionId, aScheduleComposite, + mPaintSequenceNumber, mIsRepeatTransaction, transactionStart, + &sent); + if (ok) { if (sent) { mNeedsComposite = false; } diff --git a/gfx/layers/client/ClientPaintedLayer.cpp b/gfx/layers/client/ClientPaintedLayer.cpp index 871f10559b50..c4a9bcb83c5f 100644 --- a/gfx/layers/client/ClientPaintedLayer.cpp +++ b/gfx/layers/client/ClientPaintedLayer.cpp @@ -99,7 +99,7 @@ ClientPaintedLayer::PaintThebes() mValidRegion.Or(mValidRegion, state.mRegionToDraw); ContentClientRemote* contentClientRemote = static_cast(mContentClient.get()); - MOZ_ASSERT(contentClientRemote->GetIPDLActor()); + MOZ_ASSERT(contentClientRemote->GetIPCHandle()); // Hold(this) ensures this layer is kept alive through the current transaction // The ContentClient assumes this layer is kept alive (e.g., in CreateBuffer), diff --git a/gfx/layers/client/CompositableChild.cpp b/gfx/layers/client/CompositableChild.cpp deleted file mode 100644 index 379cd1b7b283..000000000000 --- a/gfx/layers/client/CompositableChild.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "CompositableChild.h" -#include "CompositableClient.h" - -namespace mozilla { -namespace layers { - -/* static */ PCompositableChild* -CompositableChild::CreateActor() -{ - CompositableChild* child = new CompositableChild(); - child->AddRef(); - return child; -} - -/* static */ void -CompositableChild::DestroyActor(PCompositableChild* aChild) -{ - static_cast(aChild)->Release(); -} - -CompositableChild::CompositableChild() - : mCompositableClient(nullptr), - mCanSend(true) -{ -} - -CompositableChild::~CompositableChild() -{ -} - -bool -CompositableChild::IsConnected() const -{ - return mCompositableClient && mCanSend; -} - -void -CompositableChild::Init(CompositableClient* aCompositable) -{ - mCompositableClient = aCompositable; -} - -void -CompositableChild::RevokeCompositableClient() -{ - mCompositableClient = nullptr; -} - -RefPtr -CompositableChild::GetCompositableClient() -{ - return mCompositableClient; -} - -void -CompositableChild::ActorDestroy(ActorDestroyReason) -{ - MOZ_ASSERT(NS_IsMainThread()); - - mCanSend = false; - - if (mCompositableClient) { - mCompositableClient->mCompositableChild = nullptr; - mCompositableClient = nullptr; - } -} - -/* static */ PCompositableChild* -AsyncCompositableChild::CreateActor(uint64_t aAsyncID) -{ - AsyncCompositableChild* child = new AsyncCompositableChild(aAsyncID); - child->AddRef(); - return child; -} - -AsyncCompositableChild::AsyncCompositableChild(uint64_t aAsyncID) - : mLock("AsyncCompositableChild.mLock"), - mAsyncID(aAsyncID) -{ -} - -AsyncCompositableChild::~AsyncCompositableChild() -{ -} - -void -AsyncCompositableChild::ActorDestroy(ActorDestroyReason) -{ - mCanSend = false; - - // We do not revoke CompositableClient::mCompositableChild here, since that - // could race with the main thread. - RevokeCompositableClient(); -} - -void -AsyncCompositableChild::RevokeCompositableClient() -{ - MutexAutoLock lock(mLock); - mCompositableClient = nullptr; -} - -RefPtr -AsyncCompositableChild::GetCompositableClient() -{ - MutexAutoLock lock(mLock); - return CompositableChild::GetCompositableClient(); -} - -} // namespace layers -} // namespace mozilla diff --git a/gfx/layers/client/CompositableChild.h b/gfx/layers/client/CompositableChild.h deleted file mode 100644 index 9635b997bae6..000000000000 --- a/gfx/layers/client/CompositableChild.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_gfx_layers_client_CompositableChild_h -#define mozilla_gfx_layers_client_CompositableChild_h - -#include -#include "IPDLActor.h" -#include "mozilla/Mutex.h" -#include "mozilla/layers/PCompositableChild.h" - -namespace mozilla { -namespace layers { - -class CompositableClient; -class AsyncCompositableChild; - -/** - * IPDL actor used by CompositableClient to match with its corresponding - * CompositableHost on the compositor side. - * - * CompositableChild is owned by a CompositableClient. - */ -class CompositableChild : public PCompositableChild -{ -public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositableChild) - - static PCompositableChild* CreateActor(); - static void DestroyActor(PCompositableChild* aChild); - - void Init(CompositableClient* aCompositable); - virtual void RevokeCompositableClient(); - - virtual void ActorDestroy(ActorDestroyReason) override; - - virtual RefPtr GetCompositableClient(); - - virtual AsyncCompositableChild* AsAsyncCompositableChild() { - return nullptr; - } - - // These should only be called on the IPDL thread. - bool IsConnected() const; - bool CanSend() const { - return mCanSend; - } - -protected: - CompositableChild(); - virtual ~CompositableChild(); - -protected: - CompositableClient* mCompositableClient; - bool mCanSend; -}; - -// This CompositableChild can be used off the main thread. -class AsyncCompositableChild final : public CompositableChild -{ -public: - static PCompositableChild* CreateActor(uint64_t aAsyncID); - - void RevokeCompositableClient() override; - RefPtr GetCompositableClient() override; - - void ActorDestroy(ActorDestroyReason) override; - - AsyncCompositableChild* AsAsyncCompositableChild() override { - return this; - } - - uint64_t GetAsyncID() const { - return mAsyncID; - } - -protected: - explicit AsyncCompositableChild(uint64_t aAsyncID); - ~AsyncCompositableChild() override; - -private: - Mutex mLock; - uint64_t mAsyncID; -}; - -} // namespace layers -} // namespace mozilla - -#endif // mozilla_gfx_layers_client_CompositableChild_h diff --git a/gfx/layers/client/CompositableClient.cpp b/gfx/layers/client/CompositableClient.cpp index 87de2a8d849e..6be6ab738d0f 100644 --- a/gfx/layers/client/CompositableClient.cpp +++ b/gfx/layers/client/CompositableClient.cpp @@ -6,13 +6,11 @@ #include "mozilla/layers/CompositableClient.h" #include // for uint64_t, uint32_t #include "gfxPlatform.h" // for gfxPlatform -#include "mozilla/layers/CompositableChild.h" #include "mozilla/layers/CompositableForwarder.h" #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/layers/TextureClient.h" // for TextureClient, etc #include "mozilla/layers/TextureClientOGL.h" #include "mozilla/mozalloc.h" // for operator delete, etc -#include "mozilla/layers/PCompositableChild.h" #include "mozilla/layers/TextureClientRecycleAllocator.h" #ifdef XP_WIN #include "gfxWindowsPlatform.h" // for gfxWindowsPlatform @@ -28,36 +26,21 @@ namespace layers { using namespace mozilla::gfx; void -CompositableClient::InitIPDLActor(PCompositableChild* aActor, uint64_t aAsyncID) +CompositableClient::InitIPDL(const CompositableHandle& aHandle) { - MOZ_ASSERT(aActor); + MOZ_ASSERT(aHandle); mForwarder->AssertInForwarderThread(); - mAsyncID = aAsyncID; - mCompositableChild = static_cast(aActor); - mCompositableChild->Init(this); -} - -/* static */ RefPtr -CompositableClient::FromIPDLActor(PCompositableChild* aActor) -{ - MOZ_ASSERT(aActor); - - RefPtr client = static_cast(aActor)->GetCompositableClient(); - if (!client) { - return nullptr; - } - - client->mForwarder->AssertInForwarderThread(); - return client; + mHandle = aHandle; + mIsAsync = !NS_IsMainThread(); } CompositableClient::CompositableClient(CompositableForwarder* aForwarder, TextureFlags aTextureFlags) : mForwarder(aForwarder) , mTextureFlags(aTextureFlags) -, mAsyncID(0) +, mIsAsync(false) { } @@ -72,17 +55,11 @@ CompositableClient::GetCompositorBackendType() const return mForwarder->GetCompositorBackendType(); } -PCompositableChild* -CompositableClient::GetIPDLActor() const -{ - return mCompositableChild; -} - bool CompositableClient::Connect(ImageContainer* aImageContainer) { - MOZ_ASSERT(!mCompositableChild); - if (!GetForwarder() || GetIPDLActor()) { + MOZ_ASSERT(!mHandle); + if (!GetForwarder() || mHandle) { return false; } @@ -96,35 +73,29 @@ CompositableClient::IsConnected() const { // CanSend() is only reliable in the same thread as the IPDL channel. mForwarder->AssertInForwarderThread(); - return mCompositableChild && mCompositableChild->IsConnected(); + return !!mHandle; } void CompositableClient::Destroy() { - if (!mCompositableChild) { - return; - } - if (mTextureClientRecycler) { mTextureClientRecycler->Destroy(); } - // Take away our IPDL's actor reference back to us. - mCompositableChild->RevokeCompositableClient(); - - // Schedule the IPDL actor to be destroyed on the forwarder's thread. - mForwarder->Destroy(mCompositableChild); - mCompositableChild = nullptr; + if (mHandle) { + mForwarder->ReleaseCompositable(mHandle); + mHandle = CompositableHandle(); + } } -uint64_t -CompositableClient::GetAsyncID() const +CompositableHandle +CompositableClient::GetAsyncHandle() const { - if (mCompositableChild) { - return mAsyncID; + if (mIsAsync) { + return mHandle; } - return 0; // zero is always an invalid async ID + return CompositableHandle(); } already_AddRefed diff --git a/gfx/layers/client/CompositableClient.h b/gfx/layers/client/CompositableClient.h index 64bccc6157ce..16463cb69a79 100644 --- a/gfx/layers/client/CompositableClient.h +++ b/gfx/layers/client/CompositableClient.h @@ -27,6 +27,7 @@ class CompositableForwarder; class CompositableChild; class PCompositableChild; class TextureClientRecycleAllocator; +class ContentClientRemote; /** * CompositableClient manages the texture-specific logic for composite layers, @@ -113,8 +114,6 @@ public: bool IsConnected() const; - PCompositableChild* GetIPDLActor() const; - CompositableForwarder* GetForwarder() const { return mForwarder; @@ -125,10 +124,17 @@ public: * layer. It is not used if the compositable is used with the regular shadow * layer forwarder. * - * If this returns zero, it means the compositable is not async (it is used + * If this returns empty, it means the compositable is not async (it is used * on the main thread). */ - uint64_t GetAsyncID() const; + CompositableHandle GetAsyncHandle() const; + + /** + * Handle for IPDL communication. + */ + CompositableHandle GetIPCHandle() const { + return mHandle; + } /** * Tells the Compositor to create a TextureHost for this TextureClient. @@ -160,9 +166,9 @@ public: */ virtual void RemoveTexture(TextureClient* aTexture); - static RefPtr FromIPDLActor(PCompositableChild* aActor); + virtual ContentClientRemote* AsContentClientRemote() { return nullptr; } - void InitIPDLActor(PCompositableChild* aActor, uint64_t aAsyncID = 0); + void InitIPDL(const CompositableHandle& aHandle); TextureFlags GetTextureFlags() const { return mTextureFlags; } @@ -174,14 +180,14 @@ public: TextureClient* aTexture, TextureDumpMode aCompress); protected: - RefPtr mCompositableChild; RefPtr mForwarder; // Some layers may want to enforce some flags to all their textures // (like disallowing tiling) TextureFlags mTextureFlags; RefPtr mTextureClientRecycler; - uint64_t mAsyncID; + CompositableHandle mHandle; + bool mIsAsync; friend class CompositableChild; }; diff --git a/gfx/layers/client/ContentClient.h b/gfx/layers/client/ContentClient.h index d26f0146412b..9ed8510bf6cf 100644 --- a/gfx/layers/client/ContentClient.h +++ b/gfx/layers/client/ContentClient.h @@ -119,6 +119,10 @@ public: virtual void Updated(const nsIntRegion& aRegionToDraw, const nsIntRegion& aVisibleRegion, bool aDidSelfCopy) = 0; + + ContentClientRemote* AsContentClientRemote() override { + return this; + } }; // thin wrapper around RotatedContentBuffer, for on-mtc diff --git a/gfx/layers/client/ImageClient.cpp b/gfx/layers/client/ImageClient.cpp index 1ccb69502f3f..ba046b81d967 100644 --- a/gfx/layers/client/ImageClient.cpp +++ b/gfx/layers/client/ImageClient.cpp @@ -278,7 +278,6 @@ ImageClient::ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags, ImageClientBridge::ImageClientBridge(CompositableForwarder* aFwd, TextureFlags aFlags) : ImageClient(aFwd, aFlags, CompositableType::IMAGE_BRIDGE) -, mAsyncContainerID(0) { } @@ -288,11 +287,11 @@ ImageClientBridge::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlag if (!GetForwarder() || !mLayer) { return false; } - if (mAsyncContainerID == aContainer->GetAsyncContainerID()) { + if (mAsyncContainerHandle == aContainer->GetAsyncContainerHandle()) { return true; } - mAsyncContainerID = aContainer->GetAsyncContainerID(); - static_cast(GetForwarder())->AttachAsyncCompositable(mAsyncContainerID, mLayer); + mAsyncContainerHandle = aContainer->GetAsyncContainerHandle(); + static_cast(GetForwarder())->AttachAsyncCompositable(mAsyncContainerHandle, mLayer); return true; } diff --git a/gfx/layers/client/ImageClient.h b/gfx/layers/client/ImageClient.h index 4c6e264008ec..0ffd53d58a3f 100644 --- a/gfx/layers/client/ImageClient.h +++ b/gfx/layers/client/ImageClient.h @@ -129,7 +129,7 @@ public: } protected: - uint64_t mAsyncContainerID; + CompositableHandle mAsyncContainerHandle; }; } // namespace layers diff --git a/gfx/layers/client/TextureClient.h b/gfx/layers/client/TextureClient.h index 9c3f64548017..d28f37cf5f1b 100644 --- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -111,6 +111,7 @@ public: virtual SyncType GetSyncType() = 0; virtual void FinalizeFrame() = 0; + virtual bool IsSyncObjectValid() = 0; protected: SyncObject() { } diff --git a/gfx/layers/composite/CompositableHost.cpp b/gfx/layers/composite/CompositableHost.cpp index 35e6d8a76aa3..7a28d16b6bb9 100644 --- a/gfx/layers/composite/CompositableHost.cpp +++ b/gfx/layers/composite/CompositableHost.cpp @@ -17,7 +17,6 @@ #include "nsDebug.h" // for NS_WARNING #include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc #include "gfxPlatform.h" // for gfxPlatform -#include "mozilla/layers/PCompositableParent.h" #include "IPDLActor.h" namespace mozilla { @@ -28,38 +27,6 @@ namespace layers { class Compositor; -/** - * IPDL actor used by CompositableHost to match with its corresponding - * CompositableClient on the content side. - * - * CompositableParent is owned by the IPDL system. It's deletion is triggered - * by either the CompositableChild's deletion, or by the IPDL communication - * going down. - */ -class CompositableParent : public ParentActor -{ -public: - CompositableParent(CompositableParentManager* aMgr, const TextureInfo& aTextureInfo) - { - MOZ_COUNT_CTOR(CompositableParent); - mHost = CompositableHost::Create(aTextureInfo); - } - - ~CompositableParent() - { - MOZ_COUNT_DTOR(CompositableParent); - } - - virtual void Destroy() override - { - if (mHost) { - mHost->Detach(nullptr, CompositableHost::FORCE_DETACH); - } - } - - RefPtr mHost; -}; - CompositableHost::CompositableHost(const TextureInfo& aTextureInfo) : mTextureInfo(aTextureInfo) , mCompositorID(0) @@ -77,27 +44,6 @@ CompositableHost::~CompositableHost() MOZ_COUNT_DTOR(CompositableHost); } -PCompositableParent* -CompositableHost::CreateIPDLActor(CompositableParentManager* aMgr, - const TextureInfo& aTextureInfo) -{ - return new CompositableParent(aMgr, aTextureInfo); -} - -bool -CompositableHost::DestroyIPDLActor(PCompositableParent* aActor) -{ - delete aActor; - return true; -} - -CompositableHost* -CompositableHost::FromIPDLActor(PCompositableParent* aActor) -{ - MOZ_ASSERT(aActor); - return static_cast(aActor)->mHost; -} - void CompositableHost::UseTextureHost(const nsTArray& aTextures) { @@ -209,11 +155,5 @@ CompositableHost::DumpTextureHost(std::stringstream& aStream, TextureHost* aText aStream << gfxUtils::GetAsDataURI(dSurf).get(); } -void -CompositableHost::ReceivedDestroy(PCompositableParent* aActor) -{ - static_cast(aActor)->RecvDestroy(); -} - } // namespace layers } // namespace mozilla diff --git a/gfx/layers/composite/CompositableHost.h b/gfx/layers/composite/CompositableHost.h index edde29c063c8..257c6885eee8 100644 --- a/gfx/layers/composite/CompositableHost.h +++ b/gfx/layers/composite/CompositableHost.h @@ -43,21 +43,19 @@ class Compositor; class ThebesBufferData; class TiledContentHost; class CompositableParentManager; -class PCompositableParent; struct EffectChain; struct AsyncCompositableRef { AsyncCompositableRef() - : mProcessId(mozilla::ipc::kInvalidProcessId), - mAsyncId(0) + : mProcessId(mozilla::ipc::kInvalidProcessId) {} - AsyncCompositableRef(base::ProcessId aProcessId, uint64_t aAsyncId) - : mProcessId(aProcessId), mAsyncId(aAsyncId) + AsyncCompositableRef(base::ProcessId aProcessId, const CompositableHandle& aHandle) + : mProcessId(aProcessId), mHandle(aHandle) {} - explicit operator bool() const { return !!mAsyncId; } + explicit operator bool() const { return !!mHandle; } base::ProcessId mProcessId; - uint64_t mAsyncId; + CompositableHandle mHandle; }; /** @@ -80,7 +78,7 @@ protected: virtual ~CompositableHost(); public: - NS_INLINE_DECL_REFCOUNTING(CompositableHost) + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositableHost) explicit CompositableHost(const TextureInfo& aTextureInfo); static already_AddRefed Create(const TextureInfo& aTextureInfo); @@ -188,9 +186,6 @@ public: } bool IsAttached() { return mAttached; } - static void - ReceivedDestroy(PCompositableParent* aActor); - virtual void Dump(std::stringstream& aStream, const char* aPrefix="", bool aDumpHtml=false) { } @@ -221,14 +216,6 @@ public: ? DIAGNOSTIC_FLASH_COUNTER_MAX : mFlashCounter + 1; } - static PCompositableParent* - CreateIPDLActor(CompositableParentManager* mgr, - const TextureInfo& textureInfo); - - static bool DestroyIPDLActor(PCompositableParent* actor); - - static CompositableHost* FromIPDLActor(PCompositableParent* actor); - uint64_t GetCompositorID() const { return mCompositorID; } const AsyncCompositableRef& GetAsyncRef() const { return mAsyncRef; } diff --git a/gfx/layers/composite/ImageHost.cpp b/gfx/layers/composite/ImageHost.cpp index edd96abbf2dd..0cbb1d63fba2 100644 --- a/gfx/layers/composite/ImageHost.cpp +++ b/gfx/layers/composite/ImageHost.cpp @@ -350,7 +350,7 @@ ImageHost::Composite(LayerComposite* aLayer, ImageCompositeNotificationInfo info; info.mImageBridgeProcessId = mAsyncRef.mProcessId; info.mNotification = ImageCompositeNotification( - mAsyncRef.mAsyncId, + mAsyncRef.mHandle, img->mTimeStamp, GetCompositor()->GetCompositionTime(), img->mFrameID, img->mProducerID); static_cast(aLayer->GetLayerManager())-> diff --git a/gfx/layers/d3d11/TextureD3D11.cpp b/gfx/layers/d3d11/TextureD3D11.cpp index 59463ffccc35..73d792b8d331 100644 --- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -1198,6 +1198,7 @@ CompositingRenderTargetD3D11::GetSize() const SyncObjectD3D11::SyncObjectD3D11(SyncHandle aSyncHandle) : mSyncHandle(aSyncHandle) { + mD3D11Device = DeviceManagerDx::Get()->GetContentDevice(); } bool @@ -1239,6 +1240,16 @@ SyncObjectD3D11::RegisterTexture(ID3D11Texture2D* aTexture) mD3D11SyncedTextures.push_back(aTexture); } +bool +SyncObjectD3D11::IsSyncObjectValid() +{ + RefPtr dev = DeviceManagerDx::Get()->GetContentDevice(); + if (!dev || (dev != mD3D11Device)) { + return false; + } + return true; +} + void SyncObjectD3D11::FinalizeFrame() { diff --git a/gfx/layers/d3d11/TextureD3D11.h b/gfx/layers/d3d11/TextureD3D11.h index 0ba8fc89a3ed..6efff8e8a687 100644 --- a/gfx/layers/d3d11/TextureD3D11.h +++ b/gfx/layers/d3d11/TextureD3D11.h @@ -415,6 +415,7 @@ class SyncObjectD3D11 : public SyncObject public: explicit SyncObjectD3D11(SyncHandle aSyncHandle); virtual void FinalizeFrame(); + virtual bool IsSyncObjectValid(); virtual SyncType GetSyncType() { return SyncType::D3D11; } @@ -425,6 +426,7 @@ private: private: SyncHandle mSyncHandle; + RefPtr mD3D11Device; RefPtr mD3D11Texture; RefPtr mKeyedMutex; std::vector mD3D11SyncedTextures; diff --git a/gfx/layers/ipc/CompositableForwarder.cpp b/gfx/layers/ipc/CompositableForwarder.cpp deleted file mode 100644 index 20f2f61aeb86..000000000000 --- a/gfx/layers/ipc/CompositableForwarder.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- 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 "CompositableForwarder.h" -#include "mozilla/layers/CompositableChild.h" - -namespace mozilla { -namespace layers { - -void -CompositableForwarder::Destroy(CompositableChild* aCompositable) -{ - AssertInForwarderThread(); - - if (!aCompositable->CanSend()) { - return; - } - - if (!DestroyInTransaction(aCompositable, false)) { - aCompositable->SendDestroy(); - } -} - -} // namespace layers -} // namespace mozilla diff --git a/gfx/layers/ipc/CompositableForwarder.h b/gfx/layers/ipc/CompositableForwarder.h index b31754b5a0d6..648a3370a067 100644 --- a/gfx/layers/ipc/CompositableForwarder.h +++ b/gfx/layers/ipc/CompositableForwarder.h @@ -71,10 +71,8 @@ public: const ThebesBufferData& aThebesBufferData, const nsIntRegion& aUpdatedRegion) = 0; - virtual void Destroy(CompositableChild* aCompositable); - + virtual void ReleaseCompositable(const CompositableHandle& aHandle) = 0; virtual bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) = 0; - virtual bool DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) = 0; /** * Tell the CompositableHost on the compositor side to remove the texture diff --git a/gfx/layers/ipc/CompositableTransactionParent.cpp b/gfx/layers/ipc/CompositableTransactionParent.cpp index 135011101f0a..8bf5da682850 100644 --- a/gfx/layers/ipc/CompositableTransactionParent.cpp +++ b/gfx/layers/ipc/CompositableTransactionParent.cpp @@ -66,7 +66,10 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation { // Ignore all operations on compositables created on stale compositors. We // return true because the child is unable to handle errors. - CompositableHost* compositable = CompositableHost::FromIPDLActor(aEdit.compositableParent()); + RefPtr compositable = FindCompositable(aEdit.compositable()); + if (!compositable) { + return false; + } if (compositable->GetCompositor() && !compositable->GetCompositor()->IsValid()) { return true; } @@ -95,7 +98,7 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation return false; } replyv.push_back( - OpContentBufferSwap(aEdit.compositableParent(), nullptr, frontUpdatedRegion)); + OpContentBufferSwap(aEdit.compositable(), frontUpdatedRegion)); RenderTraceInvalidateEnd(thebes, "FF00FF"); break; @@ -229,9 +232,8 @@ CompositableParentManager::DestroyActor(const OpDestroy& aOp) TextureHost::ReceivedDestroy(actor); break; } - case OpDestroy::TPCompositableParent: { - auto actor = aOp.get_PCompositableParent(); - CompositableHost::ReceivedDestroy(actor); + case OpDestroy::TCompositableHandle: { + ReleaseCompositable(aOp.get_CompositableHandle()); break; } default: { @@ -240,6 +242,52 @@ CompositableParentManager::DestroyActor(const OpDestroy& aOp) } } +RefPtr +CompositableParentManager::AddCompositable(const CompositableHandle& aHandle, + const TextureInfo& aInfo) +{ + if (mCompositables.find(aHandle.Value()) != mCompositables.end()) { + NS_ERROR("Client should not allocate duplicate handles"); + return nullptr; + } + if (!aHandle) { + NS_ERROR("Client should not allocate 0 as a handle"); + return nullptr; + } + + RefPtr host = CompositableHost::Create(aInfo); + if (!host) { + return nullptr; + } + + mCompositables[aHandle.Value()] = host; + return host; +} + +RefPtr +CompositableParentManager::FindCompositable(const CompositableHandle& aHandle) +{ + auto iter = mCompositables.find(aHandle.Value()); + if (iter == mCompositables.end()) { + return nullptr; + } + return iter->second; +} + +void +CompositableParentManager::ReleaseCompositable(const CompositableHandle& aHandle) +{ + auto iter = mCompositables.find(aHandle.Value()); + if (iter == mCompositables.end()) { + return; + } + + RefPtr host = iter->second; + mCompositables.erase(iter); + + host->Detach(nullptr, CompositableHost::FORCE_DETACH); +} + } // namespace layers } // namespace mozilla diff --git a/gfx/layers/ipc/CompositableTransactionParent.h b/gfx/layers/ipc/CompositableTransactionParent.h index ca676c11561e..fca5a6db640d 100644 --- a/gfx/layers/ipc/CompositableTransactionParent.h +++ b/gfx/layers/ipc/CompositableTransactionParent.h @@ -12,12 +12,11 @@ #include "mozilla/Attributes.h" // for override #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/LayersMessages.h" // for EditReply, etc +#include "CompositableHost.h" namespace mozilla { namespace layers { -class CompositableHost; - typedef std::vector EditReplyVector; // Since PCompositble has two potential manager protocols, we can't just call @@ -39,6 +38,11 @@ public: uint64_t GetFwdTransactionId() { return mFwdTransactionId; } + RefPtr AddCompositable( + const CompositableHandle& aHandle, + const TextureInfo& aInfo); + RefPtr FindCompositable(const CompositableHandle& aHandle); + protected: /** * Handle the IPDL messages that affect PCompositable actors. @@ -46,7 +50,14 @@ protected: bool ReceiveCompositableUpdate(const CompositableOperation& aEdit, EditReplyVector& replyv); + void ReleaseCompositable(const CompositableHandle& aHandle); + uint64_t mFwdTransactionId = 0; + + /** + * Mapping form IDs to CompositableHosts. + */ + std::map> mCompositables; }; } // namespace layers diff --git a/gfx/layers/ipc/ImageBridgeChild.cpp b/gfx/layers/ipc/ImageBridgeChild.cpp index ad5b0c26bdcd..dc77a96d007a 100644 --- a/gfx/layers/ipc/ImageBridgeChild.cpp +++ b/gfx/layers/ipc/ImageBridgeChild.cpp @@ -23,13 +23,11 @@ #include "mozilla/layers/AsyncCanvasRenderer.h" #include "mozilla/media/MediaSystemResourceManager.h" // for MediaSystemResourceManager #include "mozilla/media/MediaSystemResourceManagerChild.h" // for MediaSystemResourceManagerChild -#include "mozilla/layers/CompositableChild.h" #include "mozilla/layers/CompositableClient.h" // for CompositableChild, etc #include "mozilla/layers/CompositorThread.h" #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/ImageClient.h" // for ImageClient #include "mozilla/layers/LayersMessages.h" // for CompositableOperation -#include "mozilla/layers/PCompositableChild.h" // for PCompositableChild #include "mozilla/layers/TextureClient.h" // for TextureClient #include "mozilla/dom/ContentChild.h" #include "mozilla/mozalloc.h" // for operator new, etc @@ -155,7 +153,7 @@ ImageBridgeChild::UseTextures(CompositableClient* aCompositable, const nsTArray& aTextures) { MOZ_ASSERT(aCompositable); - MOZ_ASSERT(aCompositable->GetIPDLActor()); + MOZ_ASSERT(aCompositable->GetIPCHandle()); MOZ_ASSERT(aCompositable->IsConnected()); AutoTArray textures; @@ -179,7 +177,7 @@ ImageBridgeChild::UseTextures(CompositableClient* aCompositable, // Wait end of usage on host side if TextureFlags::RECYCLE is set HoldUntilCompositableRefReleasedIfNecessary(t.mTextureClient); } - mTxn->AddNoSwapEdit(CompositableOperation(nullptr, aCompositable->GetIPDLActor(), + mTxn->AddNoSwapEdit(CompositableOperation(aCompositable->GetIPCHandle(), OpUseTexture(textures))); } @@ -206,8 +204,7 @@ ImageBridgeChild::UseComponentAlphaTextures(CompositableClient* aCompositable, mTxn->AddNoSwapEdit( CompositableOperation( - nullptr, - aCompositable->GetIPDLActor(), + aCompositable->GetIPCHandle(), OpUseComponentAlphaTextures( nullptr, aTextureOnBlack->GetIPDLActor(), nullptr, aTextureOnWhite->GetIPDLActor(), @@ -272,14 +269,6 @@ ImageBridgeChild::ShutdownStep1(SynchronousTask* aTask) MediaSystemResourceManager::Shutdown(); // Force all managed protocols to shut themselves down cleanly - InfallibleTArray compositables; - ManagedPCompositableChild(compositables); - for (int i = compositables.Length() - 1; i >= 0; --i) { - auto compositable = CompositableClient::FromIPDLActor(compositables[i]); - if (compositable) { - compositable->Destroy(); - } - } InfallibleTArray textures; ManagedPTextureChild(textures); for (int i = textures.Length() - 1; i >= 0; --i) { @@ -306,18 +295,17 @@ ImageBridgeChild::ShutdownStep2(SynchronousTask* aTask) MOZ_ASSERT(InImageBridgeChildThread(), "Should be in ImageBridgeChild thread."); - - if (!mCalledClose) { - Close(); - mCalledClose = true; - } + Close(); } void ImageBridgeChild::ActorDestroy(ActorDestroyReason aWhy) { mCanSend = false; - mCalledClose = true; + { + MutexAutoLock lock(mContainerMapLock); + mImageContainers.Clear(); + } } void @@ -349,7 +337,7 @@ ImageBridgeChild::CreateCanvasClientSync(SynchronousTask* aTask, ImageBridgeChild::ImageBridgeChild() : mCanSend(false) - , mCalledClose(false) + , mDestroyed(false) , mFwdTransactionId(0) , mContainerMapLock("ImageBridgeChild.mContainerMapLock") { @@ -391,41 +379,16 @@ ImageBridgeChild::Connect(CompositableClient* aCompositable, mImageContainers.Put(id, aImageContainer); } - PCompositableChild* child = - SendPCompositableConstructor(aCompositable->GetTextureInfo(), id); - if (!child) { - return; - } - aCompositable->InitIPDLActor(child, id); + CompositableHandle handle(id); + aCompositable->InitIPDL(handle); + SendNewCompositable(handle, aCompositable->GetTextureInfo()); } void -ImageBridgeChild::ForgetImageContainer(uint64_t aAsyncContainerID) +ImageBridgeChild::ForgetImageContainer(const CompositableHandle& aHandle) { MutexAutoLock lock(mContainerMapLock); - mImageContainers.Remove(aAsyncContainerID); -} - -PCompositableChild* -ImageBridgeChild::AllocPCompositableChild(const TextureInfo& aInfo, const uint64_t& aID) -{ - MOZ_ASSERT(CanSend()); - return AsyncCompositableChild::CreateActor(aID); -} - -bool -ImageBridgeChild::DeallocPCompositableChild(PCompositableChild* aActor) -{ - AsyncCompositableChild* actor = static_cast(aActor); - MOZ_ASSERT(actor->GetAsyncID()); - - { - MutexAutoLock lock(mContainerMapLock); - mImageContainers.Remove(actor->GetAsyncID()); - } - - AsyncCompositableChild::DestroyActor(aActor); - return true; + mImageContainers.Remove(aHandle.Value()); } Thread* ImageBridgeChild::GetThread() const @@ -461,7 +424,6 @@ ImageBridgeChild::DispatchReleaseTextureClient(TextureClient* aClient) // However, if we take this branch it means that the ImageBridgeChild // has already shut down, along with the TextureChild, which means no // message will be sent and it is safe to run this code from any thread. - MOZ_ASSERT(aClient->GetIPDLActor() == nullptr); RELEASE_MANUALLY(aClient); return; } @@ -773,6 +735,8 @@ ImageBridgeChild::WillShutdown() task.Wait(); } + + mDestroyed = true; } void @@ -1035,6 +999,12 @@ ImageBridgeChild::DeallocShmem(ipc::Shmem& aShmem) return PImageBridgeChild::DeallocShmem(aShmem); } + // If we can't post a task, then we definitely cannot send, so there's + // no reason to queue up this send. + if (!CanPostTask()) { + return false; + } + SynchronousTask task("AllocatorProxy Dealloc"); bool result = false; @@ -1109,7 +1079,7 @@ ImageBridgeChild::RecvDidComposite(InfallibleTArray& { MutexAutoLock lock(mContainerMapLock); ImageContainer* imageContainer; - imageContainer = mImageContainers.Get(n.asyncCompositableID()); + imageContainer = mImageContainers.Get(n.compositable().Value()); if (imageContainer) { listener = imageContainer->GetImageContainerListener(); } @@ -1154,12 +1124,11 @@ ImageBridgeChild::DestroyInTransaction(PTextureChild* aTexture, bool synchronous } bool -ImageBridgeChild::DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) +ImageBridgeChild::DestroyInTransaction(const CompositableHandle& aHandle) { - return IBCAddOpDestroy(mTxn, OpDestroy(aCompositable), synchronously); + return IBCAddOpDestroy(mTxn, OpDestroy(aHandle), false); } - void ImageBridgeChild::RemoveTextureFromCompositable(CompositableClient* aCompositable, TextureClient* aTexture) @@ -1173,7 +1142,7 @@ ImageBridgeChild::RemoveTextureFromCompositable(CompositableClient* aCompositabl } CompositableOperation op( - nullptr, aCompositable->GetIPDLActor(), + aCompositable->GetIPCHandle(), OpRemoveTexture(nullptr, aTexture->GetIPDLActor())); if (aTexture->GetFlags() & TextureFlags::DEALLOCATE_CLIENT) { @@ -1188,18 +1157,52 @@ bool ImageBridgeChild::IsSameProcess() const return OtherPid() == base::GetCurrentProcId(); } +bool +ImageBridgeChild::CanPostTask() const +{ + // During shutdown, the cycle collector may free objects that are holding a + // reference to ImageBridgeChild. Since this happens on the main thread, + // ImageBridgeChild will attempt to post a task to the ImageBridge thread. + // However the thread manager has already been shut down, so the task cannot + // post. + // + // It's okay if this races. We only care about the shutdown case where + // everything's happening on the main thread. Even if it races outside of + // shutdown, it's still harmless to post the task, since the task must + // check CanSend(). + return !mDestroyed; +} + void -ImageBridgeChild::Destroy(CompositableChild* aCompositable) +ImageBridgeChild::ReleaseCompositable(const CompositableHandle& aHandle) { if (!InImageBridgeChildThread()) { + // If we can't post a task, then we definitely cannot send, so there's + // no reason to queue up this send. + if (!CanPostTask()) { + return; + } + RefPtr runnable = WrapRunnable( RefPtr(this), - &ImageBridgeChild::Destroy, - RefPtr(aCompositable)); + &ImageBridgeChild::ReleaseCompositable, + aHandle); GetMessageLoop()->PostTask(runnable.forget()); return; } - CompositableForwarder::Destroy(aCompositable); + + if (!CanSend()) { + return; + } + + if (!DestroyInTransaction(aHandle)) { + SendReleaseCompositable(aHandle); + } + + { + MutexAutoLock lock(mContainerMapLock); + mImageContainers.Remove(aHandle.Value()); + } } bool diff --git a/gfx/layers/ipc/ImageBridgeChild.h b/gfx/layers/ipc/ImageBridgeChild.h index bb75b6f2de3e..82ca193ff481 100644 --- a/gfx/layers/ipc/ImageBridgeChild.h +++ b/gfx/layers/ipc/ImageBridgeChild.h @@ -168,10 +168,6 @@ public: virtual base::ProcessId GetParentPid() const override { return OtherPid(); } - PCompositableChild* AllocPCompositableChild(const TextureInfo& aInfo, - const uint64_t& aID) override; - bool DeallocPCompositableChild(PCompositableChild* aActor) override; - virtual PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aSerial) override; @@ -268,9 +264,9 @@ public: TextureClient* aClientOnBlack, TextureClient* aClientOnWhite) override; - void Destroy(CompositableChild* aCompositable) override; + void ReleaseCompositable(const CompositableHandle& aHandle) override; - void ForgetImageContainer(uint64_t aAsyncContainerID); + void ForgetImageContainer(const CompositableHandle& aHandle); /** * Hold TextureClient ref until end of usage on host side if TextureFlags::RECYCLE is set. @@ -287,7 +283,7 @@ public: virtual void CancelWaitForRecycle(uint64_t aTextureId) override; virtual bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) override; - virtual bool DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) override; + bool DestroyInTransaction(const CompositableHandle& aHandle); virtual void RemoveTextureFromCompositable(CompositableClient* aCompositable, TextureClient* aTexture) override; @@ -364,6 +360,7 @@ protected: void DeallocPImageBridgeChild() override; bool CanSend() const; + bool CanPostTask() const; static void ShutdownSingleton(); @@ -371,7 +368,7 @@ private: CompositableTransaction* mTxn; bool mCanSend; - bool mCalledClose; + mozilla::Atomic mDestroyed; /** * Transaction id of CompositableForwarder. diff --git a/gfx/layers/ipc/ImageBridgeParent.cpp b/gfx/layers/ipc/ImageBridgeParent.cpp index d66a6ff05f1c..ddd168a167bb 100644 --- a/gfx/layers/ipc/ImageBridgeParent.cpp +++ b/gfx/layers/ipc/ImageBridgeParent.cpp @@ -20,7 +20,6 @@ #include "mozilla/layers/CompositableTransactionParent.h" #include "mozilla/layers/LayerManagerComposite.h" #include "mozilla/layers/LayersMessages.h" // for EditReply -#include "mozilla/layers/PCompositableParent.h" #include "mozilla/layers/PImageBridgeParent.h" #include "mozilla/layers/TextureHostOGL.h" // for TextureHostOGL #include "mozilla/layers/Compositor.h" @@ -105,6 +104,7 @@ ImageBridgeParent::ActorDestroy(ActorDestroyReason aWhy) { // Can't alloc/dealloc shmems from now on. mClosed = true; + mCompositables.clear(); MessageLoop::current()->PostTask(NewRunnableMethod(this, &ImageBridgeParent::DeferredDestroy)); @@ -232,34 +232,23 @@ mozilla::ipc::IPCResult ImageBridgeParent::RecvWillClose() return IPC_OK(); } -PCompositableParent* -ImageBridgeParent::AllocPCompositableParent(const TextureInfo& aInfo, const uint64_t& aID) +mozilla::ipc::IPCResult +ImageBridgeParent::RecvNewCompositable(const CompositableHandle& aHandle, const TextureInfo& aInfo) { - PCompositableParent* actor = CompositableHost::CreateIPDLActor(this, aInfo); - if (mCompositables.find(aID) != mCompositables.end()) { - NS_ERROR("Async compositable ID already exists"); - return actor; - } - if (!aID) { - NS_ERROR("Expected non-zero async compositable ID"); - return actor; + RefPtr host = AddCompositable(aHandle, aInfo); + if (!host) { + return IPC_FAIL_NO_REASON(this); } - CompositableHost* host = CompositableHost::FromIPDLActor(actor); - - host->SetAsyncRef(AsyncCompositableRef(OtherPid(), aID)); - mCompositables[aID] = host; - - return actor; + host->SetAsyncRef(AsyncCompositableRef(OtherPid(), aHandle)); + return IPC_OK(); } -bool ImageBridgeParent::DeallocPCompositableParent(PCompositableParent* aActor) +mozilla::ipc::IPCResult +ImageBridgeParent::RecvReleaseCompositable(const CompositableHandle& aHandle) { - if (CompositableHost* host = CompositableHost::FromIPDLActor(aActor)) { - const AsyncCompositableRef& ref = host->GetAsyncRef(); - mCompositables.erase(ref.mAsyncId); - } - return CompositableHost::DestroyIPDLActor(aActor); + ReleaseCompositable(aHandle); + return IPC_OK(); } PTextureParent* @@ -324,7 +313,7 @@ ImageBridgeParent::NotifyImageComposites(nsTArray notifications; notifications.AppendElement(aNotifications[i].mNotification); uint32_t end = i + 1; - MOZ_ASSERT(aNotifications[i].mNotification.asyncCompositableID()); + MOZ_ASSERT(aNotifications[i].mNotification.compositable()); ProcessId pid = aNotifications[i].mImageBridgeProcessId; while (end < aNotifications.Length() && aNotifications[end].mImageBridgeProcessId == pid) { @@ -438,15 +427,5 @@ ImageBridgeParent::NotifyNotUsed(PTextureParent* aTexture, uint64_t aTransaction } } -CompositableHost* -ImageBridgeParent::FindCompositable(uint64_t aId) -{ - auto iter = mCompositables.find(aId); - if (iter == mCompositables.end()) { - return nullptr; - } - return iter->second; -} - } // namespace layers } // namespace mozilla diff --git a/gfx/layers/ipc/ImageBridgeParent.h b/gfx/layers/ipc/ImageBridgeParent.h index 6278fb7a9597..f8f4e9ed973e 100644 --- a/gfx/layers/ipc/ImageBridgeParent.h +++ b/gfx/layers/ipc/ImageBridgeParent.h @@ -77,16 +77,16 @@ public: virtual mozilla::ipc::IPCResult RecvUpdateNoSwap(EditArray&& aEdits, OpDestroyArray&& aToDestroy, const uint64_t& aFwdTransactionId) override; - PCompositableParent* AllocPCompositableParent(const TextureInfo& aInfo, - const uint64_t& aID) override; - bool DeallocPCompositableParent(PCompositableParent* aActor) override; - virtual PTextureParent* AllocPTextureParent(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aSerial) override; virtual bool DeallocPTextureParent(PTextureParent* actor) override; + virtual mozilla::ipc::IPCResult RecvNewCompositable(const CompositableHandle& aHandle, + const TextureInfo& aInfo) override; + virtual mozilla::ipc::IPCResult RecvReleaseCompositable(const CompositableHandle& aHandle) override; + PMediaSystemResourceManagerParent* AllocPMediaSystemResourceManagerParent() override; bool DeallocPMediaSystemResourceManagerParent(PMediaSystemResourceManagerParent* aActor) override; @@ -123,8 +123,6 @@ public: virtual bool IPCOpen() const override { return !mClosed; } - CompositableHost* FindCompositable(uint64_t aId); - protected: void OnChannelConnected(int32_t pid) override; @@ -148,33 +146,6 @@ private: static MessageLoop* sMainLoop; RefPtr mCompositorThreadHolder; - - /** - * PCompositable and PLayer can, in the case of async textures, be managed by - * different top level protocols. In this case they don't share the same - * communication channel and we can't send an OpAttachCompositable (PCompositable, - * PLayer) message. - * - * In order to attach a layer and the right compositable if the the compositable - * is async, we store references to the async compositables in a CompositableMap - * that is accessed only on the compositor thread. During a layer transaction we - * send the message OpAttachAsyncCompositable(ID, PLayer), and on the compositor - * side we lookup the ID in the map and attach the corresponding compositable to - * the layer. - * - * CompositableMap must be global because the image bridge doesn't have any - * reference to whatever we have created with PLayerTransaction. So, the only way to - * actually connect these two worlds is to have something global that they can - * both query (in the same thread). The map is not allocated the map on the - * stack to avoid the badness of static initialization. - * - * Also, we have a compositor/PLayerTransaction protocol/etc. per layer manager, and the - * ImageBridge is used by all the existing compositors that have a video, so - * there isn't an instance or "something" that lives outside the boudaries of a - * given layer manager on the compositor thread except the image bridge and the - * thread itself. - */ - std::map mCompositables; }; } // namespace layers diff --git a/gfx/layers/ipc/LayerTransactionChild.cpp b/gfx/layers/ipc/LayerTransactionChild.cpp index 36abd7514a9a..378bfb651bab 100644 --- a/gfx/layers/ipc/LayerTransactionChild.cpp +++ b/gfx/layers/ipc/LayerTransactionChild.cpp @@ -7,8 +7,6 @@ #include "LayerTransactionChild.h" #include "mozilla/gfx/Logging.h" -#include "mozilla/layers/CompositableChild.h" -#include "mozilla/layers/PCompositableChild.h" // for PCompositableChild #include "mozilla/layers/ShadowLayers.h" // for ShadowLayerForwarder #include "mozilla/mozalloc.h" // for operator delete, etc #include "nsDebug.h" // for NS_RUNTIMEABORT, etc @@ -36,21 +34,6 @@ LayerTransactionChild::Destroy() SendShutdown(); } - -PCompositableChild* -LayerTransactionChild::AllocPCompositableChild(const TextureInfo& aInfo) -{ - MOZ_ASSERT(!mDestroyed); - return CompositableChild::CreateActor(); -} - -bool -LayerTransactionChild::DeallocPCompositableChild(PCompositableChild* actor) -{ - CompositableChild::DestroyActor(actor); - return true; -} - void LayerTransactionChild::ActorDestroy(ActorDestroyReason why) { diff --git a/gfx/layers/ipc/LayerTransactionChild.h b/gfx/layers/ipc/LayerTransactionChild.h index fd8e5a5c62c3..ea5cb86a3f63 100644 --- a/gfx/layers/ipc/LayerTransactionChild.h +++ b/gfx/layers/ipc/LayerTransactionChild.h @@ -57,9 +57,6 @@ protected: {} ~LayerTransactionChild() { } - virtual PCompositableChild* AllocPCompositableChild(const TextureInfo& aInfo) override; - virtual bool DeallocPCompositableChild(PCompositableChild* actor) override; - virtual void ActorDestroy(ActorDestroyReason why) override; void AddIPDLReference() { diff --git a/gfx/layers/ipc/LayerTransactionParent.cpp b/gfx/layers/ipc/LayerTransactionParent.cpp index ad0381227b94..ce6cfd882d9d 100644 --- a/gfx/layers/ipc/LayerTransactionParent.cpp +++ b/gfx/layers/ipc/LayerTransactionParent.cpp @@ -24,7 +24,6 @@ #include "mozilla/layers/LayerManagerComposite.h" #include "mozilla/layers/LayersMessages.h" // for EditReply, etc #include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG -#include "mozilla/layers/PCompositableParent.h" #include "mozilla/layers/TextureHostOGL.h" // for TextureHostOGL #include "mozilla/layers/PaintedLayerComposite.h" #include "mozilla/mozalloc.h" // for operator delete, etc @@ -95,6 +94,7 @@ void LayerTransactionParent::Destroy() { mDestroyed = true; + mCompositables.clear(); } mozilla::ipc::IPCResult @@ -574,7 +574,7 @@ LayerTransactionParent::RecvUpdate(const TransactionInfo& aInfo, } case Edit::TOpAttachCompositable: { const OpAttachCompositable& op = edit.get_OpAttachCompositable(); - CompositableHost* host = CompositableHost::FromIPDLActor(op.compositableParent()); + RefPtr host = FindCompositable(op.compositable()); if (mPendingCompositorUpdates) { // Do not attach compositables from old layer trees. Return true since // content cannot handle errors. @@ -599,7 +599,7 @@ LayerTransactionParent::RecvUpdate(const TransactionInfo& aInfo, if (!imageBridge) { return IPC_FAIL_NO_REASON(this); } - CompositableHost* host = imageBridge->FindCompositable(op.containerID()); + RefPtr host = imageBridge->FindCompositable(op.compositable()); if (!host) { NS_ERROR("CompositableHost not found in the map"); return IPC_FAIL_NO_REASON(this); @@ -942,18 +942,6 @@ LayerTransactionParent::RecvForceComposite() return IPC_OK(); } -PCompositableParent* -LayerTransactionParent::AllocPCompositableParent(const TextureInfo& aInfo) -{ - return CompositableHost::CreateIPDLActor(this, aInfo); -} - -bool -LayerTransactionParent::DeallocPCompositableParent(PCompositableParent* aActor) -{ - return CompositableHost::DestroyIPDLActor(aActor); -} - void LayerTransactionParent::ActorDestroy(ActorDestroyReason why) { @@ -1040,6 +1028,15 @@ LayerTransactionParent::AsLayer(const LayerHandle& aHandle) return mLayerMap.Get(aHandle.Value()).get(); } +mozilla::ipc::IPCResult +LayerTransactionParent::RecvNewCompositable(const CompositableHandle& aHandle, const TextureInfo& aInfo) +{ + if (!AddCompositable(aHandle, aInfo)) { + return IPC_FAIL_NO_REASON(this); + } + return IPC_OK(); +} + mozilla::ipc::IPCResult LayerTransactionParent::RecvReleaseLayer(const LayerHandle& aHandle) { @@ -1055,5 +1052,12 @@ LayerTransactionParent::RecvReleaseLayer(const LayerHandle& aHandle) return IPC_OK(); } +mozilla::ipc::IPCResult +LayerTransactionParent::RecvReleaseCompositable(const CompositableHandle& aHandle) +{ + ReleaseCompositable(aHandle); + return IPC_OK(); +} + } // namespace layers } // namespace mozilla diff --git a/gfx/layers/ipc/LayerTransactionParent.h b/gfx/layers/ipc/LayerTransactionParent.h index 052271cc978b..08d0d600114c 100644 --- a/gfx/layers/ipc/LayerTransactionParent.h +++ b/gfx/layers/ipc/LayerTransactionParent.h @@ -122,7 +122,10 @@ protected: virtual mozilla::ipc::IPCResult RecvUpdateNoSwap(const TransactionInfo& aInfo) override; virtual mozilla::ipc::IPCResult RecvSetLayerObserverEpoch(const uint64_t& aLayerObserverEpoch) override; + virtual mozilla::ipc::IPCResult RecvNewCompositable(const CompositableHandle& aHandle, + const TextureInfo& aInfo) override; virtual mozilla::ipc::IPCResult RecvReleaseLayer(const LayerHandle& aHandle) override; + virtual mozilla::ipc::IPCResult RecvReleaseCompositable(const CompositableHandle& aHandle) override; virtual mozilla::ipc::IPCResult RecvClearCachedResources() override; virtual mozilla::ipc::IPCResult RecvForceComposite() override; @@ -144,9 +147,6 @@ protected: virtual mozilla::ipc::IPCResult RecvSetConfirmedTargetAPZC(const uint64_t& aBlockId, nsTArray&& aTargets) override; - virtual PCompositableParent* AllocPCompositableParent(const TextureInfo& aInfo) override; - virtual bool DeallocPCompositableParent(PCompositableParent* actor) override; - virtual void ActorDestroy(ActorDestroyReason why) override; template diff --git a/gfx/layers/ipc/LayersMessages.ipdlh b/gfx/layers/ipc/LayersMessages.ipdlh index 20f68821738d..088bfda2e6aa 100644 --- a/gfx/layers/ipc/LayersMessages.ipdlh +++ b/gfx/layers/ipc/LayersMessages.ipdlh @@ -6,7 +6,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ include LayersSurfaces; -include protocol PCompositable; include protocol PCompositorBridge; include protocol PRenderFrame; include protocol PTexture; @@ -50,6 +49,7 @@ using mozilla::layers::BorderColors from "mozilla/layers/LayersTypes.h"; using mozilla::layers::BorderCorners from "mozilla/layers/LayersTypes.h"; using mozilla::layers::BorderWidths from "mozilla/layers/LayersTypes.h"; using mozilla::layers::LayerHandle from "mozilla/layers/LayersTypes.h"; +using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h"; namespace mozilla { namespace layers { @@ -73,12 +73,12 @@ struct OpCreateRefLayer { LayerHandle layer; }; struct OpAttachCompositable { LayerHandle layer; - PCompositable compositable; + CompositableHandle compositable; }; struct OpAttachAsyncCompositable { LayerHandle layer; - uint64_t containerID; + CompositableHandle compositable; }; struct ThebesBufferData { @@ -469,7 +469,7 @@ union CompositableOperationDetail { }; struct CompositableOperation { - PCompositable compositable; + CompositableHandle compositable; CompositableOperationDetail detail; }; @@ -507,13 +507,13 @@ union Edit { // operations for safety. union OpDestroy { PTexture; - PCompositable; + CompositableHandle; }; // Replies to operations struct OpContentBufferSwap { - PCompositable compositable; + CompositableHandle compositable; nsIntRegion frontUpdatedRegion; }; @@ -522,7 +522,7 @@ struct OpContentBufferSwap { * image is composited by an ImageHost. */ struct ImageCompositeNotification { - uint64_t asyncCompositableID; + CompositableHandle compositable; TimeStamp imageTimeStamp; TimeStamp firstCompositeTimeStamp; uint32_t frameID; diff --git a/gfx/layers/ipc/PCompositable.ipdl b/gfx/layers/ipc/PCompositable.ipdl deleted file mode 100644 index d7754cd95492..000000000000 --- a/gfx/layers/ipc/PCompositable.ipdl +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=8 et : - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -include protocol PLayerTransaction; -include protocol PImageBridge; -include protocol PCompositorBridge; - -namespace mozilla { -namespace layers { - -async protocol PCompositable -{ - manager PImageBridge or PLayerTransaction; -child: - async __delete__(); -parent: - /** - * Asynchronously tell the compositor side to remove the texture. - */ - async Destroy(); -}; - -} // namespace -} // namespace diff --git a/gfx/layers/ipc/PCompositorBridge.ipdl b/gfx/layers/ipc/PCompositorBridge.ipdl index 0e9d2e842bd7..5a410613a291 100644 --- a/gfx/layers/ipc/PCompositorBridge.ipdl +++ b/gfx/layers/ipc/PCompositorBridge.ipdl @@ -11,7 +11,6 @@ include PlatformWidgetTypes; include protocol PAPZ; include protocol PAPZCTreeManager; include protocol PBrowser; -include protocol PCompositable; include protocol PCompositorWidget; include protocol PLayerTransaction; include protocol PTexture; diff --git a/gfx/layers/ipc/PImageBridge.ipdl b/gfx/layers/ipc/PImageBridge.ipdl index 8341c9fbcc5b..2cde51945d63 100644 --- a/gfx/layers/ipc/PImageBridge.ipdl +++ b/gfx/layers/ipc/PImageBridge.ipdl @@ -5,7 +5,6 @@ include LayersSurfaces; include LayersMessages; -include protocol PCompositable; include protocol PTexture; include ProtocolTypes; include protocol PMediaSystemResourceManager; @@ -14,6 +13,7 @@ include "mozilla/GfxMessageUtils.h"; using struct mozilla::layers::TextureInfo from "mozilla/layers/CompositorTypes.h"; using mozilla::layers::TextureFlags from "mozilla/layers/CompositorTypes.h"; +using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h"; using PlatformThreadId from "base/platform_thread.h"; @@ -27,7 +27,6 @@ namespace layers { */ sync protocol PImageBridge { - manages PCompositable; manages PTexture; manages PMediaSystemResourceManager; @@ -53,10 +52,11 @@ parent: // before sending closing the channel. sync WillClose(); - async PCompositable(TextureInfo aInfo, uint64_t aId); async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t aSerial); async PMediaSystemResourceManager(); + sync NewCompositable(CompositableHandle aHandle, TextureInfo aInfo); + async ReleaseCompositable(CompositableHandle aHandle); }; diff --git a/gfx/layers/ipc/PLayerTransaction.ipdl b/gfx/layers/ipc/PLayerTransaction.ipdl index 7e984070db3f..b09c20f84a2b 100644 --- a/gfx/layers/ipc/PLayerTransaction.ipdl +++ b/gfx/layers/ipc/PLayerTransaction.ipdl @@ -7,7 +7,6 @@ include LayersSurfaces; include LayersMessages; -include protocol PCompositable; include protocol PCompositorBridge; include protocol PRenderFrame; include protocol PTexture; @@ -21,6 +20,7 @@ using mozilla::layers::FrameMetrics::ViewID from "FrameMetrics.h"; using struct mozilla::layers::ScrollableLayerGuid from "FrameMetrics.h"; using mozilla::layers::LayersBackend from "mozilla/layers/LayersTypes.h"; using mozilla::layers::LayerHandle from "mozilla/layers/LayersTypes.h"; +using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h"; /** * The layers protocol is spoken between thread contexts that manage @@ -48,11 +48,8 @@ union MaybeTransform { */ sync protocol PLayerTransaction { manager PCompositorBridge; - manages PCompositable; parent: - async PCompositable(TextureInfo aTextureInfo); - // The isFirstPaint flag can be used to indicate that this is the first update // for a particular document. sync Update(TransactionInfo txn) returns (EditReply[] reply); @@ -65,8 +62,12 @@ parent: async SetLayerObserverEpoch(uint64_t layerObserverEpoch); - // Release a layer that is no longer in use. + // Create a new Compositable. + async NewCompositable(CompositableHandle handle, TextureInfo info); + + // Release an object that is no longer in use. async ReleaseLayer(LayerHandle layer); + async ReleaseCompositable(CompositableHandle compositable); // Testing APIs diff --git a/gfx/layers/ipc/ShadowLayers.cpp b/gfx/layers/ipc/ShadowLayers.cpp index a4f263874890..704e5f023954 100644 --- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -22,13 +22,13 @@ #include "mozilla/gfx/Point.h" // for IntSize #include "mozilla/layers/CompositableClient.h" // for CompositableClient, etc #include "mozilla/layers/CompositorBridgeChild.h" +#include "mozilla/layers/ContentClient.h" #include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/layers/LayersMessages.h" // for Edit, etc #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc #include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG #include "mozilla/layers/LayerTransactionChild.h" -#include "mozilla/layers/PCompositableChild.h" #include "mozilla/layers/PTextureChild.h" #include "ShadowLayerUtils.h" #include "mozilla/layers/TextureClient.h" // for TextureClient @@ -382,7 +382,7 @@ ShadowLayerForwarder::UseTiledLayerBuffer(CompositableClient* aCompositable, return; } - mTxn->AddNoSwapPaint(CompositableOperation(nullptr, aCompositable->GetIPDLActor(), + mTxn->AddNoSwapPaint(CompositableOperation(aCompositable->GetIPCHandle(), OpUseTiledLayerBuffer(aTileLayerDescriptor))); } @@ -399,7 +399,7 @@ ShadowLayerForwarder::UpdateTextureRegion(CompositableClient* aCompositable, mTxn->AddPaint( CompositableOperation( - nullptr, aCompositable->GetIPDLActor(), + aCompositable->GetIPCHandle(), OpPaintTextureRegion(aThebesBufferData, aUpdatedRegion))); } @@ -435,7 +435,7 @@ ShadowLayerForwarder::UseTextures(CompositableClient* aCompositable, } mClientLayerManager->GetCompositorBridgeChild()->HoldUntilCompositableRefReleasedIfNecessary(t.mTextureClient); } - mTxn->AddEdit(CompositableOperation(nullptr, aCompositable->GetIPDLActor(), + mTxn->AddEdit(CompositableOperation(aCompositable->GetIPCHandle(), OpUseTexture(textures))); } @@ -452,7 +452,7 @@ ShadowLayerForwarder::UseComponentAlphaTextures(CompositableClient* aCompositabl MOZ_ASSERT(aTextureOnWhite); MOZ_ASSERT(aTextureOnBlack); - MOZ_ASSERT(aCompositable->GetIPDLActor()); + MOZ_ASSERT(aCompositable->GetIPCHandle()); MOZ_ASSERT(aTextureOnBlack->GetIPDLActor()); MOZ_ASSERT(aTextureOnWhite->GetIPDLActor()); MOZ_ASSERT(aTextureOnBlack->GetSize() == aTextureOnWhite->GetSize()); @@ -469,7 +469,7 @@ ShadowLayerForwarder::UseComponentAlphaTextures(CompositableClient* aCompositabl mTxn->AddEdit( CompositableOperation( - nullptr, aCompositable->GetIPDLActor(), + aCompositable->GetIPCHandle(), OpUseComponentAlphaTextures( nullptr, aTextureOnBlack->GetIPDLActor(), nullptr, aTextureOnWhite->GetIPDLActor(), @@ -500,9 +500,9 @@ ShadowLayerForwarder::DestroyInTransaction(PTextureChild* aTexture, bool synchro } bool -ShadowLayerForwarder::DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) +ShadowLayerForwarder::DestroyInTransaction(const CompositableHandle& aHandle) { - return AddOpDestroy(mTxn, OpDestroy(aCompositable), synchronously); + return AddOpDestroy(mTxn, OpDestroy(aHandle), false); } void @@ -520,7 +520,7 @@ ShadowLayerForwarder::RemoveTextureFromCompositable(CompositableClient* aComposi mTxn->AddEdit( CompositableOperation( - nullptr, aCompositable->GetIPDLActor(), + aCompositable->GetIPCHandle(), OpRemoveTexture(nullptr, aTexture->GetIPDLActor()))); if (aTexture->GetFlags() & TextureFlags::DEALLOCATE_CLIENT) { mTxn->MarkSyncTransaction(); @@ -559,8 +559,7 @@ ShadowLayerForwarder::SendPaintTime(uint64_t aId, TimeDuration aPaintTime) } bool -ShadowLayerForwarder::EndTransaction(InfallibleTArray* aReplies, - const nsIntRegion& aRegionToClear, +ShadowLayerForwarder::EndTransaction(const nsIntRegion& aRegionToClear, uint64_t aId, bool aScheduleComposite, uint32_t aPaintSequenceNumber, @@ -733,13 +732,16 @@ ShadowLayerForwarder::EndTransaction(InfallibleTArray* aReplies, } profiler_tracing("Paint", "Rasterize", TRACING_INTERVAL_END); + + AutoTArray replies; if (mTxn->mSwapRequired) { MOZ_LAYERS_LOG(("[LayersForwarder] sending transaction...")); RenderTraceScope rendertrace3("Forward Transaction", "000093"); - if (!mShadowManager->SendUpdate(info, aReplies)) { + if (!mShadowManager->SendUpdate(info, &replies)) { MOZ_LAYERS_LOG(("[LayersForwarder] WARNING: sending transaction failed!")); return false; } + ProcessReplies(replies); } else { // If we don't require a swap we can call SendUpdateNoSwap which // assumes that aReplies is empty (DEBUG assertion) @@ -758,6 +760,39 @@ ShadowLayerForwarder::EndTransaction(InfallibleTArray* aReplies, return true; } +void +ShadowLayerForwarder::ProcessReplies(const nsTArray& aReplies) +{ + for (const auto& reply : aReplies) { + switch (reply.type()) { + case EditReply::TOpContentBufferSwap: { + MOZ_LAYERS_LOG(("[LayersForwarder] DoubleBufferSwap")); + + const OpContentBufferSwap& obs = reply.get_OpContentBufferSwap(); + + RefPtr compositable = FindCompositable(obs.compositable()); + ContentClientRemote* contentClient = compositable->AsContentClientRemote(); + MOZ_ASSERT(contentClient); + + contentClient->SwapBuffers(obs.frontUpdatedRegion()); + break; + } + default: + MOZ_CRASH("not reached"); + } + } +} + +RefPtr +ShadowLayerForwarder::FindCompositable(const CompositableHandle& aHandle) +{ + CompositableClient* client = nullptr; + if (!mCompositables.Get(aHandle.Value(), &client)) { + return nullptr; + } + return client; +} + void ShadowLayerForwarder::SetLayerObserverEpoch(uint64_t aLayerObserverEpoch) { @@ -814,12 +849,15 @@ ShadowLayerForwarder::Connect(CompositableClient* aCompositable, if (!IPCOpen()) { return; } - PCompositableChild* actor = - mShadowManager->SendPCompositableConstructor(aCompositable->GetTextureInfo()); - if (!actor) { - return; - } - aCompositable->InitIPDLActor(actor); + + static uint64_t sNextID = 1; + uint64_t id = sNextID++; + + mCompositables.Put(id, aCompositable); + + CompositableHandle handle(id); + aCompositable->InitIPDL(handle); + mShadowManager->SendNewCompositable(handle, aCompositable->GetTextureInfo()); } void ShadowLayerForwarder::Attach(CompositableClient* aCompositable, @@ -827,15 +865,15 @@ void ShadowLayerForwarder::Attach(CompositableClient* aCompositable, { MOZ_ASSERT(aLayer); MOZ_ASSERT(aCompositable); - mTxn->AddEdit(OpAttachCompositable(Shadow(aLayer), nullptr, aCompositable->GetIPDLActor())); + mTxn->AddEdit(OpAttachCompositable(Shadow(aLayer), aCompositable->GetIPCHandle())); } -void ShadowLayerForwarder::AttachAsyncCompositable(uint64_t aCompositableID, +void ShadowLayerForwarder::AttachAsyncCompositable(const CompositableHandle& aHandle, ShadowableLayer* aLayer) { MOZ_ASSERT(aLayer); - MOZ_ASSERT(aCompositableID != 0); // zero is always an invalid compositable id. - mTxn->AddEdit(OpAttachAsyncCompositable(Shadow(aLayer), aCompositableID)); + MOZ_ASSERT(aHandle); + mTxn->AddEdit(OpAttachAsyncCompositable(Shadow(aLayer), aHandle)); } void ShadowLayerForwarder::SetShadowManager(PLayerTransactionChild* aShadowManager) @@ -1049,6 +1087,16 @@ ShadowLayerForwarder::SyncWithCompositor() } } +void +ShadowLayerForwarder::ReleaseCompositable(const CompositableHandle& aHandle) +{ + AssertInForwarderThread(); + if (!DestroyInTransaction(aHandle)) { + mShadowManager->SendReleaseCompositable(aHandle); + } + mCompositables.Remove(aHandle.Value()); +} + ShadowableLayer::~ShadowableLayer() { if (mShadow) { diff --git a/gfx/layers/ipc/ShadowLayers.h b/gfx/layers/ipc/ShadowLayers.h index 43efe2e729ae..dd16d160aa0e 100644 --- a/gfx/layers/ipc/ShadowLayers.h +++ b/gfx/layers/ipc/ShadowLayers.h @@ -182,7 +182,7 @@ public: * the compositable or it's IPDL actor here, so we use an ID instead, that * is matched on the compositor side. */ - void AttachAsyncCompositable(uint64_t aCompositableID, + void AttachAsyncCompositable(const CompositableHandle& aHandle, ShadowableLayer* aLayer); /** @@ -251,8 +251,9 @@ public: void UseTiledLayerBuffer(CompositableClient* aCompositable, const SurfaceDescriptorTiles& aTileLayerDescriptor) override; + void ReleaseCompositable(const CompositableHandle& aHandle) override; bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) override; - bool DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) override; + bool DestroyInTransaction(const CompositableHandle& aHandle); virtual void RemoveTextureFromCompositable(CompositableClient* aCompositable, TextureClient* aTexture) override; @@ -284,8 +285,7 @@ public: * |aReplies| are directions from the LayerManagerComposite to the * caller of EndTransaction(). */ - bool EndTransaction(InfallibleTArray* aReplies, - const nsIntRegion& aRegionToClear, + bool EndTransaction(const nsIntRegion& aRegionToClear, uint64_t aId, bool aScheduleComposite, uint32_t aPaintSequenceNumber, @@ -420,6 +420,10 @@ protected: void CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const {} #endif + void ProcessReplies(const nsTArray& aReplies); + + RefPtr FindCompositable(const CompositableHandle& aHandle); + bool InWorkerThread(); CompositorBridgeChild* GetCompositorBridgeChild(); @@ -439,6 +443,7 @@ private: InfallibleTArray mPluginWindowData; UniquePtr mActiveResourceTracker; uint64_t mNextLayerHandle; + nsDataHashtable mCompositables; }; class CompositableClient; diff --git a/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp b/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp index 6a1bbcac0064..e335244f3eba 100644 --- a/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp +++ b/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp @@ -36,8 +36,7 @@ SharedPlanarYCbCrImage::SharedPlanarYCbCrImage(ImageClient* aCompositable) SharedPlanarYCbCrImage::~SharedPlanarYCbCrImage() { MOZ_COUNT_DTOR(SharedPlanarYCbCrImage); - if (mCompositable->GetAsyncID() != 0 && - !InImageBridgeChildThread()) { + if (mCompositable->GetAsyncHandle() && !InImageBridgeChildThread()) { if (mTextureClient) { ADDREF_MANUALLY(mTextureClient); ImageBridgeChild::DispatchReleaseTextureClient(mTextureClient); diff --git a/gfx/layers/ipc/SharedRGBImage.cpp b/gfx/layers/ipc/SharedRGBImage.cpp index bb3bb968cd05..84d924f42d81 100644 --- a/gfx/layers/ipc/SharedRGBImage.cpp +++ b/gfx/layers/ipc/SharedRGBImage.cpp @@ -63,8 +63,7 @@ SharedRGBImage::~SharedRGBImage() { MOZ_COUNT_DTOR(SharedRGBImage); - if (mCompositable->GetAsyncID() != 0 && - !InImageBridgeChildThread()) { + if (mCompositable->GetAsyncHandle() && !InImageBridgeChildThread()) { ADDREF_MANUALLY(mTextureClient); ImageBridgeChild::DispatchReleaseTextureClient(mTextureClient); mTextureClient = nullptr; diff --git a/gfx/layers/moz.build b/gfx/layers/moz.build index de12fba5e315..be6bed36f8c2 100644 --- a/gfx/layers/moz.build +++ b/gfx/layers/moz.build @@ -129,7 +129,6 @@ EXPORTS.mozilla.layers += [ 'BSPTree.h', 'BufferTexture.h', 'client/CanvasClient.h', - 'client/CompositableChild.h', 'client/CompositableClient.h', 'client/ContentClient.h', 'client/GPUVideoTextureClient.h', @@ -294,7 +293,6 @@ UNIFIED_SOURCES += [ 'client/ClientPaintedLayer.cpp', 'client/ClientTextLayer.cpp', 'client/ClientTiledPaintedLayer.cpp', - 'client/CompositableChild.cpp', 'client/CompositableClient.cpp', 'client/ContentClient.cpp', 'client/GPUVideoTextureClient.cpp', @@ -331,7 +329,6 @@ UNIFIED_SOURCES += [ 'ipc/APZChild.cpp', 'ipc/APZCTreeManagerChild.cpp', 'ipc/APZCTreeManagerParent.cpp', - 'ipc/CompositableForwarder.cpp', 'ipc/CompositableTransactionParent.cpp', 'ipc/CompositorBench.cpp', 'ipc/CompositorBridgeChild.cpp', @@ -402,7 +399,6 @@ IPDL_SOURCES = [ 'ipc/LayersSurfaces.ipdlh', 'ipc/PAPZ.ipdl', 'ipc/PAPZCTreeManager.ipdl', - 'ipc/PCompositable.ipdl', 'ipc/PCompositorBridge.ipdl', 'ipc/PImageBridge.ipdl', 'ipc/PLayerTransaction.ipdl', diff --git a/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp b/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp index cef415ad04a2..57b453d50f2d 100644 --- a/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp +++ b/gfx/skia/skia/src/ports/SkFontHost_cairo.cpp @@ -41,6 +41,12 @@ typedef enum FT_LcdFilter_ } FT_LcdFilter; #endif +// If compiling with FreeType before 2.5.0 +#ifndef FT_LOAD_COLOR +# define FT_LOAD_COLOR ( 1L << 20 ) +# define FT_PIXEL_MODE_BGRA 7 +#endif + #ifndef SK_CAN_USE_DLOPEN #define SK_CAN_USE_DLOPEN 1 #endif @@ -396,9 +402,7 @@ SkScalerContext_CairoFT::SkScalerContext_CairoFT(SkTypeface* typeface, const SkS loadFlags |= FT_LOAD_VERTICAL_LAYOUT; } -#ifdef FT_LOAD_COLOR loadFlags |= FT_LOAD_COLOR; -#endif fLoadGlyphFlags = loadFlags; } @@ -689,11 +693,9 @@ void SkScalerContext_CairoFT::generateMetrics(SkGlyph* glyph) } break; case FT_GLYPH_FORMAT_BITMAP: -#ifdef FT_LOAD_COLOR if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) { glyph->fMaskFormat = SkMask::kARGB32_Format; } -#endif if (isLCD(fRec)) { fRec.fMaskFormat = SkMask::kA8_Format; diff --git a/gfx/thebes/gfxGDIFontList.cpp b/gfx/thebes/gfxGDIFontList.cpp index 36006f89b6cb..df49e042ba2e 100644 --- a/gfx/thebes/gfxGDIFontList.cpp +++ b/gfx/thebes/gfxGDIFontList.cpp @@ -879,15 +879,8 @@ gfxGDIFontList::MakePlatformFont(const nsAString& aFontName, gfxWindowsFontType(isCFF ? GFX_FONT_TYPE_PS_OPENTYPE : GFX_FONT_TYPE_TRUETYPE) /*type*/, aStyle, w, aStretch, winUserFontData, false); - if (!fe) - return fe; - - fe->mIsDataUserFont = true; - - // Uniscribe doesn't place CFF fonts loaded privately - // via AddFontMemResourceEx on XP/Vista - if (isCFF && !IsWin7OrLater()) { - fe->mForceGDI = true; + if (fe) { + fe->mIsDataUserFont = true; } return fe; diff --git a/gfx/thebes/gfxPrefs.h b/gfx/thebes/gfxPrefs.h index 96e04cda697e..6f3d53aed754 100644 --- a/gfx/thebes/gfxPrefs.h +++ b/gfx/thebes/gfxPrefs.h @@ -617,6 +617,9 @@ private: DECL_GFX_PREF(Live, "webgl.allow-immediate-queries", WebGLImmediateQueries, bool, false); DECL_GFX_PREF(Live, "webgl.allow-fb-invalidation", WebGLFBInvalidation, bool, false); + DECL_GFX_PREF(Live, "webgl.max-perf-warnings", WebGLMaxPerfWarnings, int32_t, 0); + DECL_GFX_PREF(Live, "webgl.max-acceptable-fb-status-invals", WebGLMaxAcceptableFBStatusInvals, int32_t, 0); + DECL_GFX_PREF(Live, "webgl.webgl2-compat-mode", WebGL2CompatMode, bool, false); // WARNING: diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp index f597d05633ef..e5133e2839c1 100755 --- a/gfx/thebes/gfxWindowsPlatform.cpp +++ b/gfx/thebes/gfxWindowsPlatform.cpp @@ -193,10 +193,6 @@ public: HMODULE gdi32Handle; PFND3DKMTQS queryD3DKMTStatistics = nullptr; - // GPU memory reporting is not available before Windows 7 - if (!IsWin7OrLater()) - return NS_OK; - if ((gdi32Handle = LoadLibrary(TEXT("gdi32.dll")))) queryD3DKMTStatistics = (PFND3DKMTQS)GetProcAddress(gdi32Handle, "D3DKMTQueryStatistics"); @@ -401,10 +397,6 @@ gfxWindowsPlatform::CanUseHardwareVideoDecoding() bool gfxWindowsPlatform::InitDWriteSupport() { - if (!IsVistaOrLater()) { - return false; - } - // DWrite is only supported on Windows 7 with the platform update and higher. // We check this by seeing if D2D1 support is available. if (!Factory::SupportsD2D1()) { @@ -1382,17 +1374,13 @@ gfxWindowsPlatform::InitializeD3D9Config() return; } - if (!IsVistaOrLater()) { - d3d9.EnableByDefault(); - } else { - d3d9.SetDefaultFromPref( - gfxPrefs::GetLayersAllowD3D9FallbackPrefName(), - true, - gfxPrefs::GetLayersAllowD3D9FallbackPrefDefault()); + d3d9.SetDefaultFromPref( + gfxPrefs::GetLayersAllowD3D9FallbackPrefName(), + true, + gfxPrefs::GetLayersAllowD3D9FallbackPrefDefault()); - if (!d3d9.IsEnabled() && gfxPrefs::LayersPreferD3D9()) { - d3d9.UserEnable("Direct3D9 enabled via layers.prefer-d3d9"); - } + if (!d3d9.IsEnabled() && gfxPrefs::LayersPreferD3D9()) { + d3d9.UserEnable("Direct3D9 enabled via layers.prefer-d3d9"); } nsCString message; @@ -1540,11 +1528,6 @@ gfxWindowsPlatform::InitializeD2DConfig() NS_LITERAL_CSTRING("FEATURE_FAILURE_D2D_D3D11_COMP")); return; } - if (!IsVistaOrLater()) { - d2d1.DisableByDefault(FeatureStatus::Unavailable, "Direct2D is not available on Windows XP", - NS_LITERAL_CSTRING("FEATURE_FAILURE_D2D_XP")); - return; - } d2d1.SetDefaultFromPref( gfxPrefs::GetDirect2DDisabledPrefName(), @@ -1636,14 +1619,12 @@ gfxWindowsPlatform::InitGPUProcessSupport() "Not using GPU Process since D3D11 is unavailable", NS_LITERAL_CSTRING("FEATURE_FAILURE_NO_D3D11")); } else if (!IsWin7SP1OrLater()) { - // For Windows XP, we simply don't care enough to support this - // configuration. On Windows Vista and 7 Pre-SP1, DXGI 1.2 is not - // available and remote presentation for D3D11 will not work. Rather - // than take a regression and use D3D9, we revert back to in-process - // rendering. + // On Windows 7 Pre-SP1, DXGI 1.2 is not available and remote presentation + // for D3D11 will not work. Rather than take a regression and use D3D9, we + // revert back to in-process rendering. gpuProc.Disable( FeatureStatus::Unavailable, - "Windows XP, Vista, and 7 Pre-SP1 cannot use the GPU process", + "Windows 7 Pre-SP1 cannot use the GPU process", NS_LITERAL_CSTRING("FEATURE_FAILURE_OLD_WINDOWS")); } else if (!IsWin8OrLater()) { // Windows 7 SP1 can have DXGI 1.2 only via the Platform Update, so we @@ -1666,10 +1647,6 @@ gfxWindowsPlatform::InitGPUProcessSupport() bool gfxWindowsPlatform::DwmCompositionEnabled() { - if (!IsVistaOrLater()) { - return false; - } - MOZ_ASSERT(WinUtils::dwmIsCompositionEnabledPtr); BOOL dwmEnabled = false; diff --git a/js/src/builtin/Intl.js b/js/src/builtin/Intl.js index 5691d00d0aa3..64888d5aabdf 100644 --- a/js/src/builtin/Intl.js +++ b/js/src/builtin/Intl.js @@ -2267,26 +2267,6 @@ function getDateTimeFormatInternals(obj, methodName) { return internalProps; } -/** - * Components of date and time formats and their values. - * - * Spec: ECMAScript Internationalization API Specification, 12.1.1. - */ -var dateTimeComponentValues = { - weekday: ["narrow", "short", "long"], - era: ["narrow", "short", "long"], - year: ["2-digit", "numeric"], - month: ["2-digit", "numeric", "narrow", "short", "long"], - day: ["2-digit", "numeric"], - hour: ["2-digit", "numeric"], - minute: ["2-digit", "numeric"], - second: ["2-digit", "numeric"], - timeZoneName: ["short", "long"] -}; - - -var dateTimeComponents = std_Object_getOwnPropertyNames(dateTimeComponentValues); - /** * Initializes an object as a DateTimeFormat. @@ -2379,12 +2359,19 @@ function InitializeDateTimeFormat(dateTimeFormat, locales, options) { lazyDateTimeFormatData.formatOpt = formatOpt; // Step 19. - var i, prop; - for (i = 0; i < dateTimeComponents.length; i++) { - prop = dateTimeComponents[i]; - var value = GetOption(options, prop, "string", dateTimeComponentValues[prop], undefined); - formatOpt[prop] = value; - } + // 12.1, Table 4: Components of date and time formats. + formatOpt.weekday = GetOption(options, "weekday", "string", ["narrow", "short", "long"], + undefined); + formatOpt.era = GetOption(options, "era", "string", ["narrow", "short", "long"], undefined); + formatOpt.year = GetOption(options, "year", "string", ["2-digit", "numeric"], undefined); + formatOpt.month = GetOption(options, "month", "string", + ["2-digit", "numeric", "narrow", "short", "long"], undefined); + formatOpt.day = GetOption(options, "day", "string", ["2-digit", "numeric"], undefined); + formatOpt.hour = GetOption(options, "hour", "string", ["2-digit", "numeric"], undefined); + formatOpt.minute = GetOption(options, "minute", "string", ["2-digit", "numeric"], undefined); + formatOpt.second = GetOption(options, "second", "string", ["2-digit", "numeric"], undefined); + formatOpt.timeZoneName = GetOption(options, "timeZoneName", "string", ["short", "long"], + undefined); // Steps 20-21 provided by ICU - see comment after this function. diff --git a/js/src/builtin/MapObject.cpp b/js/src/builtin/MapObject.cpp index 1848714798cf..f2659d6df8fe 100644 --- a/js/src/builtin/MapObject.cpp +++ b/js/src/builtin/MapObject.cpp @@ -79,14 +79,8 @@ HashValue(const Value& v, const mozilla::HashCodeScrambler& hcs) if (v.isString()) return v.toString()->asAtom().hash(); - if (v.isSymbol()) { - Symbol* sym = v.toSymbol(); - if (sym->isWellKnownSymbol()) - return HashNumber(sym->code()); - if (sym->code() == SymbolCode::InSymbolRegistry) - return sym->description()->hash(); - return hcs.scramble(v.asRawBits()); - } + if (v.isSymbol()) + return v.toSymbol()->hash(); if (v.isObject()) return hcs.scramble(v.asRawBits()); diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 35cf8f8744fb..cecbb100960a 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -1177,6 +1177,12 @@ Parser::tryDeclareVar(HandlePropertyName name, DeclarationKind kin *redeclaredKind = Some(declaredKind); return true; } + } else if (kind == DeclarationKind::VarForAnnexBLexicalFunction) { + MOZ_ASSERT(DeclarationKindIsParameter(declaredKind)); + + // Annex B.3.3.1 disallows redeclaring parameter names. + *redeclaredKind = Some(declaredKind); + return true; } } else { if (!scope->addDeclaredName(pc, p, name, kind)) diff --git a/js/src/irregexp/RegExpEngine.cpp b/js/src/irregexp/RegExpEngine.cpp index b5b28e9b5038..6779a87d631b 100644 --- a/js/src/irregexp/RegExpEngine.cpp +++ b/js/src/irregexp/RegExpEngine.cpp @@ -33,6 +33,7 @@ #include "irregexp/NativeRegExpMacroAssembler.h" #include "irregexp/RegExpCharacters.h" #include "irregexp/RegExpMacroAssembler.h" +#include "jit/ExecutableAllocator.h" #include "jit/JitCommon.h" #include "irregexp/RegExpCharacters-inl.h" @@ -1777,7 +1778,10 @@ irregexp::CompilePattern(JSContext* cx, RegExpShared* shared, RegExpCompileData* Maybe interpreted_assembler; RegExpMacroAssembler* assembler; - if (IsNativeRegExpEnabled(cx) && !force_bytecode) { + if (IsNativeRegExpEnabled(cx) && + !force_bytecode && + jit::CanLikelyAllocateMoreExecutableMemory()) + { NativeRegExpMacroAssembler::Mode mode = is_ascii ? NativeRegExpMacroAssembler::ASCII : NativeRegExpMacroAssembler::CHAR16; diff --git a/js/src/jit-test/tests/asm.js/directives.txt b/js/src/jit-test/tests/asm.js/directives.txt index bdc583321726..35b58cb7089d 100644 --- a/js/src/jit-test/tests/asm.js/directives.txt +++ b/js/src/jit-test/tests/asm.js/directives.txt @@ -1 +1 @@ -|jit-test| test-also-noasmjs; test-also-wasm-baseline +|jit-test| test-also-noasmjs diff --git a/js/src/jit-test/tests/basic/testFunctionStatementAliasLocals.js b/js/src/jit-test/tests/basic/testFunctionStatementAliasLocals.js index 7be49b7f395a..be7f528b95bd 100644 --- a/js/src/jit-test/tests/basic/testFunctionStatementAliasLocals.js +++ b/js/src/jit-test/tests/basic/testFunctionStatementAliasLocals.js @@ -8,9 +8,11 @@ assertEq(typeof f1(true), "function"); assertEq(f1(false), 3); function f2(b, w) { + // Annex B doesn't apply to functions in blocks with the same name as a + // parameter. if (b) function w() {} return w; } -assertEq(typeof f2(true, 3), "function"); +assertEq(typeof f2(true, 3), "number"); assertEq(f2(false, 3), 3); diff --git a/js/src/jit/BaselineJIT.cpp b/js/src/jit/BaselineJIT.cpp index f86f0ed6efb6..4e9676c3eb20 100644 --- a/js/src/jit/BaselineJIT.cpp +++ b/js/src/jit/BaselineJIT.cpp @@ -321,12 +321,17 @@ CanEnterBaselineJIT(JSContext* cx, HandleScript script, InterpreterFrame* osrFra if (script->nslots() > BaselineScript::MAX_JSSCRIPT_SLOTS) return Method_CantCompile; - if (!cx->compartment()->ensureJitCompartmentExists(cx)) - return Method_Error; - if (script->hasBaselineScript()) return Method_Compiled; + // Check this before calling ensureJitCompartmentExists, so we're less + // likely to report OOM in JSRuntime::createJitRuntime. + if (!CanLikelyAllocateMoreExecutableMemory()) + return Method_Skipped; + + if (!cx->compartment()->ensureJitCompartmentExists(cx)) + return Method_Error; + // Check script warm-up counter. if (script->incWarmUpCounter() <= JitOptions.baselineWarmUpThreshold) return Method_Skipped; diff --git a/js/src/jit/ExecutableAllocator.cpp b/js/src/jit/ExecutableAllocator.cpp index 95a38f36ee24..48bee976b74d 100644 --- a/js/src/jit/ExecutableAllocator.cpp +++ b/js/src/jit/ExecutableAllocator.cpp @@ -413,9 +413,9 @@ ExecutableAllocator::poisonCode(JSRuntime* rt, JitPoisonRangeVector& ranges) // Limit on the number of bytes of executable memory to prevent JIT spraying // attacks. #if JS_BITS_PER_WORD == 32 -static const size_t MaxCodeBytesPerProcess = 128 * 1024 * 1024; +static const size_t MaxCodeBytesPerProcess = 160 * 1024 * 1024; #else -static const size_t MaxCodeBytesPerProcess = 512 * 1024 * 1024; +static const size_t MaxCodeBytesPerProcess = 640 * 1024 * 1024; #endif static mozilla::Atomic allocatedExecutableBytes(0); @@ -453,3 +453,13 @@ js::jit::AssertAllocatedExecutableBytesIsZero() { MOZ_ASSERT(allocatedExecutableBytes == 0); } + +bool +js::jit::CanLikelyAllocateMoreExecutableMemory() +{ + // Use a 16 MB buffer. + static const size_t BufferSize = 16 * 1024 * 1024; + + MOZ_ASSERT(allocatedExecutableBytes <= MaxCodeBytesPerProcess); + return allocatedExecutableBytes + BufferSize <= MaxCodeBytesPerProcess; +} diff --git a/js/src/jit/ExecutableAllocator.h b/js/src/jit/ExecutableAllocator.h index 93de41bc6c70..8e75b827fb13 100644 --- a/js/src/jit/ExecutableAllocator.h +++ b/js/src/jit/ExecutableAllocator.h @@ -353,6 +353,15 @@ SubAllocatedExecutableBytes(size_t bytes); extern void AssertAllocatedExecutableBytesIsZero(); +// Returns true if we can allocate a few more MB of executable code without +// hitting our code limit. This function can be used to stop compiling things +// that are optional (like Baseline and Ion code) when we're about to reach the +// limit, so we are less likely to OOM or crash. Note that the limit is +// per-process, so other threads can also allocate code after we call this +// function. +extern bool +CanLikelyAllocateMoreExecutableMemory(); + } // namespace jit } // namespace js diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index 4e853b68fe8d..3b650ec6561d 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -2502,6 +2502,11 @@ Compile(JSContext* cx, HandleScript script, BaselineFrame* osrFrame, jsbytecode* if (optimizationLevel == OptimizationLevel::DontCompile) return Method_Skipped; + if (!CanLikelyAllocateMoreExecutableMemory()) { + script->resetWarmUpCounter(); + return Method_Skipped; + } + if (script->hasIonScript()) { IonScript* scriptIon = script->ionScript(); if (!scriptIon->method()) diff --git a/js/src/jit/IonAnalysis.cpp b/js/src/jit/IonAnalysis.cpp index f28c4dade7ec..328cba10de38 100644 --- a/js/src/jit/IonAnalysis.cpp +++ b/js/src/jit/IonAnalysis.cpp @@ -4177,6 +4177,9 @@ jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun, TempAllocator temp(&alloc); JitContext jctx(cx, &temp); + if (!jit::CanLikelyAllocateMoreExecutableMemory()) + return true; + if (!cx->compartment()->ensureJitCompartmentExists(cx)) return false; @@ -4422,6 +4425,9 @@ jit::AnalyzeArgumentsUsage(JSContext* cx, JSScript* scriptArg) TempAllocator temp(&alloc); JitContext jctx(cx, &temp); + if (!jit::CanLikelyAllocateMoreExecutableMemory()) + return true; + if (!cx->compartment()->ensureJitCompartmentExists(cx)) return false; diff --git a/js/src/jit/JitOptions.cpp b/js/src/jit/JitOptions.cpp index fca633662216..91370bc4f351 100644 --- a/js/src/jit/JitOptions.cpp +++ b/js/src/jit/JitOptions.cpp @@ -238,14 +238,10 @@ DefaultJitOptions::DefaultJitOptions() SET_DEFAULT(wasmFoldOffsets, true); // Until which wasm bytecode size should we accumulate functions, in order - // to compile efficiently on helper threads (see also bug 1320374). - SET_DEFAULT(wasmBatchThreshold, 10000); - - // In order to have different batching thresholds for Ion and the wasm - // baseline, and since a same batch can contain both Ion and baseline - // compiled functions, we make Ion functions weight more by using a scaling - // factor. - SET_DEFAULT(wasmBatchIonScaleFactor, 9); + // to compile efficiently on helper threads. Baseline code compiles much + // faster than Ion code so use scaled thresholds (see also bug 1320374). + SET_DEFAULT(wasmBatchBaselineThreshold, 10000); + SET_DEFAULT(wasmBatchIonThreshold, 1100); // Determines whether we suppress using signal handlers // for interrupting jit-ed code. This is used only for testing. diff --git a/js/src/jit/JitOptions.h b/js/src/jit/JitOptions.h index 769b42f59759..2c37021e26c6 100644 --- a/js/src/jit/JitOptions.h +++ b/js/src/jit/JitOptions.h @@ -87,8 +87,8 @@ struct DefaultJitOptions uint32_t branchPruningBlockSpanFactor; uint32_t branchPruningEffectfulInstFactor; uint32_t branchPruningThreshold; - uint32_t wasmBatchThreshold; - uint32_t wasmBatchIonScaleFactor; + uint32_t wasmBatchIonThreshold; + uint32_t wasmBatchBaselineThreshold; mozilla::Maybe forcedDefaultIonWarmUpThreshold; mozilla::Maybe forcedDefaultIonSmallFunctionWarmUpThreshold; mozilla::Maybe forcedRegisterAllocator; diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index 53c76aa62722..0df1976e356d 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -1895,19 +1895,11 @@ js::array_sort(JSContext* cx, unsigned argc, Value* vp) * Non-optimized user supplied comparators perform much better when * called from within a self-hosted sorting function. */ - RootedAtom selfHostedSortAtom(cx, Atomize(cx, "ArraySort", 9)); - RootedPropertyName selfHostedSortName(cx, selfHostedSortAtom->asPropertyName()); - RootedValue selfHostedSortValue(cx); + FixedInvokeArgs<1> args2(cx); + args2[0].set(fval); - if (!GlobalObject::getIntrinsicValue(cx, cx->global(), selfHostedSortName, - &selfHostedSortValue)) { - return false; - } - - MOZ_ASSERT(selfHostedSortValue.isObject()); - MOZ_ASSERT(selfHostedSortValue.toObject().is()); - - return Call(cx, selfHostedSortValue, args.thisv(), fval, args.rval()); + RootedValue thisv(cx, ObjectValue(*obj)); + return CallSelfHostedFunction(cx, cx->names().ArraySort, thisv, args2, args.rval()); } uint32_t len; @@ -1932,15 +1924,6 @@ js::array_sort(JSContext* cx, unsigned argc, Value* vp) } #endif - /* - * Initialize vec as a root. We will clear elements of vec one by - * one while increasing the rooted amount of vec when we know that the - * property at the corresponding index exists and its value must be rooted. - * - * In this way when sorting a huge mostly sparse array we will not - * access the tail of vec corresponding to properties that do not - * exist, allowing OS to avoiding committing RAM. See bug 330812. - */ size_t n, undefs; { Rooted> vec(cx, GCVector(cx)); @@ -1963,7 +1946,6 @@ js::array_sort(JSContext* cx, unsigned argc, Value* vp) if (!CheckForInterrupt(cx)) return false; - /* Clear vec[newlen] before including it in the rooted set. */ bool hole; if (!GetElement(cx, obj, i, &hole, &v)) return false; @@ -1978,7 +1960,6 @@ js::array_sort(JSContext* cx, unsigned argc, Value* vp) allInts = allInts && v.isInt32(); } - /* * If the array only contains holes, we're done. But if it contains * undefs, those must be sorted to the front of the array. diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index ea5990d1104b..065e5bec0819 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -14,6 +14,7 @@ #include "js/CharacterEncoding.h" #include "js/GCVector.h" #include "js/Result.h" +#include "js/Utility.h" #include "js/Vector.h" #include "vm/Caches.h" #include "vm/Runtime.h" diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index 65e9183316a7..88ad508985e1 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -165,6 +165,12 @@ JSRuntime::createJitRuntime(JSContext* cx) MOZ_ASSERT(!jitRuntime_); + if (!CanLikelyAllocateMoreExecutableMemory()) { + // Report OOM instead of potentially hitting the MOZ_CRASH below. + ReportOutOfMemory(cx); + return nullptr; + } + jit::JitRuntime* jrt = cx->new_(cx->runtime()); if (!jrt) return nullptr; @@ -1288,6 +1294,13 @@ JSCompartment::addTelemetry(const char* filename, DeprecatedLanguageExtension e) sawDeprecatedLanguageExtension[e] = true; } +HashNumber +JSCompartment::randomHashCode() +{ + ensureRandomNumberGenerator(); + return HashNumber(randomNumberGenerator.ref().next()); +} + mozilla::HashCodeScrambler JSCompartment::randomHashCodeScrambler() { diff --git a/js/src/jscompartment.h b/js/src/jscompartment.h index 622d3abc7dbf..1115284c8db0 100644 --- a/js/src/jscompartment.h +++ b/js/src/jscompartment.h @@ -706,6 +706,8 @@ struct JSCompartment mozilla::non_crypto::XorShift128PlusRNG randomKeyGenerator_; public: + js::HashNumber randomHashCode(); + mozilla::HashCodeScrambler randomHashCodeScrambler(); static size_t offsetOfRegExps() { diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 3b5910908841..f1dc3d852998 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -1439,3 +1439,15 @@ js::detail::IsWindowSlow(JSObject* obj) { return obj->as().maybeWindowProxy(); } + +AutoAssertNoContentJS::AutoAssertNoContentJS(JSContext* cx) + : context_(cx), + prevAllowContentJS_(cx->runtime()->allowContentJS_) +{ + cx->runtime()->allowContentJS_ = false; +} + +AutoAssertNoContentJS::~AutoAssertNoContentJS() +{ + context_->runtime()->allowContentJS_ = prevAllowContentJS_; +} diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 8cc009fda841..56181b9f65db 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -2865,6 +2865,17 @@ ToWindowIfWindowProxy(JSObject* obj); extern bool AddPluralRulesConstructor(JSContext* cx, JS::Handle intl); +class MOZ_STACK_CLASS JS_FRIEND_API(AutoAssertNoContentJS) +{ + public: + explicit AutoAssertNoContentJS(JSContext* cx); + ~AutoAssertNoContentJS(); + + private: + JSContext* context_; + bool prevAllowContentJS_; +}; + } /* namespace js */ class NativeProfiler diff --git a/js/src/jswatchpoint.cpp b/js/src/jswatchpoint.cpp index eb2f267a6f9f..7ec8589ad7ed 100644 --- a/js/src/jswatchpoint.cpp +++ b/js/src/jswatchpoint.cpp @@ -11,6 +11,7 @@ #include "jsfriendapi.h" #include "gc/Marking.h" +#include "vm/Shape.h" #include "jsgcinlines.h" diff --git a/js/src/tests/ecma_6/LexicalEnvironment/block-scoped-functions-annex-b-parameter.js b/js/src/tests/ecma_6/LexicalEnvironment/block-scoped-functions-annex-b-parameter.js new file mode 100644 index 000000000000..f0adedf7d84e --- /dev/null +++ b/js/src/tests/ecma_6/LexicalEnvironment/block-scoped-functions-annex-b-parameter.js @@ -0,0 +1,16 @@ +// Annex B.3.3.1 disallows Annex B lexical function behavior when redeclaring a +// parameter. + +(function(f) { + if (true) function f() { } + assertEq(f, 123); +}(123)); + +(function(f) { + { function f() { } } + assertEq(f, 123); +}(123)); + + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/js1_8/regress/regress-467495-05.js b/js/src/tests/js1_8/regress/regress-467495-05.js index 505fb6bd66e3..ecf47b8fe30f 100644 --- a/js/src/tests/js1_8/regress/regress-467495-05.js +++ b/js/src/tests/js1_8/regress/regress-467495-05.js @@ -20,7 +20,7 @@ function test() printBugNumber(BUGNUMBER); printStatus (summary); - expect = 'function x() {}'; + expect = '1'; function g(x) { if (1) function x() {} return x; } print(actual = g(1) + ''); diff --git a/js/src/tests/js1_8/regress/regress-467495-06.js b/js/src/tests/js1_8/regress/regress-467495-06.js index d8bc81c83146..72adeee9ecb9 100644 --- a/js/src/tests/js1_8/regress/regress-467495-06.js +++ b/js/src/tests/js1_8/regress/regress-467495-06.js @@ -32,7 +32,7 @@ function test() var r = f(0); - if (typeof(r[0]) != "function") + if (typeof(r[0]) != "number") actual += "Bad r[0]"; if (typeof(r[1]) != "function") diff --git a/js/src/tests/lib/jittests.py b/js/src/tests/lib/jittests.py index bb440a9858a7..3670796598a8 100755 --- a/js/src/tests/lib/jittests.py +++ b/js/src/tests/lib/jittests.py @@ -138,7 +138,7 @@ class JitTest: t.valgrind = self.valgrind t.tz_pacific = self.tz_pacific t.test_also_noasmjs = self.test_also_noasmjs - t.test_also_wasm_baseline = self.test_also_noasmjs + t.test_also_wasm_baseline = self.test_also_wasm_baseline t.test_also = self.test_also t.test_join = self.test_join t.expect_error = self.expect_error diff --git a/js/src/tests/test262/built-ins/ArrayBuffer/data-allocation-after-object-creation.js b/js/src/tests/test262/built-ins/ArrayBuffer/data-allocation-after-object-creation.js new file mode 100644 index 000000000000..cfce2c3e7f0f --- /dev/null +++ b/js/src/tests/test262/built-ins/ArrayBuffer/data-allocation-after-object-creation.js @@ -0,0 +1,38 @@ +// Copyright (C) 2015 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 24.1.2.1 +description: > + The new ArrayBuffer instance is created prior to allocating the Data Block. +info: > + ArrayBuffer( length ) + + ... + 6. Return AllocateArrayBuffer(NewTarget, byteLength). + + AllocateArrayBuffer( constructor, byteLength ) + 1. Let obj be OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%", + «[[ArrayBufferData]], [[ArrayBufferByteLength]]» ). + 2. ReturnIfAbrupt(obj). + ... + 4. Let block be CreateByteDataBlock(byteLength). + 5. ReturnIfAbrupt(block). + ... +features: [Reflect.construct] +---*/ + +function DummyError() { } + +var newTarget = function(){}.bind(null); +Object.defineProperty(newTarget, "prototype", { + get: function() { + throw new DummyError(); + } +}); + +assert.throws(DummyError, function() { + // Allocating 7 PiB should fail with a RangeError. + // Math.pow(1024, 5) = 1125899906842624 + Reflect.construct(ArrayBuffer, [7 * 1125899906842624], newTarget); +}); diff --git a/js/src/vm/ArrayBufferObject.cpp b/js/src/vm/ArrayBufferObject.cpp index 05875d5de413..f2aef0d745c4 100644 --- a/js/src/vm/ArrayBufferObject.cpp +++ b/js/src/vm/ArrayBufferObject.cpp @@ -280,18 +280,21 @@ ArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp) if (!ToIndex(cx, args.get(0), &byteLength)) return false; - // Non-standard: Refuse to allocate buffers larger than ~2 GiB. - if (byteLength > INT32_MAX) { - JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); - return false; - } - - // Step 3. + // Step 3 (Inlined 24.1.1.1 AllocateArrayBuffer). + // 24.1.1.1, step 1 (Inlined 9.1.14 OrdinaryCreateFromConstructor). RootedObject proto(cx); RootedObject newTarget(cx, &args.newTarget().toObject()); if (!GetPrototypeFromConstructor(cx, newTarget, &proto)) return false; + // 24.1.1.1, step 3 (Inlined 6.2.6.1 CreateByteDataBlock, step 2). + // Refuse to allocate too large buffers, currently limited to ~2 GiB. + if (byteLength > INT32_MAX) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH); + return false; + } + + // 24.1.1.1, steps 1 and 4-6. JSObject* bufobj = create(cx, uint32_t(byteLength), proto); if (!bufobj) return false; diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 862e8843fd0c..2af75685ae17 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -21,6 +21,7 @@ macro(ArrayBufferSpecies, ArrayBufferSpecies, "ArrayBufferSpecies") \ macro(ArrayIterator, ArrayIterator, "Array Iterator") \ macro(ArrayIteratorNext, ArrayIteratorNext, "ArrayIteratorNext") \ + macro(ArraySort, ArraySort, "ArraySort") \ macro(ArraySpecies, ArraySpecies, "ArraySpecies") \ macro(ArraySpeciesCreate, ArraySpeciesCreate, "ArraySpeciesCreate") \ macro(ArrayToLocaleString, ArrayToLocaleString, "ArrayToLocaleString") \ diff --git a/js/src/vm/EnvironmentObject.cpp b/js/src/vm/EnvironmentObject.cpp index edd20af80625..b69225f52552 100644 --- a/js/src/vm/EnvironmentObject.cpp +++ b/js/src/vm/EnvironmentObject.cpp @@ -635,7 +635,7 @@ const Class WasmFunctionCallObject::class_ = { }; /* static */ WasmFunctionCallObject* -WasmFunctionCallObject::createHollowForDebug(JSContext* cx, WasmFunctionScope* scope) +WasmFunctionCallObject::createHollowForDebug(JSContext* cx, Handle scope) { RootedObjectGroup group(cx, ObjectGroup::defaultNewGroup(cx, &class_, TaggedProto(nullptr))); if (!group) @@ -654,6 +654,7 @@ WasmFunctionCallObject::createHollowForDebug(JSContext* cx, WasmFunctionScope* s Rooted callobj(cx, &obj->as()); callobj->initEnclosingEnvironment(&cx->global()->lexicalEnvironment()); + callobj->initReservedSlot(SCOPE_SLOT, PrivateGCThingValue(scope)); return callobj; } diff --git a/js/src/vm/EnvironmentObject.h b/js/src/vm/EnvironmentObject.h index 09894f6f276e..5d4a0f55ee61 100644 --- a/js/src/vm/EnvironmentObject.h +++ b/js/src/vm/EnvironmentObject.h @@ -428,13 +428,19 @@ typedef MutableHandle MutableHandleModuleEnvironmentOb class WasmFunctionCallObject : public EnvironmentObject { + // Currently WasmFunctionCallObjects do not use their scopes in a + // meaningful way. However, it is an invariant of DebugEnvironments that + // environments kept in those maps have live scopes, thus this strong + // reference. + static const uint32_t SCOPE_SLOT = 1; + public: static const Class class_; - static const uint32_t RESERVED_SLOTS = 1; + static const uint32_t RESERVED_SLOTS = 2; static WasmFunctionCallObject* createHollowForDebug(JSContext* cx, - WasmFunctionScope* scope); + Handle scope); }; class LexicalEnvironmentObject : public EnvironmentObject diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index 0a14c4401b13..b0f8c69c0a32 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -364,6 +364,9 @@ js::RunScript(JSContext* cx, RunState& state) // Since any script can conceivably GC, make sure it's safe to do so. cx->runtime()->gc.verifyIsSafeToGC(); + MOZ_DIAGNOSTIC_ASSERT(cx->compartment()->isSystem() || + cx->runtime()->allowContentJS()); + if (!Debugger::checkNoExecute(cx, state.script())) return false; diff --git a/js/src/vm/ObjectGroup.cpp b/js/src/vm/ObjectGroup.cpp index 81fe7f499bc3..625bacb0a574 100644 --- a/js/src/vm/ObjectGroup.cpp +++ b/js/src/vm/ObjectGroup.cpp @@ -16,6 +16,7 @@ #include "gc/Zone.h" #include "js/CharacterEncoding.h" #include "vm/ArrayObject.h" +#include "vm/Shape.h" #include "vm/TaggedProto.h" #include "vm/UnboxedObject.h" diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index 35350bc3be4b..fd8faf972957 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -222,6 +222,7 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime) keepAtoms_(0), trustedPrincipals_(nullptr), beingDestroyed_(false), + allowContentJS_(true), atoms_(nullptr), atomsCompartment_(nullptr), staticStrings(nullptr), diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h index c39580c10e18..773d63f915b0 100644 --- a/js/src/vm/Runtime.h +++ b/js/src/vm/Runtime.h @@ -62,6 +62,7 @@ namespace js { class PerThreadData; class ExclusiveContext; +class AutoAssertNoContentJS; class AutoKeepAtoms; class EnterDebuggeeNoExecute; #ifdef JS_TRACE_LOGGING @@ -1042,6 +1043,15 @@ struct JSRuntime : public JS::shadow::Runtime, return beingDestroyed_; } + private: + bool allowContentJS_; + public: + bool allowContentJS() const { + return allowContentJS_; + } + + friend class js::AutoAssertNoContentJS; + private: // Set of all atoms other than those in permanentAtoms and staticStrings. // Reading or writing this set requires the calling thread to have an diff --git a/js/src/vm/Shape.h b/js/src/vm/Shape.h index 5ad2b86dbe44..c298ee243606 100644 --- a/js/src/vm/Shape.h +++ b/js/src/vm/Shape.h @@ -29,6 +29,8 @@ #include "js/RootingAPI.h" #include "js/UbiNode.h" #include "vm/ObjectGroup.h" +#include "vm/String.h" +#include "vm/Symbol.h" #ifdef _MSC_VER #pragma warning(push) @@ -563,6 +565,30 @@ struct StackBaseShape : public DefaultHasher> static inline bool match(ReadBarriered key, const Lookup& lookup); }; +static MOZ_ALWAYS_INLINE js::HashNumber +HashId(jsid id) +{ + // HashGeneric alone would work, but bits of atom and symbol addresses + // could then be recovered from the hash code. See bug 1330769. + if (MOZ_LIKELY(JSID_IS_ATOM(id))) + return JSID_TO_ATOM(id)->hash(); + if (JSID_IS_SYMBOL(id)) + return JSID_TO_SYMBOL(id)->hash(); + return mozilla::HashGeneric(JSID_BITS(id)); +} + +template <> +struct DefaultHasher +{ + typedef jsid Lookup; + static HashNumber hash(jsid id) { + return HashId(id); + } + static bool match(jsid id1, jsid id2) { + return id1 == id2; + } +}; + using BaseShapeSet = JS::GCHashSet, StackBaseShape, SystemAllocPolicy>; diff --git a/js/src/vm/String.h b/js/src/vm/String.h index 918c180cff2e..24a5cf00ba0a 100644 --- a/js/src/vm/String.h +++ b/js/src/vm/String.h @@ -1300,26 +1300,6 @@ NewStringCopyUTF8Z(JSContext* cx, const JS::ConstUTF8CharsZ utf8) JS_STATIC_ASSERT(sizeof(HashNumber) == 4); -static MOZ_ALWAYS_INLINE js::HashNumber -HashId(jsid id) -{ - if (MOZ_LIKELY(JSID_IS_ATOM(id))) - return JSID_TO_ATOM(id)->hash(); - return mozilla::HashGeneric(JSID_BITS(id)); -} - -template <> -struct DefaultHasher -{ - typedef jsid Lookup; - static HashNumber hash(jsid id) { - return HashId(id); - } - static bool match(jsid id1, jsid id2) { - return id1 == id2; - } -}; - } /* namespace js */ // Addon IDs are interned atoms which are never destroyed. This detail is diff --git a/js/src/vm/Symbol.cpp b/js/src/vm/Symbol.cpp index 612bc48c253f..59903c38a52e 100644 --- a/js/src/vm/Symbol.cpp +++ b/js/src/vm/Symbol.cpp @@ -20,7 +20,7 @@ using JS::Symbol; using namespace js; Symbol* -Symbol::newInternal(ExclusiveContext* cx, JS::SymbolCode code, JSAtom* description, +Symbol::newInternal(ExclusiveContext* cx, JS::SymbolCode code, uint32_t hash, JSAtom* description, AutoLockForExclusiveAccess& lock) { MOZ_ASSERT(cx->compartment() == cx->atomsCompartment(lock)); @@ -31,7 +31,7 @@ Symbol::newInternal(ExclusiveContext* cx, JS::SymbolCode code, JSAtom* descripti ReportOutOfMemory(cx); return nullptr; } - return new (p) Symbol(code, description); + return new (p) Symbol(code, hash, description); } Symbol* @@ -48,7 +48,7 @@ Symbol::new_(ExclusiveContext* cx, JS::SymbolCode code, JSString* description) // probably be replaced with an assertion that we're on the main thread. AutoLockForExclusiveAccess lock(cx); AutoCompartment ac(cx, cx->atomsCompartment(lock), &lock); - return newInternal(cx, code, atom, lock); + return newInternal(cx, code, cx->compartment()->randomHashCode(), atom, lock); } Symbol* @@ -66,7 +66,7 @@ Symbol::for_(js::ExclusiveContext* cx, HandleString description) return *p; AutoCompartment ac(cx, cx->atomsCompartment(lock), &lock); - Symbol* sym = newInternal(cx, SymbolCode::InSymbolRegistry, atom, lock); + Symbol* sym = newInternal(cx, SymbolCode::InSymbolRegistry, atom->hash(), atom, lock); if (!sym) return nullptr; diff --git a/js/src/vm/Symbol.h b/js/src/vm/Symbol.h index 66f3e34084cc..2872fa3c6e45 100644 --- a/js/src/vm/Symbol.h +++ b/js/src/vm/Symbol.h @@ -16,10 +16,11 @@ #include "gc/Barrier.h" #include "gc/Marking.h" - #include "js/GCHashTable.h" #include "js/RootingAPI.h" #include "js/TypeDecls.h" +#include "js/Utility.h" +#include "vm/String.h" namespace js { class AutoLockForExclusiveAccess; @@ -31,26 +32,31 @@ class Symbol : public js::gc::TenuredCell { private: SymbolCode code_; + + // Each Symbol gets its own hash code so that we don't have to use + // addresses as hash codes (a security hazard). + js::HashNumber hash_; + JSAtom* description_; // The minimum allocation size is sizeof(JSString): 16 bytes on 32-bit - // architectures and 24 bytes on 64-bit. 8 bytes of padding makes Symbol + // architectures and 24 bytes on 64-bit. A size_t of padding makes Symbol // the minimum size on both. - uint64_t unused2_; + size_t unused_; - Symbol(SymbolCode code, JSAtom* desc) - : code_(code), description_(desc) + Symbol(SymbolCode code, js::HashNumber hash, JSAtom* desc) + : code_(code), hash_(hash), description_(desc) { - // Silence warnings about unused2 being... unused. - (void)unused2_; + // Silence warnings about unused_ being... unused. + (void)unused_; } Symbol(const Symbol&) = delete; void operator=(const Symbol&) = delete; static Symbol* - newInternal(js::ExclusiveContext* cx, SymbolCode code, JSAtom* description, - js::AutoLockForExclusiveAccess& lock); + newInternal(js::ExclusiveContext* cx, SymbolCode code, js::HashNumber hash, + JSAtom* description, js::AutoLockForExclusiveAccess& lock); public: static Symbol* new_(js::ExclusiveContext* cx, SymbolCode code, JSString* description); @@ -58,6 +64,7 @@ class Symbol : public js::gc::TenuredCell JSAtom* description() const { return description_; } SymbolCode code() const { return code_; } + js::HashNumber hash() const { return hash_; } bool isWellKnownSymbol() const { return uint32_t(code_) < WellKnownSymbolLimit; } @@ -93,7 +100,7 @@ struct HashSymbolsByDescription typedef JSAtom* Lookup; static HashNumber hash(Lookup l) { - return HashNumber(reinterpret_cast(l)); + return HashNumber(l->hash()); } static bool match(Key sym, Lookup l) { return sym->description() == l; diff --git a/js/src/vm/UnboxedObject.cpp b/js/src/vm/UnboxedObject.cpp index ca079ec21528..3018ace6773b 100644 --- a/js/src/vm/UnboxedObject.cpp +++ b/js/src/vm/UnboxedObject.cpp @@ -7,6 +7,7 @@ #include "vm/UnboxedObject-inl.h" #include "jit/BaselineIC.h" +#include "jit/ExecutableAllocator.h" #include "jit/JitCommon.h" #include "jit/Linker.h" @@ -706,7 +707,8 @@ UnboxedPlainObject::createWithProperties(ExclusiveContext* cx, HandleObjectGroup if (cx->isJSContext() && !group->unknownProperties() && !layout.constructorCode() && - cx->asJSContext()->runtime()->jitSupportsFloatingPoint) + cx->asJSContext()->runtime()->jitSupportsFloatingPoint && + jit::CanLikelyAllocateMoreExecutableMemory()) { if (!UnboxedLayout::makeConstructorCode(cx->asJSContext(), group)) return nullptr; diff --git a/js/src/wasm/WasmBaselineCompile.cpp b/js/src/wasm/WasmBaselineCompile.cpp index 1806588c1a26..624f30ca8ccf 100644 --- a/js/src/wasm/WasmBaselineCompile.cpp +++ b/js/src/wasm/WasmBaselineCompile.cpp @@ -1716,6 +1716,22 @@ class BaseCompiler return true; } + MOZ_MUST_USE bool peekConstI32(int32_t* c) { + Stk& v = stk_.back(); + if (v.kind() != Stk::ConstI32) + return false; + *c = v.i32val(); + return true; + } + + MOZ_MUST_USE bool peekConstI64(int64_t* c) { + Stk& v = stk_.back(); + if (v.kind() != Stk::ConstI64) + return false; + *c = v.i64val(); + return true; + } + MOZ_MUST_USE bool popConstPositivePowerOfTwoI32(int32_t& c, uint_fast8_t& power, int32_t cutoff) @@ -2758,12 +2774,15 @@ class BaseCompiler } #ifndef INT_DIV_I64_CALLOUT - void quotientI64(RegI64 rhs, RegI64 srcDest, IsUnsigned isUnsigned) { + void quotientI64(RegI64 rhs, RegI64 srcDest, IsUnsigned isUnsigned, + bool isConst, int64_t c) + { Label done; - checkDivideByZeroI64(rhs); + if (!isConst || c == 0) + checkDivideByZeroI64(rhs); - if (!isUnsigned) + if (!isUnsigned && (!isConst || c == -1)) checkDivideSignedOverflowI64(rhs, srcDest, &done, ZeroOnOverflow(false)); # if defined(JS_CODEGEN_X64) @@ -2783,12 +2802,15 @@ class BaseCompiler masm.bind(&done); } - void remainderI64(RegI64 rhs, RegI64 srcDest, IsUnsigned isUnsigned) { + void remainderI64(RegI64 rhs, RegI64 srcDest, IsUnsigned isUnsigned, + bool isConst, int64_t c) + { Label done; - checkDivideByZeroI64(rhs); + if (!isConst || c == 0) + checkDivideByZeroI64(rhs); - if (!isUnsigned) + if (!isUnsigned && (!isConst || c == -1)) checkDivideSignedOverflowI64(rhs, srcDest, &done, ZeroOnOverflow(true)); # if defined(JS_CODEGEN_X64) @@ -4184,12 +4206,15 @@ BaseCompiler::emitQuotientI32() pushI32(r); } } else { + bool isConst = peekConstI32(&c); RegI32 r0, r1; pop2xI32ForIntMulDiv(&r0, &r1); Label done; - checkDivideByZeroI32(r1, r0, &done); - checkDivideSignedOverflowI32(r1, r0, &done, ZeroOnOverflow(false)); + if (!isConst || c == 0) + checkDivideByZeroI32(r1, r0, &done); + if (!isConst || c == -1) + checkDivideSignedOverflowI32(r1, r0, &done, ZeroOnOverflow(false)); masm.quotient32(r1, r0, IsUnsigned(false)); masm.bind(&done); @@ -4210,11 +4235,13 @@ BaseCompiler::emitQuotientU32() pushI32(r); } } else { + bool isConst = peekConstI32(&c); RegI32 r0, r1; pop2xI32ForIntMulDiv(&r0, &r1); Label done; - checkDivideByZeroI32(r1, r0, &done); + if (!isConst || c == 0) + checkDivideByZeroI32(r1, r0, &done); masm.quotient32(r1, r0, IsUnsigned(true)); masm.bind(&done); @@ -4245,12 +4272,15 @@ BaseCompiler::emitRemainderI32() pushI32(r); } else { + bool isConst = peekConstI32(&c); RegI32 r0, r1; pop2xI32ForIntMulDiv(&r0, &r1); Label done; - checkDivideByZeroI32(r1, r0, &done); - checkDivideSignedOverflowI32(r1, r0, &done, ZeroOnOverflow(true)); + if (!isConst || c == 0) + checkDivideByZeroI32(r1, r0, &done); + if (!isConst || c == -1) + checkDivideSignedOverflowI32(r1, r0, &done, ZeroOnOverflow(true)); masm.remainder32(r1, r0, IsUnsigned(false)); masm.bind(&done); @@ -4269,11 +4299,13 @@ BaseCompiler::emitRemainderU32() masm.and32(Imm32(c-1), r); pushI32(r); } else { + bool isConst = peekConstI32(&c); RegI32 r0, r1; pop2xI32ForIntMulDiv(&r0, &r1); Label done; - checkDivideByZeroI32(r1, r0, &done); + if (!isConst || c == 0) + checkDivideByZeroI32(r1, r0, &done); masm.remainder32(r1, r0, IsUnsigned(true)); masm.bind(&done); @@ -4302,9 +4334,10 @@ BaseCompiler::emitQuotientI64() pushI64(r); } } else { + bool isConst = peekConstI64(&c); RegI64 r0, r1; pop2xI64ForIntDiv(&r0, &r1); - quotientI64(r1, r0, IsUnsigned(false)); + quotientI64(r1, r0, IsUnsigned(false), isConst, c); freeI64(r1); pushI64(r0); } @@ -4326,9 +4359,10 @@ BaseCompiler::emitQuotientU64() pushI64(r); } } else { + bool isConst = peekConstI64(&c); RegI64 r0, r1; pop2xI64ForIntDiv(&r0, &r1); - quotientI64(r1, r0, IsUnsigned(true)); + quotientI64(r1, r0, IsUnsigned(true), isConst, c); freeI64(r1); pushI64(r0); } @@ -4361,9 +4395,10 @@ BaseCompiler::emitRemainderI64() pushI64(r); } else { + bool isConst = peekConstI64(&c); RegI64 r0, r1; pop2xI64ForIntDiv(&r0, &r1); - remainderI64(r1, r0, IsUnsigned(false)); + remainderI64(r1, r0, IsUnsigned(false), isConst, c); freeI64(r1); pushI64(r0); } @@ -4383,9 +4418,10 @@ BaseCompiler::emitRemainderU64() masm.and64(Imm64(c-1), r); pushI64(r); } else { + bool isConst = peekConstI64(&c); RegI64 r0, r1; pop2xI64ForIntDiv(&r0, &r1); - remainderI64(r1, r0, IsUnsigned(true)); + remainderI64(r1, r0, IsUnsigned(true), isConst, c); freeI64(r1); pushI64(r0); } @@ -7866,7 +7902,7 @@ LiveRegisterSet BaseCompiler::VolatileReturnGPR = volatileReturnGPR(); } // js bool -js::wasm::BaselineCanCompile(const FunctionGenerator* fg) +js::wasm::BaselineCanCompile() { // On all platforms we require signals for AsmJS/Wasm. // If we made it this far we must have signals. @@ -7884,12 +7920,6 @@ js::wasm::BaselineCanCompile(const FunctionGenerator* fg) #endif #if defined(JS_CODEGEN_X64) || defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM) - // AsmJS code may use SIMD or atomics, which Baseline doesn't currently - // handle. Since we haven't yet validated the function, we don't know - // whether it actually uses those features. Assume the worst. - if (fg->isAsmJS()) - return false; - return true; #else return false; @@ -7899,7 +7929,7 @@ js::wasm::BaselineCanCompile(const FunctionGenerator* fg) bool js::wasm::BaselineCompileFunction(CompileTask* task, FuncCompileUnit* unit, UniqueChars *error) { - MOZ_ASSERT(unit->mode() == CompileMode::Baseline); + MOZ_ASSERT(task->mode() == CompileMode::Baseline); const FuncBytes& func = unit->func(); uint32_t bodySize = func.bytes().length(); diff --git a/js/src/wasm/WasmBaselineCompile.h b/js/src/wasm/WasmBaselineCompile.h index 7d0ac0d13ef4..1043139b1d6e 100644 --- a/js/src/wasm/WasmBaselineCompile.h +++ b/js/src/wasm/WasmBaselineCompile.h @@ -24,21 +24,13 @@ namespace js { namespace wasm { -class FunctionGenerator; class CompileTask; class FuncCompileUnit; -// Return true if BaselineCompileFunction can generate code for the -// function held in the FunctionGenerator. If false is returned a -// different compilation strategy must be chosen. -// -// This allows the baseline compiler to have different capabilities on -// different platforms and defer to the full Ion compiler if -// capabilities are missing. The FunctionGenerator and other data -// structures contain information about the capabilities that are -// required to compile the function. +// Return whether BaselineCompileFunction can generate code on the current device. +// Note: asm.js is also currently not supported due to Atomics and SIMD. bool -BaselineCanCompile(const FunctionGenerator* fg); +BaselineCanCompile(); // Generate adequate code quickly. bool diff --git a/js/src/wasm/WasmGenerator.cpp b/js/src/wasm/WasmGenerator.cpp index f2f60b6e7ee0..fde29046f1e9 100644 --- a/js/src/wasm/WasmGenerator.cpp +++ b/js/src/wasm/WasmGenerator.cpp @@ -45,8 +45,7 @@ static const unsigned COMPILATION_LIFO_DEFAULT_CHUNK_SIZE = 64 * 1024; static const uint32_t BAD_CODE_RANGE = UINT32_MAX; ModuleGenerator::ModuleGenerator(UniqueChars* error) - : alwaysBaseline_(false), - debugEnabled_(false), + : compileMode_(CompileMode(-1)), error_(error), numSigs_(0), numTables_(0), @@ -112,6 +111,12 @@ ModuleGenerator::initAsmJS(Metadata* asmJSMetadata) metadata_ = asmJSMetadata; MOZ_ASSERT(isAsmJS()); + // Enabling debugging requires baseline and baseline is only enabled for + // wasm (since the baseline does not currently support Atomics or SIMD). + + metadata_->debugEnabled = false; + compileMode_ = CompileMode::Ion; + // For asm.js, the Vectors in ModuleEnvironment are max-sized reservations // and will be initialized in a linear order via init* functions as the // module is generated. @@ -124,7 +129,7 @@ ModuleGenerator::initAsmJS(Metadata* asmJSMetadata) } bool -ModuleGenerator::initWasm() +ModuleGenerator::initWasm(const CompileArgs& args) { MOZ_ASSERT(!env_->isAsmJS()); @@ -134,6 +139,11 @@ ModuleGenerator::initWasm() MOZ_ASSERT(!isAsmJS()); + metadata_->debugEnabled = args.debugEnabled && BaselineCanCompile(); + compileMode_ = args.alwaysBaseline || metadata_->debugEnabled + ? CompileMode::Baseline + : CompileMode::Ion; + // For wasm, the Vectors are correctly-sized and already initialized. numSigs_ = env_->sigs.length(); @@ -202,9 +212,6 @@ ModuleGenerator::init(UniqueModuleEnvironment env, const CompileArgs& args, linkData_.globalDataLength = AlignBytes(InitialGlobalDataBytes, sizeof(void*)); - alwaysBaseline_ = args.alwaysBaseline; - debugEnabled_ = args.debugEnabled; - if (!funcToCodeRange_.appendN(BAD_CODE_RANGE, env_->funcSigs.length())) return false; @@ -214,7 +221,7 @@ ModuleGenerator::init(UniqueModuleEnvironment env, const CompileArgs& args, if (!exportedFuncs_.init()) return false; - if (env_->isAsmJS() ? !initAsmJS(maybeAsmJSMetadata) : !initWasm()) + if (env_->isAsmJS() ? !initAsmJS(maybeAsmJSMetadata) : !initWasm(args)) return false; if (args.scriptedCaller.filename) { @@ -903,7 +910,7 @@ ModuleGenerator::startFuncDefs() if (!tasks_.initCapacity(numTasks)) return false; for (size_t i = 0; i < numTasks; i++) - tasks_.infallibleEmplaceBack(*env_, COMPILATION_LIFO_DEFAULT_CHUNK_SIZE); + tasks_.infallibleEmplaceBack(*env_, compileMode_, COMPILATION_LIFO_DEFAULT_CHUNK_SIZE); if (!freeTasks_.reserve(numTasks)) return false; @@ -948,7 +955,7 @@ ModuleGenerator::launchBatchCompile() { MOZ_ASSERT(currentTask_); - currentTask_->setDebugEnabled(debugEnabled_); + currentTask_->setDebugEnabled(metadata_->debugEnabled); size_t numBatchedFuncs = currentTask_->units().length(); MOZ_ASSERT(numBatchedFuncs); @@ -977,30 +984,20 @@ ModuleGenerator::finishFuncDef(uint32_t funcIndex, FunctionGenerator* fg) MOZ_ASSERT(activeFuncDef_ == fg); UniqueFuncBytes func = Move(fg->funcBytes_); - func->setFunc(funcIndex, &funcSig(funcIndex)); - - CompileMode mode; - if ((alwaysBaseline_ || debugEnabled_) && BaselineCanCompile(fg)) { - mode = CompileMode::Baseline; - } else { - mode = CompileMode::Ion; - // Ion does not support debugging -- reset debugEnabled_ flags to avoid - // turning debugging for wasm::Code. - debugEnabled_ = false; - } - - CheckedInt newBatched = func->bytes().length(); - if (mode == CompileMode::Ion) - newBatched *= JitOptions.wasmBatchIonScaleFactor; - newBatched += batchedBytecode_; - - if (!currentTask_->units().emplaceBack(Move(func), mode)) + uint32_t funcBytecodeLength = func->bytes().length(); + if (!currentTask_->units().emplaceBack(Move(func))) return false; - if (newBatched.isValid() && newBatched.value() < JitOptions.wasmBatchThreshold) - batchedBytecode_ = newBatched.value(); - else if (!launchBatchCompile()) + uint32_t threshold; + switch (compileMode_) { + case CompileMode::Baseline: threshold = JitOptions.wasmBatchBaselineThreshold; break; + case CompileMode::Ion: threshold = JitOptions.wasmBatchIonThreshold; break; + } + + batchedBytecode_ += funcBytecodeLength; + MOZ_ASSERT(batchedBytecode_ <= MaxModuleBytes); + if (batchedBytecode_ > threshold && !launchBatchCompile()) return false; fg->m_ = nullptr; @@ -1189,8 +1186,6 @@ ModuleGenerator::finish(const ShareableBytes& bytecode) if (isAsmJS() && !metadata_->tables.resize(numTables_)) return nullptr; - metadata_->debugEnabled = debugEnabled_; - // Assert CodeRanges are sorted. #ifdef DEBUG uint32_t lastEnd = 0; @@ -1229,17 +1224,19 @@ wasm::CompileFunction(CompileTask* task, UniqueChars* error) TraceLoggerThread* logger = TraceLoggerForCurrentThread(); AutoTraceLog logCompile(logger, TraceLogger_WasmCompilation); - for (FuncCompileUnit& unit : task->units()) { - switch (unit.mode()) { - case CompileMode::Ion: + switch (task->mode()) { + case CompileMode::Ion: + for (FuncCompileUnit& unit : task->units()) { if (!IonCompileFunction(task, &unit, error)) return false; - break; - case CompileMode::Baseline: + } + break; + case CompileMode::Baseline: + for (FuncCompileUnit& unit : task->units()) { if (!BaselineCompileFunction(task, &unit, error)) return false; - break; } + break; } return true; diff --git a/js/src/wasm/WasmGenerator.h b/js/src/wasm/WasmGenerator.h index eb8cee18dcca..549e3f93b100 100644 --- a/js/src/wasm/WasmGenerator.h +++ b/js/src/wasm/WasmGenerator.h @@ -101,19 +101,16 @@ enum class CompileMode class FuncCompileUnit { UniqueFuncBytes func_; - CompileMode mode_; FuncOffsets offsets_; DebugOnly finished_; public: - FuncCompileUnit(UniqueFuncBytes func, CompileMode mode) + explicit FuncCompileUnit(UniqueFuncBytes func) : func_(Move(func)), - mode_(mode), finished_(false) {} const FuncBytes& func() const { return *func_; } - CompileMode mode() const { return mode_; } FuncOffsets offsets() const { MOZ_ASSERT(finished_); return offsets_; } void finish(FuncOffsets offsets) { @@ -140,6 +137,7 @@ typedef Vector FuncCompileUnitVector; class CompileTask { const ModuleEnvironment& env_; + CompileMode mode_; LifoAlloc lifo_; Maybe alloc_; Maybe masm_; @@ -156,8 +154,9 @@ class CompileTask } public: - CompileTask(const ModuleEnvironment& env, size_t defaultChunkSize) + CompileTask(const ModuleEnvironment& env, CompileMode mode, size_t defaultChunkSize) : env_(env), + mode_(mode), lifo_(defaultChunkSize) { init(); @@ -177,6 +176,9 @@ class CompileTask FuncCompileUnitVector& units() { return units_; } + CompileMode mode() const { + return mode_; + } bool debugEnabled() const { return debugEnabled_; } @@ -213,8 +215,7 @@ class MOZ_STACK_CLASS ModuleGenerator typedef EnumeratedArray TrapExitOffsetArray; // Constant parameters - bool alwaysBaseline_; - bool debugEnabled_; + CompileMode compileMode_; UniqueChars* error_; // Data that is moved into the result of finish() @@ -268,7 +269,7 @@ class MOZ_STACK_CLASS ModuleGenerator MOZ_MUST_USE bool launchBatchCompile(); MOZ_MUST_USE bool initAsmJS(Metadata* asmJSMetadata); - MOZ_MUST_USE bool initWasm(); + MOZ_MUST_USE bool initWasm(const CompileArgs& args); public: explicit ModuleGenerator(UniqueChars* error); diff --git a/js/src/wasm/WasmIonCompile.cpp b/js/src/wasm/WasmIonCompile.cpp index 06c9c89d5298..8f21abedd1a5 100644 --- a/js/src/wasm/WasmIonCompile.cpp +++ b/js/src/wasm/WasmIonCompile.cpp @@ -3657,7 +3657,7 @@ EmitExpr(FunctionCompiler& f) bool wasm::IonCompileFunction(CompileTask* task, FuncCompileUnit* unit, UniqueChars* error) { - MOZ_ASSERT(unit->mode() == CompileMode::Ion); + MOZ_ASSERT(task->mode() == CompileMode::Ion); const FuncBytes& func = unit->func(); const ModuleEnvironment& env = task->env(); diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index 297b5ee3baad..469708440e8c 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -168,6 +168,7 @@ #include "LayerTreeInvalidation.h" #include "mozilla/css/ImageLoader.h" #include "mozilla/dom/DocumentTimeline.h" +#include "mozilla/dom/ScriptSettings.h" #include "mozilla/Preferences.h" #include "mozilla/Telemetry.h" #include "nsCanvasFrame.h" @@ -6239,6 +6240,13 @@ PresShell::Paint(nsView* aViewToPaint, PROFILER_LABEL("PresShell", "Paint", js::ProfileEntry::Category::GRAPHICS); + Maybe nojs; + if (!(aFlags & nsIPresShell::PAINT_COMPOSITE)) { + // We need to allow content JS when the flag is set since we may trigger + // MozAfterPaint events in content in those cases. + nojs.emplace(dom::danger::GetJSContext()); + } + NS_ASSERTION(!mIsDestroying, "painting a destroyed PresShell"); NS_ASSERTION(aViewToPaint, "null view"); diff --git a/layout/base/ServoRestyleManager.cpp b/layout/base/ServoRestyleManager.cpp index f7f20425501d..93053583097a 100644 --- a/layout/base/ServoRestyleManager.cpp +++ b/layout/base/ServoRestyleManager.cpp @@ -88,19 +88,9 @@ void ServoRestyleManager::RebuildAllStyleData(nsChangeHint aExtraHint, nsRestyleHint aRestyleHint) { - NS_WARNING("stylo: ServoRestyleManager::RebuildAllStyleData not implemented"); - // That said, we do know that rebuilding all style data in Gecko would get rid - // of the old ruletree, and hence of the cached-on-the-root default computed - // styles. So we know we need to clear them here. I think this is the only - // way they could get cleared, in fact, though not _all_ calls that come - // through here may need to clear them in practice. - // - // We probably need to do some actual restyling here too, though. And figure - // out whether it actually matters that we may be recomputing the default - // styles in too many cases. For one thing, we do a bunch of eager work here, - // whereas we should really just set a bit that says to recompute the default - // computed styles before the next time we restyle anything! - StyleSet()->RecomputeDefaultComputedStyles(); + // TODO(emilio, bz): We probably need to do some actual restyling here too. + NS_WARNING("stylo: ServoRestyleManager::RebuildAllStyleData is incomplete"); + StyleSet()->RebuildData(); } void diff --git a/layout/generic/nsBlockFrame.h b/layout/generic/nsBlockFrame.h index 471b5392b7cb..1d6728889400 100644 --- a/layout/generic/nsBlockFrame.h +++ b/layout/generic/nsBlockFrame.h @@ -106,21 +106,21 @@ public: NS_DECL_QUERYFRAME // nsIFrame - virtual void Init(nsIContent* aContent, - nsContainerFrame* aParent, - nsIFrame* aPrevInFlow) override; - virtual void SetInitialChildList(ChildListID aListID, - nsFrameList& aChildList) override; - virtual void AppendFrames(ChildListID aListID, - nsFrameList& aFrameList) override; - virtual void InsertFrames(ChildListID aListID, - nsIFrame* aPrevFrame, - nsFrameList& aFrameList) override; - virtual void RemoveFrame(ChildListID aListID, - nsIFrame* aOldFrame) override; - virtual const nsFrameList& GetChildList(ChildListID aListID) const override; - virtual void GetChildLists(nsTArray* aLists) const override; - virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override; + void Init(nsIContent* aContent, + nsContainerFrame* aParent, + nsIFrame* aPrevInFlow) override; + void SetInitialChildList(ChildListID aListID, + nsFrameList& aChildList) override; + void AppendFrames(ChildListID aListID, + nsFrameList& aFrameList) override; + void InsertFrames(ChildListID aListID, + nsIFrame* aPrevFrame, + nsFrameList& aFrameList) override; + void RemoveFrame(ChildListID aListID, + nsIFrame* aOldFrame) override; + const nsFrameList& GetChildList(ChildListID aListID) const override; + void GetChildLists(nsTArray* aLists) const override; + nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override; bool GetVerticalAlignBaseline(mozilla::WritingMode aWM, nscoord* aBaseline) const override { @@ -134,36 +134,36 @@ public: bool GetNaturalBaselineBOffset(mozilla::WritingMode aWM, BaselineSharingGroup aBaselineGroup, nscoord* aBaseline) const override; - virtual nscoord GetCaretBaseline() const override; - virtual void DestroyFrom(nsIFrame* aDestructRoot) override; - virtual nsSplittableType GetSplittableType() const override; - virtual bool IsFloatContainingBlock() const override; - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) override; - virtual nsIAtom* GetType() const override; - virtual bool IsFrameOfType(uint32_t aFlags) const override + nscoord GetCaretBaseline() const override; + void DestroyFrom(nsIFrame* aDestructRoot) override; + nsSplittableType GetSplittableType() const override; + bool IsFloatContainingBlock() const override; + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; + nsIAtom* GetType() const override; + bool IsFrameOfType(uint32_t aFlags) const override { return nsContainerFrame::IsFrameOfType(aFlags & ~(nsIFrame::eCanContainOverflowContainers | nsIFrame::eBlockFrame)); } - virtual void InvalidateFrame(uint32_t aDisplayItemKey = 0) override; - virtual void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0) override; + void InvalidateFrame(uint32_t aDisplayItemKey = 0) override; + void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0) override; #ifdef DEBUG_FRAME_DUMP void List(FILE* out = stderr, const char* aPrefix = "", uint32_t aFlags = 0) const override; - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; #endif #ifdef DEBUG - virtual nsFrameState GetDebugStateBits() const override; + nsFrameState GetDebugStateBits() const override; const char* LineReflowStatusToString(LineReflowStatus aLineReflowStatus) const; #endif #ifdef ACCESSIBILITY - virtual mozilla::a11y::AccType AccessibleType() override; + mozilla::a11y::AccType AccessibleType() override; #endif // Line cursor methods to speed up line searching in which one query @@ -226,12 +226,12 @@ public: nsLineBox* mOrigCursor; }; - virtual void ChildIsDirty(nsIFrame* aChild) override; - virtual bool IsVisibleInSelection(nsISelection* aSelection) override; + void ChildIsDirty(nsIFrame* aChild) override; + bool IsVisibleInSelection(nsISelection* aSelection) override; - virtual bool IsEmpty() override; - virtual bool CachedIsEmpty() override; - virtual bool IsSelfEmpty() override; + bool IsEmpty() override; + bool CachedIsEmpty() override; + bool IsSelfEmpty() override; // Given that we have a bullet, does it actually draw something, i.e., // do we have either a 'list-style-type' or 'list-style-image' that is @@ -272,18 +272,18 @@ public: return outside ? outside : GetInsideBullet(); } - virtual void MarkIntrinsicISizesDirty() override; + void MarkIntrinsicISizesDirty() override; private: void CheckIntrinsicCacheAgainstShrinkWrapState(); public: - virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; - virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; + nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; + nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; - virtual nsRect ComputeTightBounds(DrawTarget* aDrawTarget) const override; + nsRect ComputeTightBounds(DrawTarget* aDrawTarget) const override; - virtual nsresult GetPrefWidthTightBounds(nsRenderingContext* aContext, - nscoord* aX, - nscoord* aXMost) override; + nsresult GetPrefWidthTightBounds(nsRenderingContext* aContext, + nscoord* aX, + nscoord* aXMost) override; /** * Compute the final block size of this frame. @@ -309,25 +309,25 @@ public: mozilla::LogicalSize& aFinalSize, nscoord aConsumed); - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; - virtual nsresult AttributeChanged(int32_t aNameSpaceID, - nsIAtom* aAttribute, - int32_t aModType) override; + nsresult AttributeChanged(int32_t aNameSpaceID, + nsIAtom* aAttribute, + int32_t aModType) override; /** * Move any frames on our overflow list to the end of our principal list. * @return true if there were any overflow frames */ - virtual bool DrainSelfOverflowList() override; + bool DrainSelfOverflowList() override; - virtual nsresult StealFrame(nsIFrame* aChild) override; + nsresult StealFrame(nsIFrame* aChild) override; - virtual void DeleteNextInFlowChild(nsIFrame* aNextInFlow, - bool aDeletingEmptyFrames) override; + void DeleteNextInFlowChild(nsIFrame* aNextInFlow, + bool aDeletingEmptyFrames) override; /** * This is a special method that allows a child class of nsBlockFrame to diff --git a/layout/generic/nsFlexContainerFrame.h b/layout/generic/nsFlexContainerFrame.h index 22b420d85b13..b27e6b4e30b6 100644 --- a/layout/generic/nsFlexContainerFrame.h +++ b/layout/generic/nsFlexContainerFrame.h @@ -62,23 +62,21 @@ public: nsContainerFrame* aParent, nsIFrame* aPrevInFlow) override; - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) override; + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; - virtual nscoord - GetMinISize(nsRenderingContext* aRenderingContext) override; - virtual nscoord - GetPrefISize(nsRenderingContext* aRenderingContext) override; + nscoord GetMinISize(nsRenderingContext* aRenderingContext) override; + nscoord GetPrefISize(nsRenderingContext* aRenderingContext) override; - virtual nsIAtom* GetType() const override; + nsIAtom* GetType() const override; #ifdef DEBUG_FRAME_DUMP - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; #endif nscoord GetLogicalBaseline(mozilla::WritingMode aWM) const override; diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h index 99373c48041a..80fff2066262 100644 --- a/layout/generic/nsFrame.h +++ b/layout/generic/nsFrame.h @@ -89,7 +89,7 @@ #define NS_DECL_FRAMEARENA_HELPERS \ void* operator new(size_t, nsIPresShell*) MOZ_MUST_OVERRIDE; \ - virtual nsQueryFrame::FrameIID GetFrameId() override MOZ_MUST_OVERRIDE; + nsQueryFrame::FrameIID GetFrameId() override MOZ_MUST_OVERRIDE; #define NS_IMPL_FRAMEARENA_HELPERS(class) \ void* class::operator new(size_t sz, nsIPresShell* aShell) \ @@ -148,65 +148,68 @@ public: virtual nsQueryFrame::FrameIID GetFrameId() MOZ_MUST_OVERRIDE; // nsIFrame - virtual void Init(nsIContent* aContent, - nsContainerFrame* aParent, - nsIFrame* aPrevInFlow) override; - virtual void DestroyFrom(nsIFrame* aDestructRoot) override; - virtual nsStyleContext* GetAdditionalStyleContext(int32_t aIndex) const override; - virtual void SetAdditionalStyleContext(int32_t aIndex, - nsStyleContext* aStyleContext) override; - virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override; - virtual const nsFrameList& GetChildList(ChildListID aListID) const override; - virtual void GetChildLists(nsTArray* aLists) const override; + void Init(nsIContent* aContent, + nsContainerFrame* aParent, + nsIFrame* aPrevInFlow) override; + void DestroyFrom(nsIFrame* aDestructRoot) override; + nsStyleContext* GetAdditionalStyleContext(int32_t aIndex) const override; + void SetAdditionalStyleContext(int32_t aIndex, + nsStyleContext* aStyleContext) override; + nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override; + const nsFrameList& GetChildList(ChildListID aListID) const override; + void GetChildLists(nsTArray* aLists) const override; - virtual nsresult HandleEvent(nsPresContext* aPresContext, - mozilla::WidgetGUIEvent* aEvent, - nsEventStatus* aEventStatus) override; - virtual nsresult GetContentForEvent(mozilla::WidgetEvent* aEvent, - nsIContent** aContent) override; - virtual nsresult GetCursor(const nsPoint& aPoint, - nsIFrame::Cursor& aCursor) override; + nsresult HandleEvent(nsPresContext* aPresContext, + mozilla::WidgetGUIEvent* aEvent, + nsEventStatus* aEventStatus) override; + nsresult GetContentForEvent(mozilla::WidgetEvent* aEvent, + nsIContent** aContent) override; + nsresult GetCursor(const nsPoint& aPoint, + nsIFrame::Cursor& aCursor) override; - virtual nsresult GetPointFromOffset(int32_t inOffset, - nsPoint* outPoint) override; - virtual nsresult GetCharacterRectsInRange(int32_t aInOffset, - int32_t aLength, - nsTArray& aOutRect) override; + nsresult GetPointFromOffset(int32_t inOffset, + nsPoint* outPoint) override; + nsresult GetCharacterRectsInRange(int32_t aInOffset, + int32_t aLength, + nsTArray& aOutRect) override; - virtual nsresult GetChildFrameContainingOffset(int32_t inContentOffset, - bool inHint, - int32_t* outFrameContentOffset, - nsIFrame** outChildFrame) override; + nsresult GetChildFrameContainingOffset(int32_t inContentOffset, + bool inHint, + int32_t* outFrameContentOffset, + nsIFrame** outChildFrame) override; - static nsresult GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext, - nsPeekOffsetStruct *aPos, - nsIFrame *aBlockFrame, - int32_t aLineStart, - int8_t aOutSideLimit - ); + static nsresult GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext, + nsPeekOffsetStruct *aPos, + nsIFrame *aBlockFrame, + int32_t aLineStart, + int8_t aOutSideLimit); - virtual nsresult CharacterDataChanged(CharacterDataChangeInfo* aInfo) override; - virtual nsresult AttributeChanged(int32_t aNameSpaceID, - nsIAtom* aAttribute, - int32_t aModType) override; - virtual nsSplittableType GetSplittableType() const override; - virtual nsIFrame* GetPrevContinuation() const override; - virtual void SetPrevContinuation(nsIFrame*) override; - virtual nsIFrame* GetNextContinuation() const override; - virtual void SetNextContinuation(nsIFrame*) override; - virtual nsIFrame* GetPrevInFlowVirtual() const override; - virtual void SetPrevInFlow(nsIFrame*) override; - virtual nsIFrame* GetNextInFlowVirtual() const override; - virtual void SetNextInFlow(nsIFrame*) override; - virtual nsIAtom* GetType() const override; + nsresult CharacterDataChanged(CharacterDataChangeInfo* aInfo) override; + nsresult AttributeChanged(int32_t aNameSpaceID, + nsIAtom* aAttribute, + int32_t aModType) override; + nsSplittableType GetSplittableType() const override; + nsIFrame* GetPrevContinuation() const override; + void SetPrevContinuation(nsIFrame*) override; + nsIFrame* GetNextContinuation() const override; + void SetNextContinuation(nsIFrame*) override; + nsIFrame* GetPrevInFlowVirtual() const override; + void SetPrevInFlow(nsIFrame*) override; + nsIFrame* GetNextInFlowVirtual() const override; + void SetNextInFlow(nsIFrame*) override; + nsIAtom* GetType() const override; - virtual nsresult GetSelectionController(nsPresContext *aPresContext, nsISelectionController **aSelCon) override; + nsresult GetSelectionController(nsPresContext *aPresContext, + nsISelectionController **aSelCon) override; - virtual FrameSearchResult PeekOffsetNoAmount(bool aForward, int32_t* aOffset) override; - virtual FrameSearchResult PeekOffsetCharacter(bool aForward, int32_t* aOffset, - bool aRespectClusters = true) override; - virtual FrameSearchResult PeekOffsetWord(bool aForward, bool aWordSelectEatSpace, bool aIsKeyboardSelect, - int32_t* aOffset, PeekWordState *aState) override; + FrameSearchResult PeekOffsetNoAmount(bool aForward, + int32_t* aOffset) override; + FrameSearchResult PeekOffsetCharacter(bool aForward, int32_t* aOffset, + bool aRespectClusters = true) override; + FrameSearchResult PeekOffsetWord(bool aForward, bool aWordSelectEatSpace, + bool aIsKeyboardSelect, + int32_t* aOffset, + PeekWordState *aState) override; /** * Check whether we should break at a boundary between punctuation and * non-punctuation. Only call it at a punctuation boundary @@ -216,20 +219,23 @@ public: * @param aWhitespaceAfter true if the next character is whitespace */ bool BreakWordBetweenPunctuation(const PeekWordState* aState, - bool aForward, - bool aPunctAfter, bool aWhitespaceAfter, - bool aIsKeyboardSelect); + bool aForward, + bool aPunctAfter, bool aWhitespaceAfter, + bool aIsKeyboardSelect); - virtual nsresult CheckVisibility(nsPresContext* aContext, int32_t aStartIndex, int32_t aEndIndex, bool aRecurse, bool *aFinished, bool *_retval) override; + nsresult CheckVisibility(nsPresContext* aContext, + int32_t aStartIndex, int32_t aEndIndex, + bool aRecurse, bool *aFinished, + bool *_retval) override; - virtual nsresult GetOffsets(int32_t &aStart, int32_t &aEnd) const override; - virtual void ChildIsDirty(nsIFrame* aChild) override; + nsresult GetOffsets(int32_t &aStart, int32_t &aEnd) const override; + void ChildIsDirty(nsIFrame* aChild) override; #ifdef ACCESSIBILITY - virtual mozilla::a11y::AccType AccessibleType() override; + mozilla::a11y::AccType AccessibleType() override; #endif - virtual nsStyleContext* GetParentStyleContext(nsIFrame** aProviderFrame) const override { + nsStyleContext* GetParentStyleContext(nsIFrame** aProviderFrame) const override { return DoGetParentStyleContext(aProviderFrame); } @@ -248,21 +254,21 @@ public: */ nsStyleContext* DoGetParentStyleContext(nsIFrame** aProviderFrame) const; - virtual bool IsEmpty() override; - virtual bool IsSelfEmpty() override; + bool IsEmpty() override; + bool IsSelfEmpty() override; - virtual void MarkIntrinsicISizesDirty() override; - virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; - virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; - virtual void AddInlineMinISize(nsRenderingContext *aRenderingContext, - InlineMinISizeData *aData) override; - virtual void AddInlinePrefISize(nsRenderingContext *aRenderingContext, - InlinePrefISizeData *aData) override; - virtual IntrinsicISizeOffsetData IntrinsicISizeOffsets() override; - virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + void MarkIntrinsicISizesDirty() override; + nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; + nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; + void AddInlineMinISize(nsRenderingContext *aRenderingContext, + InlineMinISizeData *aData) override; + void AddInlinePrefISize(nsRenderingContext *aRenderingContext, + InlinePrefISizeData *aData) override; + IntrinsicISizeOffsetData IntrinsicISizeOffsets() override; + mozilla::IntrinsicSize GetIntrinsicSize() override; + nsSize GetIntrinsicRatio() override; - virtual mozilla::LogicalSize + mozilla::LogicalSize ComputeSize(nsRenderingContext* aRenderingContext, mozilla::WritingMode aWM, const mozilla::LogicalSize& aCBSize, @@ -347,29 +353,29 @@ public: * Note: if it's only the overflow rect(s) of a frame that need to be * updated, then UpdateOverflow should be called instead of Reflow. */ - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) override; - virtual void DidReflow(nsPresContext* aPresContext, - const ReflowInput* aReflowInput, - nsDidReflowStatus aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; + void DidReflow(nsPresContext* aPresContext, + const ReflowInput* aReflowInput, + nsDidReflowStatus aStatus) override; /** * NOTE: aStatus is assumed to be already-initialized. The reflow statuses of * any reflowed absolute children will be merged into aStatus; aside from * that, this method won't modify aStatus. */ - void ReflowAbsoluteFrames(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, + void ReflowAbsoluteFrames(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, - nsReflowStatus& aStatus, - bool aConstrainBSize = true); - void FinishReflowWithAbsoluteFrames(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, + nsReflowStatus& aStatus, + bool aConstrainBSize = true); + void FinishReflowWithAbsoluteFrames(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, - nsReflowStatus& aStatus, - bool aConstrainBSize = true); + nsReflowStatus& aStatus, + bool aConstrainBSize = true); /* * If this frame is dirty, marks all absolutely-positioned children of this @@ -384,11 +390,11 @@ public: */ void PushDirtyBitToAbsoluteFrames(); - virtual bool CanContinueTextRun() const override; + bool CanContinueTextRun() const override; - virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override; + bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override; - virtual void UnionChildOverflow(nsOverflowAreas& aOverflowAreas) override; + void UnionChildOverflow(nsOverflowAreas& aOverflowAreas) override; // Selection Methods @@ -428,15 +434,15 @@ public: virtual ContentOffsets CalcContentOffsetsFromFramePoint(nsPoint aPoint); // Box layout methods - virtual nsSize GetXULPrefSize(nsBoxLayoutState& aBoxLayoutState) override; - virtual nsSize GetXULMinSize(nsBoxLayoutState& aBoxLayoutState) override; - virtual nsSize GetXULMaxSize(nsBoxLayoutState& aBoxLayoutState) override; - virtual nscoord GetXULFlex() override; - virtual nscoord GetXULBoxAscent(nsBoxLayoutState& aBoxLayoutState) override; + nsSize GetXULPrefSize(nsBoxLayoutState& aBoxLayoutState) override; + nsSize GetXULMinSize(nsBoxLayoutState& aBoxLayoutState) override; + nsSize GetXULMaxSize(nsBoxLayoutState& aBoxLayoutState) override; + nscoord GetXULFlex() override; + nscoord GetXULBoxAscent(nsBoxLayoutState& aBoxLayoutState) override; // We compute and store the HTML content's overflow area. So don't // try to compute it in the box code. - virtual bool ComputesOwnOverflowArea() override { return true; } + bool ComputesOwnOverflowArea() override { return true; } //-------------------------------------------------- // Additional methods @@ -501,18 +507,18 @@ public: const char* aType); static void* DisplayIntrinsicSizeEnter(nsIFrame* aFrame, const char* aType); - static void DisplayReflowExit(nsPresContext* aPresContext, + static void DisplayReflowExit(nsPresContext* aPresContext, nsIFrame* aFrame, ReflowOutput& aMetrics, uint32_t aStatus, void* aFrameTreeNode); - static void DisplayLayoutExit(nsIFrame* aFrame, + static void DisplayLayoutExit(nsIFrame* aFrame, void* aFrameTreeNode); - static void DisplayIntrinsicISizeExit(nsIFrame* aFrame, + static void DisplayIntrinsicISizeExit(nsIFrame* aFrame, const char* aType, nscoord aResult, void* aFrameTreeNode); - static void DisplayIntrinsicSizeExit(nsIFrame* aFrame, + static void DisplayIntrinsicSizeExit(nsIFrame* aFrame, const char* aType, nsSize aResult, void* aFrameTreeNode); @@ -586,7 +592,7 @@ protected: int16_t DisplaySelection(nsPresContext* aPresContext, bool isOkToTurnOn = false); // Style post processing hook - virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override; + void DidSetStyleContext(nsStyleContext* aOldStyleContext) override; public: //given a frame five me the first/last leaf available @@ -649,7 +655,7 @@ public: aFrame->GetType() == nsGkAtoms::blockFrame; } - virtual nsILineIterator* GetLineIterator() override; + nsILineIterator* GetLineIterator() override; protected: @@ -674,7 +680,7 @@ protected: NS_IMETHOD DoXULLayout(nsBoxLayoutState& aBoxLayoutState) override; #ifdef DEBUG_LAYOUT - virtual void GetBoxName(nsAutoString& aName) override; + void GetBoxName(nsAutoString& aName) override; #endif nsBoxLayoutMetrics* BoxMetrics() const; @@ -707,7 +713,7 @@ public: * Get a printable from of the name of the frame type. * XXX This should be eliminated and we use GetType() instead... */ - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; nsresult MakeFrameName(const nsAString& aKind, nsAString& aResult) const; // Helper function to return the index in parent of the frame's content // object. Returns -1 on error or if the frame doesn't have a content object @@ -720,7 +726,7 @@ public: * Return the state bits that are relevant to regression tests (that * is, those bits which indicate a real difference when they differ */ - virtual nsFrameState GetDebugStateBits() const override; + nsFrameState GetDebugStateBits() const override; /** * Called to dump out regression data that describes the layout * of the frame and its children, and so on. The format of the @@ -729,8 +735,8 @@ public: * the caveat that some base types are defined. * For more information, see XXX. */ - virtual nsresult DumpRegressionData(nsPresContext* aPresContext, - FILE* out, int32_t aIndent) override; + nsresult DumpRegressionData(nsPresContext* aPresContext, + FILE* out, int32_t aIndent) override; /** * See if style tree verification is enabled. To enable style tree diff --git a/layout/generic/nsQueryFrame.h b/layout/generic/nsQueryFrame.h index 7f7ea2fc1adc..b8f69ee11b11 100644 --- a/layout/generic/nsQueryFrame.h +++ b/layout/generic/nsQueryFrame.h @@ -17,7 +17,7 @@ typedef classname Has_NS_DECL_QUERYFRAME_TARGET; #define NS_DECL_QUERYFRAME \ - virtual void* QueryFrame(FrameIID id) override; + void* QueryFrame(FrameIID id) override; #define NS_QUERYFRAME_HEAD(class) \ void* class::QueryFrame(FrameIID id) { switch (id) { diff --git a/layout/generic/nsSimplePageSequenceFrame.h b/layout/generic/nsSimplePageSequenceFrame.h index 885678e70e54..27012d2a4f4b 100644 --- a/layout/generic/nsSimplePageSequenceFrame.h +++ b/layout/generic/nsSimplePageSequenceFrame.h @@ -61,14 +61,14 @@ public: NS_DECL_FRAMEARENA_HELPERS // nsIFrame - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aMaxSize, - nsReflowStatus& aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aMaxSize, + nsReflowStatus& aStatus) override; - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) override; + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; // nsIPageSequenceFrame NS_IMETHOD SetPageNo(int32_t aPageNo) { return NS_OK;} @@ -94,19 +94,19 @@ public: // We must allow Print Preview UI to have a background, no matter what the // user's settings - virtual bool HonorPrintBackgroundSettings() override { return false; } + bool HonorPrintBackgroundSettings() override { return false; } - virtual bool HasTransformGetter() const override { return true; } + bool HasTransformGetter() const override { return true; } /** * Get the "type" of the frame * * @see nsGkAtoms::sequenceFrame */ - virtual nsIAtom* GetType() const override; + nsIAtom* GetType() const override; #ifdef DEBUG_FRAME_DUMP - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; #endif protected: diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h index 54f08d4fe6ff..634e2ab3b2c5 100644 --- a/layout/generic/nsSubDocumentFrame.h +++ b/layout/generic/nsSubDocumentFrame.h @@ -26,14 +26,14 @@ public: #ifdef DEBUG_FRAME_DUMP void List(FILE* out = stderr, const char* aPrefix = "", uint32_t aFlags = 0) const override; - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; #endif NS_DECL_QUERYFRAME - virtual nsIAtom* GetType() const override; + nsIAtom* GetType() const override; - virtual bool IsFrameOfType(uint32_t aFlags) const override + bool IsFrameOfType(uint32_t aFlags) const override { return nsAtomicContainerFrame::IsFrameOfType(aFlags & ~(nsIFrame::eReplaced | @@ -41,19 +41,19 @@ public: nsIFrame::eReplacedContainsBlock)); } - virtual void Init(nsIContent* aContent, - nsContainerFrame* aParent, - nsIFrame* aPrevInFlow) override; + void Init(nsIContent* aContent, + nsContainerFrame* aParent, + nsIFrame* aPrevInFlow) override; - virtual void DestroyFrom(nsIFrame* aDestructRoot) override; + void DestroyFrom(nsIFrame* aDestructRoot) override; - virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; - virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; + nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; + nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; - virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + mozilla::IntrinsicSize GetIntrinsicSize() override; + nsSize GetIntrinsicRatio() override; - virtual mozilla::LogicalSize + mozilla::LogicalSize ComputeAutoSize(nsRenderingContext* aRenderingContext, mozilla::WritingMode aWritingMode, const mozilla::LogicalSize& aCBSize, @@ -63,7 +63,7 @@ public: const mozilla::LogicalSize& aPadding, ComputeSizeFlags aFlags) override; - virtual mozilla::LogicalSize + mozilla::LogicalSize ComputeSize(nsRenderingContext* aRenderingContext, mozilla::WritingMode aWritingMode, const mozilla::LogicalSize& aCBSize, @@ -73,27 +73,27 @@ public: const mozilla::LogicalSize& aPadding, ComputeSizeFlags aFlags) override; - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) override; + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; - virtual nsresult AttributeChanged(int32_t aNameSpaceID, - nsIAtom* aAttribute, - int32_t aModType) override; + nsresult AttributeChanged(int32_t aNameSpaceID, + nsIAtom* aAttribute, + int32_t aModType) override; // if the content is "visibility:hidden", then just hide the view // and all our contents. We don't extend "visibility:hidden" to // the child content ourselves, since it belongs to a different // document and CSS doesn't inherit in there. - virtual bool SupportsVisibilityHidden() override { return false; } + bool SupportsVisibilityHidden() override { return false; } #ifdef ACCESSIBILITY - virtual mozilla::a11y::AccType AccessibleType() override; + mozilla::a11y::AccType AccessibleType() override; #endif nsresult GetDocShell(nsIDocShell **aDocShell); @@ -108,8 +108,8 @@ public: mozilla::ScreenIntSize GetSubdocumentSize(); // nsIReflowCallback - virtual bool ReflowFinished() override; - virtual void ReflowCallbackCanceled() override; + bool ReflowFinished() override; + void ReflowCallbackCanceled() override; bool ShouldClipSubdocument() { diff --git a/layout/generic/nsVideoFrame.h b/layout/generic/nsVideoFrame.h index 97385e7a44de..9e7fd56796fc 100644 --- a/layout/generic/nsVideoFrame.h +++ b/layout/generic/nsVideoFrame.h @@ -44,21 +44,21 @@ public: NS_DECL_QUERYFRAME_TARGET(nsVideoFrame) NS_DECL_FRAMEARENA_HELPERS - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) override; + void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, + const nsDisplayListSet& aLists) override; - virtual nsresult AttributeChanged(int32_t aNameSpaceID, - nsIAtom* aAttribute, - int32_t aModType) override; + nsresult AttributeChanged(int32_t aNameSpaceID, + nsIAtom* aAttribute, + int32_t aModType) override; void OnVisibilityChange(Visibility aNewVisibility, Maybe aNonvisibleAction = Nothing()) override; /* get the size of the video's display */ nsSize GetVideoIntrinsicSize(nsRenderingContext *aRenderingContext); - virtual nsSize GetIntrinsicRatio() override; - virtual mozilla::LogicalSize + nsSize GetIntrinsicRatio() override; + mozilla::LogicalSize ComputeSize(nsRenderingContext *aRenderingContext, mozilla::WritingMode aWritingMode, const mozilla::LogicalSize& aCBSize, @@ -67,31 +67,31 @@ public: const mozilla::LogicalSize& aBorder, const mozilla::LogicalSize& aPadding, ComputeSizeFlags aFlags) override; - virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; - virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; - virtual void DestroyFrom(nsIFrame* aDestructRoot) override; - virtual bool IsLeaf() const override; + nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; + nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; + void DestroyFrom(nsIFrame* aDestructRoot) override; + bool IsLeaf() const override; - virtual void Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, - const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) override; + void Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + nsReflowStatus& aStatus) override; #ifdef ACCESSIBILITY - virtual mozilla::a11y::AccType AccessibleType() override; + mozilla::a11y::AccType AccessibleType() override; #endif - virtual nsIAtom* GetType() const override; + nsIAtom* GetType() const override; - virtual bool IsFrameOfType(uint32_t aFlags) const override + bool IsFrameOfType(uint32_t aFlags) const override { return nsSplittableFrame::IsFrameOfType(aFlags & ~(nsIFrame::eReplaced | nsIFrame::eReplacedSizing)); } - virtual nsresult CreateAnonymousContent(nsTArray& aElements) override; - virtual void AppendAnonymousContentTo(nsTArray& aElements, - uint32_t aFilters) override; + nsresult CreateAnonymousContent(nsTArray& aElements) override; + void AppendAnonymousContentTo(nsTArray& aElements, + uint32_t aFilters) override; nsIContent* GetPosterImage() { return mPosterImage; } @@ -104,7 +104,7 @@ public: nsIContent *GetVideoControls() { return mVideoControls; } #ifdef DEBUG_FRAME_DUMP - virtual nsresult GetFrameName(nsAString& aResult) const override; + nsresult GetFrameName(nsAString& aResult) const override; #endif already_AddRefed BuildLayer(nsDisplayListBuilder* aBuilder, diff --git a/layout/reftests/invalidation/reftest.list b/layout/reftests/invalidation/reftest.list index 29a984298bf9..6c0179838636 100644 --- a/layout/reftests/invalidation/reftest.list +++ b/layout/reftests/invalidation/reftest.list @@ -23,11 +23,11 @@ pref(layout.animated-image-layers.enabled,true) skip-if(Android||gtkWidget) == t == filter-userspace-offset.svg?offsetContainer=innerSVG&filter=matrix-boundingBox filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=foreignObject&filter=matrix-boundingBox filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=rect&filter=flood-userSpace-at100 filter-userspace-offset.svg -== filter-userspace-offset.svg?offsetContainer=use&filter=flood-userSpace-at100 filter-userspace-offset.svg +== filter-userspace-offset.svg?offsetContainer=use&filter=flood-userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=innerSVG&filter=flood-userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=foreignObject&filter=flood-userSpace-at100 filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=rect&filter=matrix-userSpace-at100 filter-userspace-offset.svg -== filter-userspace-offset.svg?offsetContainer=use&filter=matrix-userSpace-at100 filter-userspace-offset.svg +== filter-userspace-offset.svg?offsetContainer=use&filter=matrix-userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=innerSVG&filter=matrix-userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=foreignObject&filter=matrix-userSpace-at100 filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=rect&mask=boundingBox filter-userspace-offset.svg @@ -35,7 +35,7 @@ pref(layout.animated-image-layers.enabled,true) skip-if(Android||gtkWidget) == t == filter-userspace-offset.svg?offsetContainer=innerSVG&mask=boundingBox filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=foreignObject&mask=boundingBox filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=rect&mask=userSpace-at100 filter-userspace-offset.svg -== filter-userspace-offset.svg?offsetContainer=use&mask=userSpace-at100 filter-userspace-offset.svg +== filter-userspace-offset.svg?offsetContainer=use&mask=userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=innerSVG&mask=userSpace-atZero filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=foreignObject&mask=userSpace-at100 filter-userspace-offset.svg == filter-userspace-offset.svg?offsetContainer=rect&filter=matrix-fillPaint-boundingBox filter-userspace-offset.svg diff --git a/layout/reftests/svg/clip-use-element-01.svg b/layout/reftests/svg/clip-use-element-01.svg new file mode 100644 index 000000000000..a01f4b9afec5 --- /dev/null +++ b/layout/reftests/svg/clip-use-element-01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/svg/clip-use-element-02.svg b/layout/reftests/svg/clip-use-element-02.svg new file mode 100644 index 000000000000..493edf24b5ed --- /dev/null +++ b/layout/reftests/svg/clip-use-element-02.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/svg/filter-use-element-01.svg b/layout/reftests/svg/filter-use-element-01.svg new file mode 100644 index 000000000000..48ff4f915e4d --- /dev/null +++ b/layout/reftests/svg/filter-use-element-01.svg @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/svg/mask-use-element-01.svg b/layout/reftests/svg/mask-use-element-01.svg new file mode 100644 index 000000000000..c2490ad0a1b6 --- /dev/null +++ b/layout/reftests/svg/mask-use-element-01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/layout/reftests/svg/reftest.list b/layout/reftests/svg/reftest.list index f05aad49f954..873b5d97c60f 100644 --- a/layout/reftests/svg/reftest.list +++ b/layout/reftests/svg/reftest.list @@ -469,3 +469,8 @@ default-preferences fuzzy(71,817) == filter-on-continuation-box-01.html filter-on-continuation-box-ref.html == mask-contains-inner-svg-01.svg pass.svg == mask-contains-inner-svg-02.svg pass.svg + +== mask-use-element-01.svg pass.svg +== clip-use-element-01.svg pass.svg +== clip-use-element-02.svg pass.svg +== filter-use-element-01.svg pass.svg diff --git a/layout/style/ServoBindingList.h b/layout/style/ServoBindingList.h index c242c47f1807..fb99fc7448b7 100644 --- a/layout/style/ServoBindingList.h +++ b/layout/style/ServoBindingList.h @@ -50,10 +50,9 @@ SERVO_BINDING_FUNC(Servo_StyleSheet_HasRules, bool, RawServoStyleSheetBorrowed sheet) SERVO_BINDING_FUNC(Servo_StyleSheet_GetRules, ServoCssRulesStrong, RawServoStyleSheetBorrowed sheet) -SERVO_BINDING_FUNC(Servo_StyleSet_Init, RawServoStyleSetOwned, RawGeckoPresContextBorrowed pres_context) -SERVO_BINDING_FUNC(Servo_StyleSet_RecomputeDefaultStyles, void, - RawServoStyleSetBorrowed set, - RawGeckoPresContextBorrowed pres_context) +SERVO_BINDING_FUNC(Servo_StyleSet_Init, RawServoStyleSetOwned, RawGeckoPresContextOwned pres_context) +SERVO_BINDING_FUNC(Servo_StyleSet_RebuildData, void, + RawServoStyleSetBorrowed set) SERVO_BINDING_FUNC(Servo_StyleSet_Drop, void, RawServoStyleSetOwned set) SERVO_BINDING_FUNC(Servo_StyleSet_AppendStyleSheet, void, RawServoStyleSetBorrowed set, RawServoStyleSheetBorrowed sheet, bool flush) diff --git a/layout/style/ServoBindingTypes.h b/layout/style/ServoBindingTypes.h index 8f0ba7129f9d..dcf86b17b719 100644 --- a/layout/style/ServoBindingTypes.h +++ b/layout/style/ServoBindingTypes.h @@ -107,6 +107,7 @@ DECL_BORROWED_MUT_REF_TYPE_FOR(StyleChildrenIterator) DECL_BORROWED_MUT_REF_TYPE_FOR(ServoElementSnapshot) DECL_BORROWED_REF_TYPE_FOR(nsCSSValue) DECL_BORROWED_MUT_REF_TYPE_FOR(nsCSSValue) +DECL_OWNED_REF_TYPE_FOR(RawGeckoPresContext) DECL_BORROWED_REF_TYPE_FOR(RawGeckoPresContext) DECL_BORROWED_MUT_REF_TYPE_FOR(RawGeckoAnimationValueList) diff --git a/layout/style/ServoBindings.cpp b/layout/style/ServoBindings.cpp index 4800c658bbe0..ba58c317c694 100644 --- a/layout/style/ServoBindings.cpp +++ b/layout/style/ServoBindings.cpp @@ -20,6 +20,7 @@ #include "nsIFrame.h" #include "nsINode.h" #include "nsIPrincipal.h" +#include "nsMediaFeatures.h" #include "nsNameSpaceManager.h" #include "nsNetUtil.h" #include "nsRuleNode.h" @@ -1055,6 +1056,12 @@ Gecko_PropertyId_IsPrefEnabled(nsCSSPropertyID id) return nsCSSProps::IsEnabled(id); } +void +Gecko_CSSValue_Drop(nsCSSValueBorrowedMut aCSSValue) +{ + aCSSValue->~nsCSSValue(); +} + void Gecko_LoadStyleSheet(css::Loader* aLoader, ServoStyleSheet* aParent, @@ -1095,6 +1102,12 @@ Gecko_LoadStyleSheet(css::Loader* aLoader, aLoader->LoadChildSheet(aParent, uri, media, nullptr, aImportRule, nullptr); } +const nsMediaFeature* +Gecko_GetMediaFeatures() +{ + return nsMediaFeatures::features; +} + NS_IMPL_THREADSAFE_FFI_REFCOUNTING(nsCSSValueSharedList, CSSValueSharedList); #define STYLE_STRUCT(name, checkdata_cb) \ diff --git a/layout/style/ServoBindings.h b/layout/style/ServoBindings.h index 93c1ab3a94c8..f5fbaf453b3f 100644 --- a/layout/style/ServoBindings.h +++ b/layout/style/ServoBindings.h @@ -37,6 +37,7 @@ namespace mozilla { using mozilla::FontFamilyList; using mozilla::FontFamilyType; using mozilla::ServoElementSnapshot; +struct nsMediaFeature; struct nsStyleList; struct nsStyleImage; struct nsStyleGradientStop; @@ -292,9 +293,12 @@ void Gecko_CSSValue_SetAngle(nsCSSValueBorrowedMut css_value, float radians); void Gecko_CSSValue_SetCalc(nsCSSValueBorrowedMut css_value, nsStyleCoord::CalcValue calc); void Gecko_CSSValue_SetFunction(nsCSSValueBorrowedMut css_value, int32_t len); nsCSSValueBorrowedMut Gecko_CSSValue_GetArrayItem(nsCSSValueBorrowedMut css_value, int32_t index); +void Gecko_CSSValue_Drop(nsCSSValueBorrowedMut css_value); NS_DECL_THREADSAFE_FFI_REFCOUNTING(nsCSSValueSharedList, CSSValueSharedList); bool Gecko_PropertyId_IsPrefEnabled(nsCSSPropertyID id); +const nsMediaFeature* Gecko_GetMediaFeatures(); + // Style-struct management. #define STYLE_STRUCT(name, checkdata_cb) \ void Gecko_Construct_Default_nsStyle##name( \ diff --git a/layout/style/ServoStyleSet.cpp b/layout/style/ServoStyleSet.cpp index b3175e64c393..21dde967a615 100644 --- a/layout/style/ServoStyleSet.cpp +++ b/layout/style/ServoStyleSet.cpp @@ -549,9 +549,9 @@ ServoStyleSet::AssertTreeIsClean() #endif void -ServoStyleSet::RecomputeDefaultComputedStyles() +ServoStyleSet::RebuildData() { - Servo_StyleSet_RecomputeDefaultStyles(mRawSet.get(), mPresContext); + Servo_StyleSet_RebuildData(mRawSet.get()); } ServoComputedValuesStrong diff --git a/layout/style/ServoStyleSet.h b/layout/style/ServoStyleSet.h index 651c0c2e8e30..2c03da0a0552 100644 --- a/layout/style/ServoStyleSet.h +++ b/layout/style/ServoStyleSet.h @@ -161,10 +161,10 @@ public: #endif /** - * Recompute our default computed styles. This will eagerly create a new set - * of default computed style structs. + * Rebuild the style data. This will force a stylesheet flush, and also + * recompute the default computed styles. */ - void RecomputeDefaultComputedStyles(); + void RebuildData(); /** * Resolve style for the given element, and return it as a diff --git a/layout/style/crashtests/crashtests.list b/layout/style/crashtests/crashtests.list index 187988771970..ca5f27665771 100644 --- a/layout/style/crashtests/crashtests.list +++ b/layout/style/crashtests/crashtests.list @@ -165,6 +165,6 @@ load 1315889-1.html load 1315894-1.html skip-if(stylo) load 1319072-1.html # bug 1323733 HTTP load 1320423-1.html -asserts-if(stylo,5-9) load 1321357-1.html # bug 1324669 +asserts-if(stylo,5-28) load 1321357-1.html # bug 1324669 load 1328535-1.html load 1331272.html diff --git a/layout/style/moz.build b/layout/style/moz.build index 27854fc1204f..906410466c69 100644 --- a/layout/style/moz.build +++ b/layout/style/moz.build @@ -64,6 +64,8 @@ EXPORTS += [ 'nsIStyleRule.h', 'nsIStyleRuleProcessor.h', 'nsLayoutStylesheetCache.h', + 'nsMediaFeatures.h', + 'nsMediaList.h', 'nsRuleData.h', 'nsRuleNode.h', 'nsRuleProcessorData.h', diff --git a/layout/style/nsMediaFeatures.h b/layout/style/nsMediaFeatures.h index 76e94837d64c..a0965b349c95 100644 --- a/layout/style/nsMediaFeatures.h +++ b/layout/style/nsMediaFeatures.h @@ -31,7 +31,7 @@ struct nsMediaFeature enum ValueType { // All value types allow eCSSUnit_Null to indicate that no value // was given (in addition to the types listed below). - eLength, // values are such that nsCSSValue::IsLengthUnit() is true + eLength, // values are eCSSUnit_Pixel eInteger, // values are eCSSUnit_Integer eFloat, // values are eCSSUnit_Number eBoolInteger,// values are eCSSUnit_Integer (0, -0, or 1 only) diff --git a/layout/svg/crashtests/crashtests.list b/layout/svg/crashtests/crashtests.list index 7fc87b244615..4fd1cdc746a5 100644 --- a/layout/svg/crashtests/crashtests.list +++ b/layout/svg/crashtests/crashtests.list @@ -105,7 +105,7 @@ load 587336-1.html load 590291-1.svg load 601999-1.html load 605626-1.svg -asserts(2) load 606914.xhtml # bug 606914 +asserts(2) asserts-if(stylo,0) load 606914.xhtml # bug 606914 asserts-if(stylo,2) load 610594-1.html # bug 1324669 load 610954-1.html load 612662-1.svg @@ -140,7 +140,7 @@ load 757718-1.svg load 757751-1.svg load 767056-1.svg asserts-if(stylo,3) load 767535-1.xhtml # bug 1324669 -asserts-if(stylo,2) load 768087-1.html # bug 1324669 +asserts-if(stylo,1-2) load 768087-1.html # bug 1324669 load 768351.svg load 778492-1.svg load 779971-1.svg diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp index d15e11d52a0a..32adf6169d41 100644 --- a/layout/svg/nsSVGUtils.cpp +++ b/layout/svg/nsSVGUtils.cpp @@ -1126,8 +1126,7 @@ nsSVGUtils::GetBBox(nsIFrame *aFrame, uint32_t aFlags) } gfxMatrix matrix; - if (aFrame->GetType() == nsGkAtoms::svgForeignObjectFrame || - aFrame->GetType() == nsGkAtoms::svgUseFrame) { + if (aFrame->GetType() == nsGkAtoms::svgForeignObjectFrame) { // The spec says getBBox "Returns the tight bounding box in *current user // space*". So we should really be doing this for all elements, but that // needs investigation to check that we won't break too much content. @@ -1219,8 +1218,7 @@ nsSVGUtils::FrameSpaceInCSSPxToUserSpaceOffset(nsIFrame *aFrame) // For foreignObject frames, nsSVGUtils::GetBBox applies their local // transform, so we need to do the same here. - if (aFrame->GetType() == nsGkAtoms::svgForeignObjectFrame || - aFrame->GetType() == nsGkAtoms::svgUseFrame) { + if (aFrame->GetType() == nsGkAtoms::svgForeignObjectFrame) { gfxMatrix transform = static_cast(aFrame->GetContent())-> PrependLocalTransformsTo(gfxMatrix(), eChildToUserSpace); NS_ASSERTION(!transform.HasNonTranslation(), "we're relying on this being an offset-only transform"); diff --git a/layout/tables/crashtests/crashtests.list b/layout/tables/crashtests/crashtests.list index 46f2a6efccd7..1da087db87ed 100644 --- a/layout/tables/crashtests/crashtests.list +++ b/layout/tables/crashtests/crashtests.list @@ -148,7 +148,7 @@ load 705996-2.html load 707622-1.html load 710098-1.html load 711864-1.html -asserts-if(gtkWidget&&browserIsRemote,5) asserts-if(stylo,1-3) load 759249-1.html # Bug 1195474 # bug 1324704 +asserts-if(gtkWidget&&browserIsRemote,5) asserts-if(stylo,1-6) load 759249-1.html # Bug 1195474 # bug 1324704 load 759249-2.html load 814713.html load 1027611-1.html diff --git a/layout/xul/crashtests/crashtests.list b/layout/xul/crashtests/crashtests.list index c97b811faade..8cfa36b4b40a 100644 --- a/layout/xul/crashtests/crashtests.list +++ b/layout/xul/crashtests/crashtests.list @@ -63,7 +63,7 @@ load 404192.xhtml load 407152.xul load 408904-1.xul load 412479-1.xhtml -asserts(4) asserts-if(gtkWidget&&browserIsRemote,6) asserts-if(stylo,4) load 415394-1.xhtml # Bug 163838, bug 1195474 # bug 1324651 +asserts(4) asserts-if(gtkWidget&&browserIsRemote,6) asserts-if(stylo,4-6) load 415394-1.xhtml # Bug 163838, bug 1195474 # bug 1324651 load 417509.xul load 420424-1.xul load 430356-1.xhtml diff --git a/media/webrtc/signaling/src/media-conduit/CodecConfig.h b/media/webrtc/signaling/src/media-conduit/CodecConfig.h index 308c97948166..3e87734230b6 100755 --- a/media/webrtc/signaling/src/media-conduit/CodecConfig.h +++ b/media/webrtc/signaling/src/media-conduit/CodecConfig.h @@ -94,6 +94,10 @@ public: struct SimulcastEncoding { std::string rid; EncodingConstraints constraints; + bool operator==(const SimulcastEncoding& aOther) const { + return rid == aOther.rid && + constraints == aOther.constraints; + } }; std::vector mSimulcastEncodings; std::string mSpropParameterSets; @@ -103,6 +107,27 @@ public: uint8_t mPacketizationMode; // TODO: add external negotiated SPS/PPS + bool operator==(const VideoCodecConfig& aRhs) const { + if (mType != aRhs.mType || + mName != aRhs.mName || + mAckFbTypes != aRhs.mAckFbTypes || + mNackFbTypes != aRhs.mNackFbTypes || + mCcmFbTypes != aRhs.mCcmFbTypes || + mRembFbSet != aRhs.mRembFbSet || + mFECFbSet != aRhs.mFECFbSet || + !(mEncodingConstraints == aRhs.mEncodingConstraints) || + !(mSimulcastEncodings == aRhs.mSimulcastEncodings) || + mSpropParameterSets != aRhs.mSpropParameterSets || + mProfile != aRhs.mProfile || + mConstraints != aRhs.mConstraints || + mLevel != aRhs.mLevel || + mPacketizationMode != aRhs.mPacketizationMode) { + return false; + } + + return true; + } + VideoCodecConfig(int type, std::string name, const EncodingConstraints& constraints, diff --git a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp index 863aa0fd0989..bdd513fdce83 100755 --- a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp +++ b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp @@ -1005,17 +1005,12 @@ WebrtcVideoConduit::ConfigureRecvMediaCodecs( MediaConduitErrorCode condError = kMediaConduitNoError; std::string payloadName; - condError = StopReceiving(); - if (condError != kMediaConduitNoError) { - return condError; - } - if (codecConfigList.empty()) { CSFLogError(logTag, "%s Zero number of codecs to configure", __FUNCTION__); return kMediaConduitMalformedArgument; } - webrtc::KeyFrameRequestMethod kf_request_method; + webrtc::KeyFrameRequestMethod kf_request_method = webrtc::kKeyFrameReqPliRtcp; bool kf_request_enabled = false; bool use_nack_basic = false; bool use_tmmbr = false; @@ -1024,9 +1019,7 @@ WebrtcVideoConduit::ConfigureRecvMediaCodecs( int ulpfec_payload_type = kNullPayloadType; int red_payload_type = kNullPayloadType; bool configuredH264 = false; - // XXX(pkerr) - can I reuse matching decoders? - mRecvStreamConfig.decoders.clear(); - mRecvStreamConfig.rtp.rtx.clear(); + nsTArray> recv_codecs; // Try Applying the codecs in the list // we treat as success if at least one codec was applied and reception was @@ -1060,6 +1053,8 @@ WebrtcVideoConduit::ConfigureRecvMediaCodecs( // Check for the keyframe request type: PLI is preferred // over FIR, and FIR is preferred over none. + // XXX (See upstream issue https://bugs.chromium.org/p/webrtc/issues/detail?id=7002): + // There is no 'none' option in webrtc.org if (codec_config->RtcpFbNackIsSet("pli")) { kf_request_enabled = true; kf_request_method = webrtc::kKeyFrameReqPliRtcp; @@ -1068,43 +1063,72 @@ WebrtcVideoConduit::ConfigureRecvMediaCodecs( kf_request_method = webrtc::kKeyFrameReqFirRtcp; } - use_nack_basic = codec_config->RtcpFbNackIsSet(""); - use_tmmbr = codec_config->RtcpFbCcmIsSet("tmmbr"); - use_remb = codec_config->RtcpFbRembIsSet(); - use_fec = codec_config->RtcpFbFECIsSet(); + // What if codec A has Nack and REMB, and codec B has TMMBR, and codec C has none? + // In practice, that's not a useful configuration, and VideoReceiveStream::Config can't + // represent that, so simply union the (boolean) settings + use_nack_basic |= codec_config->RtcpFbNackIsSet(""); + use_tmmbr |= codec_config->RtcpFbCcmIsSet("tmmbr"); + use_remb |= codec_config->RtcpFbRembIsSet(); + use_fec |= codec_config->RtcpFbFECIsSet(); - CopyCodecToDB(codec_config); + recv_codecs.AppendElement(new VideoCodecConfig(*codec_config)); } - mRecvStreamConfig.rtp.rtcp_mode = webrtc::RtcpMode::kCompound; - mRecvStreamConfig.rtp.nack.rtp_history_ms = use_nack_basic ? 1000 : 0; - mRecvStreamConfig.rtp.remb = use_remb; - mRecvStreamConfig.rtp.tmmbr = use_tmmbr; + // Now decide if we need to recreate the receive stream, or can keep it + if (!mRecvStream || + CodecsDifferent(recv_codecs, mRecvCodecList) || + mRecvStreamConfig.rtp.nack.rtp_history_ms != (use_nack_basic ? 1000 : 0) || + mRecvStreamConfig.rtp.remb != use_remb || + mRecvStreamConfig.rtp.tmmbr != use_tmmbr || + mRecvStreamConfig.rtp.keyframe_method != kf_request_method || + (use_fec && + mRecvStreamConfig.rtp.fec.ulpfec_payload_type != ulpfec_payload_type || + mRecvStreamConfig.rtp.fec.red_payload_type != red_payload_type)) { - if (use_fec) { - mRecvStreamConfig.rtp.fec.ulpfec_payload_type = ulpfec_payload_type; - mRecvStreamConfig.rtp.fec.red_payload_type = red_payload_type; - mRecvStreamConfig.rtp.fec.red_rtx_payload_type = -1; - } - - // FIXME(jesup) - Bug 1325447 -- SSRCs configured here are a problem. - // 0 isn't allowed. Would be best to ask for a random SSRC from the RTP code. - // Would need to call rtp_sender.cc -- GenerateSSRC(), which isn't exposed. It's called on - // collision, or when we decide to send. it should be called on receiver creation. - // Here, we're generating the SSRC value - but this causes ssrc_forced in set in rtp_sender, - // which locks us into the SSRC - even a collision won't change it!!! - auto ssrc = mRecvStreamConfig.rtp.remote_ssrc; - do { - SECStatus rv = PK11_GenerateRandom(reinterpret_cast(&ssrc), sizeof(ssrc)); - if (rv != SECSuccess) { - return kMediaConduitUnknownError; + condError = StopReceiving(); + if (condError != kMediaConduitNoError) { + return condError; } - } while (ssrc == mRecvStreamConfig.rtp.remote_ssrc); - //DEBUG(pkerr) mRecvStreamConfig.rtp.local_ssrc = ssrc; - mRecvStreamConfig.rtp.local_ssrc = 1; + // If we fail after here things get ugly + mRecvStreamConfig.rtp.rtcp_mode = webrtc::RtcpMode::kCompound; + mRecvStreamConfig.rtp.nack.rtp_history_ms = use_nack_basic ? 1000 : 0; + mRecvStreamConfig.rtp.remb = use_remb; + mRecvStreamConfig.rtp.tmmbr = use_tmmbr; + mRecvStreamConfig.rtp.keyframe_method = kf_request_method; - return StartReceiving(); + if (use_fec) { + mRecvStreamConfig.rtp.fec.ulpfec_payload_type = ulpfec_payload_type; + mRecvStreamConfig.rtp.fec.red_payload_type = red_payload_type; + mRecvStreamConfig.rtp.fec.red_rtx_payload_type = -1; + } + + // FIXME(jesup) - Bug 1325447 -- SSRCs configured here are a problem. + // 0 isn't allowed. Would be best to ask for a random SSRC from the RTP code. + // Would need to call rtp_sender.cc -- GenerateSSRC(), which isn't exposed. It's called on + // collision, or when we decide to send. it should be called on receiver creation. + // Here, we're generating the SSRC value - but this causes ssrc_forced in set in rtp_sender, + // which locks us into the SSRC - even a collision won't change it!!! + auto ssrc = mRecvStreamConfig.rtp.remote_ssrc; + do { + SECStatus rv = PK11_GenerateRandom(reinterpret_cast(&ssrc), sizeof(ssrc)); + if (rv != SECSuccess) { + return kMediaConduitUnknownError; + } + } while (ssrc == mRecvStreamConfig.rtp.remote_ssrc); + + //DEBUG(pkerr) mRecvStreamConfig.rtp.local_ssrc = ssrc; + mRecvStreamConfig.rtp.local_ssrc = 1; + + // XXX Copy over those that are the same and don't rebuild them + mRecvCodecList.SwapElements(recv_codecs); + recv_codecs.Clear(); + mRecvStreamConfig.decoders.clear(); + mRecvStreamConfig.rtp.rtx.clear(); + // Rebuilds mRecvStream from mRecvStreamConfig + DeleteRecvStream(); + return StartReceiving(); + } return kMediaConduitNoError; } @@ -1870,12 +1894,27 @@ WebrtcVideoConduit::RenderFrame(const webrtc::VideoFrame& video_frame, img_handle); } -// Copy the codec passed into Conduit's database +// Compare lists of codecs bool -WebrtcVideoConduit::CopyCodecToDB(const VideoCodecConfig* codecInfo) +WebrtcVideoConduit::CodecsDifferent(const nsTArray>& a, + const nsTArray>& b) { - mRecvCodecList.AppendElement(new VideoCodecConfig(*codecInfo)); - return true; + // return a != b; + // would work if UniquePtr<> operator== compared contents! + auto len = a.Length(); + if (len != b.Length()) { + return true; + } + + // XXX std::equal would work, if we could use it on this - fails for the + // same reason as above. c++14 would let us pass a comparator function. + for (uint32_t i = 0; i < len; ++i) { + if (!(*a[i] == *b[i])) { + return true; + } + } + + return false; } /** diff --git a/media/webrtc/signaling/src/media-conduit/VideoConduit.h b/media/webrtc/signaling/src/media-conduit/VideoConduit.h index 067cf844efc3..7d3fbbde004b 100755 --- a/media/webrtc/signaling/src/media-conduit/VideoConduit.h +++ b/media/webrtc/signaling/src/media-conduit/VideoConduit.h @@ -417,7 +417,8 @@ private: //Utility function to dump recv codec database void DumpCodecDB() const; - bool CopyCodecToDB(const VideoCodecConfig* codecInfo); + bool CodecsDifferent(const nsTArray>& a, + const nsTArray>& b); // Video Latency Test averaging filter void VideoLatencyUpdate(uint64_t new_sample); diff --git a/media/webrtc/trunk/webrtc/video/video_receive_stream.cc b/media/webrtc/trunk/webrtc/video/video_receive_stream.cc index 29af87058091..03a4acf9e036 100644 --- a/media/webrtc/trunk/webrtc/video/video_receive_stream.cc +++ b/media/webrtc/trunk/webrtc/video/video_receive_stream.cc @@ -247,6 +247,8 @@ VideoReceiveStream::VideoReceiveStream( vie_channel_->EnableTMMBR(config.rtp.tmmbr); + vie_channel_->rtp_rtcp()->SetKeyFrameRequestMethod(config.rtp.keyframe_method); + if (config.rtp.rtcp_xr.receiver_reference_time_report) vie_channel_->SetRtcpXrRrtrStatus(true); diff --git a/media/webrtc/trunk/webrtc/video_receive_stream.h b/media/webrtc/trunk/webrtc/video_receive_stream.h index 0f9197fc3500..29cc6e4ca1e4 100644 --- a/media/webrtc/trunk/webrtc/video_receive_stream.h +++ b/media/webrtc/trunk/webrtc/video_receive_stream.h @@ -22,6 +22,7 @@ #include "webrtc/transport.h" #include "webrtc/video_renderer.h" #include "webrtc/voice_engine/include/voe_base.h" +#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" namespace webrtc { @@ -111,6 +112,9 @@ class VideoReceiveStream : public ReceiveStream { // See draft-holmer-rmcat-transport-wide-cc-extensions for details. bool transport_cc = false; + // TODO(jesup) - there should be a kKeyFrameReqNone + KeyFrameRequestMethod keyframe_method = kKeyFrameReqPliRtcp; + // See NackConfig for description. NackConfig nack; diff --git a/mfbt/Assertions.h b/mfbt/Assertions.h index ae873c42ae7c..04485f249a2e 100644 --- a/mfbt/Assertions.h +++ b/mfbt/Assertions.h @@ -23,7 +23,6 @@ #include "nsTraceRefcnt.h" #endif -#if defined(MOZ_HAS_MOZGLUE) || defined(MOZILLA_INTERNAL_API) /* * The crash reason set by MOZ_CRASH_ANNOTATE is consumed by the crash reporter * if present. It is declared here (and defined in Assertions.cpp) to make it @@ -34,6 +33,7 @@ MOZ_BEGIN_EXTERN_C extern MFBT_DATA const char* gMozCrashReason; MOZ_END_EXTERN_C +#if !defined(DEBUG) && (defined(MOZ_HAS_MOZGLUE) || defined(MOZILLA_INTERNAL_API)) static inline void AnnotateMozCrashReason(const char* reason) { @@ -47,22 +47,18 @@ AnnotateMozCrashReason(const char* reason) #include #include #include -#ifdef WIN32 +#ifdef _MSC_VER /* * TerminateProcess and GetCurrentProcess are defined in , which * further depends on . We hardcode these few definitions manually * because those headers clutter the global namespace with a significant * number of undesired macros and symbols. */ -# ifdef __cplusplus -extern "C" { -# endif +MOZ_BEGIN_EXTERN_C __declspec(dllimport) int __stdcall TerminateProcess(void* hProcess, unsigned int uExitCode); __declspec(dllimport) void* __stdcall GetCurrentProcess(void); -# ifdef __cplusplus -} -# endif +MOZ_END_EXTERN_C #else # include #endif @@ -142,9 +138,7 @@ __declspec(dllimport) void* __stdcall GetCurrentProcess(void); #define MOZ_STATIC_ASSERT_IF(cond, expr, reason) static_assert(!(cond) || (expr), reason) #endif -#ifdef __cplusplus -extern "C" { -#endif +MOZ_BEGIN_EXTERN_C /* * Prints |aStr| as an assertion failure (using aFilename and aLine as the @@ -154,7 +148,7 @@ extern "C" { * method is primarily for internal use in this header, and only secondarily * for use in implementing release-build assertions. */ -static MOZ_COLD MOZ_ALWAYS_INLINE void +MOZ_MAYBE_UNUSED static MOZ_COLD MOZ_NEVER_INLINE void MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine) MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS { @@ -171,7 +165,7 @@ MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine) #endif } -static MOZ_COLD MOZ_ALWAYS_INLINE void +MOZ_MAYBE_UNUSED static MOZ_COLD MOZ_NEVER_INLINE void MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS { @@ -198,6 +192,9 @@ MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) * Breakpad without requiring system library symbols on all stack-processing * machines, as a nested breakpoint would require. * + * We use __LINE__ to prevent the compiler from folding multiple crash sites + * together, which would make crash reports hard to understand. + * * We use TerminateProcess with the exit code aborting would generate * because we don't want to invoke atexit handlers, destructors, library * unload handlers, and so on when our process might be in a compromised @@ -206,34 +203,22 @@ MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) * We don't use abort() because it'd cause Windows to annoyingly pop up the * process error dialog multiple times. See bug 345118 and bug 426163. * - * We follow TerminateProcess() with a call to MOZ_NoReturn() so that the - * compiler doesn't hassle us to provide a return statement after a - * MOZ_REALLY_CRASH() call. - * * (Technically these are Windows requirements, not MSVC requirements. But * practically you need MSVC for debugging, and we only ship builds created * by MSVC, so doing it this way reduces complexity.) */ -__declspec(noreturn) __inline void MOZ_NoReturn() {} +static MOZ_COLD MOZ_NORETURN MOZ_NEVER_INLINE void MOZ_NoReturn(int aLine) +{ + *((volatile int*) NULL) = aLine; + TerminateProcess(GetCurrentProcess(), 3); +} -# ifdef __cplusplus -# define MOZ_REALLY_CRASH() \ - do { \ - ::__debugbreak(); \ - *((volatile int*) NULL) = __LINE__; \ - ::TerminateProcess(::GetCurrentProcess(), 3); \ - ::MOZ_NoReturn(); \ - } while (0) -# else -# define MOZ_REALLY_CRASH() \ - do { \ - __debugbreak(); \ - *((volatile int*) NULL) = __LINE__; \ - TerminateProcess(GetCurrentProcess(), 3); \ - MOZ_NoReturn(); \ - } while (0) -# endif +# define MOZ_REALLY_CRASH() \ + do { \ + __debugbreak(); \ + MOZ_NoReturn(__LINE__); \ + } while (0) #else # ifdef __cplusplus # define MOZ_REALLY_CRASH() \ @@ -286,9 +271,7 @@ __declspec(noreturn) __inline void MOZ_NoReturn() {} } while (0) #endif -#ifdef __cplusplus -} /* extern "C" */ -#endif +MOZ_END_EXTERN_C /* * MOZ_ASSERT(expr [, explanation-string]) asserts that |expr| must be truthy in @@ -370,12 +353,18 @@ struct AssertionConditionType # define MOZ_VALIDATE_ASSERT_CONDITION_TYPE(x) #endif +#if defined(DEBUG) || defined(MOZ_ASAN) +# define MOZ_REPORT_ASSERTION_FAILURE(...) MOZ_ReportAssertionFailure(__VA_ARGS__) +#else +# define MOZ_REPORT_ASSERTION_FAILURE(...) do { /* nothing */ } while (0) +#endif + /* First the single-argument form. */ #define MOZ_ASSERT_HELPER1(expr) \ do { \ MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \ if (MOZ_UNLIKELY(!MOZ_CHECK_ASSERT_ASSIGNMENT(expr))) { \ - MOZ_ReportAssertionFailure(#expr, __FILE__, __LINE__); \ + MOZ_REPORT_ASSERTION_FAILURE(#expr, __FILE__, __LINE__); \ MOZ_CRASH_ANNOTATE("MOZ_RELEASE_ASSERT(" #expr ")"); \ MOZ_REALLY_CRASH(); \ } \ @@ -385,7 +374,7 @@ struct AssertionConditionType do { \ MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \ if (MOZ_UNLIKELY(!MOZ_CHECK_ASSERT_ASSIGNMENT(expr))) { \ - MOZ_ReportAssertionFailure(#expr " (" explain ")", __FILE__, __LINE__); \ + MOZ_REPORT_ASSERTION_FAILURE(#expr " (" explain ")", __FILE__, __LINE__); \ MOZ_CRASH_ANNOTATE("MOZ_RELEASE_ASSERT(" #expr ") (" explain ")"); \ MOZ_REALLY_CRASH(); \ } \ diff --git a/mfbt/Attributes.h b/mfbt/Attributes.h index 50f26da00dfa..b7fd72413ca7 100644 --- a/mfbt/Attributes.h +++ b/mfbt/Attributes.h @@ -274,6 +274,27 @@ # define MOZ_MUST_USE #endif +/** + * MOZ_MAYBE_UNUSED suppresses compiler warnings about functions that are + * never called (in this build configuration, at least). + * + * Place this attribute at the very beginning of a function declaration. For + * example, write + * + * MOZ_MAYBE_UNUSED int foo(); + * + * or + * + * MOZ_MAYBE_UNUSED int foo() { return 42; } + */ +#if defined(__GNUC__) || defined(__clang__) +# define MOZ_MAYBE_UNUSED __attribute__ ((__unused__)) +#elif defined(_MSC_VER) +# define MOZ_MAYBE_UNUSED __pragma(warning(suppress:4505)) +#else +# define MOZ_MAYBE_UNUSED +#endif + /** * MOZ_FALLTHROUGH is an annotation to suppress compiler warnings about switch * cases that fall through without a break or return statement. MOZ_FALLTHROUGH diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java index 335721108f8b..133bf3b18c2e 100644 --- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java @@ -37,6 +37,7 @@ import org.mozilla.gecko.distribution.PartnerBrowserCustomizationsClient; import org.mozilla.gecko.dlc.DownloadContentService; import org.mozilla.gecko.icons.IconsHelper; import org.mozilla.gecko.icons.decoders.IconDirectoryEntry; +import org.mozilla.gecko.icons.decoders.FaviconDecoder; import org.mozilla.gecko.feeds.ContentNotificationsDelegate; import org.mozilla.gecko.feeds.FeedService; import org.mozilla.gecko.firstrun.FirstrunAnimationContainer; @@ -752,6 +753,7 @@ public class BrowserApp extends GeckoApp "Sanitize:ClearSyncedTabs", "Telemetry:Gather", "Download:AndroidDownloadManager", + "Website:AppInstalled", "Website:Metadata", null); @@ -1376,7 +1378,6 @@ public class BrowserApp extends GeckoApp @Override public void run() { GeckoAppShell.createShortcut(title, url); - } }); @@ -1465,6 +1466,7 @@ public class BrowserApp extends GeckoApp "Sanitize:ClearSyncedTabs", "Telemetry:Gather", "Download:AndroidDownloadManager", + "Website:AppInstalled", "Website:Metadata", null); @@ -1968,6 +1970,15 @@ public class BrowserApp extends GeckoApp ContextUtils.isPackageInstalled(getContext(), "org.torproject.android") ? 1 : 0); break; + case "Website:AppInstalled": + final String name = message.getString("name"); + final String startUrl = message.getString("start_url"); + final Bitmap icon = FaviconDecoder + .decodeDataURI(getContext(), message.getString("icon")) + .getBestBitmap(GeckoAppShell.getPreferredIconSize()); + createShortcut(name, startUrl, icon); + break; + case "Updater:Launch": /** * Launch UI that lets the user update Firefox. diff --git a/mobile/android/base/java/org/mozilla/gecko/FormAssistPopup.java b/mobile/android/base/java/org/mozilla/gecko/FormAssistPopup.java index dacadb24fd71..be7db0772577 100644 --- a/mobile/android/base/java/org/mozilla/gecko/FormAssistPopup.java +++ b/mobile/android/base/java/org/mozilla/gecko/FormAssistPopup.java @@ -8,15 +8,13 @@ package org.mozilla.gecko; import org.mozilla.gecko.animation.ViewHelper; import org.mozilla.gecko.gfx.FloatSize; import org.mozilla.gecko.gfx.ImmutableViewportMetrics; -import org.mozilla.gecko.util.GeckoEventListener; +import org.mozilla.gecko.util.BundleEventListener; +import org.mozilla.gecko.util.EventCallback; +import org.mozilla.gecko.util.GeckoBundle; import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.gecko.widget.SwipeDismissListViewTouchListener; import org.mozilla.gecko.widget.SwipeDismissListViewTouchListener.OnDismissCallback; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - import android.content.Context; import android.content.res.Resources; import android.graphics.PointF; @@ -41,7 +39,7 @@ import android.widget.TextView; import java.util.Arrays; import java.util.Collection; -public class FormAssistPopup extends RelativeLayout implements GeckoEventListener { +public class FormAssistPopup extends RelativeLayout implements BundleEventListener { private final Context mContext; private final Animation mAnimation; @@ -96,8 +94,8 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene public void onAttachedToWindow() { super.onAttachedToWindow(); - GeckoApp.getEventDispatcher().registerGeckoThreadListener(this, - "FormAssist:AutoComplete", + GeckoApp.getEventDispatcher().registerUiThreadListener(this, + "FormAssist:AutoCompleteResult", "FormAssist:ValidationMessage", "FormAssist:Hide"); } @@ -107,62 +105,34 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene @Override public void onDetachedFromWindow() { - GeckoApp.getEventDispatcher().unregisterGeckoThreadListener(this, - "FormAssist:AutoComplete", + GeckoApp.getEventDispatcher().unregisterUiThreadListener(this, + "FormAssist:AutoCompleteResult", "FormAssist:ValidationMessage", "FormAssist:Hide"); super.onDetachedFromWindow(); } - @Override - public void handleMessage(String event, JSONObject message) { - try { - if (event.equals("FormAssist:AutoComplete")) { - handleAutoCompleteMessage(message); - } else if (event.equals("FormAssist:ValidationMessage")) { - handleValidationMessage(message); - } else if (event.equals("FormAssist:Hide")) { - handleHideMessage(message); - } - } catch (Exception e) { - Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); + @Override // BundleEventListener + public void handleMessage(final String event, final GeckoBundle message, + final EventCallback callback) { + if ("FormAssist:AutoCompleteResult".equals(event)) { + showAutoCompleteSuggestions(message.getBundleArray("suggestions"), + message.getBundle("rect"), + message.getBoolean("isEmpty")); + + } else if ("FormAssist:ValidationMessage".equals(event)) { + showValidationMessage(message.getString("validationMessage"), + message.getBundle("rect")); + + } else if ("FormAssist:Hide".equals(event)) { + hide(); } } - private void handleAutoCompleteMessage(JSONObject message) throws JSONException { - final JSONArray suggestions = message.getJSONArray("suggestions"); - final JSONObject rect = message.getJSONObject("rect"); - final boolean isEmpty = message.getBoolean("isEmpty"); - ThreadUtils.postToUiThread(new Runnable() { - @Override - public void run() { - showAutoCompleteSuggestions(suggestions, rect, isEmpty); - } - }); - } - - private void handleValidationMessage(JSONObject message) throws JSONException { - final String validationMessage = message.getString("validationMessage"); - final JSONObject rect = message.getJSONObject("rect"); - ThreadUtils.postToUiThread(new Runnable() { - @Override - public void run() { - showValidationMessage(validationMessage, rect); - } - }); - } - - private void handleHideMessage(JSONObject message) { - ThreadUtils.postToUiThread(new Runnable() { - @Override - public void run() { - hide(); - } - }); - } - - private void showAutoCompleteSuggestions(JSONArray suggestions, JSONObject rect, boolean isEmpty) { + private void showAutoCompleteSuggestions(final GeckoBundle[] suggestions, + final GeckoBundle rect, + final boolean isEmpty) { final String inputMethod = InputMethods.getCurrentInputMethod(mContext); if (!isEmpty && sInputMethodBlocklist.contains(inputMethod)) { // Don't display the form auto-complete popup after the user starts typing @@ -180,9 +150,10 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene public void onItemClick(AdapterView parentView, View view, int position, long id) { // Use the value stored with the autocomplete view, not the label text, // since they can be different. - TextView textView = (TextView) view; - String value = (String) textView.getTag(); - broadcastGeckoEvent("FormAssist:AutoComplete", value); + final TextView textView = (TextView) view; + final GeckoBundle message = new GeckoBundle(1); + message.putString("value", (String) textView.getTag()); + GeckoApp.getEventDispatcher().dispatch("FormAssist:AutoComplete", message); hide(); } }); @@ -199,7 +170,9 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene Pair item = adapter.getItem(position); // Remove the item from form history. - broadcastGeckoEvent("FormAssist:Remove", item.second); + final GeckoBundle message = new GeckoBundle(1); + message.putString("value", item.second); + GeckoApp.getEventDispatcher().dispatch("FormAssist:Remove", message); // Update the list adapter.remove(item); @@ -228,7 +201,8 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene } } - private void showValidationMessage(String validationMessage, JSONObject rect) { + private void showValidationMessage(final String validationMessage, + final GeckoBundle rect) { if (mValidationMessage == null) { LayoutInflater inflater = LayoutInflater.from(mContext); mValidationMessage = (RelativeLayout) inflater.inflate(R.layout.validation_message, null); @@ -258,18 +232,12 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene } } - private boolean setGeckoPositionData(JSONObject rect, boolean isAutoComplete) { - try { - mX = rect.getDouble("x"); - mY = rect.getDouble("y"); - mW = rect.getDouble("w"); - mH = rect.getDouble("h"); - } catch (JSONException e) { - // Bail if we can't get the correct dimensions for the popup. - Log.e(LOGTAG, "Error getting FormAssistPopup dimensions", e); - return false; - } - + private boolean setGeckoPositionData(final GeckoBundle rect, + final boolean isAutoComplete) { + mX = rect.getDouble("x"); + mY = rect.getDouble("y"); + mW = rect.getDouble("w"); + mH = rect.getDouble("h"); mPopupType = (isAutoComplete ? PopupType.AUTOCOMPLETE : PopupType.VALIDATIONMESSAGE); return true; @@ -394,7 +362,7 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene public void hide() { if (isShown()) { setVisibility(GONE); - broadcastGeckoEvent("FormAssist:Hidden", null); + GeckoApp.getEventDispatcher().dispatch("FormAssist:Hidden", null); } } @@ -419,10 +387,6 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene }); } - private static void broadcastGeckoEvent(String eventName, String eventData) { - GeckoAppShell.notifyObservers(eventName, eventData); - } - private class AutoCompleteListAdapter extends ArrayAdapter> { private final LayoutInflater mInflater; private final int mTextViewResourceId; @@ -436,16 +400,12 @@ public class FormAssistPopup extends RelativeLayout implements GeckoEventListene // This method takes an array of autocomplete suggestions with label/value properties // and adds label/value Pair objects to the array that backs the adapter. - public void populateSuggestionsList(JSONArray suggestions) { - try { - for (int i = 0; i < suggestions.length(); i++) { - JSONObject suggestion = suggestions.getJSONObject(i); - String label = suggestion.getString("label"); - String value = suggestion.getString("value"); - add(new Pair(label, value)); - } - } catch (JSONException e) { - Log.e(LOGTAG, "JSONException", e); + public void populateSuggestionsList(final GeckoBundle[] suggestions) { + for (int i = 0; i < suggestions.length; i++) { + final GeckoBundle suggestion = suggestions[i]; + final String label = suggestion.getString("label"); + final String value = suggestion.getString("value"); + add(new Pair(label, value)); } } diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java index 09315129b4dc..2f173f6685c5 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -1947,6 +1947,18 @@ public abstract class GeckoApp @Override public void createShortcut(final String title, final String url) { + + final Tab selectedTab = Tabs.getInstance().getSelectedTab(); + + if (selectedTab.hasManifest()) { + // If a page has associated manifest, lets install it + final GeckoBundle message = new GeckoBundle(); + message.putInt("iconSize", GeckoAppShell.getPreferredIconSize()); + EventDispatcher.getInstance().dispatch("Browser:LoadManifest", message); + return; + } + + // Otherwise we try to pick best icon from favicons etc Icons.with(this) .pageUrl(url) .skipNetwork() @@ -1956,12 +1968,12 @@ public abstract class GeckoApp .execute(new IconCallback() { @Override public void onIconResponse(IconResponse response) { - doCreateShortcut(title, url, response.getBitmap()); + createShortcut(title, url, response.getBitmap()); } }); } - private void doCreateShortcut(final String aTitle, final String aURI, final Bitmap aIcon) { + public void createShortcut(final String aTitle, final String aURI, final Bitmap aIcon) { // The intent to be launched by the shortcut. Intent shortcutIntent = new Intent(); shortcutIntent.setAction(GeckoApp.ACTION_HOMESCREEN_SHORTCUT); diff --git a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java index 6deb7a4c5b49..bfb80e0b6c0a 100644 --- a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java +++ b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java @@ -5,7 +5,9 @@ package org.mozilla.gecko; -import org.json.JSONObject; +import org.mozilla.gecko.util.GeckoBundle; + +import java.util.Locale; import android.text.TextUtils; @@ -27,101 +29,26 @@ public class SiteIdentity { // The order of the items here relate to image levels in // site_security_level.xml public enum SecurityMode { - UNKNOWN("unknown"), - IDENTIFIED("identified"), - VERIFIED("verified"), - CHROMEUI("chromeUI"); - - private final String mId; - - private SecurityMode(String id) { - mId = id; - } - - public static SecurityMode fromString(String id) { - if (id == null) { - throw new IllegalArgumentException("Can't convert null String to SiteIdentity"); - } - - for (SecurityMode mode : SecurityMode.values()) { - if (TextUtils.equals(mode.mId, id)) { - return mode; - } - } - - throw new IllegalArgumentException("Could not convert String id to SiteIdentity"); - } - - @Override - public String toString() { - return mId; - } + UNKNOWN, + IDENTIFIED, + VERIFIED, + CHROMEUI } // The order of the items here relate to image levels in // site_security_level.xml public enum MixedMode { - UNKNOWN("unknown"), - MIXED_CONTENT_BLOCKED("blocked"), - MIXED_CONTENT_LOADED("loaded"); - - private final String mId; - - private MixedMode(String id) { - mId = id; - } - - public static MixedMode fromString(String id) { - if (id == null) { - throw new IllegalArgumentException("Can't convert null String to MixedMode"); - } - - for (MixedMode mode : MixedMode.values()) { - if (TextUtils.equals(mode.mId, id.toLowerCase())) { - return mode; - } - } - - throw new IllegalArgumentException("Could not convert String id to MixedMode"); - } - - @Override - public String toString() { - return mId; - } + UNKNOWN, + BLOCKED, + LOADED } // The order of the items here relate to image levels in // site_security_level.xml public enum TrackingMode { - UNKNOWN("unknown"), - TRACKING_CONTENT_BLOCKED("tracking_content_blocked"), - TRACKING_CONTENT_LOADED("tracking_content_loaded"); - - private final String mId; - - private TrackingMode(String id) { - mId = id; - } - - public static TrackingMode fromString(String id) { - if (id == null) { - throw new IllegalArgumentException("Can't convert null String to TrackingMode"); - } - - for (TrackingMode mode : TrackingMode.values()) { - if (TextUtils.equals(mode.mId, id.toLowerCase())) { - return mode; - } - } - - throw new IllegalArgumentException("Could not convert String id to TrackingMode"); - } - - @Override - public String toString() { - return mId; - } + UNKNOWN, + TRACKING_CONTENT_BLOCKED, + TRACKING_CONTENT_LOADED } public SiteIdentity() { @@ -145,59 +72,50 @@ public class SiteIdentity { mMixedModeActive = MixedMode.UNKNOWN; mMixedModeDisplay = MixedMode.UNKNOWN; mTrackingMode = TrackingMode.UNKNOWN; - mSecurityException = false; } - void update(JSONObject identityData) { - if (identityData == null) { + private > T getEnumValue(Class enumType, String value, T def) { + if (value == null) { + return def; + } + try { + return Enum.valueOf(enumType, value.toUpperCase(Locale.US)); + } catch (final IllegalArgumentException e) { + return def; + } + } + + /* package */ void update(final GeckoBundle identityData) { + if (identityData == null || !identityData.containsKey("mode")) { reset(); return; } - try { - JSONObject mode = identityData.getJSONObject("mode"); + final GeckoBundle mode = identityData.getBundle("mode"); - try { - mMixedModeDisplay = MixedMode.fromString(mode.getString("mixed_display")); - } catch (Exception e) { - mMixedModeDisplay = MixedMode.UNKNOWN; - } + mMixedModeDisplay = getEnumValue( + MixedMode.class, mode.getString("mixed_display"), MixedMode.UNKNOWN); + mMixedModeActive = getEnumValue( + MixedMode.class, mode.getString("mixed_active"), MixedMode.UNKNOWN); + mTrackingMode = getEnumValue( + TrackingMode.class, mode.getString("tracking"), TrackingMode.UNKNOWN); - try { - mMixedModeActive = MixedMode.fromString(mode.getString("mixed_active")); - } catch (Exception e) { - mMixedModeActive = MixedMode.UNKNOWN; - } - - try { - mTrackingMode = TrackingMode.fromString(mode.getString("tracking")); - } catch (Exception e) { - mTrackingMode = TrackingMode.UNKNOWN; - } - - try { - mSecurityMode = SecurityMode.fromString(mode.getString("identity")); - } catch (Exception e) { - resetIdentity(); - return; - } - - try { - mOrigin = identityData.getString("origin"); - mHost = identityData.optString("host", null); - mOwner = identityData.optString("owner", null); - mSupplemental = identityData.optString("supplemental", null); - mCountry = identityData.optString("country", null); - mVerifier = identityData.optString("verifier", null); - mSecure = identityData.optBoolean("secure", false); - mSecurityException = identityData.optBoolean("securityException", false); - - } catch (Exception e) { - resetIdentity(); - } - } catch (Exception e) { - reset(); + if (!mode.containsKey("identity") || !identityData.containsKey("origin")) { + resetIdentity(); + return; } + + mSecurityMode = getEnumValue( + SecurityMode.class, mode.getString("identity"), SecurityMode.UNKNOWN); + + mOrigin = identityData.getString("origin"); + mHost = identityData.getString("host"); + mOwner = identityData.getString("owner"); + mSupplemental = identityData.getString("supplemental"); + mCountry = identityData.getString("country"); + mVerifier = identityData.getString("verifier"); + mSecure = identityData.getBoolean("secure"); + mSecurityException = identityData.getBoolean("securityException"); } public SecurityMode getSecurityMode() { diff --git a/mobile/android/base/java/org/mozilla/gecko/Tab.java b/mobile/android/base/java/org/mozilla/gecko/Tab.java index 069c911f0769..1b62e6ae1e1c 100644 --- a/mobile/android/base/java/org/mozilla/gecko/Tab.java +++ b/mobile/android/base/java/org/mozilla/gecko/Tab.java @@ -13,7 +13,6 @@ import java.util.concurrent.Future; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.annotation.RobocopTarget; import org.mozilla.gecko.db.BrowserDB; @@ -27,6 +26,7 @@ import org.mozilla.gecko.icons.Icons; import org.mozilla.gecko.reader.ReaderModeUtils; import org.mozilla.gecko.reader.ReadingListHelper; import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState; +import org.mozilla.gecko.util.GeckoBundle; import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.gecko.widget.SiteLogins; @@ -60,6 +60,7 @@ public class Tab { private Future mRunningIconRequest; private boolean mHasFeeds; + private boolean mHasManifest; private boolean mHasOpenSearch; private final SiteIdentity mSiteIdentity; private SiteLogins mSiteLogins; @@ -300,6 +301,10 @@ public class Tab { return mHasFeeds; } + public boolean hasManifest() { + return mHasManifest; + } + public boolean hasOpenSearch() { return mHasOpenSearch; } @@ -477,6 +482,10 @@ public class Tab { mHasFeeds = hasFeeds; } + public void setHasManifest(boolean hasManifest) { + mHasManifest = hasManifest; + } + public void setHasOpenSearch(boolean hasOpenSearch) { mHasOpenSearch = hasOpenSearch; } @@ -485,7 +494,7 @@ public class Tab { mLoadedFromCache = loadedFromCache; } - public void updateIdentityData(JSONObject identityData) { + public void updateIdentityData(final GeckoBundle identityData) { mSiteIdentity.update(identityData); } @@ -593,7 +602,7 @@ public class Tab { return true; } - void handleLocationChange(JSONObject message) throws JSONException { + void handleLocationChange(final GeckoBundle message) { final String uri = message.getString("uri"); final String oldUrl = getURL(); final boolean sameDocument = message.getBoolean("sameDocument"); @@ -635,9 +644,10 @@ public class Tab { setContentType(message.getString("contentType")); updateUserRequested(message.getString("userRequested")); - mBaseDomain = message.optString("baseDomain"); + mBaseDomain = message.getString("baseDomain"); setHasFeeds(false); + setHasManifest(false); setHasOpenSearch(false); mSiteIdentity.reset(); setSiteLogins(null); diff --git a/mobile/android/base/java/org/mozilla/gecko/Tabs.java b/mobile/android/base/java/org/mozilla/gecko/Tabs.java index cdd50e66f965..6570ae030154 100644 --- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java +++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java @@ -26,7 +26,6 @@ import org.mozilla.gecko.reader.ReaderModeUtils; import org.mozilla.gecko.util.BundleEventListener; import org.mozilla.gecko.util.EventCallback; import org.mozilla.gecko.util.GeckoBundle; -import org.mozilla.gecko.util.GeckoEventListener; import org.mozilla.gecko.util.ThreadUtils; import android.accounts.Account; @@ -43,7 +42,7 @@ import android.provider.Browser; import android.support.v4.content.ContextCompat; import android.util.Log; -public class Tabs implements BundleEventListener, GeckoEventListener { +public class Tabs implements BundleEventListener { private static final String LOGTAG = "GeckoTabs"; // mOrder and mTabs are always of the same cardinality, and contain the same values. @@ -108,33 +107,28 @@ public class Tabs implements BundleEventListener, GeckoEventListener { private Tabs() { EventDispatcher.getInstance().registerUiThreadListener(this, - "Tab:Added", - null); - - EventDispatcher.getInstance().registerGeckoThreadListener((GeckoEventListener) this, - "Tab:Close", - "Tab:Select", - "Tab:SelectAndForeground", "Content:LocationChange", "Content:SecurityChange", "Content:StateChange", "Content:LoadError", "Content:PageShow", - "DOMTitleChanged", - "Link:Favicon", - "Link:Touchicon", - "Link:Feed", - "Link:OpenSearch", + "Content:DOMTitleChanged", "DesktopMode:Changed", - "Tab:StreamStart", - "Tab:StreamStop", + "Link:Favicon", + "Link:Feed", + "Link:Manifest", + "Link:OpenSearch", + "Link:Touchicon", + "Tab:Added", "Tab:AudioPlayingChange", + "Tab:Close", "Tab:MediaPlaybackChange", + "Tab:RecordingChange", + "Tab:Select", "Tab:SetParentId", null); mPrivateClearColor = Color.RED; - } public synchronized void attachToContext(Context context, LayerView layerView) { @@ -289,7 +283,9 @@ public class Tabs implements BundleEventListener, GeckoEventListener { } // Pass a message to Gecko to update tab state in BrowserApp. - GeckoAppShell.notifyObservers("Tab:Selected", String.valueOf(tab.getId())); + final GeckoBundle data = new GeckoBundle(1); + data.putInt("id", tab.getId()); + EventDispatcher.getInstance().dispatch("Tab:Selected", data); return tab; } @@ -409,16 +405,11 @@ public class Tabs implements BundleEventListener, GeckoEventListener { tab.onDestroy(); - final JSONObject args = new JSONObject(); - try { - args.put("tabId", String.valueOf(tabId)); - args.put("showUndoToast", showUndoToast); - } catch (JSONException e) { - Log.e(LOGTAG, "Error building Tab:Closed arguments: " + e); - } - // Pass a message to Gecko to update tab state in BrowserApp - GeckoAppShell.notifyObservers("Tab:Closed", args.toString()); + final GeckoBundle data = new GeckoBundle(2); + data.putInt("tabId", tabId); + data.putBoolean("showUndoToast", showUndoToast); + EventDispatcher.getInstance().dispatch("Tab:Closed", data); } /** Return the tab that will be selected by default after this one is closed */ @@ -484,11 +475,12 @@ public class Tabs implements BundleEventListener, GeckoEventListener { @Override // BundleEventListener public synchronized void handleMessage(final String event, final GeckoBundle message, final EventCallback callback) { + // All other events handled below should contain a tabID property + final int id = message.getInt("tabID", -1); + Tab tab = getTab(id); + // "Tab:Added" is a special case because tab will be null if the tab was just added if ("Tab:Added".equals(event)) { - int id = message.getInt("tabID"); - Tab tab = getTab(id); - String url = message.getString("uri"); if (message.getBoolean("cancelEditMode")) { @@ -520,100 +512,105 @@ public class Tabs implements BundleEventListener, GeckoEventListener { if (message.getBoolean("desktopMode")) tab.setDesktopMode(true); } - } - // GeckoEventListener implementation - @Override - public synchronized void handleMessage(String event, JSONObject message) { - Log.d(LOGTAG, "handleMessage: " + event); - try { - // All other events handled below should contain a tabID property - int id = message.getInt("tabID"); - Tab tab = getTab(id); + // Tab was already closed; abort + if (tab == null) { + return; + } - // Tab was already closed; abort - if (tab == null) - return; + if ("Tab:Close".equals(event)) { + closeTab(tab); - if (event.equals("Tab:Close")) { - closeTab(tab); - } else if (event.equals("Tab:Select")) { - selectTab(tab.getId()); - } else if (event.equals("Tab:SelectAndForeground")) { + } else if ("Tab:Select".equals(event)) { + if (message.getBoolean("foreground", false)) { GeckoAppShell.launchOrBringToFront(); - selectTab(tab.getId()); - } else if (event.equals("Content:LocationChange")) { - tab.handleLocationChange(message); - } else if (event.equals("Content:SecurityChange")) { - tab.updateIdentityData(message.getJSONObject("identity")); - notifyListeners(tab, TabEvents.SECURITY_CHANGE); - } else if (event.equals("Content:StateChange")) { - int state = message.getInt("state"); - if ((state & GeckoAppShell.WPL_STATE_IS_NETWORK) != 0) { - if ((state & GeckoAppShell.WPL_STATE_START) != 0) { - boolean restoring = message.getBoolean("restoring"); - tab.handleDocumentStart(restoring, message.getString("uri")); - notifyListeners(tab, Tabs.TabEvents.START); - } else if ((state & GeckoAppShell.WPL_STATE_STOP) != 0) { - tab.handleDocumentStop(message.getBoolean("success")); - notifyListeners(tab, Tabs.TabEvents.STOP); - } - } - } else if (event.equals("Content:LoadError")) { - tab.handleContentLoaded(); - notifyListeners(tab, Tabs.TabEvents.LOAD_ERROR); - } else if (event.equals("Content:PageShow")) { - tab.setLoadedFromCache(message.getBoolean("fromCache")); - tab.updateUserRequested(message.getString("userRequested")); - notifyListeners(tab, TabEvents.PAGE_SHOW); - } else if (event.equals("DOMTitleChanged")) { - tab.updateTitle(message.getString("title")); - } else if (event.equals("Link:Favicon")) { - // Add the favicon to the set of available icons for this tab. + } + selectTab(tab.getId()); - tab.addFavicon(message.getString("href"), message.getInt("size"), message.getString("mime")); + } else if ("Content:LocationChange".equals(event)) { + tab.handleLocationChange(message); - // Load the favicon. If the tab is still loading, we actually do the load once the - // page has loaded, in an attempt to prevent the favicon load from having a - // detrimental effect on page load time. - if (tab.getState() != Tab.STATE_LOADING) { - tab.loadFavicon(); - } - } else if (event.equals("Link:Touchicon")) { - tab.addTouchicon(message.getString("href"), message.getInt("size"), message.getString("mime")); - } else if (event.equals("Link:Feed")) { - tab.setHasFeeds(true); - notifyListeners(tab, TabEvents.LINK_FEED); - } else if (event.equals("Link:OpenSearch")) { - boolean visible = message.getBoolean("visible"); - tab.setHasOpenSearch(visible); - } else if (event.equals("DesktopMode:Changed")) { - tab.setDesktopMode(message.getBoolean("desktopMode")); - notifyListeners(tab, TabEvents.DESKTOP_MODE_CHANGE); - } else if (event.equals("Tab:StreamStart")) { - tab.setRecording(true); - notifyListeners(tab, TabEvents.RECORDING_CHANGE); - } else if (event.equals("Tab:StreamStop")) { - tab.setRecording(false); - notifyListeners(tab, TabEvents.RECORDING_CHANGE); - } else if (event.equals("Tab:AudioPlayingChange")) { - tab.setIsAudioPlaying(message.getBoolean("isAudioPlaying")); - notifyListeners(tab, TabEvents.AUDIO_PLAYING_CHANGE); - } else if (event.equals("Tab:MediaPlaybackChange")) { - final String status = message.getString("status"); - if (status.equals("resume")) { - notifyListeners(tab, TabEvents.MEDIA_PLAYING_RESUME); - } else { - tab.setIsMediaPlaying(status.equals("start")); - notifyListeners(tab, TabEvents.MEDIA_PLAYING_CHANGE); - } - } else if (event.equals("Tab:SetParentId")) { - int newParentId = message.getInt("parentID"); - tab.setParentId(newParentId); + } else if ("Content:SecurityChange".equals(event)) { + tab.updateIdentityData(message.getBundle("identity")); + notifyListeners(tab, TabEvents.SECURITY_CHANGE); + + } else if ("Content:StateChange".equals(event)) { + final int state = message.getInt("state"); + if ((state & GeckoAppShell.WPL_STATE_IS_NETWORK) == 0) { + return; + } + if ((state & GeckoAppShell.WPL_STATE_START) != 0) { + final boolean restoring = message.getBoolean("restoring"); + tab.handleDocumentStart(restoring, message.getString("uri")); + notifyListeners(tab, Tabs.TabEvents.START); + } else if ((state & GeckoAppShell.WPL_STATE_STOP) != 0) { + tab.handleDocumentStop(message.getBoolean("success")); + notifyListeners(tab, Tabs.TabEvents.STOP); } - } catch (Exception e) { - Log.w(LOGTAG, "handleMessage threw for " + event, e); + } else if ("Content:LoadError".equals(event)) { + tab.handleContentLoaded(); + notifyListeners(tab, Tabs.TabEvents.LOAD_ERROR); + + } else if ("Content:PageShow".equals(event)) { + tab.setLoadedFromCache(message.getBoolean("fromCache")); + tab.updateUserRequested(message.getString("userRequested")); + notifyListeners(tab, TabEvents.PAGE_SHOW); + + } else if ("Content:DOMTitleChanged".equals(event)) { + tab.updateTitle(message.getString("title")); + + } else if ("Link:Favicon".equals(event)) { + // Add the favicon to the set of available icons for this tab. + tab.addFavicon(message.getString("href"), + message.getInt("size"), + message.getString("mime")); + + // Load the favicon. If the tab is still loading, we actually do the load once the + // page has loaded, in an attempt to prevent the favicon load from having a + // detrimental effect on page load time. + if (tab.getState() != Tab.STATE_LOADING) { + tab.loadFavicon(); + } + + } else if ("Link:Touchicon".equals(event)) { + tab.addTouchicon(message.getString("href"), + message.getInt("size"), + message.getString("mime")); + + } else if ("Link:Feed".equals(event)) { + tab.setHasFeeds(true); + notifyListeners(tab, TabEvents.LINK_FEED); + + } else if ("Link:OpenSearch".equals(event)) { + tab.setHasOpenSearch(message.getBoolean("visible")); + + } else if ("Link:Manifest".equals(event)) { + tab.setHasManifest(true); + + } else if ("DesktopMode:Changed".equals(event)) { + tab.setDesktopMode(message.getBoolean("desktopMode")); + notifyListeners(tab, TabEvents.DESKTOP_MODE_CHANGE); + + } else if ("Tab:RecordingChange".equals(event)) { + tab.setRecording(message.getBoolean("recording")); + notifyListeners(tab, TabEvents.RECORDING_CHANGE); + + } else if ("Tab:AudioPlayingChange".equals(event)) { + tab.setIsAudioPlaying(message.getBoolean("isAudioPlaying")); + notifyListeners(tab, TabEvents.AUDIO_PLAYING_CHANGE); + + } else if ("Tab:MediaPlaybackChange".equals(event)) { + final String status = message.getString("status"); + if (status.equals("resume")) { + notifyListeners(tab, TabEvents.MEDIA_PLAYING_RESUME); + } else { + tab.setIsMediaPlaying(status.equals("start")); + notifyListeners(tab, TabEvents.MEDIA_PLAYING_CHANGE); + } + + } else if ("Tab:SetParentId".equals(event)) { + tab.setParentId(message.getInt("parentID", -1)); } } @@ -683,7 +680,7 @@ public class Tabs implements BundleEventListener, GeckoEventListener { throw new IllegalArgumentException("onTabChanged:" + msg + " must specify a tab."); } - ThreadUtils.postToUiThread(new Runnable() { + final Runnable notifier = new Runnable() { @Override public void run() { onTabChanged(tab, msg, data); @@ -697,10 +694,16 @@ public class Tabs implements BundleEventListener, GeckoEventListener { items.next().onTabChanged(tab, msg, data); } } - }); + }; + + if (ThreadUtils.isOnUiThread()) { + notifier.run(); + } else { + ThreadUtils.postToUiThread(notifier); + } } - private void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { + /* package */ void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { switch (msg) { // We want the tab record to have an accurate favicon, so queue // the persisting of tabs when it changes. @@ -878,89 +881,85 @@ public class Tabs implements BundleEventListener, GeckoEventListener { */ public Tab loadUrl(final String url, final String searchEngine, final int parentId, final SafeIntent intent, final int flags) { - JSONObject args = new JSONObject(); + final GeckoBundle data = new GeckoBundle(); Tab tabToSelect = null; boolean delayLoad = (flags & LOADURL_DELAY_LOAD) != 0; // delayLoad implies background tab boolean background = delayLoad || (flags & LOADURL_BACKGROUND) != 0; - try { - boolean isPrivate = (flags & LOADURL_PRIVATE) != 0; - boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0; - boolean desktopMode = (flags & LOADURL_DESKTOP) != 0; - boolean external = (flags & LOADURL_EXTERNAL) != 0; - final boolean isFirstShownAfterActivityUnhidden = (flags & LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN) != 0; + boolean isPrivate = (flags & LOADURL_PRIVATE) != 0; + boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0; + boolean desktopMode = (flags & LOADURL_DESKTOP) != 0; + boolean external = (flags & LOADURL_EXTERNAL) != 0; + final boolean isFirstShownAfterActivityUnhidden = (flags & LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN) != 0; - args.put("url", url); - args.put("engine", searchEngine); - args.put("parentId", parentId); - args.put("userEntered", userEntered); - args.put("isPrivate", isPrivate); - args.put("pinned", (flags & LOADURL_PINNED) != 0); - args.put("desktopMode", desktopMode); + data.putString("url", url); + data.putString("engine", searchEngine); + data.putInt("parentId", parentId); + data.putBoolean("userEntered", userEntered); + data.putBoolean("isPrivate", isPrivate); + data.putBoolean("pinned", (flags & LOADURL_PINNED) != 0); + data.putBoolean("desktopMode", desktopMode); - final boolean needsNewTab; - final String applicationId = (intent == null) ? null : - intent.getStringExtra(Browser.EXTRA_APPLICATION_ID); - if (applicationId == null) { - needsNewTab = (flags & LOADURL_NEW_TAB) != 0; + final boolean needsNewTab; + final String applicationId = (intent == null) ? null : + intent.getStringExtra(Browser.EXTRA_APPLICATION_ID); + if (applicationId == null) { + needsNewTab = (flags & LOADURL_NEW_TAB) != 0; + } else { + // If you modify this code, be careful that intent != null. + final boolean extraCreateNewTab = intent.getBooleanExtra(Browser.EXTRA_CREATE_NEW_TAB, false); + final Tab applicationTab = getTabForApplicationId(applicationId); + if (applicationTab == null || extraCreateNewTab) { + needsNewTab = true; } else { - // If you modify this code, be careful that intent != null. - final boolean extraCreateNewTab = intent.getBooleanExtra(Browser.EXTRA_CREATE_NEW_TAB, false); - final Tab applicationTab = getTabForApplicationId(applicationId); - if (applicationTab == null || extraCreateNewTab) { - needsNewTab = true; - } else { - needsNewTab = false; - delayLoad = false; - background = false; + needsNewTab = false; + delayLoad = false; + background = false; - tabToSelect = applicationTab; - final int tabToSelectId = tabToSelect.getId(); - args.put("tabID", tabToSelectId); + tabToSelect = applicationTab; + final int tabToSelectId = tabToSelect.getId(); + data.putInt("tabID", tabToSelectId); - // This must be called before the "Tab:Load" event is sent. I think addTab gets - // away with it because having "newTab" == true causes the selected tab to be - // updated in JS for the "Tab:Load" event but "newTab" is false in our case. - // This makes me think the other selectTab is not necessary (bug 1160673). - // - // Note: that makes the later call redundant but selectTab exits early so I'm - // fine not adding the complex logic to avoid calling it again. - selectTab(tabToSelect.getId()); - } + // This must be called before the "Tab:Load" event is sent. I think addTab gets + // away with it because having "newTab" == true causes the selected tab to be + // updated in JS for the "Tab:Load" event but "newTab" is false in our case. + // This makes me think the other selectTab is not necessary (bug 1160673). + // + // Note: that makes the later call redundant but selectTab exits early so I'm + // fine not adding the complex logic to avoid calling it again. + selectTab(tabToSelect.getId()); } - - args.put("newTab", needsNewTab); - args.put("delayLoad", delayLoad); - args.put("selected", !background); - - if (needsNewTab) { - int tabId = getNextTabId(); - args.put("tabID", tabId); - - // The URL is updated for the tab once Gecko responds with the - // Tab:Added message. We can preliminarily set the tab's URL as - // long as it's a valid URI. - String tabUrl = (url != null && Uri.parse(url).getScheme() != null) ? url : null; - - // Add the new tab to the end of the tab order. - final int tabIndex = -1; - - tabToSelect = addTab(tabId, tabUrl, external, parentId, url, isPrivate, tabIndex); - tabToSelect.setDesktopMode(desktopMode); - tabToSelect.setApplicationId(applicationId); - if (isFirstShownAfterActivityUnhidden) { - // We just opened Firefox so we want to show - // the toolbar but not animate it to avoid jank. - tabToSelect.setShouldShowToolbarWithoutAnimationOnFirstSelection(true); - } - } - } catch (Exception e) { - Log.w(LOGTAG, "Error building JSON arguments for loadUrl.", e); } - GeckoAppShell.notifyObservers("Tab:Load", args.toString()); + data.putBoolean("newTab", needsNewTab); + data.putBoolean("delayLoad", delayLoad); + data.putBoolean("selected", !background); + + if (needsNewTab) { + int tabId = getNextTabId(); + data.putInt("tabID", tabId); + + // The URL is updated for the tab once Gecko responds with the + // Tab:Added data. We can preliminarily set the tab's URL as + // long as it's a valid URI. + String tabUrl = (url != null && Uri.parse(url).getScheme() != null) ? url : null; + + // Add the new tab to the end of the tab order. + final int tabIndex = -1; + + tabToSelect = addTab(tabId, tabUrl, external, parentId, url, isPrivate, tabIndex); + tabToSelect.setDesktopMode(desktopMode); + tabToSelect.setApplicationId(applicationId); + if (isFirstShownAfterActivityUnhidden) { + // We just opened Firefox so we want to show + // the toolbar but not animate it to avoid jank. + tabToSelect.setShouldShowToolbarWithoutAnimationOnFirstSelection(true); + } + } + + EventDispatcher.getInstance().dispatch("Tab:Load", data); if (tabToSelect == null) { return null; diff --git a/mobile/android/base/java/org/mozilla/gecko/ZoomedView.java b/mobile/android/base/java/org/mozilla/gecko/ZoomedView.java index ee3324f07893..21e874343c4c 100644 --- a/mobile/android/base/java/org/mozilla/gecko/ZoomedView.java +++ b/mobile/android/base/java/org/mozilla/gecko/ZoomedView.java @@ -13,12 +13,11 @@ import org.mozilla.gecko.gfx.PanZoomController; import org.mozilla.gecko.gfx.PointUtils; import org.mozilla.gecko.mozglue.DirectBufferAllocator; import org.mozilla.gecko.PrefsHelper; -import org.mozilla.gecko.util.GeckoEventListener; +import org.mozilla.gecko.util.BundleEventListener; +import org.mozilla.gecko.util.EventCallback; +import org.mozilla.gecko.util.GeckoBundle; import org.mozilla.gecko.util.ThreadUtils; -import org.json.JSONException; -import org.json.JSONObject; - import android.content.Context; import android.content.res.Resources; import android.content.res.Configuration; @@ -51,7 +50,7 @@ import java.nio.ByteBuffer; import java.text.DecimalFormat; public class ZoomedView extends FrameLayout implements LayerView.DynamicToolbarListener, - LayerView.ZoomedViewListener, GeckoEventListener { + LayerView.ZoomedViewListener, BundleEventListener { private static final String LOGTAG = "Gecko" + ZoomedView.class.getSimpleName(); private static final float[] ZOOM_FACTORS_LIST = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 1.5f}; @@ -240,15 +239,28 @@ public class ZoomedView extends FrameLayout implements LayerView.DynamicToolbarL } }; touchListener = new ZoomedViewTouchListener(); - EventDispatcher.getInstance().registerGeckoThreadListener(this, - "Gesture:clusteredLinksClicked", - "Window:Resize", - "Content:LocationChange", + } + + @Override // View + public void onAttachedToWindow() { + super.onAttachedToWindow(); + + GeckoApp.getEventDispatcher().registerUiThreadListener(this, + "FormAssist:AutoCompleteResult", + "FormAssist:Hide", "Gesture:CloseZoomedView", - "Browser:ZoomToPageWidth", - "Browser:ZoomToRect", - "FormAssist:AutoComplete", - "FormAssist:Hide"); + "Gesture:ClusteredLinksClicked"); + } + + @Override // View + public void onDetachedFromWindow() { + GeckoApp.getEventDispatcher().unregisterUiThreadListener(this, + "FormAssist:AutoCompleteResult", + "FormAssist:Hide", + "Gesture:CloseZoomedView", + "Gesture:ClusteredLinksClicked"); + + super.onDetachedFromWindow(); } void destroy() { @@ -257,15 +269,6 @@ public class ZoomedView extends FrameLayout implements LayerView.DynamicToolbarL prefObserver = null; } ThreadUtils.removeCallbacksFromUiThread(requestRenderRunnable); - EventDispatcher.getInstance().unregisterGeckoThreadListener(this, - "Gesture:clusteredLinksClicked", - "Window:Resize", - "Content:LocationChange", - "Gesture:CloseZoomedView", - "Browser:ZoomToPageWidth", - "Browser:ZoomToRect", - "FormAssist:AutoComplete", - "FormAssist:Hide"); } // This method (onFinishInflate) is called only when the zoomed view class is used inside @@ -621,41 +624,29 @@ public class ZoomedView extends FrameLayout implements LayerView.DynamicToolbarL changeZoomFactorButton.setText("- " + getResources().getString(R.string.percent, percentageValue) + " +"); } - @Override - public void handleMessage(final String event, final JSONObject message) { - ThreadUtils.postToUiThread(new Runnable() { - @Override - public void run() { - try { - if (event.equals("Gesture:clusteredLinksClicked")) { - final JSONObject clickPosition = message.getJSONObject("clickPosition"); - int left = clickPosition.getInt("x"); - int top = clickPosition.getInt("y"); - // Start to display inside the zoomedView - LayerView geckoAppLayerView = GeckoAppShell.getLayerView(); - if (geckoAppLayerView != null) { - startZoomDisplay(geckoAppLayerView, left, top); - } - } else if (event.equals("Window:Resize")) { - ImmutableViewportMetrics metrics = layerView.getViewportMetrics(); - refreshZoomedViewSize(metrics); - } else if (event.equals("Content:LocationChange")) { - stopZoomDisplay(false); - } else if (event.equals("Gesture:CloseZoomedView") || - event.equals("Browser:ZoomToPageWidth") || - event.equals("Browser:ZoomToRect")) { - stopZoomDisplay(true); - } else if (event.equals("FormAssist:AutoComplete")) { - isBlockedFromAppearing = true; - stopZoomDisplay(true); - } else if (event.equals("FormAssist:Hide")) { - isBlockedFromAppearing = false; - } - } catch (JSONException e) { - Log.e(LOGTAG, "JSON exception", e); - } + @Override // BundleEventListener + public void handleMessage(final String event, final GeckoBundle message, + final EventCallback callback) { + if ("Gesture:CloseZoomedView".equals(event)) { + stopZoomDisplay(message.getBoolean("animate")); + + } else if ("Gesture:ClusteredLinksClicked".equals(event)) { + final GeckoBundle clickPosition = message.getBundle("clickPosition"); + final int left = clickPosition.getInt("x"); + final int top = clickPosition.getInt("y"); + // Start to display inside the zoomedView + final LayerView geckoAppLayerView = GeckoAppShell.getLayerView(); + if (geckoAppLayerView != null) { + startZoomDisplay(geckoAppLayerView, left, top); } - }); + + } else if ("FormAssist:AutoCompleteResult".equals(event)) { + isBlockedFromAppearing = true; + stopZoomDisplay(true); + + } else if ("FormAssist:Hide".equals(event)) { + isBlockedFromAppearing = false; + } } private void moveUsingGeckoPosition(int leftFromGecko, int topFromGecko) { diff --git a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java index 7b3f8e060655..1955a6285f23 100644 --- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java +++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java @@ -5,6 +5,7 @@ package org.mozilla.gecko.customtabs; +import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -20,14 +21,10 @@ import android.widget.TextView; import org.mozilla.gecko.AppConstants; import org.mozilla.gecko.GeckoApp; -import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.R; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; import org.mozilla.gecko.util.ColorUtil; -import org.mozilla.gecko.util.GeckoRequest; -import org.mozilla.gecko.util.NativeJSObject; -import org.mozilla.gecko.util.ThreadUtils; import java.lang.reflect.Field; @@ -55,10 +52,12 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi toolbarColor = savedInstanceState.getInt(SAVED_TOOLBAR_COLOR, NO_COLOR); toolbarTitle = savedInstanceState.getString(SAVED_TOOLBAR_TITLE, AppConstants.MOZ_APP_BASENAME); } else { - toolbarColor = NO_COLOR; + toolbarColor = getIntent().getIntExtra(EXTRA_TOOLBAR_COLOR, NO_COLOR); toolbarTitle = AppConstants.MOZ_APP_BASENAME; } + setThemeFromToolbarColor(); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); updateActionBarWithToolbar(toolbar); try { @@ -91,6 +90,19 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi Tabs.registerOnTabsChangedListener(this); } + private void setThemeFromToolbarColor() { + if (toolbarColor == NO_COLOR) { + return; + } + + if (ColorUtil.getReadableTextColor(toolbarColor) == Color.BLACK) { + setTheme(R.style.Theme_AppCompat_Light_NoActionBar); + } else { + setTheme(R.style.Theme_AppCompat_NoActionBar); + } + + } + @Override public void onDestroy() { super.onDestroy(); @@ -172,17 +184,11 @@ public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedLi private void updateToolbarColor(final Toolbar toolbar) { if (toolbarColor == NO_COLOR) { - final int color = getIntent().getIntExtra(EXTRA_TOOLBAR_COLOR, NO_COLOR); - if (color == NO_COLOR) { - return; - } - toolbarColor = color; + return; } - final int titleTextColor = ColorUtil.getReadableTextColor(toolbarColor); - toolbar.setBackgroundColor(toolbarColor); - toolbar.setTitleTextColor(titleTextColor); + final Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); diff --git a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java index 853d2cb33239..571b8ecb8b64 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java @@ -11,7 +11,6 @@ import android.media.MediaCrypto; import android.media.MediaFormat; import android.os.IBinder; import android.os.RemoteException; -import android.os.TransactionTooLargeException; import android.util.Log; import android.view.Surface; @@ -169,16 +168,45 @@ import java.util.concurrent.ConcurrentLinkedQueue; } private class OutputProcessor { + private final boolean mRenderToSurface; private boolean mHasOutputCapacitySet; private Queue mSentIndices = new LinkedList<>(); private Queue mSentOutputs = new LinkedList<>(); private boolean mStopped; + private OutputProcessor(boolean renderToSurface) { + mRenderToSurface = renderToSurface; + } + private synchronized void onBuffer(int index, MediaCodec.BufferInfo info) { if (mStopped) { return; } + Sample output = obtainOutputSample(index, info); + try { + mSentIndices.add(index); + mSentOutputs.add(output); + mCallbacks.onOutput(output); + } catch (RemoteException e) { + // Dead recipient. + e.printStackTrace(); + mCodec.releaseOutputBuffer(index, false); + } + + boolean eos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; + if (DEBUG && eos) { + Log.d(LOGTAG, "output EOS"); + } + } + + private Sample obtainOutputSample(int index, MediaCodec.BufferInfo info) { + Sample sample = mSamplePool.obtainOutput(info); + + if (mRenderToSurface) { + return sample; + } + ByteBuffer output = mCodec.getOutputBuffer(index); if (!mHasOutputCapacitySet) { int capacity = output.capacity(); @@ -187,39 +215,16 @@ import java.util.concurrent.ConcurrentLinkedQueue; mHasOutputCapacitySet = true; } } - Sample copy = mSamplePool.obtainOutput(info); - try { - if (info.size > 0) { - copy.buffer.readFromByteBuffer(output, info.offset, info.size); + + if (info.size > 0) { + try { + sample.buffer.readFromByteBuffer(output, info.offset, info.size); + } catch (IOException e) { + Log.e(LOGTAG, "Fail to read output buffer:" + e.getMessage()); } - mSentIndices.add(index); - mSentOutputs.add(copy); - mCallbacks.onOutput(copy); - } catch (IOException e) { - Log.e(LOGTAG, "Fail to read output buffer:" + e.getMessage()); - outputDummy(info); - } catch (TransactionTooLargeException ttle) { - Log.e(LOGTAG, "Output is too large:" + ttle.getMessage()); - outputDummy(info); - } catch (RemoteException e) { - // Dead recipient. - e.printStackTrace(); } - boolean eos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; - if (DEBUG && eos) { - Log.d(LOGTAG, "output EOS"); - } - } - - private void outputDummy(MediaCodec.BufferInfo info) { - try { - if (DEBUG) { Log.d(LOGTAG, "return dummy sample"); } - mCallbacks.onOutput(Sample.create(null, info, null)); - } catch (RemoteException e) { - // Dead recipient. - e.printStackTrace(); - } + return sample; } private synchronized void onRelease(Sample sample, boolean render) { @@ -331,8 +336,9 @@ import java.util.concurrent.ConcurrentLinkedQueue; codec.setCallbacks(new Callbacks(), null); + boolean renderToSurface = surface != null; // Video decoder should config with adaptive playback capability. - if (surface != null) { + if (renderToSurface) { mIsAdaptivePlaybackSupported = codec.isAdaptivePlaybackSupported( fmt.getString(MediaFormat.KEY_MIME)); if (mIsAdaptivePlaybackSupported) { @@ -346,12 +352,12 @@ import java.util.concurrent.ConcurrentLinkedQueue; codec.configure(fmt, surface, crypto, flags); mCodec = codec; mInputProcessor = new InputProcessor(); - mOutputProcessor = new OutputProcessor(); - mSamplePool = new SamplePool(codecName); - if (DEBUG) { Log.d(LOGTAG, codec.toString() + " created"); } + mOutputProcessor = new OutputProcessor(renderToSurface); + mSamplePool = new SamplePool(codecName, renderToSurface); + if (DEBUG) { Log.d(LOGTAG, codec.toString() + " created. Render to surface?" + renderToSurface); } return true; } catch (Exception e) { - if (DEBUG) { Log.d(LOGTAG, "FAIL: cannot create codec -- " + codecName); } + Log.e(LOGTAG, "FAIL: cannot create codec -- " + codecName); e.printStackTrace(); return false; } diff --git a/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java b/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java index 9041e37561ee..f484c7f2a909 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/SamplePool.java @@ -13,46 +13,52 @@ import java.util.ArrayList; import java.util.List; final class SamplePool { - private final class Impl { + private static final class Impl { private final String mName; private int mNextId = 0; private int mDefaultBufferSize = 4096; private final List mRecycledSamples = new ArrayList<>(); + private final boolean mBufferless; - private Impl(String name) { + private Impl(String name, boolean bufferless) { mName = name; + mBufferless = bufferless; } private void setDefaultBufferSize(int size) { + if (mBufferless) { + throw new IllegalStateException("Setting buffer size of a bufferless pool is not allowed"); + } mDefaultBufferSize = size; } - private synchronized Sample allocate(int size) { - Sample sample; + private synchronized Sample obtain(int size) { if (!mRecycledSamples.isEmpty()) { - sample = mRecycledSamples.remove(0); - sample.info.set(0, 0, 0, 0); - } else { - SharedMemory shm = null; - try { - shm = new SharedMemory(mNextId++, Math.max(size, mDefaultBufferSize)); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - if (shm != null) { - sample = Sample.create(shm); - } else { - sample = Sample.create(); - } + return mRecycledSamples.remove(0); } - return sample; + if (mBufferless) { + return Sample.create(); + } else { + return allocateSharedMemorySample(size); + } + } + + private Sample allocateSharedMemorySample(int size) { + SharedMemory shm = null; + try { + shm = new SharedMemory(mNextId++, Math.max(size, mDefaultBufferSize)); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return shm != null ? Sample.create(shm) : Sample.create(); } private synchronized void recycle(Sample recycled) { - if (recycled.buffer.capacity() >= mDefaultBufferSize) { + if (mBufferless || recycled.buffer.capacity() >= mDefaultBufferSize) { mRecycledSamples.add(recycled); } else { recycled.dispose(); @@ -76,9 +82,10 @@ final class SamplePool { private final Impl mInputs; private final Impl mOutputs; - /* package */ SamplePool(String name) { - mInputs = new Impl(name + " input buffer pool"); - mOutputs = new Impl(name + " output buffer pool"); + /* package */ SamplePool(String name, boolean renderToSurface) { + mInputs = new Impl(name + " input sample pool", false); + // Buffers are useless when rendering to surface. + mOutputs = new Impl(name + " output sample pool", renderToSurface); } /* package */ void setInputBufferSize(int size) { @@ -90,11 +97,13 @@ final class SamplePool { } /* package */ Sample obtainInput(int size) { - return mInputs.allocate(size); + Sample input = mInputs.obtain(size); + input.info.set(0, 0, 0, 0); + return input; } /* package */ Sample obtainOutput(MediaCodec.BufferInfo info) { - Sample output = mOutputs.allocate(info.size); + Sample output = mOutputs.obtain(info.size); output.info.set(0, info.size, info.presentationTimeUs, info.flags); return output; } diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java index 94686cf2d247..21aa907b97d4 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java @@ -656,13 +656,6 @@ public abstract class BrowserToolbar extends ThemedRelativeLayout } } - public void setToolBarButtonsAlpha(float alpha) { - ViewHelper.setAlpha(tabsCounter, alpha); - if (!HardwareUtils.isTablet()) { - ViewHelper.setAlpha(menuIcon, alpha); - } - } - public void onEditSuggestion(String suggestion) { if (!isEditing()) { return; diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java index e0f51ba76248..e83d674181ca 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbarTablet.java @@ -166,12 +166,6 @@ class BrowserToolbarTablet extends BrowserToolbarTabletBase { // Do nothing. } - @Override - public void setToolBarButtonsAlpha(float alpha) { - // Do nothing. - } - - @Override public void startEditing(final String url, final PropertyAnimator animator) { // We already know the forward button state - no need to store it here. diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java index 4671972b3a57..b53e6871be8a 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java @@ -331,7 +331,7 @@ public class SiteIdentityPopup extends AnchoredPopup implements GeckoEventListen mMixedContentActivity.setVisibility(View.GONE); mLink.setVisibility(View.GONE); } else if (!siteIdentity.isSecure()) { - if (siteIdentity.getMixedModeActive() == MixedMode.MIXED_CONTENT_LOADED) { + if (siteIdentity.getMixedModeActive() == MixedMode.LOADED) { // Active Mixed Content loaded because user has disabled blocking. mIcon.setImageResource(R.drawable.lock_disabled); clearSecurityStateIcon(); @@ -339,12 +339,12 @@ public class SiteIdentityPopup extends AnchoredPopup implements GeckoEventListen mMixedContentActivity.setText(R.string.mixed_content_protection_disabled); mLink.setVisibility(View.VISIBLE); - } else if (siteIdentity.getMixedModeDisplay() == MixedMode.MIXED_CONTENT_LOADED) { + } else if (siteIdentity.getMixedModeDisplay() == MixedMode.LOADED) { // Passive Mixed Content loaded. mIcon.setImageResource(R.drawable.lock_inactive); setSecurityStateIcon(R.drawable.warning_major, 1); mMixedContentActivity.setVisibility(View.VISIBLE); - if (siteIdentity.getMixedModeActive() == MixedMode.MIXED_CONTENT_BLOCKED) { + if (siteIdentity.getMixedModeActive() == MixedMode.BLOCKED) { mMixedContentActivity.setText(R.string.mixed_content_blocked_some); } else { mMixedContentActivity.setText(R.string.mixed_content_display_loaded); @@ -379,8 +379,8 @@ public class SiteIdentityPopup extends AnchoredPopup implements GeckoEventListen mSecurityState.setText(R.string.identity_connection_secure); // Mixed content has been blocked, if present. - if (siteIdentity.getMixedModeActive() == MixedMode.MIXED_CONTENT_BLOCKED || - siteIdentity.getMixedModeDisplay() == MixedMode.MIXED_CONTENT_BLOCKED) { + if (siteIdentity.getMixedModeActive() == MixedMode.BLOCKED || + siteIdentity.getMixedModeDisplay() == MixedMode.BLOCKED) { mMixedContentActivity.setVisibility(View.VISIBLE); mMixedContentActivity.setText(R.string.mixed_content_blocked_all); mLink.setVisibility(View.VISIBLE); diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java index 0d070f117253..d1bed759fac3 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java @@ -397,9 +397,9 @@ public class ToolbarDisplayLayout extends ThemedLinearLayout { imageLevel = LEVEL_SHIELD_DISABLED; } else if (trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED) { imageLevel = LEVEL_SHIELD_ENABLED; - } else if (activeMixedMode == MixedMode.MIXED_CONTENT_LOADED) { + } else if (activeMixedMode == MixedMode.LOADED) { imageLevel = LEVEL_LOCK_DISABLED; - } else if (displayMixedMode == MixedMode.MIXED_CONTENT_LOADED) { + } else if (displayMixedMode == MixedMode.LOADED) { imageLevel = LEVEL_WARNING_MINOR; } diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index c861d4204f5e..c91a0e4ded82 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -283,7 +283,6 @@ gvjar.sources += [geckoview_source_dir + 'java/org/mozilla/gecko/' + x 'gfx/PanZoomController.java', 'gfx/PanZoomTarget.java', 'gfx/PointUtils.java', - 'gfx/ProgressiveUpdateData.java', 'gfx/RectUtils.java', 'gfx/RenderTask.java', 'gfx/StackScroller.java', diff --git a/mobile/android/chrome/content/FindHelper.js b/mobile/android/chrome/content/FindHelper.js index 037b182d64b7..a53f22b783f1 100644 --- a/mobile/android/chrome/content/FindHelper.js +++ b/mobile/android/chrome/content/FindHelper.js @@ -19,16 +19,20 @@ var FindHelper = { break; } + case "FindInPage:Closed": + this._uninit(); + this._findClosed(); + break; + } + }, + + onEvent: function(event, message, callback) { + switch (event) { case "Tab:Selected": { // Allow for page switching. this._uninit(); break; } - - case "FindInPage:Closed": - this._uninit(); - this._findClosed(); - break; } }, @@ -68,6 +72,10 @@ var FindHelper = { this._finder.addResultListener(this); this._initialViewport = JSON.stringify(this._targetTab.getViewport()); this._viewportChanged = false; + + GlobalEventDispatcher.registerListener(this, [ + "Tab:Selected", + ]); }, /** @@ -86,6 +94,10 @@ var FindHelper = { this._targetTab = null; this._initialViewport = null; this._viewportChanged = false; + + GlobalEventDispatcher.unregisterListener(this, [ + "Tab:Selected", + ]); }, /** diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 72fe7b7a9864..d56ba8b804d6 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -21,6 +21,9 @@ if (AppConstants.ACCESSIBILITY) { "resource://gre/modules/accessibility/AccessFu.jsm"); } +XPCOMUtils.defineLazyModuleGetter(this, "Manifest", + "resource://gre/modules/Manifest.jsm"); + XPCOMUtils.defineLazyModuleGetter(this, "SpatialNavigation", "resource://gre/modules/SpatialNavigation.jsm"); @@ -152,7 +155,7 @@ lazilyLoadedBrowserScripts.forEach(function (aScript) { var lazilyLoadedObserverScripts = [ ["MemoryObserver", ["memory-pressure", "Memory:Dump"], "chrome://browser/content/MemoryObserver.js"], ["ConsoleAPI", ["console-api-log-event"], "chrome://browser/content/ConsoleAPI.js"], - ["FindHelper", ["FindInPage:Opened", "FindInPage:Closed", "Tab:Selected"], "chrome://browser/content/FindHelper.js"], + ["FindHelper", ["FindInPage:Opened", "FindInPage:Closed"], "chrome://browser/content/FindHelper.js"], ["PermissionsHelper", ["Permissions:Check", "Permissions:Get", "Permissions:Clear"], "chrome://browser/content/PermissionsHelper.js"], ["FeedHandler", ["Feeds:Subscribe"], "chrome://browser/content/FeedHandler.js"], ["Feedback", ["Feedback:Show"], "chrome://browser/content/Feedback.js"], @@ -369,11 +372,15 @@ var BrowserApp = { Services.androidBridge.browserApp = this; + GlobalEventDispatcher.registerListener(this, [ + "Tab:Load", + "Tab:Selected", + "Tab:Closed", + "Browser:LoadManifest", + ]); + Services.obs.addObserver(this, "Locale:OS", false); Services.obs.addObserver(this, "Locale:Changed", false); - Services.obs.addObserver(this, "Tab:Load", false); - Services.obs.addObserver(this, "Tab:Selected", false); - Services.obs.addObserver(this, "Tab:Closed", false); Services.obs.addObserver(this, "Session:Back", false); Services.obs.addObserver(this, "Session:Forward", false); Services.obs.addObserver(this, "Session:Navigate", false); @@ -492,6 +499,9 @@ var BrowserApp = { let mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript("chrome://browser/content/content.js", true); + // Listen to manifest messages + mm.loadFrameScript("chrome://global/content/manifestMessages.js", true); + // We can't delay registering WebChannel listeners: if the first page is // about:accounts, which can happen when starting the Firefox Account flow // from the first run experience, or via the Firefox Account Status @@ -1181,7 +1191,7 @@ var BrowserApp = { type: "Content:LoadError", tabID: tab.id }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); dump("Handled load error: " + e) } } @@ -1228,7 +1238,7 @@ var BrowserApp = { type: "Tab:Close", tabID: aTab.id }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); }, // Calling this will update the state in BrowserApp after a tab has been @@ -1302,7 +1312,7 @@ var BrowserApp = { type: "Tab:Select", tabID: aTab.id }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); }, /** @@ -1598,11 +1608,91 @@ var BrowserApp = { Services.prefs.setComplexValue(pref, Ci.nsIPrefLocalizedString, pls); }, + onEvent: function (event, data, callback) { + let browser = this.selectedBrowser; + + switch (event) { + case "Browser:LoadManifest": { + const manifest = new Manifest(browser); + manifest.install().then(() => { + return manifest.icon(data.iconSize); + }).then(icon => { + GlobalEventDispatcher.sendRequest({ + type: "Website:AppInstalled", + icon: icon, + name: manifest.name(), + start_url: manifest.data.start_url + }); + }).catch(err => { + Cu.reportError("Failed to install " + data.src); + }); + break; + } + + case "Tab:Load": { + let url = data.url; + let flags = Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP + | Ci.nsIWebNavigation.LOAD_FLAGS_FIXUP_SCHEME_TYPOS; + + // Pass LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL to prevent any loads from + // inheriting the currently loaded document's principal. + if (data.userEntered) { + flags |= Ci.nsIWebNavigation.LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL; + } + + let delayLoad = ("delayLoad" in data) ? data.delayLoad : false; + let params = { + selected: ("selected" in data) ? data.selected : !delayLoad, + parentId: ("parentId" in data) ? data.parentId : -1, + flags: flags, + tabID: data.tabID, + isPrivate: (data.isPrivate === true), + pinned: (data.pinned === true), + delayLoad: (delayLoad === true), + desktopMode: (data.desktopMode === true) + }; + + params.userRequested = url; + + if (data.engine) { + let engine = Services.search.getEngineByName(data.engine); + if (engine) { + let submission = engine.getSubmission(url); + url = submission.uri.spec; + params.postData = submission.postData; + params.isSearch = true; + } + } + + if (data.newTab) { + this.addTab(url, params); + } else { + if (data.tabId) { + // Use a specific browser instead of the selected browser, if it exists + let specificBrowser = this.getTabForId(data.tabId).browser; + if (specificBrowser) + browser = specificBrowser; + } + this.loadURI(url, browser, params); + } + break; + } + + case "Tab:Selected": + this._handleTabSelected(this.getTabForId(data.id)); + break; + + case "Tab:Closed": { + this._handleTabClosed(this.getTabForId(data.tabId), data.showUndoToast); + break; + } + } + }, + observe: function(aSubject, aTopic, aData) { let browser = this.selectedBrowser; switch (aTopic) { - case "Session:Back": browser.goBack(); break; @@ -1685,66 +1775,6 @@ var BrowserApp = { browser.stop(); break; - case "Tab:Load": { - let data = JSON.parse(aData); - let url = data.url; - let flags = Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP - | Ci.nsIWebNavigation.LOAD_FLAGS_FIXUP_SCHEME_TYPOS; - - // Pass LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL to prevent any loads from - // inheriting the currently loaded document's principal. - if (data.userEntered) { - flags |= Ci.nsIWebNavigation.LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL; - } - - let delayLoad = ("delayLoad" in data) ? data.delayLoad : false; - let params = { - selected: ("selected" in data) ? data.selected : !delayLoad, - parentId: ("parentId" in data) ? data.parentId : -1, - flags: flags, - tabID: data.tabID, - isPrivate: (data.isPrivate === true), - pinned: (data.pinned === true), - delayLoad: (delayLoad === true), - desktopMode: (data.desktopMode === true) - }; - - params.userRequested = url; - - if (data.engine) { - let engine = Services.search.getEngineByName(data.engine); - if (engine) { - let submission = engine.getSubmission(url); - url = submission.uri.spec; - params.postData = submission.postData; - params.isSearch = true; - } - } - - if (data.newTab) { - this.addTab(url, params); - } else { - if (data.tabId) { - // Use a specific browser instead of the selected browser, if it exists - let specificBrowser = this.getTabForId(data.tabId).browser; - if (specificBrowser) - browser = specificBrowser; - } - this.loadURI(url, browser, params); - } - break; - } - - case "Tab:Selected": - this._handleTabSelected(this.getTabForId(parseInt(aData))); - break; - - case "Tab:Closed": { - let data = JSON.parse(aData); - this._handleTabClosed(this.getTabForId(data.tabId), data.showUndoToast); - break; - } - case "keyword-search": // This event refers to a search via the URL bar, not a bookmarks // keyword search. Note that this code assumes that the user can only @@ -3575,7 +3605,7 @@ Tab.prototype = { type: "Content:LoadError", tabID: this.id }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); dump("Handled load error: " + e); } } @@ -3593,7 +3623,7 @@ Tab.prototype = { // Set desktop mode for tab and send change to Java if (this.desktopMode != aDesktopMode) { this.desktopMode = aDesktopMode; - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "DesktopMode:Changed", desktopMode: aDesktopMode, tabID: this.id @@ -3780,6 +3810,13 @@ Tab.prototype = { } }, + makeManifestMessage: function() { + return { + type: "Link:Manifest", + tabID: this.id + }; + }, + sendOpenSearchMessage: function(eventTarget) { let type = eventTarget.type && eventTarget.type.toLowerCase(); // Replace all starting or trailing spaces or spaces before "*;" globally w/ "". @@ -3826,7 +3863,7 @@ Tab.prototype = { return null; // Broadcast message that this tab contains search engines that should be visible. - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Link:OpenSearch", tabID: this.id, visible: true @@ -3838,7 +3875,7 @@ Tab.prototype = { setParentId: function(aParentId) { let newParentId = (typeof aParentId == "number") ? aParentId : -1; this.parentId = newParentId; - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Tab:SetParentId", tabID: this.id, parentID: newParentId @@ -3988,11 +4025,15 @@ Tab.prototype = { jsonMessage = this.makeFeedMessage(target, type); } else if (list.indexOf("[search]") != -1 && aEvent.type == "DOMLinkAdded") { this.sendOpenSearchMessage(target); + } else if (list.indexOf("[manifest]") != -1 && + aEvent.type == "DOMLinkAdded" && + Services.prefs.getBoolPref("manifest.install.enabled")) { + jsonMessage = this.makeManifestMessage(target); } if (!jsonMessage) return; - Messaging.sendRequest(jsonMessage); + GlobalEventDispatcher.sendRequest(jsonMessage); break; } @@ -4004,8 +4045,8 @@ Tab.prototype = { if (aEvent.originalTarget != this.browser.contentDocument) return; - Messaging.sendRequest({ - type: "DOMTitleChanged", + GlobalEventDispatcher.sendRequest({ + type: "Content:DOMTitleChanged", tabID: this.id, title: truncate(aEvent.target.title, MAX_TITLE_LENGTH) }); @@ -4033,7 +4074,7 @@ Tab.prototype = { this.playingAudio = aEvent.type === "DOMAudioPlaybackStarted"; - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Tab:AudioPlayingChange", tabID: this.id, isAudioPlaying: this.playingAudio @@ -4049,7 +4090,7 @@ Tab.prototype = { if (this.browser.contentWindow == aEvent.target) { aEvent.preventDefault(); - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Tab:Close", tabID: this.id }); @@ -4095,9 +4136,10 @@ Tab.prototype = { } case "DOMServiceWorkerFocusClient": { - Messaging.sendRequest({ - type: "Tab:SelectAndForeground", - tabID: this.id + GlobalEventDispatcher.sendRequest({ + type: "Tab:Select", + tabID: this.id, + foreground: true, }); break; } @@ -4116,7 +4158,7 @@ Tab.prototype = { this.userRequested = ""; } - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Content:PageShow", tabID: this.id, userRequested: this.userRequested, @@ -4199,7 +4241,7 @@ Tab.prototype = { restoring: restoring, success: success }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); } }, @@ -4311,7 +4353,9 @@ Tab.prototype = { canGoForward: webNav.canGoForward, }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); + + BrowserEventHandler.closeZoomedView(); if (!sameDocument) { // XXX This code assumes that this is the earliest hook we have at which @@ -4346,7 +4390,7 @@ Tab.prototype = { identity: identity }; - Messaging.sendRequest(message); + GlobalEventDispatcher.sendRequest(message); }, onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) { @@ -4484,7 +4528,7 @@ Tab.prototype = { status = "resume"; } - Messaging.sendRequest({ + GlobalEventDispatcher.sendRequest({ type: "Tab:MediaPlaybackChange", tabID: this.id, status: status @@ -4625,12 +4669,12 @@ var BrowserEventHandler = { } catch(e) { Cu.reportError(e); } - Messaging.sendRequest({ type: "FormAssist:Hide" }); + WindowEventDispatcher.sendRequest({ type: "FormAssist:Hide" }); } this._clusterClicked(x, y); } else { if (this._clickInZoomedView != true) { - this._closeZoomedView(); + this.closeZoomedView(/* animate */ true); } } this._clickInZoomedView = false; @@ -4644,15 +4688,16 @@ var BrowserEventHandler = { } }, - _closeZoomedView: function() { - Messaging.sendRequest({ - type: "Gesture:CloseZoomedView" + closeZoomedView: function(aAnimate) { + WindowEventDispatcher.sendRequest({ + type: "Gesture:CloseZoomedView", + animate: !!aAnimate, }); }, _clusterClicked: function(aX, aY) { - Messaging.sendRequest({ - type: "Gesture:clusteredLinksClicked", + WindowEventDispatcher.sendRequest({ + type: "Gesture:ClusteredLinksClicked", clickPosition: { x: aX, y: aY @@ -4817,9 +4862,12 @@ var FormAssistant = { _invalidSubmit: false, init: function() { - Services.obs.addObserver(this, "FormAssist:AutoComplete", false); - Services.obs.addObserver(this, "FormAssist:Hidden", false); - Services.obs.addObserver(this, "FormAssist:Remove", false); + WindowEventDispatcher.registerListener(this, [ + "FormAssist:AutoComplete", + "FormAssist:Hidden", + "FormAssist:Remove", + ]); + Services.obs.addObserver(this, "invalidformsubmit", false); Services.obs.addObserver(this, "PanZoom:StateChange", false); @@ -4831,6 +4879,52 @@ var FormAssistant = { BrowserApp.deck.addEventListener("pageshow", this); }, + onEvent: function(event, message, callback) { + switch (event) { + case "FormAssist:AutoComplete": + if (!this._currentInputElement) + break; + + let editableElement = this._currentInputElement.QueryInterface(Ci.nsIDOMNSEditableElement); + + this._doingAutocomplete = true; + + // If we have an active composition string, commit it before sending + // the autocomplete event with the text that will replace it. + try { + if (editableElement.editor.composing) + editableElement.editor.forceCompositionEnd(); + } catch (e) {} + + editableElement.setUserInput(message.value); + this._currentInputValue = message.value; + + let event = this._currentInputElement.ownerDocument.createEvent("Events"); + event.initEvent("DOMAutoComplete", true, true); + this._currentInputElement.dispatchEvent(event); + + this._doingAutocomplete = false; + + break; + + case "FormAssist:Hidden": + this._currentInputElement = null; + break; + + case "FormAssist:Remove": + if (!this._currentInputElement) { + break; + } + + FormHistory.update({ + op: "remove", + fieldname: this._currentInputElement.name, + value: message.value, + }); + break; + } + }, + observe: function(aSubject, aTopic, aData) { switch (aTopic) { case "PanZoom:StateChange": @@ -4856,47 +4950,6 @@ var FormAssistant = { this._hideFormAssistPopup(); } break; - case "FormAssist:AutoComplete": - if (!this._currentInputElement) - break; - - let editableElement = this._currentInputElement.QueryInterface(Ci.nsIDOMNSEditableElement); - - this._doingAutocomplete = true; - - // If we have an active composition string, commit it before sending - // the autocomplete event with the text that will replace it. - try { - if (editableElement.editor.composing) - editableElement.editor.forceCompositionEnd(); - } catch (e) {} - - editableElement.setUserInput(aData); - this._currentInputValue = aData; - - let event = this._currentInputElement.ownerDocument.createEvent("Events"); - event.initEvent("DOMAutoComplete", true, true); - this._currentInputElement.dispatchEvent(event); - - this._doingAutocomplete = false; - - break; - - case "FormAssist:Hidden": - this._currentInputElement = null; - break; - - case "FormAssist:Remove": - if (!this._currentInputElement) { - break; - } - - FormHistory.update({ - op: "remove", - fieldname: this._currentInputElement.name, - value: aData - }); - break; } }, @@ -5099,8 +5152,8 @@ var FormAssistant = { return; } - Messaging.sendRequest({ - type: "FormAssist:AutoComplete", + WindowEventDispatcher.sendRequest({ + type: "FormAssist:AutoCompleteResult", suggestions: suggestions, rect: ElementTouchHelper.getBoundingContentRect(aElement), isEmpty: isEmpty, @@ -5135,7 +5188,7 @@ var FormAssistant = { if (!this._isValidateable(aElement)) return false; - Messaging.sendRequest({ + WindowEventDispatcher.sendRequest({ type: "FormAssist:ValidationMessage", validationMessage: aElement.validationMessage, rect: ElementTouchHelper.getBoundingContentRect(aElement) @@ -5145,7 +5198,7 @@ var FormAssistant = { }, _hideFormAssistPopup: function _hideFormAssistPopup() { - Messaging.sendRequest({ type: "FormAssist:Hide" }); + WindowEventDispatcher.sendRequest({ type: "FormAssist:Hide" }); }, _isDisabledElement : function(aElement) { @@ -6117,7 +6170,7 @@ var SearchEngines = { visible: false }; - Messaging.sendRequest(newEngineMessage); + GlobalEventDispatcher.sendRequest(newEngineMessage); } }).bind(this)); }, diff --git a/mobile/android/components/TabSource.js b/mobile/android/components/TabSource.js index c35a54438a1d..a018a2edccde 100644 --- a/mobile/android/components/TabSource.js +++ b/mobile/android/components/TabSource.js @@ -12,7 +12,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Prompt", "resource://gre/modules/Prompt.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Messaging", +XPCOMUtils.defineLazyModuleGetter(this, "EventDispatcher", "resource://gre/modules/Messaging.jsm"); function TabSource() { @@ -72,7 +72,11 @@ TabSource.prototype = { let tabs = app.tabs; for (var i in tabs) { if (tabs[i].browser.contentWindow == window) { - Messaging.sendRequest({ type: "Tab:StreamStart", tabID: tabs[i].id }); + EventDispatcher.instance.sendRequest({ + type: "Tab:RecordingChange", + recording: true, + tabID: tabs[i].id, + }); } } }, @@ -82,7 +86,11 @@ TabSource.prototype = { let tabs = app.tabs; for (let i in tabs) { if (tabs[i].browser.contentWindow == window) { - Messaging.sendRequest({ type: "Tab:StreamStop", tabID: tabs[i].id }); + EventDispatcher.instance.sendRequest({ + type: "Tab:RecordingChange", + recording: false, + tabID: tabs[i].id, + }); } } } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/DynamicToolbarAnimator.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/DynamicToolbarAnimator.java index 471a257438cc..9db084ce55d9 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/DynamicToolbarAnimator.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/DynamicToolbarAnimator.java @@ -589,16 +589,4 @@ public class DynamicToolbarAnimator { return mContinueAnimation; } } - - class SnapMetrics { - public final int viewportWidth; - public final int viewportHeight; - public final float scrollChangeY; - - SnapMetrics(ImmutableViewportMetrics aMetrics, float aScrollChange) { - viewportWidth = aMetrics.viewportRectWidth; - viewportHeight = aMetrics.viewportRectHeight; - scrollChangeY = aScrollChange; - } - } } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/ProgressiveUpdateData.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/ProgressiveUpdateData.java deleted file mode 100644 index d961a2569f1b..000000000000 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/ProgressiveUpdateData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- - * 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/. */ - -package org.mozilla.gecko.gfx; - -import org.mozilla.gecko.annotation.WrapForJNI; - -/** - * This is the data structure that's returned by the progressive tile update - * callback function. It encompasses the current viewport and a boolean value - * representing whether the front-end is interested in the current progressive - * update continuing. - */ -@WrapForJNI -public class ProgressiveUpdateData { - public float x; - public float y; - public float scale; - public boolean abort; - - public void setViewport(ImmutableViewportMetrics viewport) { - this.x = viewport.viewportRectLeft; - this.y = viewport.viewportRectTop; - this.scale = viewport.zoomFactor; - } -} - diff --git a/mobile/android/tests/browser/chrome/test_awsy_lite.html b/mobile/android/tests/browser/chrome/test_awsy_lite.html index 582d33d9e5f9..9d17eac08100 100644 --- a/mobile/android/tests/browser/chrome/test_awsy_lite.html +++ b/mobile/android/tests/browser/chrome/test_awsy_lite.html @@ -177,20 +177,16 @@ checkpoint("After tabs [+30s, forced GC]"); var tabCount = BrowserApp.tabs.length; for (var i = 1; i < tabCount; i++) { - BrowserApp.closeTab(BrowserApp.tabs[i]); - } - - var closeListener = { - observe: function(aSubject, aTopic, aData) { + BrowserApp.tabs[i].browser.addEventListener("TabClose", () => { tabCount--; dump("tab count dropped to [" + tabCount + "]"); if (tabCount == 1) { - Services.obs.removeObserver(this, "Tab:Closed", false); setTimeout(tabsClosed, 0); } - } - }; - Services.obs.addObserver(closeListener, "Tab:Closed", false); + }, { once: true }); + + BrowserApp.closeTab(BrowserApp.tabs[i]); + } } function tabsClosed() { diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java index e9e5fc5bad33..f0d94dedc96c 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java @@ -12,9 +12,6 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.HashSet; -import org.json.JSONException; -import org.json.JSONObject; - import org.mozilla.gecko.Actions; import org.mozilla.gecko.Element; import org.mozilla.gecko.GeckoAppShell; @@ -24,6 +21,7 @@ import org.mozilla.gecko.R; import org.mozilla.gecko.RobocopUtils; import org.mozilla.gecko.Tab; import org.mozilla.gecko.Tabs; +import org.mozilla.gecko.util.GeckoBundle; import android.content.ContentValues; import android.content.res.AssetManager; @@ -579,25 +577,22 @@ abstract class BaseTest extends BaseRobocopTest { } }, MAX_WAIT_MS); mAsserter.ok(success, "waiting for add tab view", "add tab view available"); - final Actions.RepeatedEventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + final Actions.RepeatedEventExpecter pageShowExpecter = + mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); mSolo.clickOnView(mSolo.getView(R.id.add_tab)); waitForAnimationsToFinish(); // Wait until we get a PageShow event for a new tab ID for(;;) { - try { - JSONObject data = new JSONObject(pageShowExpecter.blockForEventData()); - int tabID = data.getInt("tabID"); - if (tabID == 0) { - mAsserter.dumpLog("addTab ignoring PageShow for tab 0"); - continue; - } - if (!mKnownTabIDs.contains(tabID)) { - mKnownTabIDs.add(tabID); - break; - } - } catch(JSONException e) { - mAsserter.ok(false, "Exception in addTab", getStackTraceString(e)); + final GeckoBundle data = pageShowExpecter.blockForBundle(); + final int tabID = data.getInt("tabID"); + if (tabID == 0) { + mAsserter.dumpLog("addTab ignoring PageShow for tab 0"); + continue; + } + if (!mKnownTabIDs.contains(tabID)) { + mKnownTabIDs.add(tabID); + break; } } pageShowExpecter.unregisterListener(); @@ -763,7 +758,8 @@ abstract class BaseTest extends BaseRobocopTest { } public void back() { - Actions.EventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + final Actions.EventExpecter pageShowExpecter = + mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); if (devType.equals("tablet")) { Element backBtn = mDriver.findElement(getActivity(), R.id.back); @@ -777,7 +773,8 @@ abstract class BaseTest extends BaseRobocopTest { } public void forward() { - Actions.EventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + final Actions.EventExpecter pageShowExpecter = + mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); if (devType.equals("tablet")) { mSolo.waitForView(R.id.forward); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java index e07a9750c5f1..61f2c8553c2f 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java @@ -156,7 +156,8 @@ public abstract class SessionTest extends BaseTest { } for (int j = 1; j < pages.length; j++) { - Actions.EventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + final Actions.EventExpecter pageShowExpecter = + mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); loadUrl(pages[j].url); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/helpers/WaitHelper.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/helpers/WaitHelper.java index 204abb9fa770..2b791a8c5250 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/helpers/WaitHelper.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/helpers/WaitHelper.java @@ -121,7 +121,7 @@ public final class WaitHelper { // Wait for the page load and title changed event. final EventExpecter[] eventExpecters = new EventExpecter[] { sActions.expectGlobalEvent(Actions.EventType.GECKO, "Content:DOMContentLoaded"), - sActions.expectGeckoEvent("DOMTitleChanged") + sActions.expectGlobalEvent(Actions.EventType.UI, "Content:DOMTitleChanged") }; initiatingAction.run(); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAppMenuPathways.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAppMenuPathways.java index 69efb4decf55..27c73c412b60 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAppMenuPathways.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAppMenuPathways.java @@ -4,11 +4,10 @@ package org.mozilla.gecko.tests; -import org.json.JSONObject; -import org.mozilla.gecko.Tabs; import org.mozilla.gecko.tests.components.AppMenuComponent; import org.mozilla.gecko.tests.helpers.GeckoHelper; import org.mozilla.gecko.tests.helpers.NavigationHelper; +import org.mozilla.gecko.util.GeckoBundle; import com.robotium.solo.Solo; @@ -45,21 +44,16 @@ public class testAppMenuPathways extends UITest { mAppMenu.assertMenuItemIsDisabledAndVisible(AppMenuComponent.PageMenuItem.SAVE_AS_PDF); // Generate a mock Content:LocationChange message with video mime-type for the current tab (tabId = 0). - final JSONObject message = new JSONObject(); - try { - message.put("contentType", "video/webm"); - message.put("baseDomain", "webmfiles.org"); - message.put("type", "Content:LocationChange"); - message.put("sameDocument", false); - message.put("userRequested", ""); - message.put("uri", getAbsoluteIpUrl("/big-buck-bunny_trailer.webm")); - message.put("tabID", 0); - } catch (Exception ex) { - mAsserter.ok(false, "exception in testSaveAsPDFPathway", ex.toString()); - } + final GeckoBundle message = new GeckoBundle(); + message.putString("contentType", "video/webm"); + message.putString("baseDomain", "webmfiles.org"); + message.putBoolean("sameDocument", false); + message.putString("userRequested", ""); + message.putString("uri", getAbsoluteIpUrl("/big-buck-bunny_trailer.webm")); + message.putInt("tabID", 0); // Mock video playback with the generated message and Content:LocationChange event. - Tabs.getInstance().handleMessage("Content:LocationChange", message); + getActions().sendGlobalEvent("Content:LocationChange", message); // Save as pdf menu is disabled while playing video. mAppMenu.assertMenuItemIsDisabledAndVisible(AppMenuComponent.PageMenuItem.SAVE_AS_PDF); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testPrivateBrowsing.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testPrivateBrowsing.java index 1707d9b493f9..8c041e928d40 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testPrivateBrowsing.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testPrivateBrowsing.java @@ -27,7 +27,7 @@ public class testPrivateBrowsing extends ContentContextMenuTest { blockForGeckoReady(); Actions.EventExpecter tabExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Tab:Added"); - Actions.EventExpecter contentExpecter = mActions.expectGeckoEvent("Content:PageShow"); + Actions.EventExpecter contentExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); tabs.loadUrl(bigLinkUrl, Tabs.LOADURL_NEW_TAB | Tabs.LOADURL_PRIVATE); tabExpecter.blockForEvent(); tabExpecter.unregisterListener(); @@ -46,7 +46,7 @@ public class testPrivateBrowsing extends ContentContextMenuTest { // Open the link in a new private tab and check that it is private tabExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Tab:Added"); - contentExpecter = mActions.expectGeckoEvent("Content:PageShow"); + contentExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); mSolo.clickOnText(mStringHelper.CONTEXT_MENU_ITEMS_IN_PRIVATE_TAB[0]); final GeckoBundle eventData = tabExpecter.blockForBundle(); @@ -58,7 +58,7 @@ public class testPrivateBrowsing extends ContentContextMenuTest { // Open a normal tab to check later that it was registered in the Firefox Browser History tabExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Tab:Added"); - contentExpecter = mActions.expectGeckoEvent("Content:PageShow"); + contentExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); tabs.loadUrl(blank2Url, Tabs.LOADURL_NEW_TAB); tabExpecter.blockForEvent(); tabExpecter.unregisterListener(); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java index f5e5ee099651..73e196d0fa5d 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java @@ -13,7 +13,8 @@ public class testSessionOOMSave extends SessionTest { private final static int SESSION_TIMEOUT = 25000; public void testSessionOOMSave() { - Actions.EventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + final Actions.EventExpecter pageShowExpecter = + mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); pageShowExpecter.blockForEvent(); pageShowExpecter.unregisterListener(); diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java index c27ff0094f02..1d8748e904db 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testTrackingProtection.java @@ -9,39 +9,30 @@ import static org.mozilla.gecko.tests.helpers.AssertionHelper.fFail; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.GeckoAppShell; -import org.mozilla.gecko.util.GeckoEventListener; +import org.mozilla.gecko.util.BundleEventListener; +import org.mozilla.gecko.util.EventCallback; +import org.mozilla.gecko.util.GeckoBundle; -import org.json.JSONException; -import org.json.JSONObject; - -public class testTrackingProtection extends JavascriptTest implements GeckoEventListener { +public class testTrackingProtection extends JavascriptTest implements BundleEventListener { private String mLastTracking; public testTrackingProtection() { super("testTrackingProtection.js"); } - @Override - public void handleMessage(String event, final JSONObject message) { - if (event.equals("Content:SecurityChange")) { - try { - JSONObject identity = message.getJSONObject("identity"); - JSONObject mode = identity.getJSONObject("mode"); - mLastTracking = mode.getString("tracking"); - mAsserter.dumpLog("Security change (tracking): " + mLastTracking); - } catch (Exception e) { - fFail("Can't extract tracking state from JSON"); - } - } + @Override // BundleEventListener + public void handleMessage(final String event, final GeckoBundle message, + final EventCallback callback) { + if ("Content:SecurityChange".equals(event)) { + final GeckoBundle identity = message.getBundle("identity"); + final GeckoBundle mode = identity.getBundle("mode"); + mLastTracking = mode.getString("tracking"); + mAsserter.dumpLog("Security change (tracking): " + mLastTracking); - if (event.equals("Test:Expected")) { - try { - String expected = message.getString("expected"); - mAsserter.is(mLastTracking, expected, "Tracking matched expectation"); - mAsserter.dumpLog("Testing (tracking): " + mLastTracking + " = " + expected); - } catch (Exception e) { - fFail("Can't extract expected state from JSON"); - } + } else if ("Test:Expected".equals(event)) { + final String expected = message.getString("expected"); + mAsserter.is(mLastTracking, expected, "Tracking matched expectation"); + mAsserter.dumpLog("Testing (tracking): " + mLastTracking + " = " + expected); } } @@ -49,17 +40,17 @@ public class testTrackingProtection extends JavascriptTest implements GeckoEvent public void setUp() throws Exception { super.setUp(); - EventDispatcher.getInstance().registerGeckoThreadListener(this, - "Content:SecurityChange", - "Test:Expected"); + EventDispatcher.getInstance().registerUiThreadListener(this, + "Content:SecurityChange", + "Test:Expected"); } @Override public void tearDown() throws Exception { super.tearDown(); - EventDispatcher.getInstance().unregisterGeckoThreadListener(this, - "Content:SecurityChange", - "Test:Expected"); + EventDispatcher.getInstance().unregisterUiThreadListener(this, + "Content:SecurityChange", + "Test:Expected"); } } diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index e9715ddbdb5c..0ff5a66996db 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -4513,6 +4513,9 @@ pref("webgl.disable-DOM-blit-uploads", false); pref("webgl.allow-fb-invalidation", false); pref("webgl.webgl2-compat-mode", false); +pref("webgl.max-perf-warnings", 0); +pref("webgl.max-acceptable-fb-status-invals", 0); + pref("webgl.enable-webgl2", true); #ifdef RELEASE_OR_BETA diff --git a/modules/zlib/src/ChangeLog b/modules/zlib/src/ChangeLog index f22aabaef534..b27cc4f0e73c 100644 --- a/modules/zlib/src/ChangeLog +++ b/modules/zlib/src/ChangeLog @@ -1,10 +1,53 @@ ChangeLog file for zlib +Changes in 1.2.11 (15 Jan 2017) +- Fix deflate stored bug when pulling last block from window +- Permit immediate deflateParams changes before any deflate input + +Changes in 1.2.10 (2 Jan 2017) +- Avoid warnings on snprintf() return value +- Fix bug in deflate_stored() for zero-length input +- Fix bug in gzwrite.c that produced corrupt gzip files +- Remove files to be installed before copying them in Makefile.in +- Add warnings when compiling with assembler code + +Changes in 1.2.9 (31 Dec 2016) +- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] +- Improve contrib/blast to return unused bytes +- Assure that gzoffset() is correct when appending +- Improve compress() and uncompress() to support large lengths +- Fix bug in test/example.c where error code not saved +- Remedy Coverity warning [Randers-Pehrson] +- Improve speed of gzprintf() in transparent mode +- Fix inflateInit2() bug when windowBits is 16 or 32 +- Change DEBUG macro to ZLIB_DEBUG +- Avoid uninitialized access by gzclose_w() +- Allow building zlib outside of the source directory +- Fix bug that accepted invalid zlib header when windowBits is zero +- Fix gzseek() problem on MinGW due to buggy _lseeki64 there +- Loop on write() calls in gzwrite.c in case of non-blocking I/O +- Add --warn (-w) option to ./configure for more compiler warnings +- Reject a window size of 256 bytes if not using the zlib wrapper +- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE +- Add --debug (-d) option to ./configure to define ZLIB_DEBUG +- Fix bugs in creating a very large gzip header +- Add uncompress2() function, which returns the input size used +- Assure that deflateParams() will not switch functions mid-block +- Dramatically speed up deflation for level 0 (storing) +- Add gzfread(), duplicating the interface of fread() +- Add gzfwrite(), duplicating the interface of fwrite() +- Add deflateGetDictionary() function +- Use snprintf() for later versions of Microsoft C +- Fix *Init macros to use z_ prefix when requested +- Replace as400 with os400 for OS/400 support [Monnerat] +- Add crc32_z() and adler32_z() functions with size_t lengths +- Update Visual Studio project files [AraHaan] + Changes in 1.2.8 (28 Apr 2013) - Update contrib/minizip/iowin32.c for Windows RT [Vollant] - Do not force Z_CONST for C++ -- Clean up contrib/vstudio [Ro§] +- Clean up contrib/vstudio [Ro§] - Correct spelling error in zlib.h - Fix mixed line endings in contrib/vstudio @@ -34,7 +77,7 @@ Changes in 1.2.7.1 (24 Mar 2013) - Clean up the usage of z_const and respect const usage within zlib - Clean up examples/gzlog.[ch] comparisons of different types - Avoid shift equal to bits in type (caused endless loop) -- Fix unintialized value bug in gzputc() introduced by const patches +- Fix uninitialized value bug in gzputc() introduced by const patches - Fix memory allocation error in examples/zran.c [Nor] - Fix bug where gzopen(), gzclose() would write an empty file - Fix bug in gzclose() when gzwrite() runs out of memory @@ -194,7 +237,7 @@ Changes in 1.2.5.2 (17 Dec 2011) - Add a transparent write mode to gzopen() when 'T' is in the mode - Update python link in zlib man page - Get inffixed.h and MAKEFIXED result to match -- Add a ./config --solo option to make zlib subset with no libary use +- Add a ./config --solo option to make zlib subset with no library use - Add undocumented inflateResetKeep() function for CAB file decoding - Add --cover option to ./configure for gcc coverage testing - Add #define ZLIB_CONST option to use const in the z_stream interface @@ -564,7 +607,7 @@ Changes in 1.2.3.1 (16 August 2006) - Update make_vms.com [Zinser] - Use -fPIC for shared build in configure [Teredesai, Nicholson] - Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] -- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] - Add some FAQ entries about the contrib directory - Update the MVS question in the FAQ - Avoid extraneous reads after EOF in gzio.c [Brown] @@ -1178,7 +1221,7 @@ Changes in 1.0.6 (19 Jan 1998) 386 asm code replacing longest_match(). contrib/iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions - contrib/iostream2/ by Tyge Løvset + contrib/iostream2/ by Tyge Løvset Another C++ I/O streams interface contrib/untgz/ by "Pedro A. Aranda Guti\irrez" A very simple tar.gz file extractor using zlib @@ -1267,7 +1310,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] - fix array overlay in deflate.c which sometimes caused bad compressed data - fix inflate bug with empty stored block - fix MSDOS medium model which was broken in 0.99 -- fix deflateParams() which could generated bad compressed data. +- fix deflateParams() which could generate bad compressed data. - Bytef is define'd instead of typedef'ed (work around Borland bug) - added an INDEX file - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), diff --git a/modules/zlib/src/ChangeLog.moz b/modules/zlib/src/ChangeLog.moz index 12755d05a207..98cd9f9c79a4 100644 --- a/modules/zlib/src/ChangeLog.moz +++ b/modules/zlib/src/ChangeLog.moz @@ -63,3 +63,7 @@ Mozilla.org changes: (keeping '#include "mozzconf.h"' in zconf.h) See bug #866964 +- 16 January 2017 + Sync'ed with 1.2.11 release + (keeping '#include "mozzconf.h"' in zconf.h) + See bug #1328099 diff --git a/modules/zlib/src/README b/modules/zlib/src/README index 5ca9d127edaf..51106de47532 100644 --- a/modules/zlib/src/README +++ b/modules/zlib/src/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.8 is a general purpose data compression library. All the code is +zlib 1.2.11 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -31,7 +31,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.8 are documented in the file ChangeLog. +The changes made in version 1.2.11 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -84,7 +84,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2013 Jean-loup Gailly and Mark Adler + (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/modules/zlib/src/adler32.c b/modules/zlib/src/adler32.c index a868f073d8a0..d0be4380a39c 100644 --- a/modules/zlib/src/adler32.c +++ b/modules/zlib/src/adler32.c @@ -1,5 +1,5 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2011 Mark Adler + * Copyright (C) 1995-2011, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -7,11 +7,9 @@ #include "zutil.h" -#define local static - local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); -#define BASE 65521 /* largest prime smaller than 65536 */ +#define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -62,10 +60,10 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #endif /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) +uLong ZEXPORT adler32_z(adler, buf, len) uLong adler; const Bytef *buf; - uInt len; + z_size_t len; { unsigned long sum2; unsigned n; @@ -132,6 +130,15 @@ uLong ZEXPORT adler32(adler, buf, len) return adler | (sum2 << 16); } +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + /* ========================================================================= */ local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; @@ -156,7 +163,7 @@ local uLong adler32_combine_(adler1, adler2, len2) sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } diff --git a/modules/zlib/src/compress.c b/modules/zlib/src/compress.c index 6e9762676a0d..e2db404abf88 100644 --- a/modules/zlib/src/compress.c +++ b/modules/zlib/src/compress.c @@ -1,5 +1,5 @@ /* compress.c -- compress a memory buffer - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -28,16 +28,11 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) { z_stream stream; int err; + const uInt max = (uInt)-1; + uLong left; - stream.next_in = (z_const Bytef *)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + left = *destLen; + *destLen = 0; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; @@ -46,15 +41,26 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) err = deflateInit(&stream, level); if (err != Z_OK) return err; - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; + stream.next_out = dest; + stream.avail_out = 0; + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; - err = deflateEnd(&stream); - return err; + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; + sourceLen -= stream.avail_in; + } + err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); + } while (err == Z_OK); + + *destLen = stream.total_out; + deflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : err; } /* =========================================================================== diff --git a/modules/zlib/src/crc32.c b/modules/zlib/src/crc32.c index 979a7190a3ca..9580440c0e6b 100644 --- a/modules/zlib/src/crc32.c +++ b/modules/zlib/src/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -30,17 +30,15 @@ #include "zutil.h" /* for STDC and FAR definitions */ -#define local static - /* Definitions for doing the crc four data bytes at a time. */ #if !defined(NOBYFOUR) && defined(Z_U4) # define BYFOUR #endif #ifdef BYFOUR local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); + const unsigned char FAR *, z_size_t)); local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); + const unsigned char FAR *, z_size_t)); # define TBLS 8 #else # define TBLS 1 @@ -201,10 +199,10 @@ const z_crc_t FAR * ZEXPORT get_crc_table() #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) +unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - uInt len; + z_size_t len; { if (buf == Z_NULL) return 0UL; @@ -235,8 +233,29 @@ unsigned long ZEXPORT crc32(crc, buf, len) return crc ^ 0xffffffffUL; } +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + #ifdef BYFOUR +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ @@ -247,7 +266,7 @@ unsigned long ZEXPORT crc32(crc, buf, len) local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; @@ -278,7 +297,7 @@ local unsigned long crc32_little(crc, buf, len) } /* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ +#define DOBIG4 c ^= *buf4++; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 @@ -287,7 +306,7 @@ local unsigned long crc32_little(crc, buf, len) local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; @@ -300,7 +319,6 @@ local unsigned long crc32_big(crc, buf, len) } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - buf4--; while (len >= 32) { DOBIG32; len -= 32; @@ -309,7 +327,6 @@ local unsigned long crc32_big(crc, buf, len) DOBIG4; len -= 4; } - buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { diff --git a/modules/zlib/src/deflate.c b/modules/zlib/src/deflate.c index 696957705b75..1ec761448de9 100644 --- a/modules/zlib/src/deflate.c +++ b/modules/zlib/src/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -73,6 +73,8 @@ typedef enum { typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); @@ -84,15 +86,16 @@ local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif -#ifdef DEBUG +#ifdef ZLIB_DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif @@ -148,21 +151,14 @@ local const config configuration_table[10] = { * meaning. */ -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ -#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) /* =========================================================================== * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) @@ -173,9 +169,9 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ @@ -197,6 +193,37 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; @@ -270,7 +297,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ @@ -278,14 +305,15 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ s->wrap = wrap; s->gzhead = Z_NULL; - s->w_bits = windowBits; + s->w_bits = (uInt)windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; - s->hash_bits = memLevel + 7; + s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); @@ -319,6 +347,31 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, return deflateReset(strm); } +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; @@ -331,7 +384,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) unsigned avail; z_const unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + if (deflateStateCheck(strm) || dictionary == Z_NULL) return Z_STREAM_ERROR; s = strm->state; wrap = s->wrap; @@ -388,14 +441,35 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + /* ========================================================================= */ int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + if (deflateStateCheck(strm)) { return Z_STREAM_ERROR; } @@ -410,7 +484,11 @@ int ZEXPORT deflateResetKeep (strm) if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : @@ -440,8 +518,8 @@ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } @@ -452,7 +530,7 @@ int ZEXPORT deflatePending (strm, pending, bits) int *bits; z_streamp strm; { - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; if (bits != Z_NULL) @@ -469,7 +547,7 @@ int ZEXPORT deflatePrime (strm, bits, value) deflate_state *s; int put; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; @@ -494,9 +572,8 @@ int ZEXPORT deflateParams(strm, level, strategy) { deflate_state *s; compress_func func; - int err = Z_OK; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST @@ -510,13 +587,22 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - strm->total_in != 0) { + s->high_water) { /* Flush the last buffer: */ - err = deflate(strm, Z_BLOCK); - if (err == Z_BUF_ERROR && s->pending == 0) - err = Z_OK; + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; } if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; @@ -524,7 +610,7 @@ int ZEXPORT deflateParams(strm, level, strategy) s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; - return err; + return Z_OK; } /* ========================================================================= */ @@ -537,12 +623,12 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) { deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; s->nice_match = nice_length; - s->max_chain_length = max_chain; + s->max_chain_length = (uInt)max_chain; return Z_OK; } @@ -569,14 +655,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) { deflate_state *s; uLong complen, wraplen; - Bytef *str; /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (strm == Z_NULL || strm->state == Z_NULL) + if (deflateStateCheck(strm)) return complen + 6; /* compute wrapper length */ @@ -588,9 +673,11 @@ uLong ZEXPORT deflateBound(strm, sourceLen) case 1: /* zlib wrapper */ wraplen = 6 + (s->strstart ? 4 : 0); break; +#ifdef GZIP case 2: /* gzip wrapper */ wraplen = 18; if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; if (s->gzhead->extra != Z_NULL) wraplen += 2 + s->gzhead->extra_len; str = s->gzhead->name; @@ -607,6 +694,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) wraplen += 2; } break; +#endif default: /* for compiler happiness */ wraplen = 6; } @@ -634,10 +722,10 @@ local void putShortMSB (s, b) } /* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; @@ -654,13 +742,23 @@ local void flush_pending(strm) strm->next_out += len; s->pending_out += len; strm->total_out += len; - strm->avail_out -= len; - s->pending -= len; + strm->avail_out -= len; + s->pending -= len; if (s->pending == 0) { s->pending_out = s->pending_buf; } } +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; @@ -669,203 +767,21 @@ int ZEXPORT deflate (strm, flush) int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_BLOCK || flush < 0) { + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); @@ -894,15 +810,197 @@ int ZEXPORT deflate (strm, flush) ERR_RETURN(strm, Z_BUF_ERROR); } + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - (s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush)); + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; @@ -944,7 +1042,6 @@ int ZEXPORT deflate (strm, flush) } } } - Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; @@ -981,18 +1078,9 @@ int ZEXPORT deflateEnd (strm) { int status; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); @@ -1023,7 +1111,7 @@ int ZEXPORT deflateCopy (dest, source) ushf *overlay; - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + if (deflateStateCheck(source) || dest == Z_NULL) { return Z_STREAM_ERROR; } @@ -1073,7 +1161,7 @@ int ZEXPORT deflateCopy (dest, source) * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ -local int read_buf(strm, buf, size) +local unsigned read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; @@ -1097,7 +1185,7 @@ local int read_buf(strm, buf, size) strm->next_in += len; strm->total_in += len; - return (int)len; + return len; } /* =========================================================================== @@ -1151,9 +1239,9 @@ local uInt longest_match(s, cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ + register Bytef *match; /* matched string */ register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ + int best_len = (int)s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; @@ -1188,7 +1276,7 @@ local uInt longest_match(s, cur_match) /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); @@ -1349,7 +1437,11 @@ local uInt longest_match(s, cur_match) #endif /* FASTEST */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + /* =========================================================================== * Check that the match at match_start is indeed a match. */ @@ -1375,7 +1467,7 @@ local void check_match(s, start, match, length) } #else # define check_match(s, start, match, length) -#endif /* DEBUG */ +#endif /* ZLIB_DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. @@ -1390,8 +1482,7 @@ local void check_match(s, start, match, length) local void fill_window(s) deflate_state *s; { - register unsigned n, m; - register Posf *p; + unsigned n; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; @@ -1418,35 +1509,11 @@ local void fill_window(s) */ if (s->strstart >= wsize+MAX_DIST(s)) { - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif + slide_hash(s); more += wsize; } if (s->strm->avail_in == 0) break; @@ -1552,70 +1619,199 @@ local void fill_window(s) if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#define MIN(a, b) ((a) > (b) ? (b) : (a)) + /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. */ - ulg max_block_size = 0xffff; - ulg max_start; + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len != left + s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + +#ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) + left = len; + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* If the last block was written to next_out, then done. */ + if (last) return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ } - if ((long)s->strstart > s->block_start) - FLUSH_BLOCK(s, 0); - return block_done; + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; } /* =========================================================================== @@ -1892,7 +2088,7 @@ local block_state deflate_rle(s, flush) prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); - s->match_length = MAX_MATCH - (int)(strend - scan); + s->match_length = MAX_MATCH - (uInt)(strend - scan); if (s->match_length > s->lookahead) s->match_length = s->lookahead; } diff --git a/modules/zlib/src/deflate.h b/modules/zlib/src/deflate.h index ce0299edd191..23ecdd312bc0 100644 --- a/modules/zlib/src/deflate.h +++ b/modules/zlib/src/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2012 Jean-loup Gailly + * Copyright (C) 1995-2016 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -51,13 +51,16 @@ #define Buf_size 16 /* size of bit buffer in bi_buf */ -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ /* Stream status */ @@ -83,7 +86,7 @@ typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; @@ -100,10 +103,10 @@ typedef struct internal_state { Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ + ulg pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ + ulg gzindex; /* where in extra, name, or comment */ Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ @@ -249,7 +252,7 @@ typedef struct internal_state { uInt matches; /* number of string matches in current block */ uInt insert; /* bytes at end of window left to insert */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif @@ -275,7 +278,7 @@ typedef struct internal_state { /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) @@ -309,7 +312,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, * used. */ -#ifndef DEBUG +#ifndef ZLIB_DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) @@ -328,8 +331,8 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ diff --git a/modules/zlib/src/gzguts.h b/modules/zlib/src/gzguts.h index d87659d0319f..990a4d251493 100644 --- a/modules/zlib/src/gzguts.h +++ b/modules/zlib/src/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -25,6 +25,10 @@ # include # include #endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif #include #ifdef _WIN32 @@ -35,6 +39,10 @@ # include #endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + #ifdef WINAPI_FAMILY # define open _open # define read _read @@ -95,18 +103,19 @@ # endif #endif -/* unlike snprintf (which is required in C99, yet still not supported by - Microsoft more than a decade later!), _snprintf does not guarantee null - termination of the result -- however this is only used in gzlib.c where +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where the result is assured to fit in the space provided */ -#ifdef _MSC_VER +#if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf #endif #ifndef local # define local static #endif -/* compile with -Dlocal if your debugger can't find static symbols */ +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ /* gz* functions always use library allocation functions */ #ifndef STDC @@ -170,7 +179,7 @@ typedef struct { char *path; /* path or fd for error messages */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ - unsigned char *in; /* input buffer */ + unsigned char *in; /* input buffer (double-sized when writing) */ unsigned char *out; /* output buffer (double-sized when reading) */ int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ diff --git a/modules/zlib/src/gzlib.c b/modules/zlib/src/gzlib.c index fae202ef8905..4105e6aff925 100644 --- a/modules/zlib/src/gzlib.c +++ b/modules/zlib/src/gzlib.c @@ -1,11 +1,11 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -94,7 +94,7 @@ local gzFile gz_open(path, fd, mode) const char *mode; { gz_statep state; - size_t len; + z_size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; @@ -188,10 +188,10 @@ local gzFile gz_open(path, fd, mode) } /* save the path name for error messages */ -#ifdef _WIN32 +#ifdef WIDECHAR if (fd == -2) { len = wcstombs(NULL, path, 0); - if (len == (size_t)-1) + if (len == (z_size_t)-1) len = 0; } else @@ -202,7 +202,7 @@ local gzFile gz_open(path, fd, mode) free(state); return NULL; } -#ifdef _WIN32 +#ifdef WIDECHAR if (fd == -2) if (len) wcstombs(state->path, path, len + 1); @@ -211,7 +211,7 @@ local gzFile gz_open(path, fd, mode) else #endif #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->path, len + 1, "%s", (const char *)path); + (void)snprintf(state->path, len + 1, "%s", (const char *)path); #else strcpy(state->path, path); #endif @@ -239,7 +239,7 @@ local gzFile gz_open(path, fd, mode) /* open the file with the appropriate flags (or just use fd) */ state->fd = fd > -1 ? fd : ( -#ifdef _WIN32 +#ifdef WIDECHAR fd == -2 ? _wopen(path, oflag, 0666) : #endif open((const char *)path, oflag, 0666)); @@ -248,8 +248,10 @@ local gzFile gz_open(path, fd, mode) free(state); return NULL; } - if (state->mode == GZ_APPEND) + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ state->mode = GZ_WRITE; /* simplify later checks */ + } /* save the current position for rewinding (only if reading) */ if (state->mode == GZ_READ) { @@ -291,7 +293,7 @@ gzFile ZEXPORT gzdopen(fd, mode) if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ + (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); #else sprintf(path, "", fd); /* for debugging */ #endif @@ -301,7 +303,7 @@ gzFile ZEXPORT gzdopen(fd, mode) } /* -- see zlib.h -- */ -#ifdef _WIN32 +#ifdef WIDECHAR gzFile ZEXPORT gzopen_w(path, mode) const wchar_t *path; const char *mode; @@ -329,6 +331,8 @@ int ZEXPORT gzbuffer(file, size) return -1; /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ if (size < 2) size = 2; /* need two bytes to check magic header */ state->want = size; @@ -604,14 +608,13 @@ void ZLIB_INTERNAL gz_error(state, err, msg) return; } #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, - "%s%s%s", state->path, ": ", msg); + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); #else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); #endif - return; } #ifndef INT_MAX diff --git a/modules/zlib/src/gzread.c b/modules/zlib/src/gzread.c index bf4538eb2742..956b91ea7d9e 100644 --- a/modules/zlib/src/gzread.c +++ b/modules/zlib/src/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -12,6 +12,7 @@ local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. @@ -24,13 +25,17 @@ local int gz_load(state, buf, len, have) unsigned *have; { int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; *have = 0; do { - ret = read(state->fd, buf + *have, len - *have); + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); if (ret <= 0) break; - *have += ret; + *have += (unsigned)ret; } while (*have < len); if (ret < 0) { gz_error(state, Z_ERRNO, zstrerror()); @@ -94,10 +99,8 @@ local int gz_look(state) state->in = (unsigned char *)malloc(state->want); state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); + free(state->out); + free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } @@ -284,33 +287,17 @@ local int gz_skip(state, len) return 0; } -/* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - unsigned got, n; +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return -1; - } + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; /* if len is zero, avoid unnecessary operations */ if (len == 0) @@ -320,32 +307,38 @@ int ZEXPORT gzread(file, buf, len) if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) - return -1; + return 0; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + /* first just try copying data from the output buffer */ if (state->x.have) { - n = state->x.have > len ? len : state->x.have; + if (state->x.have < n) + n = state->x.have; memcpy(buf, state->x.next, n); state->x.next += n; state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) { + else if (state->eof && state->strm.avail_in == 0) { state->past = 1; /* tried to read past end */ break; } /* need output data -- for small len or new stream load up our output buffer */ - else if (state->how == LOOK || len < (state->size << 1)) { + else if (state->how == LOOK || n < (state->size << 1)) { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) - return -1; + return 0; continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ @@ -353,16 +346,16 @@ int ZEXPORT gzread(file, buf, len) /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ - if (gz_load(state, (unsigned char *)buf, len, &n) == -1) - return -1; + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ - strm->avail_out = len; - strm->next_out = (unsigned char *)buf; + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) - return -1; + return 0; n = state->x.have; state->x.have = 0; } @@ -374,8 +367,75 @@ int ZEXPORT gzread(file, buf, len) state->x.pos += n; } while (len); - /* return number of bytes read into user buffer (will fit in int) */ - return (int)got; + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; } /* -- see zlib.h -- */ @@ -408,8 +468,8 @@ int ZEXPORT gzgetc(file) return *(state->x.next)++; } - /* nothing there -- try gzread() */ - ret = gzread(file, buf, 1); + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); return ret < 1 ? -1 : buf[0]; } @@ -451,7 +511,7 @@ int ZEXPORT gzungetc(c, file) if (state->x.have == 0) { state->x.have = 1; state->x.next = state->out + (state->size << 1) - 1; - state->x.next[0] = c; + state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; @@ -473,7 +533,7 @@ int ZEXPORT gzungetc(c, file) } state->x.have++; state->x.next--; - state->x.next[0] = c; + state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; diff --git a/modules/zlib/src/gzwrite.c b/modules/zlib/src/gzwrite.c index aa767fbf63ec..c7b5651d70b9 100644 --- a/modules/zlib/src/gzwrite.c +++ b/modules/zlib/src/gzwrite.c @@ -1,5 +1,5 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,17 +9,19 @@ local int gz_init OF((gz_statep)); local int gz_comp OF((gz_statep, int)); local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); /* Initialize state for writing a gzip file. Mark initialization by setting - state->size to non-zero. Return -1 on failure or 0 on success. */ + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ local int gz_init(state) gz_statep state; { int ret; z_streamp strm = &(state->strm); - /* allocate input buffer */ - state->in = (unsigned char *)malloc(state->want); + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; @@ -47,6 +49,7 @@ local int gz_init(state) gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } + strm->next_in = NULL; } /* mark state as initialized */ @@ -62,17 +65,17 @@ local int gz_init(state) } /* Compress whatever is at avail_in and next_in and write to the output file. - Return -1 if there is an error writing to the output file, otherwise 0. - flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. If gz->direct - is true, then simply write to the output file without compressing, and - ignore flush. */ + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; { - int ret, got; - unsigned have; + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ @@ -81,12 +84,16 @@ local int gz_comp(state, flush) /* write directly if requested */ if (state->direct) { - got = write(state->fd, strm->next_in, strm->avail_in); - if (got < 0 || (unsigned)got != strm->avail_in) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; } - strm->avail_in = 0; return 0; } @@ -97,17 +104,21 @@ local int gz_comp(state, flush) doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->x.next); - if (have && ((got = write(state->fd, state->x.next, have)) < 0 || - (unsigned)got != have)) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; } if (strm->avail_out == 0) { strm->avail_out = state->size; strm->next_out = state->out; + state->x.next = state->out; } - state->x.next = strm->next_out; } /* compress */ @@ -129,7 +140,8 @@ local int gz_comp(state, flush) return 0; } -/* Compress len zeros to output. Return -1 on error, 0 on success. */ +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ local int gz_zero(state, len) gz_statep state; z_off64_t len; @@ -161,32 +173,14 @@ local int gz_zero(state, len) return 0; } -/* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - unsigned put = len; +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return 0; - } + voidpc buf; + z_size_t len; +{ + z_size_t put = len; /* if len is zero, avoid unnecessary operations */ if (len == 0) @@ -209,14 +203,15 @@ int ZEXPORT gzwrite(file, buf, len) do { unsigned have, copy; - if (strm->avail_in == 0) - strm->next_in = state->in; - have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); copy = state->size - have; if (copy > len) copy = len; memcpy(state->in + have, buf, copy); - strm->avail_in += copy; + state->strm.avail_in += copy; state->x.pos += copy; buf = (const char *)buf + copy; len -= copy; @@ -226,19 +221,83 @@ int ZEXPORT gzwrite(file, buf, len) } else { /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* directly compress user buffer to file */ - strm->avail_in = len; - strm->next_in = (z_const Bytef *)buf; - state->x.pos += len; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return 0; + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); } - /* input was all buffered or compressed (put will fit in int) */ - return (int)put; + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; } /* -- see zlib.h -- */ @@ -275,7 +334,7 @@ int ZEXPORT gzputc(file, c) strm->next_in = state->in; have = (unsigned)((strm->next_in + strm->avail_in) - state->in); if (have < state->size) { - state->in[have] = c; + state->in[have] = (unsigned char)c; strm->avail_in++; state->x.pos++; return c & 0xff; @@ -283,8 +342,8 @@ int ZEXPORT gzputc(file, c) } /* no room in buffer or not initialized, use gz_write() */ - buf[0] = c; - if (gzwrite(file, buf, 1) != 1) + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) return -1; return c & 0xff; } @@ -295,11 +354,21 @@ int ZEXPORT gzputs(file, str) const char *str; { int ret; - unsigned len; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; /* write string */ - len = (unsigned)strlen(str); - ret = gzwrite(file, str, len); + len = strlen(str); + ret = gz_write(state, str, len); return ret == 0 && len != 0 ? -1 : ret; } @@ -309,63 +378,73 @@ int ZEXPORT gzputs(file, str) /* -- see zlib.h -- */ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { - int size, len; + int len; + unsigned left; + char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; + return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) - return 0; + return state->err; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return 0; + return state->err; } - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void - (void)vsprintf((char *)(state->in), format, va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; # else - len = vsprintf((char *)(state->in), format, va); + len = vsprintf(next, format, va); # endif #else # ifdef HAS_vsnprintf_void - (void)vsnprintf((char *)(state->in), size, format, va); - len = strlen((char *)(state->in)); + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); # else - len = vsnprintf((char *)(state->in), size, format, va); + len = vsnprintf(next, state->size, format, va); # endif #endif /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) return 0; - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } return len; } @@ -390,73 +469,82 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { - int size, len; + unsigned len, left; + char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that can really pass pointer in ints */ if (sizeof(int) != sizeof(void *)) - return 0; + return Z_STREAM_ERROR; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; + return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) - return 0; + return state->error; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return 0; + return state->error; } - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void - sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) - if (state->in[len] == 0) break; + if (next[len] == 0) + break; # else - len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void - snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen((char *)(state->in)); + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); # else - len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, - a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, - a19, a20); + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + if (len == 0 || len >= state->size || next[state->size - 1] != 0) return 0; - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; state->x.pos += len; - return len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; } #endif @@ -470,7 +558,7 @@ int ZEXPORT gzflush(file, flush) /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing and that there's no error */ @@ -485,11 +573,11 @@ int ZEXPORT gzflush(file, flush) if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return -1; + return state->err; } /* compress remaining data with requested flush */ - gz_comp(state, flush); + (void)gz_comp(state, flush); return state->err; } @@ -520,13 +608,13 @@ int ZEXPORT gzsetparams(file, level, strategy) if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return -1; + return state->err; } /* change compression parameters for subsequent input */ if (state->size) { /* flush previous input with previous parameters before changing */ - if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) return state->err; deflateParams(strm, level, strategy); } diff --git a/modules/zlib/src/infback.c b/modules/zlib/src/infback.c index f3833c2e434a..59679ecbfc5d 100644 --- a/modules/zlib/src/infback.c +++ b/modules/zlib/src/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2011 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -61,7 +61,7 @@ int stream_size; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; - state->wbits = windowBits; + state->wbits = (uInt)windowBits; state->wsize = 1U << windowBits; state->window = window; state->wnext = 0; diff --git a/modules/zlib/src/inffast.c b/modules/zlib/src/inffast.c index bda59ceb6a12..0dbd1dbc09f2 100644 --- a/modules/zlib/src/inffast.c +++ b/modules/zlib/src/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010, 2013 Mark Adler + * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,26 +8,9 @@ #include "inflate.h" #include "inffast.h" -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") #else -# define OFF 1 -# define PUP(a) *++(a) -#endif /* Decode literal, length, and distance codes and write out the resulting @@ -96,9 +79,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; + in = strm->next_in; last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; + out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT @@ -119,9 +102,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ input data or output space */ do { if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } here = lcode[hold & lmask]; @@ -134,14 +117,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); - PUP(out) = (unsigned char)(here.val); + *out++ = (unsigned char)(here.val); } else if (op & 16) { /* length base */ len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); @@ -150,9 +133,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } here = dcode[hold & dmask]; @@ -165,10 +148,10 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } } @@ -196,30 +179,30 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR if (len <= op - whave) { do { - PUP(out) = 0; + *out++ = 0; } while (--len); continue; } len -= op - whave; do { - PUP(out) = 0; + *out++ = 0; } while (--op > whave); if (op == 0) { from = out - dist; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--len); continue; } #endif } - from = window - OFF; + from = window; if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } @@ -230,14 +213,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (op < len) { /* some from end of window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); - from = window - OFF; + from = window; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } @@ -248,35 +231,35 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (op < len) { /* some from window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; len -= 3; } if (len) { - PUP(out) = PUP(from); + *out++ = *from++; if (len > 1) - PUP(out) = PUP(from); + *out++ = *from++; } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; len -= 3; } while (len > 2); if (len) { - PUP(out) = PUP(from); + *out++ = *from++; if (len > 1) - PUP(out) = PUP(from); + *out++ = *from++; } } } @@ -313,8 +296,8 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold &= (1U << bits) - 1; /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; + strm->next_in = in; + strm->next_out = out; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); diff --git a/modules/zlib/src/inflate.c b/modules/zlib/src/inflate.c index 4fd3f3c1809b..ac333e8c2eda 100644 --- a/modules/zlib/src/inflate.c +++ b/modules/zlib/src/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2012 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -92,6 +92,7 @@ #endif /* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, unsigned copy)); @@ -101,12 +102,26 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; @@ -131,7 +146,7 @@ z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->wsize = 0; state->whave = 0; @@ -147,7 +162,7 @@ int windowBits; struct inflate_state FAR *state; /* get the state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* extract wrap request from windowBits parameter */ @@ -156,7 +171,7 @@ int windowBits; windowBits = -windowBits; } else { - wrap = (windowBits >> 4) + 1; + wrap = (windowBits >> 4) + 5; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; @@ -210,7 +225,9 @@ int stream_size; if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; + state->strm = strm; state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); @@ -234,17 +251,17 @@ int value; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; state->bits = 0; return Z_OK; } - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; return Z_OK; } @@ -625,7 +642,7 @@ int flush; static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; @@ -645,6 +662,8 @@ int flush; NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); @@ -672,7 +691,7 @@ int flush; len = BITS(4) + 8; if (state->wbits == 0) state->wbits = len; - else if (len > state->wbits) { + if (len > 15 || len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; @@ -699,14 +718,16 @@ int flush; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: @@ -715,7 +736,8 @@ int flush; state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: @@ -724,7 +746,8 @@ int flush; state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) @@ -742,7 +765,7 @@ int flush; len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -761,9 +784,9 @@ int flush; if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) - state->head->name[state->length++] = len; + state->head->name[state->length++] = (Bytef)len; } while (len && copy < have); - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -782,9 +805,9 @@ int flush; if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) - state->head->comment[state->length++] = len; + state->head->comment[state->length++] = (Bytef)len; } while (len && copy < have); - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -796,7 +819,7 @@ int flush; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); - if (hold != (state->check & 0xffff)) { + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; @@ -1177,11 +1200,11 @@ int flush; out -= left; strm->total_out += out; state->total += out; - if (out) + if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; - if (( + if ((state->wrap & 4) && ( #ifdef GUNZIP state->flags ? hold : #endif @@ -1240,10 +1263,10 @@ int flush; strm->total_in += in; strm->total_out += out; state->total += out; - if (state->wrap && out) + if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) @@ -1255,7 +1278,7 @@ int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); @@ -1273,7 +1296,7 @@ uInt *dictLength; struct inflate_state FAR *state; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* copy dictionary */ @@ -1298,7 +1321,7 @@ uInt dictLength; int ret; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; @@ -1330,7 +1353,7 @@ gz_headerp head; struct inflate_state FAR *state; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; @@ -1383,7 +1406,7 @@ z_streamp strm; struct inflate_state FAR *state; /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; @@ -1430,7 +1453,7 @@ z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } @@ -1445,8 +1468,7 @@ z_streamp source; unsigned wsize; /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + if (inflateStateCheck(source) || dest == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; @@ -1467,6 +1489,7 @@ z_streamp source; /* copy state */ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); @@ -1488,26 +1511,51 @@ int subvert; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - state->sane = !subvert; #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; return Z_OK; #else + (void)subvert; state->sane = 1; return Z_DATA_ERROR; #endif } +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + long ZEXPORT inflateMark(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) - return (long)(((unsigned long)0 - 1) << 16); + if (inflateStateCheck(strm)) + return -(1L << 16); state = (struct inflate_state FAR *)strm->state; return (long)(((unsigned long)((long)state->back)) << 16) + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/modules/zlib/src/inflate.h b/modules/zlib/src/inflate.h index 95f4986d4002..a46cce6b6d05 100644 --- a/modules/zlib/src/inflate.h +++ b/modules/zlib/src/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2009 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -18,7 +18,7 @@ /* Possible inflate modes between inflate() calls */ typedef enum { - HEAD, /* i: waiting for magic header */ + HEAD = 16180, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ @@ -77,11 +77,14 @@ typedef enum { CHECK -> LENGTH -> DONE */ -/* state maintained between inflate() calls. Approximately 10K bytes. */ +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ diff --git a/modules/zlib/src/inftrees.c b/modules/zlib/src/inftrees.c index 44d89cf24e1c..2ea08fc13ea8 100644 --- a/modules/zlib/src/inftrees.c +++ b/modules/zlib/src/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2013 Mark Adler + * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; + " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -54,7 +54,7 @@ unsigned short FAR *work; code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ + unsigned match; /* use base and extra for symbol >= match */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -181,19 +181,17 @@ unsigned short FAR *work; switch (type) { case CODES: base = extra = work; /* dummy value--not used */ - end = 19; + match = 20; break; case LENS: base = lbase; - base -= 257; extra = lext; - extra -= 257; - end = 256; + match = 257; break; - default: /* DISTS */ + default: /* DISTS */ base = dbase; extra = dext; - end = -1; + match = 0; } /* initialize state for loop */ @@ -216,13 +214,13 @@ unsigned short FAR *work; for (;;) { /* create table entry */ here.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { + if (work[sym] + 1U < match) { here.op = (unsigned char)0; here.val = work[sym]; } - else if ((int)(work[sym]) > end) { - here.op = (unsigned char)(extra[work[sym]]); - here.val = base[work[sym]]; + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; } else { here.op = (unsigned char)(32 + 64); /* end of block */ diff --git a/modules/zlib/src/mozzconf.h b/modules/zlib/src/mozzconf.h index f1da5ae28faa..9521297eabdc 100644 --- a/modules/zlib/src/mozzconf.h +++ b/modules/zlib/src/mozzconf.h @@ -44,7 +44,6 @@ #define gzputs MOZ_Z_gzputs #define gzgets MOZ_Z_gzgets #define gzputc MOZ_Z_gzputc -#define gzgetc MOZ_Z_gzgetc #define gzungetc MOZ_Z_gzungetc #define gzflush MOZ_Z_gzflush #define gzseek MOZ_Z_gzseek @@ -126,4 +125,45 @@ #define gzvprintf MOZ_Z_gzvprintf #define inflateGetDictionary MOZ_Z_inflateGetDictionary +/* New as of zlib-1.2.11 */ +#define adler32_combine_ MOZ_Z_adler32_combine_ +#define crc32_combine_ MOZ_Z_crc32_combine_ +#define deflate_fast MOZ_Z_deflate_fast +#define deflate_slow MOZ_Z_deflate_slow +#define deflateStateCheck MOZ_Z_deflateStateCheck +#define deflate_stored MOZ_Z_deflate_stored +#define fill_window MOZ_Z_fill_window +#define flush_pending MOZ_Z_flush_pending +#define longest_match MOZ_Z_longest_match +#define read_buf MOZ_Z_read_buf +#define slide_hash MOZ_Z_slide_hash +#define gz_open MOZ_Z_gz_open +#define gz_reset MOZ_Z_gz_reset +#define gz_avail MOZ_Z_gz_avail +#define gz_fetch MOZ_Z_gz_fetch +#define gz_decomp MOZ_Z_gz_decomp +#define gz_write MOZ_Z_gz_write +#define gz_comp MOZ_Z_gz_comp +#define gz_init MOZ_Z_gz_init +#define gz_write MOZ_Z_gz_write +#define gz_zero MOZ_Z_gz_zero +#define gz_load MOZ_Z_gz_load +#define gz_look MOZ_Z_gz_look +#define gz_read MOZ_Z_gz_read +#define gz_skip MOZ_Z_gz_skip +#define syncsearch MOZ_Z_syncsearch +#define updatewindow MOZ_Z_updatewindow +#define inflateStateCheck MOZ_Z_inflateStateCheck +#define bi_flush MOZ_Z_bi_flush +#define bi_windup MOZ_Z_bi_windup +#define bl_order MOZ_Z_bl_order +#define build_tree MOZ_Z_build_tree +#define compress_block MOZ_Z_compress_block +#define init_block MOZ_Z_init_block +#define pqdownheap MOZ_Z_pqdownheap +#define scan_tree MOZ_Z_scan_tree +#define send_tree MOZ_Z_send_tree +#define slide_hash MOZ_Z_slide_hash +#define uncompress2 MOZ_Z_uncompress2 + #endif diff --git a/modules/zlib/src/trees.c b/modules/zlib/src/trees.c index 1fd7759ef004..50cf4b4571cf 100644 --- a/modules/zlib/src/trees.c +++ b/modules/zlib/src/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2012 Jean-loup Gailly + * Copyright (C) 1995-2017 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -36,7 +36,7 @@ #include "deflate.h" -#ifdef DEBUG +#ifdef ZLIB_DEBUG # include #endif @@ -122,13 +122,13 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local static_tree_desc static_l_desc = +local const static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local static_tree_desc static_d_desc = +local const static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local static_tree_desc static_bl_desc = +local const static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== @@ -152,18 +152,16 @@ local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif -#ifndef DEBUG +#ifndef ZLIB_DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ -#else /* DEBUG */ +#else /* !ZLIB_DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } @@ -182,7 +180,7 @@ local void gen_trees_header OF((void)); * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) @@ -208,12 +206,12 @@ local void send_bits(s, value, length) s->bi_valid += length; } } -#else /* !DEBUG */ +#else /* !ZLIB_DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ + int val = (int)value;\ s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ @@ -223,7 +221,7 @@ local void send_bits(s, value, length) s->bi_valid += len;\ }\ } -#endif /* DEBUG */ +#endif /* ZLIB_DEBUG */ /* the arguments must not have side effects */ @@ -317,7 +315,7 @@ local void tr_static_init() * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H -# ifndef DEBUG +# ifndef ZLIB_DEBUG # include # endif @@ -394,7 +392,7 @@ void ZLIB_INTERNAL _tr_init(s) s->bi_buf = 0; s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif @@ -522,12 +520,12 @@ local void gen_bitlen(s, desc) xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); } if (overflow == 0) return; - Trace((stderr,"\nbit length overflow\n")); + Tracev((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ @@ -554,9 +552,8 @@ local void gen_bitlen(s, desc) m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; tree[m].Len = (ush)bits; } n--; @@ -578,7 +575,7 @@ local void gen_codes (tree, max_code, bl_count) ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ + unsigned code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ @@ -586,7 +583,8 @@ local void gen_codes (tree, max_code, bl_count) * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. @@ -599,7 +597,7 @@ local void gen_codes (tree, max_code, bl_count) int len = tree[n].Len; if (len == 0) continue; /* Now reverse the bits */ - tree[n].Code = bi_reverse(next_code[len]++, len); + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); @@ -821,7 +819,7 @@ local int build_bl_tree(s) if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -869,11 +867,17 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) int last; /* one if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ -#ifdef DEBUG + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; #endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== @@ -894,7 +898,7 @@ void ZLIB_INTERNAL _tr_align(s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); @@ -902,7 +906,7 @@ void ZLIB_INTERNAL _tr_align(s) /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. + * trees or store, and write out the encoded block. */ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; @@ -974,7 +978,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { @@ -983,7 +987,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) max_blindex+1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 3 + s->opt_len; #endif } @@ -995,7 +999,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) if (last) { bi_windup(s); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } @@ -1090,7 +1094,7 @@ local void compress_block(s, ltree, dtree) send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { - dist -= base_dist[code]; + dist -= (unsigned)base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ @@ -1193,34 +1197,7 @@ local void bi_windup(s) } s->bi_buf = 0; s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/modules/zlib/src/uncompr.c b/modules/zlib/src/uncompr.c index 242e9493dff5..f03a1a865e34 100644 --- a/modules/zlib/src/uncompr.c +++ b/modules/zlib/src/uncompr.c @@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,51 +9,85 @@ #include "zlib.h" /* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. */ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { - z_stream stream; - int err; - - stream.next_in = (z_const Bytef *)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; + return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/modules/zlib/src/zconf.h b/modules/zlib/src/zconf.h index fa0950b9deac..8e2c0a3e41ab 100644 --- a/modules/zlib/src/zconf.h +++ b/modules/zlib/src/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2013 Jean-loup Gailly. + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -20,7 +20,7 @@ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ # define Z_PREFIX_SET -/* all linked symbols */ +/* all linked symbols and init macros */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align @@ -32,6 +32,7 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 @@ -40,10 +41,14 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams @@ -70,6 +75,8 @@ # define gzeof z_gzeof # define gzerror z_gzerror # define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ # define gzgets z_gzgets @@ -81,7 +88,6 @@ # define gzopen_w z_gzopen_w # endif # define gzprintf z_gzprintf -# define gzvprintf z_gzvprintf # define gzputc z_gzputc # define gzputs z_gzputs # define gzread z_gzread @@ -92,32 +98,39 @@ # define gztell z_gztell # define gztell64 z_gztell64 # define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf # define gzwrite z_gzwrite # endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit # define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed # define inflateCopy z_inflateCopy # define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary # define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 # define inflateInit2_ z_inflateInit2_ # define inflateInit_ z_inflateInit_ # define inflateMark z_inflateMark # define inflatePrime z_inflatePrime # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep # define inflateSetDictionary z_inflateSetDictionary -# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine -# define inflateResetKeep z_inflateResetKeep +# define inflateValidate z_inflateValidate # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table # ifndef Z_SOLO # define uncompress z_uncompress +# define uncompress2 z_uncompress2 # endif # define zError z_zError # ifndef Z_SOLO @@ -227,9 +240,19 @@ # define z_const #endif -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong #endif /* Maximum value for memLevel in deflateInit2 */ @@ -259,7 +282,7 @@ Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes for small objects. */ @@ -341,7 +364,7 @@ # endif #endif -#if defined (__BEOS__) || (defined(__OS2__) && defined(__declspec)) +#if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) diff --git a/modules/zlib/src/zlib.h b/modules/zlib/src/zlib.h index b6ce7f1b094c..f09cdaf1e054 100644 --- a/modules/zlib/src/zlib.h +++ b/modules/zlib/src/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.8, April 28th, 2013 + version 1.2.11, January 15th, 2017 - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.8" -#define ZLIB_VERNUM 0x1280 +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_REVISION 11 #define ZLIB_VER_SUBREVISION 0 /* @@ -65,7 +65,8 @@ extern "C" { with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - This library can optionally read and write gzip streams in memory as well. + This library can optionally read and write gzip and raw deflate streams in + memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- @@ -74,7 +75,7 @@ extern "C" { The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash - even in case of corrupted input. + even in the case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); @@ -87,7 +88,7 @@ typedef struct z_stream_s { uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total number of input bytes read so far */ - Bytef *next_out; /* next output byte should be put there */ + Bytef *next_out; /* next output byte will go here */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total number of bytes output so far */ @@ -98,8 +99,9 @@ typedef struct z_stream_s { free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; @@ -142,7 +144,9 @@ typedef gz_header FAR *gz_headerp; zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if @@ -155,7 +159,7 @@ typedef gz_header FAR *gz_headerp; The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly + uncompressed data and may be saved for use by the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ @@ -200,7 +204,7 @@ typedef gz_header FAR *gz_headerp; #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ +/* Possible values of the data_type field for deflate() */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ @@ -258,11 +262,11 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - - Provide more output starting at next_out and update next_out and avail_out + - Generate more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. + should be set only when necessary. Some output may be provided even if + flush is zero. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more @@ -271,7 +275,9 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumulate before producing output, in order to @@ -292,8 +298,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. + in order for the decompressor to finish the block before the empty fixed + codes block. If flush is set to Z_BLOCK, a deflate block is completed and emitted, as for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to @@ -319,34 +325,38 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). Then deflate is guaranteed to - return Z_STREAM_END. If not enough output space is provided, deflate will - not return Z_STREAM_END, and it must be called again as described above. + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. */ @@ -369,23 +379,21 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. */ @@ -401,17 +409,20 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). - - Provide more output starting at next_out and update next_out and avail_out + - Generate more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be @@ -428,7 +439,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the + To assist in this, on return inflate() always sets strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or @@ -454,7 +465,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all of the uncompressed data for the operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not + saved by the compressor for this purpose.) The use of Z_FINISH is not required to perform an inflation in one step. However it may be used to inform inflate that a faster approach can be used for the single inflate() call. Z_FINISH also informs inflate to not maintain a sliding window if the @@ -476,32 +487,33 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 + below. At the end of the stream, inflate() checks that its computed Adler-32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() can decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically, if requested when initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. When processing + header is not retained unless inflateGetHeader() is used. When processing gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - producted so far. The CRC-32 is checked against the gzip trailer. + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. + recovery of the data is to be attempted. */ @@ -511,9 +523,8 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); This function discards any unprocessed input and does not flush any pending output. - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. */ @@ -544,16 +555,29 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. + with no zlib header or trailer, and will not compute a check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is @@ -614,12 +638,12 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. - Upon return of this function, strm->adler is set to the adler32 value + Upon return of this function, strm->adler is set to the Adler-32 value of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value + which dictionary has been used by the compressor. (The Adler-32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. + Adler-32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is @@ -628,6 +652,28 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* @@ -648,10 +694,10 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). @@ -662,20 +708,36 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int strategy)); /* Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be + interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, @@ -793,7 +855,7 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to + recommended that a check value such as an Adler-32 or a CRC-32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. @@ -802,7 +864,10 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -823,7 +888,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. + can be determined from the Adler-32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called at any time to set the dictionary. If the provided dictionary is smaller than the @@ -834,7 +899,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not + expected one (incorrect Adler-32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ @@ -892,7 +957,7 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The + but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source @@ -904,7 +969,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL), or if @@ -956,7 +1023,7 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); location in the input stream can be determined from avail_in and data_type as noted in the description for the Z_BLOCK flush parameter for inflate. - inflateMark returns the value noted above or -1 << 16 if the provided + inflateMark returns the value noted above, or -65536 if the provided source stream state was inconsistent. */ @@ -1048,9 +1115,9 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those @@ -1059,12 +1126,12 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). @@ -1092,7 +1159,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() + assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ @@ -1114,7 +1181,7 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 7.6: size of z_off_t Compiler, assembler, and debug options: - 8: DEBUG + 8: ZLIB_DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) @@ -1164,7 +1231,8 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1180,7 +1248,7 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. + compressed data. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, @@ -1203,7 +1271,7 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. + is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1212,6 +1280,14 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + /* gzip file access functions */ /* @@ -1290,10 +1366,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); default buffer size is 8192 bytes. This function must be called after gzopen() or gzdopen(), and before any other calls that read or write the file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1304,10 +1379,12 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); @@ -1335,7 +1412,35 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); case. gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, @@ -1346,19 +1451,33 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, error. */ +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); @@ -1418,7 +1537,7 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. + concatenated gzip streams. gzflush should be called only when strictly necessary because it will degrade compression if called too often. @@ -1572,7 +1691,7 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); return the updated checksum. If buf is Z_NULL, this function returns the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. Usage example: @@ -1585,6 +1704,12 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + /* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); @@ -1614,6 +1739,12 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + /* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); @@ -1644,19 +1775,35 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif #ifndef Z_SOLO @@ -1676,11 +1823,10 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #else -# undef gzgetc # define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or @@ -1738,19 +1884,16 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #endif /* !Z_SOLO */ -/* hack for buggy compilers */ -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; -#endif - /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if defined(_WIN32) && !defined(Z_SOLO) +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif diff --git a/modules/zlib/src/zutil.c b/modules/zlib/src/zutil.c index 23d2ebef008f..a76c6b0c7e55 100644 --- a/modules/zlib/src/zutil.c +++ b/modules/zlib/src/zutil.c @@ -1,5 +1,5 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * Copyright (C) 1995-2017 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -10,21 +10,18 @@ # include "gzguts.h" #endif -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - z_const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; const char * ZEXPORT zlibVersion() @@ -61,7 +58,7 @@ uLong ZEXPORT zlibCompileFlags() case 8: flags += 2 << 6; break; default: flags += 3 << 6; } -#ifdef DEBUG +#ifdef ZLIB_DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) @@ -115,8 +112,8 @@ uLong ZEXPORT zlibCompileFlags() return flags; } -#ifdef DEBUG - +#ifdef ZLIB_DEBUG +#include # ifndef verbose # define verbose 0 # endif @@ -219,9 +216,11 @@ local ptr_table table[MAX_PTR]; voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { - voidpf buf = opaque; /* just to make some compilers happy */ + voidpf buf; ulg bsize = (ulg)items*size; + (void)opaque; + /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ @@ -244,6 +243,9 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; + + (void)opaque; + if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; @@ -259,7 +261,6 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) next_ptr--; return; } - ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } @@ -278,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { - if (opaque) opaque = 0; /* to make compiler happy */ + (void)opaque; return _halloc((long)items, size); } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { - if (opaque) opaque = 0; /* to make compiler happy */ + (void)opaque; _hfree(ptr); } @@ -306,7 +307,7 @@ voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) unsigned items; unsigned size; { - if (opaque) items += size - size; /* make compiler happy */ + (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } @@ -315,8 +316,8 @@ void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { + (void)opaque; free(ptr); - if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ diff --git a/modules/zlib/src/zutil.h b/modules/zlib/src/zutil.h index 18fbef2aa41f..b079ea6a80f5 100644 --- a/modules/zlib/src/zutil.h +++ b/modules/zlib/src/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2013 Jean-loup Gailly. + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -36,7 +36,9 @@ #ifndef local # define local static #endif -/* compile with -Dlocal if your debugger can't find static symbols */ +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ typedef unsigned char uch; typedef uch FAR uchf; @@ -98,28 +100,38 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifdef AMIGA -# define OS_CODE 0x01 +# define OS_CODE 1 #endif #if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 +# define OS_CODE 2 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + #if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 +# define OS_CODE 5 #endif #ifdef OS2 -# define OS_CODE 0x06 +# define OS_CODE 6 # if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 +# define OS_CODE 7 # ifndef Z_SOLO # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ @@ -131,18 +143,24 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#ifdef TOPS20 -# define OS_CODE 0x0a +#ifdef __acorn +# define OS_CODE 13 #endif -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 #endif -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 #endif #if defined(_BEOS_) || defined(RISCOS) @@ -177,7 +195,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* common defaults */ #ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ +# define OS_CODE 3 /* assume Unix */ #endif #ifndef F_OPEN @@ -215,13 +233,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); #endif -/* Ignore the Mozilla build env's DEBUG unless ZLIB_DEBUG is also set. */ -#ifndef ZLIB_DEBUG -#undef DEBUG -#endif - /* Diagnostic functions */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; extern void ZLIB_INTERNAL z_error OF((char *m)); diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index 59bbd222bbc6..44f9f17bd18f 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1493131951026000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1493217420822000); diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors index 6db79b378dad..73c419f56e74 100644 --- a/security/manager/ssl/nsSTSPreloadList.errors +++ b/security/manager/ssl/nsSTSPreloadList.errors @@ -1,7 +1,6 @@ 007sascha.de: max-age too low: 3600 00f.net: did not receive HSTS header 020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] -0i0.nl: could not connect to host 0p.no: did not receive HSTS header 0x.sk: could not connect to host 0x1337.eu: could not connect to host @@ -22,6 +21,7 @@ 1p.ro: could not connect to host 1password.com: did not receive HSTS header 1xcess.com: could not connect to host +1years.cc: did not receive HSTS header 206rc.net: max-age too low: 2592000 247loan.com: max-age too low: 0 25daysof.io: could not connect to host @@ -42,7 +42,6 @@ 4455software.com: did not receive HSTS header 4679.space: could not connect to host 47ronin.com: did not receive HSTS header -491mhz.net: could not connect to host 4cclothing.com: could not connect to host 4elements.com: did not receive HSTS header 4mm.org: did not receive HSTS header @@ -51,6 +50,7 @@ 540.co: did not receive HSTS header 56ct.com: could not connect to host 60ych.net: did not receive HSTS header +6120.eu: could not connect to host 7kovrikov.ru: did not receive HSTS header 808.lv: could not connect to host 83i.net: could not connect to host @@ -97,6 +97,7 @@ adam-kostecki.de: did not receive HSTS header adamkostecki.de: did not receive HSTS header adams.net: max-age too low: 0 adamwk.com: did not receive HSTS header +adboos.com: did not receive HSTS header addaxpetroleum.com: could not connect to host addvocate.com: could not connect to host adelevie.com: could not connect to host @@ -178,7 +179,6 @@ alphalabs.xyz: could not connect to host altfire.ca: could not connect to host altmv.com: max-age too low: 7776000 alwaysmine.fi: did not receive HSTS header -alza.cz: did not receive HSTS header amaforums.org: could not connect to host amavis.org: did not receive HSTS header american-truck-simulator.de: could not connect to host @@ -239,6 +239,7 @@ anycoin.me: could not connect to host aojiao.org: could not connect to host apachelounge.com: did not receive HSTS header apeasternpower.com: max-age too low: 0 +apervita.net: could not connect to host api.mega.co.nz: could not connect to host apibot.de: could not connect to host apis.google.com: did not receive HSTS header (error ignored - included regardless) @@ -275,6 +276,7 @@ arrayify.com: could not connect to host ars-design.net: could not connect to host ars.toscana.it: max-age too low: 0 artistnetwork.nl: did not receive HSTS header +arturkohut.com: could not connect to host arvamus.eu: could not connect to host as.se: could not connect to host as9178.net: could not connect to host @@ -288,13 +290,14 @@ asm-x.com: did not receive HSTS header asmui.ga: could not connect to host asmui.ml: could not connect to host asrob.eu: could not connect to host -ass.org.au: could not connect to host +ass.org.au: did not receive HSTS header assdecoeur.org: could not connect to host asset-alive.com: did not receive HSTS header asset-alive.net: did not receive HSTS header astrath.net: could not connect to host astrolpost.com: could not connect to host astromelody.com: did not receive HSTS header +asuhe.cc: did not receive HSTS header atavio.at: could not connect to host atavio.ch: could not connect to host atavio.de: did not receive HSTS header @@ -358,7 +361,6 @@ bandb.xyz: could not connect to host bandrcrafts.com: could not connect to host bannisbierblog.de: could not connect to host banqingdiao.com: could not connect to host -barbaros.info: could not connect to host barely.sexy: did not receive HSTS header barrelhead.org: could not connect to host bashcode.ninja: could not connect to host @@ -377,6 +379,7 @@ bckp.de: could not connect to host bcm.com.au: max-age too low: 0 bcnx.de: max-age too low: 0 bcsytv.com: could not connect to host +bcvps.com: did not receive HSTS header be.search.yahoo.com: did not receive HSTS header beach-inspector.com: did not receive HSTS header beachi.es: could not connect to host @@ -419,6 +422,7 @@ bezorg.ninja: could not connect to host bf.am: max-age too low: 0 bgcparkstad.nl: did not receive HSTS header bgmn.net: could not connect to host +bhatia.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] bi.search.yahoo.com: did not receive HSTS header bidon.ca: did not receive HSTS header bieberium.de: could not connect to host @@ -479,6 +483,7 @@ blog.lookout.com: did not receive HSTS header bloglikepro.com: could not connect to host blubbablasen.de: could not connect to host blucas.org: did not receive HSTS header +blue-labs.org: could not connect to host blueliv.com: did not receive HSTS header bluescloud.xyz: could not connect to host bluetenmeer.com: did not receive HSTS header @@ -556,7 +561,7 @@ burrow.ovh: could not connect to host burtrum.me: could not connect to host burtrum.top: could not connect to host business.lookout.com: could not connect to host -business.medbank.com.mt: max-age too low: 9838382 +business.medbank.com.mt: max-age too low: 9751780 businesshosting.nl: did not receive HSTS header businessloanstoday.com: max-age too low: 0 busold.ws: could not connect to host @@ -576,6 +581,7 @@ c0rn3j.com: did not receive HSTS header c1yd3i.me: could not connect to host c3b.info: could not connect to host cabarave.com: could not connect to host +cabsites.com: could not connect to host cabusar.fr: could not connect to host caconnect.org: could not connect to host cadao.me: did not receive HSTS header @@ -611,6 +617,7 @@ cardurl.com: did not receive HSTS header cargobay.net: could not connect to host caringladies.org: could not connect to host carlandfaith.com: could not connect to host +carlgo11.com: could not connect to host carlolly.co.uk: could not connect to host carlosalves.info: could not connect to host carsforbackpackers.com: could not connect to host @@ -697,7 +704,7 @@ cigarblogs.net: could not connect to host cigi.site: could not connect to host cim2b.de: could not connect to host cimalando.eu: could not connect to host -cip.md: max-age too low: 604800 +cip.md: could not connect to host ciplanutrition.com: did not receive HSTS header circara.com: did not receive HSTS header ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] @@ -710,6 +717,7 @@ clcleaningco.com: could not connect to host cleaningsquad.ca: max-age too low: 0 clerkendweller.uk: could not connect to host clickandgo.com: did not receive HSTS header +climatestew.com: could not connect to host clint.id.au: max-age too low: 0 clintonbloodworth.com: could not connect to host clintonbloodworth.io: could not connect to host @@ -818,7 +826,6 @@ crazyhotseeds.com: did not receive HSTS header creativephysics.ml: could not connect to host creativeplayuk.com: did not receive HSTS header crendontech.com: could not connect to host -crestasantos.com: could not connect to host crestoncottage.com: could not connect to host critical.today: could not connect to host criticalaim.com: could not connect to host @@ -870,7 +877,6 @@ cyphertite.com: could not connect to host dad256.tk: could not connect to host dadtheimpaler.com: could not connect to host daemen.org: could not connect to host -daemon.xin: could not connect to host dah5.com: did not receive HSTS header dailystormerpodcasts.com: did not receive HSTS header daimadi.com: could not connect to host @@ -884,7 +890,6 @@ danieldk.eu: did not receive HSTS header danieliancu.com: could not connect to host danielworthy.com: did not receive HSTS header danijobs.com: could not connect to host -dannyrohde.de: could not connect to host danrl.de: could not connect to host daolerp.xyz: could not connect to host dargasia.is: could not connect to host @@ -971,6 +976,7 @@ desiccantpackets.com: did not receive HSTS header designthinking.or.jp: did not receive HSTS header despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] destinationbijoux.fr: could not connect to host +destom.be: could not connect to host detector.exposed: could not connect to host detest.org: could not connect to host devafterdark.com: could not connect to host @@ -1005,8 +1011,8 @@ djz4music.com: did not receive HSTS header dl.google.com: did not receive HSTS header (error ignored - included regardless) dlc.viasinc.com: could not connect to host dlemper.de: did not receive HSTS header -dlouwrink.nl: could not connect to host dmix.ca: could not connect to host +dmz.ninja: could not connect to host dn42.eu: could not connect to host dns.google.com: did not receive HSTS header (error ignored - included regardless) do-do.tk: could not connect to host @@ -1035,7 +1041,6 @@ doridian.de: could not connect to host doridian.net: did not receive HSTS header doridian.org: could not connect to host dossplumbing.co.za: did not receive HSTS header -dot.ro: did not receive HSTS header dotadata.me: could not connect to host dovetailnow.com: could not connect to host download.jitsi.org: did not receive HSTS header @@ -1096,6 +1101,7 @@ ecg.fr: could not connect to host echopaper.com: could not connect to host echosystem.fr: did not receive HSTS header ecole-en-danger.fr: could not connect to host +ecole-maternelle-saint-joseph.be: could not connect to host ecomparemo.com: did not receive HSTS header ecorus.eu: did not receive HSTS header edcphenix.tk: could not connect to host @@ -1155,6 +1161,7 @@ emmable.com: could not connect to host emnitech.com: could not connect to host empleosentorreon.mx: could not connect to host empleostampico.com: did not receive HSTS header +enaah.de: could not connect to host enargia.jp: max-age too low: 0 encode.space: did not receive HSTS header encoder.pw: could not connect to host @@ -1165,6 +1172,7 @@ endlessdark.net: max-age too low: 600 engelwerbung.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] enigmacpt.com: did not receive HSTS header enigmail.net: did not receive HSTS header +enskatson-sippe.de: could not connect to host enteente.club: could not connect to host enteente.space: could not connect to host enteente.xyz: could not connect to host @@ -1186,8 +1194,6 @@ equatetechnologies.com.au: max-age too low: 3600 equilibre-yoga-jennifer-will.com: could not connect to host erawanarifnugroho.com: did not receive HSTS header eressea.xyz: could not connect to host -ericyl.com: could not connect to host -eriix.org: could not connect to host ernesto.at: could not connect to host eromixx.com: did not receive HSTS header erotalia.es: could not connect to host @@ -1293,7 +1299,6 @@ fexmen.com: could not connect to host ffmradio.de: did not receive HSTS header fhdhelp.de: could not connect to host fhdhilft.de: could not connect to host -fierlafijn.net: could not connect to host fiftyshadesofluca.ml: could not connect to host fig.co: did not receive HSTS header fightr.co: could not connect to host @@ -1321,7 +1326,6 @@ fitnesswerk.de: could not connect to host five.vn: did not receive HSTS header fivestarsitters.com: did not receive HSTS header fixatom.com: did not receive HSTS header -fixel.express: could not connect to host fixingdns.com: did not receive HSTS header fj.search.yahoo.com: did not receive HSTS header fjruiz.es: could not connect to host @@ -1382,6 +1386,7 @@ freesounding.ru: could not connect to host freethought.org.au: could not connect to host freetsa.org: could not connect to host freeutopia.org: did not receive HSTS header +freqlabs.com: could not connect to host freshfind.xyz: could not connect to host frezbo.com: could not connect to host frforms.com: did not receive HSTS header @@ -1447,7 +1452,6 @@ gatilagata.com.br: did not receive HSTS header gchq.wtf: could not connect to host gdpventure.com: max-age too low: 0 gedankenbude.info: did not receive HSTS header -geekbundle.org: did not receive HSTS header geekcast.co.uk: did not receive HSTS header geeky.software: could not connect to host geli-graphics.com: did not receive HSTS header @@ -1484,7 +1488,6 @@ gheorghesarcov.tk: could not connect to host giakki.eu: could not connect to host gietvloergarant.nl: did not receive HSTS header gigacloud.org: max-age too low: 0 -gigacog.com: could not connect to host gilly.berlin: did not receive HSTS header gingali.de: did not receive HSTS header gintenreiter-photography.com: did not receive HSTS header @@ -1505,13 +1508,13 @@ globalexpert.co.nz: could not connect to host globalittech.com: could not connect to host globalmusic.ga: could not connect to host gloomyvancouver.com: could not connect to host -glopoi.com: did not receive HSTS header +glopoi.com: max-age too low: 0 glws.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] gm.search.yahoo.com: did not receive HSTS header gmail.com: did not receive HSTS header (error ignored - included regardless) gmantra.org: could not connect to host gmoes.at: max-age too low: 600000 -go.ax: could not connect to host +go.ax: did not receive HSTS header go2sh.de: did not receive HSTS header goabonga.com: could not connect to host goaltree.ch: did not receive HSTS header @@ -1534,7 +1537,7 @@ goodwin43.ru: could not connect to host google: could not connect to host (error ignored - included regardless) googlemail.com: did not receive HSTS header (error ignored - included regardless) googleplex.com: did not receive HSTS header (error ignored - included regardless) -goolok.com: did not receive HSTS header +goolok.com: could not connect to host gorilla-gym.site: could not connect to host gotech.com.eg: did not receive HSTS header goto.google.com: did not receive HSTS header (error ignored - included regardless) @@ -1563,6 +1566,7 @@ gresb.com: did not receive HSTS header gribani.com: could not connect to host grigalanzsoftware.com: could not connect to host grossmann.gr: could not connect to host +groupebaillargeon.com: could not connect to host groups.google.com: did not receive HSTS header (error ignored - included regardless) grunex.com: did not receive HSTS header grupopgn.com.br: could not connect to host @@ -1575,9 +1579,10 @@ gtamodshop.org: could not connect to host gtanda.tk: could not connect to host gtlfsonlinepay.com: did not receive HSTS header gtraxapp.com: could not connect to host +gts-schulsoftware.de: did not receive HSTS header guava.studio: did not receive HSTS header guilde-vindicta.fr: did not receive HSTS header -gulenet.com: did not receive HSTS header +gulenet.com: could not connect to host gunnarhafdal.com: did not receive HSTS header gurusupe.com: could not connect to host gussi.is: could not connect to host @@ -1652,10 +1657,12 @@ hdm.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAI hdsmigrationtool.com: could not connect to host hduin.xyz: did not receive HSTS header hdwallpapers.net: did not receive HSTS header +head.org: could not connect to host healtious.com: did not receive HSTS header heart.ge: did not receive HSTS header heartlandrentals.com: did not receive HSTS header heftkaufen.de: did not receive HSTS header +heijblok.com: could not connect to host helloworldhost.com: did not receive HSTS header helpadmin.net: could not connect to host helpium.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] @@ -1667,6 +1674,7 @@ hermes-net.de: could not connect to host herpaderp.net: did not receive HSTS header herzbotschaft.de: did not receive HSTS header hex2013.com: did not receive HSTS header +hexagon-e.com: could not connect to host hexid.me: could not connect to host hibilog.com: could not connect to host hicn.gq: could not connect to host @@ -1688,6 +1696,7 @@ hmm.nyc: could not connect to host hn.search.yahoo.com: did not receive HSTS header hoerbuecher-und-hoerspiele.de: could not connect to host hogar123.es: could not connect to host +hokieprivacy.org: could not connect to host holymoly.lu: could not connect to host homa.website: could not connect to host homads.com: could not connect to host @@ -1736,6 +1745,7 @@ hyper69.com: did not receive HSTS header hzsh.xyz: did not receive HSTS header i-jp.net: could not connect to host i-partners.sk: did not receive HSTS header +i95.me: could not connect to host iamokay.nl: did not receive HSTS header iamusingtheinter.net: could not connect to host iamveto.com: could not connect to host @@ -1762,7 +1772,6 @@ ie.search.yahoo.com: did not receive HSTS header ies-italia.it: did not receive HSTS header ies.id.lv: could not connect to host ifad.org: did not receive HSTS header -ifconfig.co: could not connect to host ifleurs.com: could not connect to host ignatisd.gr: did not receive HSTS header ignitedmindz.in: could not connect to host @@ -1770,7 +1779,7 @@ igule.net: could not connect to host ihrlotto.de: could not connect to host ihrnationalrat.ch: could not connect to host ihsbsd.me: could not connect to host -ihuanmeng.com: did not receive HSTS header +ihuanmeng.com: could not connect to host ikujii.com: max-age too low: 0 ikwilguidobellen.nl: did not receive HSTS header ilbuongiorno.it: did not receive HSTS header @@ -1794,7 +1803,6 @@ immunicity.top: could not connect to host imolug.org: did not receive HSTS header imouto.my: max-age too low: 5184000 imperialwebsolutions.com: did not receive HSTS header -impex.com.bd: could not connect to host imu.li: did not receive HSTS header imusic.dk: did not receive HSTS header inb4.us: could not connect to host @@ -1831,7 +1839,6 @@ intel.li: could not connect to host intelldynamics.com: could not connect to host interference.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] interlun.com: could not connect to host -internect.co.za: did not receive HSTS header internetcasinos.de: could not connect to host internetcensus.org: could not connect to host interserved.com: did not receive HSTS header @@ -1868,7 +1875,6 @@ isitamor.pm: could not connect to host iskaz.rs: did not receive HSTS header isogram.nl: could not connect to host israkurort.com: did not receive HSTS header -istanbultravelguide.info: could not connect to host istaspirtslietas.lv: did not receive HSTS header it-go.net: did not receive HSTS header itechgeek.com: max-age too low: 0 @@ -1884,7 +1890,6 @@ itshost.ru: could not connect to host ivi-fertility.com: max-age too low: 0 ivi.es: max-age too low: 0 ivk.website: could not connect to host -iwannarefill.com: could not connect to host izdiwho.com: could not connect to host izolight.ch: could not connect to host izoox.com: did not receive HSTS header @@ -1925,6 +1930,7 @@ jasmineconseil.com: could not connect to host jasonrobinson.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] jasonroe.me: did not receive HSTS header jasonsansone.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +jasperhammink.com: could not connect to host jastoria.pl: could not connect to host jayblock.com: did not receive HSTS header jayschulman.com: could not connect to host @@ -1974,6 +1980,7 @@ jonasgroth.se: did not receive HSTS header jonathan.ir: could not connect to host jonathancarter.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] jonn.me: could not connect to host +jonnybarnes.uk: did not receive HSTS header joostbovee.nl: did not receive HSTS header jordanhamilton.me: could not connect to host joretapo.fr: could not connect to host @@ -1992,7 +1999,6 @@ jualautoclave.com: did not receive HSTS header jualssh.com: could not connect to host juliamweber.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] julian-kipka.de: could not connect to host -juliangonggrijp.com: could not connect to host jumbox.xyz: could not connect to host junaos.xyz: did not receive HSTS header junge-selbsthilfe.info: could not connect to host @@ -2106,7 +2112,6 @@ kotovstyle.ru: could not connect to host kr.search.yahoo.com: did not receive HSTS header kredite.sale: could not connect to host kriegt.es: could not connect to host -kristikala.nl: could not connect to host krmela.com: could not connect to host kroetenfuchs.de: could not connect to host kropkait.pl: could not connect to host @@ -2181,7 +2186,6 @@ lentri.com: did not receive HSTS header leob.in: did not receive HSTS header leon-jaekel.com: could not connect to host leopold.email: could not connect to host -leopoldina.net: did not receive HSTS header leopotamgroup.com: could not connect to host leovanna.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] lepont.pl: could not connect to host @@ -2189,7 +2193,6 @@ lerner.moscow: did not receive HSTS header les-corsaires.net: could not connect to host lesdouceursdeliyana.com: could not connect to host lesperlesdunet.fr: could not connect to host -let-go.cc: did not receive HSTS header letras.mus.br: did not receive HSTS header letsmultiplayerplay.com: did not receive HSTS header letustravel.tk: could not connect to host @@ -2275,6 +2278,7 @@ lostinsecurity.com: could not connect to host lostinweb.eu: could not connect to host lothai.re: could not connect to host lotsencafe.de: did not receive HSTS header +loucanfixit.com: could not connect to host lovelifelovelive.com: could not connect to host lovelive.us: could not connect to host lovelycorral.com: did not receive HSTS header @@ -2284,7 +2288,7 @@ lpak.nl: could not connect to host lrhsclubs.com: could not connect to host lrhstsa.com: could not connect to host ls-a.org: did not receive HSTS header -lsky.cn: did not receive HSTS header +lsky.cn: could not connect to host lsp-sports.de: did not receive HSTS header lt.search.yahoo.com: did not receive HSTS header ltbytes.com: could not connect to host @@ -2320,10 +2324,12 @@ macchaberrycream.com: could not connect to host macgeneral.de: did not receive HSTS header machon.biz: could not connect to host madars.org: did not receive HSTS header +maddi.biz: could not connect to host maddin.ga: could not connect to host madebymagnitude.com: did not receive HSTS header maderwin.com: did not receive HSTS header mafamane.com: could not connect to host +mafiaforum.de: could not connect to host mafiareturns.com: max-age too low: 2592000 magenx.com: did not receive HSTS header mahamed91.pw: could not connect to host @@ -2356,6 +2362,7 @@ markaconnor.com: could not connect to host markayapilandirma.com: did not receive HSTS header market.android.com: did not receive HSTS header (error ignored - included regardless) markrego.com: could not connect to host +marktboten.de: did not receive HSTS header markus-dev.com: did not receive HSTS header markusweimar.de: did not receive HSTS header marleyresort.com: did not receive HSTS header @@ -2423,6 +2430,7 @@ mencap.org.uk: max-age too low: 0 mensmaximus.de: did not receive HSTS header menthix.net: could not connect to host mereckas.com: did not receive HSTS header +meredithkm.info: could not connect to host meritz.rocks: could not connect to host mersinunivercity.com: did not receive HSTS header merson.me: could not connect to host @@ -2442,6 +2450,7 @@ mhealthdemocamp.com: could not connect to host mhertel.com: did not receive HSTS header mhict.nl: max-age too low: 0 mia.to: could not connect to host +michaelcullen.name: could not connect to host michaelfitzpatrickruth.com: could not connect to host michaelwaite.org: could not connect to host michal-kral.cz: could not connect to host @@ -2467,7 +2476,6 @@ mikonmaa.fi: could not connect to host mikrom.cz: did not receive HSTS header miku.be: could not connect to host miku.hatsune.my: max-age too low: 5184000 -milahendri.com: could not connect to host milang.xyz: could not connect to host milesgeek.com: did not receive HSTS header mindcraft.ga: could not connect to host @@ -2486,13 +2494,13 @@ missrain.tw: could not connect to host mister.hosting: could not connect to host misterl.net: did not receive HSTS header mitchellrenouf.ca: could not connect to host -mitell.jp: did not receive HSTS header mittenhacks.com: could not connect to host miui-germany.de: did not receive HSTS header miyoshi-kikaku.co.jp: did not receive HSTS header miyoshi-kikaku.com: did not receive HSTS header mizd.at: could not connect to host mizi.name: did not receive HSTS header +mjcaffarattilaw.com: did not receive HSTS header mlpepilepsy.org: could not connect to host mmgazhomeloans.com: did not receive HSTS header mnemotiv.com: could not connect to host @@ -2510,7 +2518,7 @@ modemagazines.co.uk: could not connect to host moebel-nagel.de: did not receive HSTS header moelord.org: could not connect to host moen.io: did not receive HSTS header -mogry.net: could not connect to host +mogry.net: did not receive HSTS header monarca.systems: did not receive HSTS header monasterialis.eu: could not connect to host mondar.io: could not connect to host @@ -2530,7 +2538,7 @@ morningcalculation.com: could not connect to host morotech.com.br: max-age too low: 2592000 morpork.xyz: could not connect to host mortgagecentersmo.com: did not receive HSTS header -morz.org: did not receive HSTS header +morz.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] mostwuat.com: could not connect to host motherbase.io: could not connect to host motionpicturesolutions.com: could not connect to host @@ -2580,6 +2588,7 @@ my.alfresco.com: did not receive HSTS header my.swedbank.se: did not receive HSTS header my.usa.gov: did not receive HSTS header myairshop.gr: could not connect to host +myandroidtools.cc: could not connect to host mybon.at: could not connect to host mybudget.xyz: could not connect to host mycollab.net: could not connect to host @@ -2597,10 +2606,15 @@ mypagella.com: could not connect to host mypagella.eu: could not connect to host mypagella.it: could not connect to host mypension.ca: could not connect to host +mypillcard.com: could not connect to host myraytech.net: did not receive HSTS header mysecretrewards.com: did not receive HSTS header mystery-science-theater-3000.de: did not receive HSTS header mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +mytripcar.co.uk: max-age too low: 0 +mytripcar.com: max-age too low: 0 +mytripcar.de: max-age too low: 0 +mytripcar.es: max-age too low: 0 myvirtualserver.com: max-age too low: 2592000 myzone.com: did not receive HSTS header n0psled.nl: could not connect to host @@ -2637,6 +2651,8 @@ ncpc.gov: could not connect to host nct.org.uk: max-age too low: 1 nctx.co.uk: did not receive HSTS header near.st: did not receive HSTS header +necormansir.com: could not connect to host +neer.io: could not connect to host neftaly.com: did not receive HSTS header negativecurvature.net: could not connect to host neko-life.com: did not receive HSTS header @@ -2865,7 +2881,6 @@ otherstuff.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ER otichi.com: did not receive HSTS header ottospora.nl: could not connect to host ourbank.com: did not receive HSTS header -ourevents.net: could not connect to host outdoorproducts.com: did not receive HSTS header outetc.com: could not connect to host outreachbuddy.com: could not connect to host @@ -2876,7 +2891,6 @@ ovenapp.io: did not receive HSTS header overclockers.ge: could not connect to host override.io: did not receive HSTS header oversight.io: could not connect to host -overthinkingit.com: max-age too low: 3600 ovvy.net: did not receive HSTS header owncloud.help: could not connect to host ownmovies.fr: could not connect to host @@ -2908,11 +2922,11 @@ papeda.net: could not connect to host papercard.co.uk: did not receive HSTS header papierniak.net: could not connect to host papygeek.com: could not connect to host -paragon.com.sg: could not connect to host parent5446.us: could not connect to host parentmail.co.uk: did not receive HSTS header parithy.net: could not connect to host parkingplus.co.il: did not receive HSTS header +parleur.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] parodybit.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] parpaing-paillette.net: could not connect to host particonpsplus.it: did not receive HSTS header @@ -2934,7 +2948,6 @@ paster.li: did not receive HSTS header patientinsight.net: could not connect to host patt.us: did not receive HSTS header patterson.mp: could not connect to host -paulchen.at: did not receive HSTS header paulyang.cn: did not receive HSTS header paxwinkel.nl: did not receive HSTS header pay.gigahost.dk: did not receive HSTS header @@ -2994,7 +3007,7 @@ pinesandneedles.com: did not receive HSTS header pippen.io: could not connect to host piratedb.com: could not connect to host piratedot.com: could not connect to host -piratelist.online: did not receive HSTS header +piratelist.online: could not connect to host piratenlogin.de: could not connect to host pirateproxy.sx: could not connect to host pirati.cz: max-age too low: 604800 @@ -3046,7 +3059,6 @@ poolsandstuff.com: did not receive HSTS header poon.tech: could not connect to host porno-gif.ru: did not receive HSTS header portalplatform.net: did not receive HSTS header -portalzine.de: did not receive HSTS header poshpak.com: max-age too low: 86400 postcodewise.co.uk: did not receive HSTS header postscheduler.org: could not connect to host @@ -3098,7 +3110,7 @@ proximato.com: could not connect to host proxybay.al: could not connect to host proxybay.club: could not connect to host proxybay.info: did not receive HSTS header -prxio.site: could not connect to host +prxio.site: did not receive HSTS header prytkov.com: did not receive HSTS header psw.academy: did not receive HSTS header psw.consulting: did not receive HSTS header @@ -3153,7 +3165,6 @@ ramon-c.nl: could not connect to host ramonj.nl: could not connect to host randomcage.com: did not receive HSTS header randomcloud.net: could not connect to host -randomprecision.co.uk: did not receive HSTS header rankthespot.com: could not connect to host rannseier.org: did not receive HSTS header rapidresearch.me: could not connect to host @@ -3242,6 +3253,7 @@ ring0.xyz: did not receive HSTS header ringh.am: could not connect to host rippleunion.com: could not connect to host riskmgt.com.au: could not connect to host +rivastation.de: could not connect to host rj.gg: could not connect to host rk6.cz: could not connect to host rkmantpur.org: did not receive HSTS header @@ -3261,6 +3273,8 @@ roddis.net: did not receive HSTS header rodney.id.au: did not receive HSTS header rodosto.com: did not receive HSTS header roeper.party: could not connect to host +rohlik.cz: could not connect to host +rolandszabo.com: could not connect to host rolemaster.net: could not connect to host romans-place.me.uk: did not receive HSTS header ronvandordt.info: could not connect to host @@ -3355,7 +3369,6 @@ schrodinger.io: could not connect to host schulterglatzen-altenwalde.de: could not connect to host schultzflorists.com: could not connect to host schwarzkopfforyou.de: did not receive HSTS header -schwarzwaldcon.de: could not connect to host scienceathome.org: did not receive HSTS header scooshonline.co.uk: did not receive HSTS header scotbirchfield.com: did not receive HSTS header @@ -3375,6 +3388,7 @@ sdsl-speedtest.de: could not connect to host search-one.de: did not receive HSTS header sebster.com: did not receive HSTS header secandtech.com: could not connect to host +secondpay.nl: did not receive HSTS header sectia22.ro: could not connect to host sectun.com: did not receive HSTS header secure-games.us: could not connect to host @@ -3388,11 +3402,9 @@ securityglance.com: could not connect to host securityinet.biz: did not receive HSTS header securityinet.net: did not receive HSTS header securityinet.org.il: did not receive HSTS header -securityprimes.in: could not connect to host securiviera.ch: did not receive HSTS header sedoexpert.nl: could not connect to host sedoexperts.nl: could not connect to host -sedziapilkarski.pl: could not connect to host seedbox.fr: did not receive HSTS header seele.ca: could not connect to host segulink.com: could not connect to host @@ -3443,7 +3455,6 @@ shanesage.com: could not connect to host shanewadleigh.com: could not connect to host sharepass.pw: could not connect to host sharescope.co.uk: max-age too low: 14400 -sharevari.com: did not receive HSTS header shauncrowley.co.uk: could not connect to host shaunwheelhou.se: could not connect to host shawnh.net: could not connect to host @@ -3453,7 +3464,7 @@ shiftins.com: did not receive HSTS header shiinko.com: could not connect to host shinebijoux.com.br: could not connect to host shinju.moe: could not connect to host -shiona.xyz: did not receive HSTS header +shiona.xyz: could not connect to host shocksrv.com: did not receive HSTS header shooshosha.com: did not receive HSTS header shopontarget.com: did not receive HSTS header @@ -3473,7 +3484,6 @@ sig6.org: could not connect to host silentcircle.org: could not connect to host silicagelpackets.ca: did not receive HSTS header silver-drachenkrieger.de: did not receive HSTS header -silverhome.ninja: could not connect to host silverpvp.com: could not connect to host silverwind.io: did not receive HSTS header simbast.com: could not connect to host @@ -3510,7 +3520,6 @@ slightfuture.click: could not connect to host slix.io: could not connect to host slope.haus: could not connect to host slovakiana.sk: did not receive HSTS header -slowfood.es: could not connect to host sluitkampzeist.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] slycurity.de: could not connect to host smart-mirror.de: did not receive HSTS header @@ -3527,6 +3536,7 @@ smkn1lengkong.sch.id: did not receive HSTS header smksi2.com: could not connect to host smove.sg: did not receive HSTS header smusg.com: did not receive HSTS header +smvfd.info: could not connect to host snailing.org: could not connect to host snapappts.com: could not connect to host snapworks.net: did not receive HSTS header @@ -3565,6 +3575,7 @@ soulboy.io: did not receive HSTS header soulema.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] soulfulglamour.uk: could not connect to host sourcelair.com: did not receive HSTS header +southmeriden-vfd.org: could not connect to host southside-crew.club: could not connect to host southworcestershiregpservices.co.uk: could not connect to host souyar.de: could not connect to host @@ -3631,7 +3642,6 @@ stationaryjourney.com: did not receive HSTS header stationnementdenuit.ca: did not receive HSTS header statuschecks.net: could not connect to host stefanweiser.de: did not receive HSTS header -stefany.eu: could not connect to host stephanierxo.com: did not receive HSTS header stephenandburns.com: did not receive HSTS header stevensononthe.net: did not receive HSTS header @@ -3819,6 +3829,7 @@ theclementinebutchers.com: could not connect to host thecoffeehouse.xyz: could not connect to host thediaryofadam.com: did not receive HSTS header theendofzion.com: did not receive HSTS header +theeyeopener.com: did not receive HSTS header theflowerbasketonline.com: could not connect to host thefootballanalyst.com: could not connect to host thegcccoin.com: did not receive HSTS header @@ -3852,14 +3863,11 @@ thirty5.net: did not receive HSTS header thisisacompletetest.ga: could not connect to host thisisforager.com: could not connect to host thiswebhost.com: did not receive HSTS header -thomas-grobelny.de: could not connect to host thomaswoo.com: could not connect to host thorncreek.net: did not receive HSTS header thriveapproach.co.uk: did not receive HSTS header thues.eu: could not connect to host thumbtack.com: did not receive HSTS header -ti.blog.br: could not connect to host -tianya.tv: did not receive HSTS header tibbitshall.ca: did not receive HSTS header tickettoaster.de: max-age too low: 0 tickopa.co.uk: could not connect to host @@ -3886,6 +3894,7 @@ titouan.co: did not receive HSTS header tittelbach.at: did not receive HSTS header titties.ml: could not connect to host tkarstens.de: did not receive HSTS header +tlach.cz: did not receive HSTS header tlo.hosting: could not connect to host tlo.network: could not connect to host tls.li: could not connect to host @@ -3902,7 +3911,6 @@ tobiasmathes.name: could not connect to host tobiasofficial.at: could not connect to host todo.is: did not receive HSTS header todobazar.es: could not connect to host -todoescine.com: did not receive HSTS header tokyopopline.com: did not receive HSTS header tollmanz.com: did not receive HSTS header tom.horse: did not receive HSTS header @@ -3940,7 +3948,6 @@ translate.googleapis.com: did not receive HSTS header (error ignored - included transportal.sk: did not receive HSTS header treeby.net: could not connect to host trendberry.ru: could not connect to host -trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] trinityaffirmations.com: max-age too low: 0 trinitycore.org: max-age too low: 2592000 tripdelta.com: did not receive HSTS header @@ -4036,7 +4043,6 @@ up1.ca: could not connect to host upaknship.com: did not receive HSTS header upani.net: did not receive HSTS header upldr.pw: could not connect to host -upr.com.ua: could not connect to host uprotect.it: could not connect to host upstats.eu: could not connect to host urandom.eu.org: did not receive HSTS header @@ -4045,10 +4051,12 @@ urphp.com: could not connect to host us-immigration.com: did not receive HSTS header usaa.com: did not receive HSTS header uscitizenship.info: did not receive HSTS header +uscurrency.gov: could not connect to host used-in.jp: did not receive HSTS header usercare.com: did not receive HSTS header userify.com: did not receive HSTS header ustr.gov: max-age too low: 86400 +uswitch.com: could not connect to host utleieplassen.no: could not connect to host utopiagalaxy.space: could not connect to host utopianhomespa.com: did not receive HSTS header @@ -4067,10 +4075,10 @@ valkyrja.xyz: did not receive HSTS header valleyridgepta.org: could not connect to host vallis.net: did not receive HSTS header valmagus.com: could not connect to host -valshamar.is: could not connect to host vanderkley.it: could not connect to host vanestack.com: could not connect to host vanetv.com: could not connect to host +vangeluwedeberlaere.be: could not connect to host vanitas.xyz: could not connect to host vanitynailworkz.com: could not connect to host vanlaanen.com: did not receive HSTS header @@ -4088,7 +4096,6 @@ verifikatorindonesia.com: could not connect to host vermontcareergateway.org: could not connect to host versia.ru: did not receive HSTS header veryhax.de: could not connect to host -ves.vn.ua: could not connect to host vestacp.top: could not connect to host vetmgmt.com: could not connect to host vfree.org: could not connect to host @@ -4116,7 +4123,6 @@ vitalorange.com: did not receive HSTS header viva-french.com: did not receive HSTS header vksportphoto.com: could not connect to host vlastimilburian.cz: did not receive HSTS header -vlogge.com: could not connect to host vlora.city: could not connect to host vm0.eu: did not receive HSTS header vmrdev.com: could not connect to host @@ -4205,14 +4211,11 @@ wettertoertchen.com: did not receive HSTS header wetttipps.com: did not receive HSTS header wetttipps.de: did not receive HSTS header wevahoo.com: could not connect to host -wf-training-master.appspot.com: could not connect to host (error ignored - included regardless) wftda.com: did not receive HSTS header -wg-tools.de: could not connect to host whatnext.limited: did not receive HSTS header whats.io: did not receive HSTS header whatsstalk.me: could not connect to host when-release.com: did not receive HSTS header -whiskeyriver.co.uk: could not connect to host whiterabbitcakery.com: could not connect to host whitestagforge.com: did not receive HSTS header whoclicks.net: could not connect to host @@ -4266,7 +4269,6 @@ workfone.io: did not receive HSTS header wowapi.org: could not connect to host wphostingspot.com: did not receive HSTS header wpmetadatastandardsproject.org: could not connect to host -wpzhiku.com: could not connect to host writeapp.me: did not receive HSTS header wsscompany.com.ve: could not connect to host wufu.org: did not receive HSTS header @@ -4316,7 +4318,6 @@ ximens.me: did not receive HSTS header xinbiji.cn: could not connect to host xisa.it: could not connect to host xiyu.moe: could not connect to host -xmonk.org: did not receive HSTS header xn--4dbjwf8c.cf: could not connect to host xn--4dbjwf8c.ga: could not connect to host xn--4dbjwf8c.gq: could not connect to host @@ -4344,7 +4345,6 @@ xtream-hosting.com: could not connect to host xtream-hosting.de: could not connect to host xtream-hosting.eu: could not connect to host xtreamhosting.eu: could not connect to host -xtremegaming.it: could not connect to host xuri.me: max-age too low: 2592000 xuyh0120.win: could not connect to host xwalck.se: could not connect to host @@ -4403,7 +4403,6 @@ zarooba.com: did not receive HSTS header zbigniewgalucki.eu: did not receive HSTS header zbp.at: did not receive HSTS header zebrababy.cn: did not receive HSTS header -zeedroom.be: did not receive HSTS header zefiris.org: did not receive HSTS header zefu.ca: could not connect to host zeitpunkt-kulturmagazin.de: did not receive HSTS header @@ -4432,7 +4431,7 @@ zortium.report: could not connect to host zoznamrealit.sk: did not receive HSTS header zqhong.com: could not connect to host ztan.tk: could not connect to host -ztcaoll222.cn: could not connect to host +ztcaoll222.cn: did not receive HSTS header zvncloud.com: did not receive HSTS header zwy.me: did not receive HSTS header zyf.pw: could not connect to host diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index d6bad11733b4..bcc7d9733d2f 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1495551141279000); +const PRTime gPreloadListExpirationTime = INT64_C(1495636613481000); static const char kSTSHostTable[] = { /* "0.me.uk", true */ '0', '.', 'm', 'e', '.', 'u', 'k', '\0', @@ -18,6 +18,7 @@ static const char kSTSHostTable[] = { /* "050media.nl", true */ '0', '5', '0', 'm', 'e', 'd', 'i', 'a', '.', 'n', 'l', '\0', /* "0513c.com", true */ '0', '5', '1', '3', 'c', '.', 'c', 'o', 'm', '\0', /* "0au.de", true */ '0', 'a', 'u', '.', 'd', 'e', '\0', + /* "0i0.nl", true */ '0', 'i', '0', '.', 'n', 'l', '\0', /* "0knowledge.de", true */ '0', 'k', 'n', 'o', 'w', 'l', 'e', 'd', 'g', 'e', '.', 'd', 'e', '\0', /* "0paste.com", true */ '0', 'p', 'a', 's', 't', 'e', '.', 'c', 'o', 'm', '\0', /* "0x.cx", true */ '0', 'x', '.', 'c', 'x', '\0', @@ -90,7 +91,6 @@ static const char kSTSHostTable[] = { /* "1ststop.co.uk", true */ '1', 's', 't', 's', 't', 'o', 'p', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "1three1.net", true */ '1', 't', 'h', 'r', 'e', 'e', '1', '.', 'n', 'e', 't', '\0', /* "1whw.co.uk", true */ '1', 'w', 'h', 'w', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "1years.cc", true */ '1', 'y', 'e', 'a', 'r', 's', '.', 'c', 'c', '\0', /* "2-cpu.de", true */ '2', '-', 'c', 'p', 'u', '.', 'd', 'e', '\0', /* "2.wtf", true */ '2', '.', 'w', 't', 'f', '\0', /* "2048game.co.uk", true */ '2', '0', '4', '8', 'g', 'a', 'm', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -152,6 +152,7 @@ static const char kSTSHostTable[] = { /* "41844.de", true */ '4', '1', '8', '4', '4', '.', 'd', 'e', '\0', /* "41where.com", true */ '4', '1', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "4500.co.il", true */ '4', '5', '0', '0', '.', 'c', 'o', '.', 'i', 'l', '\0', + /* "491mhz.net", true */ '4', '9', '1', 'm', 'h', 'z', '.', 'n', 'e', 't', '\0', /* "4azino777.ru", true */ '4', 'a', 'z', 'i', 'n', 'o', '7', '7', '7', '.', 'r', 'u', '\0', /* "4d2.xyz", true */ '4', 'd', '2', '.', 'x', 'y', 'z', '\0', /* "4eyes.ch", false */ '4', 'e', 'y', 'e', 's', '.', 'c', 'h', '\0', @@ -171,7 +172,6 @@ static const char kSTSHostTable[] = { /* "54bf.com", true */ '5', '4', 'b', 'f', '.', 'c', 'o', 'm', '\0', /* "57aromas.com", true */ '5', '7', 'a', 'r', 'o', 'm', 'a', 's', '.', 'c', 'o', 'm', '\0', /* "5apps.com", true */ '5', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0', - /* "6120.eu", true */ '6', '1', '2', '0', '.', 'e', 'u', '\0', /* "646.io", false */ '6', '4', '6', '.', 'i', 'o', '\0', /* "6660111.ru", true */ '6', '6', '6', '0', '1', '1', '1', '.', 'r', 'u', '\0', /* "692b8c32.de", true */ '6', '9', '2', 'b', '8', 'c', '3', '2', '.', 'd', 'e', '\0', @@ -312,7 +312,6 @@ static const char kSTSHostTable[] = { /* "adblockextreme.com", true */ 'a', 'd', 'b', 'l', 'o', 'c', 'k', 'e', 'x', 't', 'r', 'e', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "adblockextreme.net", true */ 'a', 'd', 'b', 'l', 'o', 'c', 'k', 'e', 'x', 't', 'r', 'e', 'm', 'e', '.', 'n', 'e', 't', '\0', /* "adblockextreme.org", true */ 'a', 'd', 'b', 'l', 'o', 'c', 'k', 'e', 'x', 't', 'r', 'e', 'm', 'e', '.', 'o', 'r', 'g', '\0', - /* "adboos.com", true */ 'a', 'd', 'b', 'o', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "addeekt.com", true */ 'a', 'd', 'd', 'e', 'e', 'k', 't', '.', 'c', 'o', 'm', '\0', /* "adderall.space", true */ 'a', 'd', 'd', 'e', 'r', 'a', 'l', 'l', '.', 's', 'p', 'a', 'c', 'e', '\0', /* "addstar.jp", true */ 'a', 'd', 'd', 's', 't', 'a', 'r', '.', 'j', 'p', '\0', @@ -562,6 +561,7 @@ static const char kSTSHostTable[] = { /* "alyoung.com", true */ 'a', 'l', 'y', 'o', 'u', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "alza.at", true */ 'a', 'l', 'z', 'a', '.', 'a', 't', '\0', /* "alza.co.uk", true */ 'a', 'l', 'z', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "alza.cz", true */ 'a', 'l', 'z', 'a', '.', 'c', 'z', '\0', /* "alza.de", true */ 'a', 'l', 'z', 'a', '.', 'd', 'e', '\0', /* "alza.hu", true */ 'a', 'l', 'z', 'a', '.', 'h', 'u', '\0', /* "alza.sk", true */ 'a', 'l', 'z', 'a', '.', 's', 'k', '\0', @@ -719,7 +719,6 @@ static const char kSTSHostTable[] = { /* "apadvantage.com", true */ 'a', 'p', 'a', 'd', 'v', 'a', 'n', 't', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "aperture-laboratories.science", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', '-', 'l', 'a', 'b', 'o', 'r', 'a', 't', 'o', 'r', 'i', 'e', 's', '.', 's', 'c', 'i', 'e', 'n', 'c', 'e', '\0', /* "aperturesciencelabs.de", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', 's', 'c', 'i', 'e', 'n', 'c', 'e', 'l', 'a', 'b', 's', '.', 'd', 'e', '\0', - /* "apervita.net", true */ 'a', 'p', 'e', 'r', 'v', 'i', 't', 'a', '.', 'n', 'e', 't', '\0', /* "apexitsolutions.ca", true */ 'a', 'p', 'e', 'x', 'i', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'a', '\0', /* "api-geek.com", true */ 'a', 'p', 'i', '-', 'g', 'e', 'e', 'k', '.', 'c', 'o', 'm', '\0', /* "api.cloudflare.com", false */ 'a', 'p', 'i', '.', 'c', 'l', 'o', 'u', 'd', 'f', 'l', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -845,7 +844,6 @@ static const char kSTSHostTable[] = { /* "artofwhere.com", true */ 'a', 'r', 't', 'o', 'f', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "artroot.jp", true */ 'a', 'r', 't', 'r', 'o', 'o', 't', '.', 'j', 'p', '\0', /* "artspac.es", true */ 'a', 'r', 't', 's', 'p', 'a', 'c', '.', 'e', 's', '\0', - /* "arturkohut.com", true */ 'a', 'r', 't', 'u', 'r', 'k', 'o', 'h', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "artweby.cz", true */ 'a', 'r', 't', 'w', 'e', 'b', 'y', '.', 'c', 'z', '\0', /* "arty.name", true */ 'a', 'r', 't', 'y', '.', 'n', 'a', 'm', 'e', '\0', /* "arubasunsetbeach.com", true */ 'a', 'r', 'u', 'b', 'a', 's', 'u', 'n', 's', 'e', 't', 'b', 'e', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0', @@ -885,7 +883,6 @@ static const char kSTSHostTable[] = { /* "assindia.nl", true */ 'a', 's', 's', 'i', 'n', 'd', 'i', 'a', '.', 'n', 'l', '\0', /* "asta-bar.de", true */ 'a', 's', 't', 'a', '-', 'b', 'a', 'r', '.', 'd', 'e', '\0', /* "astengox.com", true */ 'a', 's', 't', 'e', 'n', 'g', 'o', 'x', '.', 'c', 'o', 'm', '\0', - /* "asuhe.cc", true */ 'a', 's', 'u', 'h', 'e', '.', 'c', 'c', '\0', /* "asun.co", true */ 'a', 's', 'u', 'n', '.', 'c', 'o', '\0', /* "asurepay.cc", true */ 'a', 's', 'u', 'r', 'e', 'p', 'a', 'y', '.', 'c', 'c', '\0', /* "at.search.yahoo.com", false */ 'a', 't', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', @@ -1092,6 +1089,7 @@ static const char kSTSHostTable[] = { /* "baofengtech.com", true */ 'b', 'a', 'o', 'f', 'e', 'n', 'g', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "baptiste-peugnez.fr", true */ 'b', 'a', 'p', 't', 'i', 's', 't', 'e', '-', 'p', 'e', 'u', 'g', 'n', 'e', 'z', '.', 'f', 'r', '\0', /* "barbarians.com", true */ 'b', 'a', 'r', 'b', 'a', 'r', 'i', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0', + /* "barbaros.info", true */ 'b', 'a', 'r', 'b', 'a', 'r', 'o', 's', '.', 'i', 'n', 'f', 'o', '\0', /* "barbate.fr", true */ 'b', 'a', 'r', 'b', 'a', 't', 'e', '.', 'f', 'r', '\0', /* "barbosha.ru", true */ 'b', 'a', 'r', 'b', 'o', 's', 'h', 'a', '.', 'r', 'u', '\0', /* "barbu.family", true */ 'b', 'a', 'r', 'b', 'u', '.', 'f', 'a', 'm', 'i', 'l', 'y', '\0', @@ -1148,7 +1146,6 @@ static const char kSTSHostTable[] = { /* "bcmlu.org", true */ 'b', 'c', 'm', 'l', 'u', '.', 'o', 'r', 'g', '\0', /* "bcrook.com", false */ 'b', 'c', 'r', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "bcswampcabins.com", true */ 'b', 'c', 's', 'w', 'a', 'm', 'p', 'c', 'a', 'b', 'i', 'n', 's', '.', 'c', 'o', 'm', '\0', - /* "bcvps.com", true */ 'b', 'c', 'v', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "bcweightlifting.ca", true */ 'b', 'c', 'w', 'e', 'i', 'g', 'h', 't', 'l', 'i', 'f', 't', 'i', 'n', 'g', '.', 'c', 'a', '\0', /* "bddemir.com", true */ 'b', 'd', 'd', 'e', 'm', 'i', 'r', '.', 'c', 'o', 'm', '\0', /* "bde-epitech.fr", true */ 'b', 'd', 'e', '-', 'e', 'p', 'i', 't', 'e', 'c', 'h', '.', 'f', 'r', '\0', @@ -1299,7 +1296,6 @@ static const char kSTSHostTable[] = { /* "bfw-online.de", true */ 'b', 'f', 'w', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', /* "bgdaddy.com", true */ 'b', 'g', 'd', 'a', 'd', 'd', 'y', '.', 'c', 'o', 'm', '\0', /* "bgneuesheim.de", true */ 'b', 'g', 'n', 'e', 'u', 'e', 's', 'h', 'e', 'i', 'm', '.', 'd', 'e', '\0', - /* "bhatia.at", true */ 'b', 'h', 'a', 't', 'i', 'a', '.', 'a', 't', '\0', /* "bhtelecom.ba", true */ 'b', 'h', 't', 'e', 'l', 'e', 'c', 'o', 'm', '.', 'b', 'a', '\0', /* "bhuntr.com", true */ 'b', 'h', 'u', 'n', 't', 'r', '.', 'c', 'o', 'm', '\0', /* "bianinapiccanovias.com", true */ 'b', 'i', 'a', 'n', 'i', 'n', 'a', 'p', 'i', 'c', 'c', 'a', 'n', 'o', 'v', 'i', 'a', 's', '.', 'c', 'o', 'm', '\0', @@ -1504,7 +1500,6 @@ static const char kSTSHostTable[] = { /* "blogreen.org", true */ 'b', 'l', 'o', 'g', 'r', 'e', 'e', 'n', '.', 'o', 'r', 'g', '\0', /* "blowjs.com", true */ 'b', 'l', 'o', 'w', 'j', 's', '.', 'c', 'o', 'm', '\0', /* "blubberladen.de", true */ 'b', 'l', 'u', 'b', 'b', 'e', 'r', 'l', 'a', 'd', 'e', 'n', '.', 'd', 'e', '\0', - /* "blue-labs.org", true */ 'b', 'l', 'u', 'e', '-', 'l', 'a', 'b', 's', '.', 'o', 'r', 'g', '\0', /* "blue-leaf81.net", true */ 'b', 'l', 'u', 'e', '-', 'l', 'e', 'a', 'f', '8', '1', '.', 'n', 'e', 't', '\0', /* "blue42.net", true */ 'b', 'l', 'u', 'e', '4', '2', '.', 'n', 'e', 't', '\0', /* "bluebill.net", true */ 'b', 'l', 'u', 'e', 'b', 'i', 'l', 'l', '.', 'n', 'e', 't', '\0', @@ -1827,7 +1822,6 @@ static const char kSTSHostTable[] = { /* "caasd.org", true */ 'c', 'a', 'a', 's', 'd', '.', 'o', 'r', 'g', '\0', /* "cablemod.com", true */ 'c', 'a', 'b', 'l', 'e', 'm', 'o', 'd', '.', 'c', 'o', 'm', '\0', /* "cablesandkits.com", true */ 'c', 'a', 'b', 'l', 'e', 's', 'a', 'n', 'd', 'k', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', - /* "cabsites.com", true */ 'c', 'a', 'b', 's', 'i', 't', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "cacaolalina.com", true */ 'c', 'a', 'c', 'a', 'o', 'l', 'a', 'l', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "caceis.bank", true */ 'c', 'a', 'c', 'e', 'i', 's', '.', 'b', 'a', 'n', 'k', '\0', /* "cachethq.io", true */ 'c', 'a', 'c', 'h', 'e', 't', 'h', 'q', '.', 'i', 'o', '\0', @@ -1942,7 +1936,6 @@ static const char kSTSHostTable[] = { /* "carif-idf.org", true */ 'c', 'a', 'r', 'i', 'f', '-', 'i', 'd', 'f', '.', 'o', 'r', 'g', '\0', /* "carigami.fr", true */ 'c', 'a', 'r', 'i', 'g', 'a', 'm', 'i', '.', 'f', 'r', '\0', /* "cariocacooking.com", true */ 'c', 'a', 'r', 'i', 'o', 'c', 'a', 'c', 'o', 'o', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', - /* "carlgo11.com", true */ 'c', 'a', 'r', 'l', 'g', 'o', '1', '1', '.', 'c', 'o', 'm', '\0', /* "carlosjeurissen.com", true */ 'c', 'a', 'r', 'l', 'o', 's', 'j', 'e', 'u', 'r', 'i', 's', 's', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "carnaticalifornia.com", true */ 'c', 'a', 'r', 'n', 'a', 't', 'i', 'c', 'a', 'l', 'i', 'f', 'o', 'r', 'n', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "carnildo.com", true */ 'c', 'a', 'r', 'n', 'i', 'l', 'd', 'o', '.', 'c', 'o', 'm', '\0', @@ -2262,7 +2255,6 @@ static const char kSTSHostTable[] = { /* "clifflu.net", true */ 'c', 'l', 'i', 'f', 'f', 'l', 'u', '.', 'n', 'e', 't', '\0', /* "climaprecio.es", true */ 'c', 'l', 'i', 'm', 'a', 'p', 'r', 'e', 'c', 'i', 'o', '.', 'e', 's', '\0', /* "climateinteractive.org", true */ 'c', 'l', 'i', 'm', 'a', 't', 'e', 'i', 'n', 't', 'e', 'r', 'a', 'c', 't', 'i', 'v', 'e', '.', 'o', 'r', 'g', '\0', - /* "climatestew.com", true */ 'c', 'l', 'i', 'm', 'a', 't', 'e', 's', 't', 'e', 'w', '.', 'c', 'o', 'm', '\0', /* "cliniko.com", true */ 'c', 'l', 'i', 'n', 'i', 'k', 'o', '.', 'c', 'o', 'm', '\0', /* "cliniquepariseau.com", false */ 'c', 'l', 'i', 'n', 'i', 'q', 'u', 'e', 'p', 'a', 'r', 'i', 's', 'e', 'a', 'u', '.', 'c', 'o', 'm', '\0', /* "clip.mx", true */ 'c', 'l', 'i', 'p', '.', 'm', 'x', '\0', @@ -2596,6 +2588,7 @@ static const char kSTSHostTable[] = { /* "creep.im", true */ 'c', 'r', 'e', 'e', 'p', '.', 'i', 'm', '\0', /* "crefelder.com", true */ 'c', 'r', 'e', 'f', 'e', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "crepererum.net", true */ 'c', 'r', 'e', 'p', 'e', 'r', 'e', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0', + /* "crestasantos.com", true */ 'c', 'r', 'e', 's', 't', 'a', 's', 'a', 'n', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "criena.net", true */ 'c', 'r', 'i', 'e', 'n', 'a', '.', 'n', 'e', 't', '\0', /* "crimson.no", true */ 'c', 'r', 'i', 'm', 's', 'o', 'n', '.', 'n', 'o', '\0', /* "cristiandeluxe.com", true */ 'c', 'r', 'i', 's', 't', 'i', 'a', 'n', 'd', 'e', 'l', 'u', 'x', 'e', '.', 'c', 'o', 'm', '\0', @@ -2783,6 +2776,7 @@ static const char kSTSHostTable[] = { /* "dadons-laserdiscs.com", true */ 'd', 'a', 'd', 'o', 'n', 's', '-', 'l', 'a', 's', 'e', 'r', 'd', 'i', 's', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "dadrian.io", true */ 'd', 'a', 'd', 'r', 'i', 'a', 'n', '.', 'i', 'o', '\0', /* "daduke.org", true */ 'd', 'a', 'd', 'u', 'k', 'e', '.', 'o', 'r', 'g', '\0', + /* "daemon.xin", true */ 'd', 'a', 'e', 'm', 'o', 'n', '.', 'x', 'i', 'n', '\0', /* "dag-konsult.com", true */ 'd', 'a', 'g', '-', 'k', 'o', 'n', 's', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', /* "dahlberg.cologne", true */ 'd', 'a', 'h', 'l', 'b', 'e', 'r', 'g', '.', 'c', 'o', 'l', 'o', 'g', 'n', 'e', '\0', /* "dailybits.be", true */ 'd', 'a', 'i', 'l', 'y', 'b', 'i', 't', 's', '.', 'b', 'e', '\0', @@ -2830,6 +2824,7 @@ static const char kSTSHostTable[] = { /* "dankim.de", false */ 'd', 'a', 'n', 'k', 'i', 'm', '.', 'd', 'e', '\0', /* "danny.fm", true */ 'd', 'a', 'n', 'n', 'y', '.', 'f', 'm', '\0', /* "dannycrichton.com", true */ 'd', 'a', 'n', 'n', 'y', 'c', 'r', 'i', 'c', 'h', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', + /* "dannyrohde.de", true */ 'd', 'a', 'n', 'n', 'y', 'r', 'o', 'h', 'd', 'e', '.', 'd', 'e', '\0', /* "danonsecurity.com", true */ 'd', 'a', 'n', 'o', 'n', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "danpiel.net", false */ 'd', 'a', 'n', 'p', 'i', 'e', 'l', '.', 'n', 'e', 't', '\0', /* "danscomp.com", true */ 'd', 'a', 'n', 's', 'c', 'o', 'm', 'p', '.', 'c', 'o', 'm', '\0', @@ -3049,7 +3044,6 @@ static const char kSTSHostTable[] = { /* "desmaakvanplanten.be", true */ 'd', 'e', 's', 'm', 'a', 'a', 'k', 'v', 'a', 'n', 'p', 'l', 'a', 'n', 't', 'e', 'n', '.', 'b', 'e', '\0', /* "desserteagleselvenar.tk", true */ 'd', 'e', 's', 's', 'e', 'r', 't', 'e', 'a', 'g', 'l', 'e', 's', 'e', 'l', 'v', 'e', 'n', 'a', 'r', '.', 't', 'k', '\0', /* "desterman.ru", true */ 'd', 'e', 's', 't', 'e', 'r', 'm', 'a', 'n', '.', 'r', 'u', '\0', - /* "destom.be", true */ 'd', 'e', 's', 't', 'o', 'm', '.', 'b', 'e', '\0', /* "detectify.com", false */ 'd', 'e', 't', 'e', 'c', 't', 'i', 'f', 'y', '.', 'c', 'o', 'm', '\0', /* "dethemium.com", true */ 'd', 'e', 't', 'h', 'e', 'm', 'i', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "detoxsinutritie.ro", true */ 'd', 'e', 't', 'o', 'x', 's', 'i', 'n', 'u', 't', 'r', 'i', 't', 'i', 'e', '.', 'r', 'o', '\0', @@ -3149,7 +3143,7 @@ static const char kSTSHostTable[] = { /* "dighans.com", true */ 'd', 'i', 'g', 'h', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "digihyp.ch", true */ 'd', 'i', 'g', 'i', 'h', 'y', 'p', '.', 'c', 'h', '\0', /* "digimagical.com", true */ 'd', 'i', 'g', 'i', 'm', 'a', 'g', 'i', 'c', 'a', 'l', '.', 'c', 'o', 'm', '\0', - /* "digimedia.cd", true */ 'd', 'i', 'g', 'i', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'd', '\0', + /* "digimedia.cd", false */ 'd', 'i', 'g', 'i', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'd', '\0', /* "digired.xyz", true */ 'd', 'i', 'g', 'i', 'r', 'e', 'd', '.', 'x', 'y', 'z', '\0', /* "digital-coach.it", false */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '-', 'c', 'o', 'a', 'c', 'h', '.', 'i', 't', '\0', /* "digital-eastside.de", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '-', 'e', 'a', 's', 't', 's', 'i', 'd', 'e', '.', 'd', 'e', '\0', @@ -3231,6 +3225,7 @@ static const char kSTSHostTable[] = { /* "dlaspania.pl", true */ 'd', 'l', 'a', 's', 'p', 'a', 'n', 'i', 'a', '.', 'p', 'l', '\0', /* "dlitz.net", true */ 'd', 'l', 'i', 't', 'z', '.', 'n', 'e', 't', '\0', /* "dlld.com", true */ 'd', 'l', 'l', 'd', '.', 'c', 'o', 'm', '\0', + /* "dlouwrink.nl", true */ 'd', 'l', 'o', 'u', 'w', 'r', 'i', 'n', 'k', '.', 'n', 'l', '\0', /* "dlscomputers.com.au", true */ 'd', 'l', 's', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "dm.lookout.com", false */ 'd', 'm', '.', 'l', 'o', 'o', 'k', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "dm7ds.de", true */ 'd', 'm', '7', 'd', 's', '.', 'd', 'e', '\0', @@ -3243,7 +3238,6 @@ static const char kSTSHostTable[] = { /* "dmtry.me", true */ 'd', 'm', 't', 'r', 'y', '.', 'm', 'e', '\0', /* "dmwall.cn", true */ 'd', 'm', 'w', 'a', 'l', 'l', '.', 'c', 'n', '\0', /* "dmxledlights.com", true */ 'd', 'm', 'x', 'l', 'e', 'd', 'l', 'i', 'g', 'h', 't', 's', '.', 'c', 'o', 'm', '\0', - /* "dmz.ninja", true */ 'd', 'm', 'z', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "dn3s.me", true */ 'd', 'n', '3', 's', '.', 'm', 'e', '\0', /* "dn42.us", true */ 'd', 'n', '4', '2', '.', 'u', 's', '\0', /* "dna.li", true */ 'd', 'n', 'a', '.', 'l', 'i', '\0', @@ -3332,6 +3326,7 @@ static const char kSTSHostTable[] = { /* "dorianmuthig.com", true */ 'd', 'o', 'r', 'i', 'a', 'n', 'm', 'u', 't', 'h', 'i', 'g', '.', 'c', 'o', 'm', '\0', /* "dormiu.com", true */ 'd', 'o', 'r', 'm', 'i', 'u', '.', 'c', 'o', 'm', '\0', /* "dormiu.com.br", true */ 'd', 'o', 'r', 'm', 'i', 'u', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', + /* "dot.ro", true */ 'd', 'o', 't', '.', 'r', 'o', '\0', /* "dot42.no", true */ 'd', 'o', 't', '4', '2', '.', 'n', 'o', '\0', /* "dotbigbang.com", true */ 'd', 'o', 't', 'b', 'i', 'g', 'b', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "dotbox.org", true */ 'd', 'o', 't', 'b', 'o', 'x', '.', 'o', 'r', 'g', '\0', @@ -3539,7 +3534,6 @@ static const char kSTSHostTable[] = { /* "ecnetworker.com", true */ 'e', 'c', 'n', 'e', 't', 'w', 'o', 'r', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "ecogen.com.au", true */ 'e', 'c', 'o', 'g', 'e', 'n', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "ecogen.net.au", true */ 'e', 'c', 'o', 'g', 'e', 'n', '.', 'n', 'e', 't', '.', 'a', 'u', '\0', - /* "ecole-maternelle-saint-joseph.be", true */ 'e', 'c', 'o', 'l', 'e', '-', 'm', 'a', 't', 'e', 'r', 'n', 'e', 'l', 'l', 'e', '-', 's', 'a', 'i', 'n', 't', '-', 'j', 'o', 's', 'e', 'p', 'h', '.', 'b', 'e', '\0', /* "ecompen.co.za", true */ 'e', 'c', 'o', 'm', 'p', 'e', 'n', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "econsumer.gov", true */ 'e', 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', '.', 'g', 'o', 'v', '\0', /* "ecorp.cc", true */ 'e', 'c', 'o', 'r', 'p', '.', 'c', 'c', '\0', @@ -3706,7 +3700,6 @@ static const char kSTSHostTable[] = { /* "emyr.net", true */ 'e', 'm', 'y', 'r', '.', 'n', 'e', 't', '\0', /* "en-booster.jp", true */ 'e', 'n', '-', 'b', 'o', 'o', 's', 't', 'e', 'r', '.', 'j', 'p', '\0', /* "en-maktoob.search.yahoo.com", false */ 'e', 'n', '-', 'm', 'a', 'k', 't', 'o', 'o', 'b', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', - /* "enaah.de", true */ 'e', 'n', 'a', 'a', 'h', '.', 'd', 'e', '\0', /* "enaia.fr", true */ 'e', 'n', 'a', 'i', 'a', '.', 'f', 'r', '\0', /* "enaim.de", true */ 'e', 'n', 'a', 'i', 'm', '.', 'd', 'e', '\0', /* "encfs.win", true */ 'e', 'n', 'c', 'f', 's', '.', 'w', 'i', 'n', '\0', @@ -3762,7 +3755,6 @@ static const char kSTSHostTable[] = { /* "enscosupply.com", true */ 'e', 'n', 's', 'c', 'o', 's', 'u', 'p', 'p', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "ensemble-rubato.de", true */ 'e', 'n', 's', 'e', 'm', 'b', 'l', 'e', '-', 'r', 'u', 'b', 'a', 't', 'o', '.', 'd', 'e', '\0', /* "enskat.de", true */ 'e', 'n', 's', 'k', 'a', 't', '.', 'd', 'e', '\0', - /* "enskatson-sippe.de", true */ 'e', 'n', 's', 'k', 'a', 't', 's', 'o', 'n', '-', 's', 'i', 'p', 'p', 'e', '.', 'd', 'e', '\0', /* "ensured.com", true */ 'e', 'n', 's', 'u', 'r', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "ensured.nl", true */ 'e', 'n', 's', 'u', 'r', 'e', 'd', '.', 'n', 'l', '\0', /* "enteente.com", true */ 'e', 'n', 't', 'e', 'e', 'n', 't', 'e', '.', 'c', 'o', 'm', '\0', @@ -3810,8 +3802,10 @@ static const char kSTSHostTable[] = { /* "erico.jp", true */ 'e', 'r', 'i', 'c', 'o', '.', 'j', 'p', '\0', /* "ericoc.com", true */ 'e', 'r', 'i', 'c', 'o', 'c', '.', 'c', 'o', 'm', '\0', /* "ericwie.se", true */ 'e', 'r', 'i', 'c', 'w', 'i', 'e', '.', 's', 'e', '\0', + /* "ericyl.com", true */ 'e', 'r', 'i', 'c', 'y', 'l', '.', 'c', 'o', 'm', '\0', /* "eridanus.uk", true */ 'e', 'r', 'i', 'd', 'a', 'n', 'u', 's', '.', 'u', 'k', '\0', /* "erigrid.eu", true */ 'e', 'r', 'i', 'g', 'r', 'i', 'd', '.', 'e', 'u', '\0', + /* "eriix.org", true */ 'e', 'r', 'i', 'i', 'x', '.', 'o', 'r', 'g', '\0', /* "erikhubers.nl", true */ 'e', 'r', 'i', 'k', 'h', 'u', 'b', 'e', 'r', 's', '.', 'n', 'l', '\0', /* "erikseth.de", true */ 'e', 'r', 'i', 'k', 's', 'e', 't', 'h', '.', 'd', 'e', '\0', /* "eriner.me", true */ 'e', 'r', 'i', 'n', 'e', 'r', '.', 'm', 'e', '\0', @@ -4163,6 +4157,7 @@ static const char kSTSHostTable[] = { /* "fidel.uk", true */ 'f', 'i', 'd', 'e', 'l', '.', 'u', 'k', '\0', /* "fidelapp.com", true */ 'f', 'i', 'd', 'e', 'l', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "fiendishmasterplan.com", true */ 'f', 'i', 'e', 'n', 'd', 'i', 's', 'h', 'm', 'a', 's', 't', 'e', 'r', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', + /* "fierlafijn.net", true */ 'f', 'i', 'e', 'r', 'l', 'a', 'f', 'i', 'j', 'n', '.', 'n', 'e', 't', '\0', /* "fierman.eu", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'e', 'u', '\0', /* "fierman.net", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'n', 'e', 't', '\0', /* "fierman.us", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'u', 's', '\0', @@ -4228,6 +4223,7 @@ static const char kSTSHostTable[] = { /* "fitzsim.org", true */ 'f', 'i', 't', 'z', 's', 'i', 'm', '.', 'o', 'r', 'g', '\0', /* "fiws.net", true */ 'f', 'i', 'w', 's', '.', 'n', 'e', 't', '\0', /* "fixate.ru", true */ 'f', 'i', 'x', 'a', 't', 'e', '.', 'r', 'u', '\0', + /* "fixel.express", true */ 'f', 'i', 'x', 'e', 'l', '.', 'e', 'x', 'p', 'r', 'e', 's', 's', '\0', /* "fixforce.nl", true */ 'f', 'i', 'x', 'f', 'o', 'r', 'c', 'e', '.', 'n', 'l', '\0', /* "fixhotsauce.com", true */ 'f', 'i', 'x', 'h', 'o', 't', 's', 'a', 'u', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "fixmycomputerdude.com", true */ 'f', 'i', 'x', 'm', 'y', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 'd', 'u', 'd', 'e', '.', 'c', 'o', 'm', '\0', @@ -4427,7 +4423,6 @@ static const char kSTSHostTable[] = { /* "freifunk-luenen.de", true */ 'f', 'r', 'e', 'i', 'f', 'u', 'n', 'k', '-', 'l', 'u', 'e', 'n', 'e', 'n', '.', 'd', 'e', '\0', /* "freiwurst.net", true */ 'f', 'r', 'e', 'i', 'w', 'u', 'r', 's', 't', '.', 'n', 'e', 't', '\0', /* "frenzel.dk", true */ 'f', 'r', 'e', 'n', 'z', 'e', 'l', '.', 'd', 'k', '\0', - /* "freqlabs.com", true */ 'f', 'r', 'e', 'q', 'l', 'a', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "fresh-hotel.org", true */ 'f', 'r', 'e', 's', 'h', '-', 'h', 'o', 't', 'e', 'l', '.', 'o', 'r', 'g', '\0', /* "freshdns.nl", true */ 'f', 'r', 'e', 's', 'h', 'd', 'n', 's', '.', 'n', 'l', '\0', /* "freshlymind.com", true */ 'f', 'r', 'e', 's', 'h', 'l', 'y', 'm', 'i', 'n', 'd', '.', 'c', 'o', 'm', '\0', @@ -4624,6 +4619,7 @@ static const char kSTSHostTable[] = { /* "geekabit.nl", true */ 'g', 'e', 'e', 'k', 'a', 'b', 'i', 't', '.', 'n', 'l', '\0', /* "geekandi.com", true */ 'g', 'e', 'e', 'k', 'a', 'n', 'd', 'i', '.', 'c', 'o', 'm', '\0', /* "geekariom.com", true */ 'g', 'e', 'e', 'k', 'a', 'r', 'i', 'o', 'm', '.', 'c', 'o', 'm', '\0', + /* "geekbundle.org", false */ 'g', 'e', 'e', 'k', 'b', 'u', 'n', 'd', 'l', 'e', '.', 'o', 'r', 'g', '\0', /* "geeklair.net", true */ 'g', 'e', 'e', 'k', 'l', 'a', 'i', 'r', '.', 'n', 'e', 't', '\0', /* "geeknik.com", true */ 'g', 'e', 'e', 'k', 'n', 'i', 'k', '.', 'c', 'o', 'm', '\0', /* "geekwu.org", true */ 'g', 'e', 'e', 'k', 'w', 'u', '.', 'o', 'r', 'g', '\0', @@ -4743,6 +4739,7 @@ static const char kSTSHostTable[] = { /* "gifzilla.net", false */ 'g', 'i', 'f', 'z', 'i', 'l', 'l', 'a', '.', 'n', 'e', 't', '\0', /* "gig.ru", false */ 'g', 'i', 'g', '.', 'r', 'u', '\0', /* "giga.nl", true */ 'g', 'i', 'g', 'a', '.', 'n', 'l', '\0', + /* "gigacog.com", true */ 'g', 'i', 'g', 'a', 'c', 'o', 'g', '.', 'c', 'o', 'm', '\0', /* "gigawa.lt", true */ 'g', 'i', 'g', 'a', 'w', 'a', '.', 'l', 't', '\0', /* "gijsbertus.com", true */ 'g', 'i', 'j', 's', 'b', 'e', 'r', 't', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "gilcloud.com", true */ 'g', 'i', 'l', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', @@ -4981,7 +4978,6 @@ static const char kSTSHostTable[] = { /* "groszek.pl", true */ 'g', 'r', 'o', 's', 'z', 'e', 'k', '.', 'p', 'l', '\0', /* "groth.im", true */ 'g', 'r', 'o', 't', 'h', '.', 'i', 'm', '\0', /* "groth.xyz", true */ 'g', 'r', 'o', 't', 'h', '.', 'x', 'y', 'z', '\0', - /* "groupebaillargeon.com", true */ 'g', 'r', 'o', 'u', 'p', 'e', 'b', 'a', 'i', 'l', 'l', 'a', 'r', 'g', 'e', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "groupme.com", true */ 'g', 'r', 'o', 'u', 'p', 'm', 'e', '.', 'c', 'o', 'm', '\0', /* "groups.google.com", true */ 'g', 'r', 'o', 'u', 'p', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "grozip.com", true */ 'g', 'r', 'o', 'z', 'i', 'p', '.', 'c', 'o', 'm', '\0', @@ -5000,7 +4996,6 @@ static const char kSTSHostTable[] = { /* "gtldna.com", true */ 'g', 't', 'l', 'd', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "gtmasterclub.it", false */ 'g', 't', 'm', 'a', 's', 't', 'e', 'r', 'c', 'l', 'u', 'b', '.', 'i', 't', '\0', /* "gtmetrix.com", true */ 'g', 't', 'm', 'e', 't', 'r', 'i', 'x', '.', 'c', 'o', 'm', '\0', - /* "gts-schulsoftware.de", true */ 'g', 't', 's', '-', 's', 'c', 'h', 'u', 'l', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '.', 'd', 'e', '\0', /* "guardian360.nl", true */ 'g', 'u', 'a', 'r', 'd', 'i', 'a', 'n', '3', '6', '0', '.', 'n', 'l', '\0', /* "gudini.net", true */ 'g', 'u', 'd', 'i', 'n', 'i', '.', 'n', 'e', 't', '\0', /* "guenthereder.at", true */ 'g', 'u', 'e', 'n', 't', 'h', 'e', 'r', 'e', 'd', 'e', 'r', '.', 'a', 't', '\0', @@ -5167,7 +5162,7 @@ static const char kSTSHostTable[] = { /* "hatethe.uk", true */ 'h', 'a', 't', 'e', 't', 'h', 'e', '.', 'u', 'k', '\0', /* "hatisenang.com", true */ 'h', 'a', 't', 'i', 's', 'e', 'n', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "haucke.xyz", true */ 'h', 'a', 'u', 'c', 'k', 'e', '.', 'x', 'y', 'z', '\0', - /* "hauntedfishtank.com", true */ 'h', 'a', 'u', 'n', 't', 'e', 'd', 'f', 'i', 's', 'h', 't', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', + /* "hauntedfishtank.com", false */ 'h', 'a', 'u', 'n', 't', 'e', 'd', 'f', 'i', 's', 'h', 't', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "hausverbrauch.de", true */ 'h', 'a', 'u', 's', 'v', 'e', 'r', 'b', 'r', 'a', 'u', 'c', 'h', '.', 'd', 'e', '\0', /* "hautarztzentrum.ch", true */ 'h', 'a', 'u', 't', 'a', 'r', 'z', 't', 'z', 'e', 'n', 't', 'r', 'u', 'm', '.', 'c', 'h', '\0', /* "haveforeningen-enghaven.dk", true */ 'h', 'a', 'v', 'e', 'f', 'o', 'r', 'e', 'n', 'i', 'n', 'g', 'e', 'n', '-', 'e', 'n', 'g', 'h', 'a', 'v', 'e', 'n', '.', 'd', 'k', '\0', @@ -5197,7 +5192,6 @@ static const char kSTSHostTable[] = { /* "hdrtranscon.com", true */ 'h', 'd', 'r', 't', 'r', 'a', 'n', 's', 'c', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "hds-lan.de", true */ 'h', 'd', 's', '-', 'l', 'a', 'n', '.', 'd', 'e', '\0', /* "hdy.nz", true */ 'h', 'd', 'y', '.', 'n', 'z', '\0', - /* "head.org", true */ 'h', 'e', 'a', 'd', '.', 'o', 'r', 'g', '\0', /* "headjapan.com", true */ 'h', 'e', 'a', 'd', 'j', 'a', 'p', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "healthcare.gov", false */ 'h', 'e', 'a', 'l', 't', 'h', 'c', 'a', 'r', 'e', '.', 'g', 'o', 'v', '\0', /* "healtheffectsofasbestos.com", true */ 'h', 'e', 'a', 'l', 't', 'h', 'e', 'f', 'f', 'e', 'c', 't', 's', 'o', 'f', 'a', 's', 'b', 'e', 's', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', @@ -5234,7 +5228,6 @@ static const char kSTSHostTable[] = { /* "heha.co", false */ 'h', 'e', 'h', 'a', '.', 'c', 'o', '\0', /* "heid.ws", true */ 'h', 'e', 'i', 'd', '.', 'w', 's', '\0', /* "heidilein.info", true */ 'h', 'e', 'i', 'd', 'i', 'l', 'e', 'i', 'n', '.', 'i', 'n', 'f', 'o', '\0', - /* "heijblok.com", true */ 'h', 'e', 'i', 'j', 'b', 'l', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "heiland.io", true */ 'h', 'e', 'i', 'l', 'a', 'n', 'd', '.', 'i', 'o', '\0', /* "heinpost.nl", false */ 'h', 'e', 'i', 'n', 'p', 'o', 's', 't', '.', 'n', 'l', '\0', /* "heissluft-fritteuse.com", true */ 'h', 'e', 'i', 's', 's', 'l', 'u', 'f', 't', '-', 'f', 'r', 'i', 't', 't', 'e', 'u', 's', 'e', '.', 'c', 'o', 'm', '\0', @@ -5294,7 +5287,6 @@ static const char kSTSHostTable[] = { /* "heute-kaufen.de", true */ 'h', 'e', 'u', 't', 'e', '-', 'k', 'a', 'u', 'f', 'e', 'n', '.', 'd', 'e', '\0', /* "heutger.net", true */ 'h', 'e', 'u', 't', 'g', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "hexacon.io", true */ 'h', 'e', 'x', 'a', 'c', 'o', 'n', '.', 'i', 'o', '\0', - /* "hexagon-e.com", true */ 'h', 'e', 'x', 'a', 'g', 'o', 'n', '-', 'e', '.', 'c', 'o', 'm', '\0', /* "hexe.net", true */ 'h', 'e', 'x', 'e', '.', 'n', 'e', 't', '\0', /* "hexed.it", true */ 'h', 'e', 'x', 'e', 'd', '.', 'i', 't', '\0', /* "hexicurity.com", true */ 'h', 'e', 'x', 'i', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', @@ -5360,7 +5352,6 @@ static const char kSTSHostTable[] = { /* "hohm.in", true */ 'h', 'o', 'h', 'm', '.', 'i', 'n', '\0', /* "hohnet.com", true */ 'h', 'o', 'h', 'n', 'e', 't', '.', 'c', 'o', 'm', '\0', /* "hoiku-map.tokyo", true */ 'h', 'o', 'i', 'k', 'u', '-', 'm', 'a', 'p', '.', 't', 'o', 'k', 'y', 'o', '\0', - /* "hokieprivacy.org", true */ 'h', 'o', 'k', 'i', 'e', 'p', 'r', 'i', 'v', 'a', 'c', 'y', '.', 'o', 'r', 'g', '\0', /* "holifestival-freyung.de", true */ 'h', 'o', 'l', 'i', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '-', 'f', 'r', 'e', 'y', 'u', 'n', 'g', '.', 'd', 'e', '\0', /* "holisticon.de", true */ 'h', 'o', 'l', 'i', 's', 't', 'i', 'c', 'o', 'n', '.', 'd', 'e', '\0', /* "hollowrap.com", true */ 'h', 'o', 'l', 'l', 'o', 'w', 'r', 'a', 'p', '.', 'c', 'o', 'm', '\0', @@ -5534,7 +5525,6 @@ static const char kSTSHostTable[] = { /* "i10z.com", true */ 'i', '1', '0', 'z', '.', 'c', 'o', 'm', '\0', /* "i1314.gdn", true */ 'i', '1', '3', '1', '4', '.', 'g', 'd', 'n', '\0', /* "i5y.co.uk", true */ 'i', '5', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "i95.me", false */ 'i', '9', '5', '.', 'm', 'e', '\0', /* "iactu.info", true */ 'i', 'a', 'c', 't', 'u', '.', 'i', 'n', 'f', 'o', '\0', /* "iainsimms.me", true */ 'i', 'a', 'i', 'n', 's', 'i', 'm', 'm', 's', '.', 'm', 'e', '\0', /* "iamcarrico.com", true */ 'i', 'a', 'm', 'c', 'a', 'r', 'r', 'i', 'c', 'o', '.', 'c', 'o', 'm', '\0', @@ -5600,6 +5590,7 @@ static const char kSTSHostTable[] = { /* "ieval.ro", true */ 'i', 'e', 'v', 'a', 'l', '.', 'r', 'o', '\0', /* "ifasec.de", false */ 'i', 'f', 'a', 's', 'e', 'c', '.', 'd', 'e', '\0', /* "ifcfg.me", true */ 'i', 'f', 'c', 'f', 'g', '.', 'm', 'e', '\0', + /* "ifconfig.co", true */ 'i', 'f', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', '\0', /* "iflare.de", true */ 'i', 'f', 'l', 'a', 'r', 'e', '.', 'd', 'e', '\0', /* "iformbuilder.com", false */ 'i', 'f', 'o', 'r', 'm', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "ifoss.me", true */ 'i', 'f', 'o', 's', 's', '.', 'm', 'e', '\0', @@ -5687,6 +5678,7 @@ static const char kSTSHostTable[] = { /* "imoto.me", true */ 'i', 'm', 'o', 't', 'o', '.', 'm', 'e', '\0', /* "imouyang.com", true */ 'i', 'm', 'o', 'u', 'y', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "impact.health.nz", true */ 'i', 'm', 'p', 'a', 'c', 't', '.', 'h', 'e', 'a', 'l', 't', 'h', '.', 'n', 'z', '\0', + /* "impex.com.bd", true */ 'i', 'm', 'p', 'e', 'x', '.', 'c', 'o', 'm', '.', 'b', 'd', '\0', /* "imppac.de", true */ 'i', 'm', 'p', 'p', 'a', 'c', '.', 'd', 'e', '\0', /* "impyus.com", true */ 'i', 'm', 'p', 'y', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "imququ.com", true */ 'i', 'm', 'q', 'u', 'q', 'u', '.', 'c', 'o', 'm', '\0', @@ -5799,6 +5791,7 @@ static const char kSTSHostTable[] = { /* "interisaudit.com", true */ 'i', 'n', 't', 'e', 'r', 'i', 's', 'a', 'u', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "interleucina.org", true */ 'i', 'n', 't', 'e', 'r', 'l', 'e', 'u', 'c', 'i', 'n', 'a', '.', 'o', 'r', 'g', '\0', /* "intermedinet.nl", true */ 'i', 'n', 't', 'e', 'r', 'm', 'e', 'd', 'i', 'n', 'e', 't', '.', 'n', 'l', '\0', + /* "internect.co.za", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 'c', 't', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "internet-pornografie.de", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', '-', 'p', 'o', 'r', 'n', 'o', 'g', 'r', 'a', 'f', 'i', 'e', '.', 'd', 'e', '\0', /* "internetbank.swedbank.se", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'a', 'n', 'k', '.', 's', 'w', 'e', 'd', 'b', 'a', 'n', 'k', '.', 's', 'e', '\0', /* "internetbugbounty.org", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'u', 'g', 'b', 'o', 'u', 'n', 't', 'y', '.', 'o', 'r', 'g', '\0', @@ -5931,6 +5924,7 @@ static const char kSTSHostTable[] = { /* "isslshop.com", true */ 'i', 's', 's', 'l', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0', /* "issuesofconcern.in", true */ 'i', 's', 's', 'u', 'e', 's', 'o', 'f', 'c', 'o', 'n', 'c', 'e', 'r', 'n', '.', 'i', 'n', '\0', /* "istanbul.systems", true */ 'i', 's', 't', 'a', 'n', 'b', 'u', 'l', '.', 's', 'y', 's', 't', 'e', 'm', 's', '\0', + /* "istanbultravelguide.info", true */ 'i', 's', 't', 'a', 'n', 'b', 'u', 'l', 't', 'r', 'a', 'v', 'e', 'l', 'g', 'u', 'i', 'd', 'e', '.', 'i', 'n', 'f', 'o', '\0', /* "istdieweltschonuntergegangen.de", true */ 'i', 's', 't', 'd', 'i', 'e', 'w', 'e', 'l', 't', 's', 'c', 'h', 'o', 'n', 'u', 'n', 't', 'e', 'r', 'g', 'e', 'g', 'a', 'n', 'g', 'e', 'n', '.', 'd', 'e', '\0', /* "isteinbaby.de", true */ 'i', 's', 't', 'e', 'i', 'n', 'b', 'a', 'b', 'y', '.', 'd', 'e', '\0', /* "istgame.com", true */ 'i', 's', 't', 'g', 'a', 'm', 'e', '.', 'c', 'o', 'm', '\0', @@ -5994,6 +5988,7 @@ static const char kSTSHostTable[] = { /* "ivpn.net", true */ 'i', 'v', 'p', 'n', '.', 'n', 'e', 't', '\0', /* "iwader.co.uk", true */ 'i', 'w', 'a', 'd', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "iwalton.com", true */ 'i', 'w', 'a', 'l', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', + /* "iwannarefill.com", true */ 'i', 'w', 'a', 'n', 'n', 'a', 'r', 'e', 'f', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "iwilcox.me.uk", true */ 'i', 'w', 'i', 'l', 'c', 'o', 'x', '.', 'm', 'e', '.', 'u', 'k', '\0', /* "iwizerunek.pl", true */ 'i', 'w', 'i', 'z', 'e', 'r', 'u', 'n', 'e', 'k', '.', 'p', 'l', '\0', /* "iww.me", true */ 'i', 'w', 'w', '.', 'm', 'e', '\0', @@ -6019,7 +6014,7 @@ static const char kSTSHostTable[] = { /* "j2ee.cz", true */ 'j', '2', 'e', 'e', '.', 'c', 'z', '\0', /* "j3e.de", true */ 'j', '3', 'e', '.', 'd', 'e', '\0', /* "ja-dyck.de", true */ 'j', 'a', '-', 'd', 'y', 'c', 'k', '.', 'd', 'e', '\0', - /* "ja-publications.com", false */ 'j', 'a', '-', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', + /* "ja-publications.com", true */ 'j', 'a', '-', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "jaaxypro.com", true */ 'j', 'a', 'a', 'x', 'y', 'p', 'r', 'o', '.', 'c', 'o', 'm', '\0', /* "jaba.hosting", true */ 'j', 'a', 'b', 'a', '.', 'h', 'o', 's', 't', 'i', 'n', 'g', '\0', /* "jabber.at", true */ 'j', 'a', 'b', 'b', 'e', 'r', '.', 'a', 't', '\0', @@ -6090,7 +6085,6 @@ static const char kSTSHostTable[] = { /* "jasonamorrow.com", true */ 'j', 'a', 's', 'o', 'n', 'a', 'm', 'o', 'r', 'r', 'o', 'w', '.', 'c', 'o', 'm', '\0', /* "jasonian-photo.com", true */ 'j', 'a', 's', 'o', 'n', 'i', 'a', 'n', '-', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0', /* "jasperespejo.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'e', 's', 'p', 'e', 'j', 'o', '.', 'c', 'o', 'm', '\0', - /* "jasperhammink.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'h', 'a', 'm', 'm', 'i', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "jasperhuttenmedia.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'h', 'u', 't', 't', 'e', 'n', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "jav-collective.com", true */ 'j', 'a', 'v', '-', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "javachip.win", true */ 'j', 'a', 'v', 'a', 'c', 'h', 'i', 'p', '.', 'w', 'i', 'n', '\0', @@ -6242,7 +6236,6 @@ static const char kSTSHostTable[] = { /* "jonirrings.com", true */ 'j', 'o', 'n', 'i', 'r', 'r', 'i', 'n', 'g', 's', '.', 'c', 'o', 'm', '\0', /* "jonlabelle.com", true */ 'j', 'o', 'n', 'l', 'a', 'b', 'e', 'l', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "jonnichols.info", true */ 'j', 'o', 'n', 'n', 'i', 'c', 'h', 'o', 'l', 's', '.', 'i', 'n', 'f', 'o', '\0', - /* "jonnybarnes.uk", true */ 'j', 'o', 'n', 'n', 'y', 'b', 'a', 'r', 'n', 'e', 's', '.', 'u', 'k', '\0', /* "jonnystoten.com", true */ 'j', 'o', 'n', 'n', 'y', 's', 't', 'o', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "jonoalderson.com", true */ 'j', 'o', 'n', 'o', 'a', 'l', 'd', 'e', 'r', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "jonpads.com", true */ 'j', 'o', 'n', 'p', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0', @@ -6291,6 +6284,7 @@ static const char kSTSHostTable[] = { /* "juergenhecht.de", true */ 'j', 'u', 'e', 'r', 'g', 'e', 'n', 'h', 'e', 'c', 'h', 't', '.', 'd', 'e', '\0', /* "jugendsuenden.info", true */ 'j', 'u', 'g', 'e', 'n', 'd', 's', 'u', 'e', 'n', 'd', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0', /* "juhakoho.com", true */ 'j', 'u', 'h', 'a', 'k', 'o', 'h', 'o', '.', 'c', 'o', 'm', '\0', + /* "juliangonggrijp.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 'g', 'o', 'n', 'g', 'g', 'r', 'i', 'j', 'p', '.', 'c', 'o', 'm', '\0', /* "julianmeyer.de", true */ 'j', 'u', 'l', 'i', 'a', 'n', 'm', 'e', 'y', 'e', 'r', '.', 'd', 'e', '\0', /* "juliansimioni.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 's', 'i', 'm', 'i', 'o', 'n', 'i', '.', 'c', 'o', 'm', '\0', /* "julibear.com", true */ 'j', 'u', 'l', 'i', 'b', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0', @@ -6728,6 +6722,7 @@ static const char kSTSHostTable[] = { /* "kriptosec.com", true */ 'k', 'r', 'i', 'p', 't', 'o', 's', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "krislamoureux.com", true */ 'k', 'r', 'i', 's', 'l', 'a', 'm', 'o', 'u', 'r', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0', /* "krisstarkey.co.uk", true */ 'k', 'r', 'i', 's', 's', 't', 'a', 'r', 'k', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "kristikala.nl", true */ 'k', 'r', 'i', 's', 't', 'i', 'k', 'a', 'l', 'a', '.', 'n', 'l', '\0', /* "kristinbailey.com", true */ 'k', 'r', 'i', 's', 't', 'i', 'n', 'b', 'a', 'i', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "kristofferkoch.com", true */ 'k', 'r', 'i', 's', 't', 'o', 'f', 'f', 'e', 'r', 'k', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "krizek.cc", true */ 'k', 'r', 'i', 'z', 'e', 'k', '.', 'c', 'c', '\0', @@ -6990,6 +6985,7 @@ static const char kSTSHostTable[] = { /* "leondenard.com", true */ 'l', 'e', 'o', 'n', 'd', 'e', 'n', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "leonklingele.de", true */ 'l', 'e', 'o', 'n', 'k', 'l', 'i', 'n', 'g', 'e', 'l', 'e', '.', 'd', 'e', '\0', /* "leonmahler.consulting", true */ 'l', 'e', 'o', 'n', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', + /* "leopoldina.net", true */ 'l', 'e', 'o', 'p', 'o', 'l', 'd', 'i', 'n', 'a', '.', 'n', 'e', 't', '\0', /* "lep.gov", true */ 'l', 'e', 'p', '.', 'g', 'o', 'v', '\0', /* "leppis-it.de", true */ 'l', 'e', 'p', 'p', 'i', 's', '-', 'i', 't', '.', 'd', 'e', '\0', /* "leprado.com", true */ 'l', 'e', 'p', 'r', 'a', 'd', 'o', '.', 'c', 'o', 'm', '\0', @@ -7006,6 +7002,7 @@ static const char kSTSHostTable[] = { /* "lesnet.co.uk", true */ 'l', 'e', 's', 'n', 'e', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "lesscloud.com", true */ 'l', 'e', 's', 's', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', /* "lessing.consulting", true */ 'l', 'e', 's', 's', 'i', 'n', 'g', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', + /* "let-go.cc", true */ 'l', 'e', 't', '-', 'g', 'o', '.', 'c', 'c', '\0', /* "letitfly.me", true */ 'l', 'e', 't', 'i', 't', 'f', 'l', 'y', '.', 'm', 'e', '\0', /* "letsgame.nl", true */ 'l', 'e', 't', 's', 'g', 'a', 'm', 'e', '.', 'n', 'l', '\0', /* "letstox.com", true */ 'l', 'e', 't', 's', 't', 'o', 'x', '.', 'c', 'o', 'm', '\0', @@ -7238,7 +7235,6 @@ static const char kSTSHostTable[] = { /* "lostg.com", true */ 'l', 'o', 's', 't', 'g', '.', 'c', 'o', 'm', '\0', /* "loteks.de", true */ 'l', 'o', 't', 'e', 'k', 's', '.', 'd', 'e', '\0', /* "lottosonline.com", true */ 'l', 'o', 't', 't', 'o', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', - /* "loucanfixit.com", true */ 'l', 'o', 'u', 'c', 'a', 'n', 'f', 'i', 'x', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "louiewatch.com", true */ 'l', 'o', 'u', 'i', 'e', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "louisvillevmug.info", true */ 'l', 'o', 'u', 'i', 's', 'v', 'i', 'l', 'l', 'e', 'v', 'm', 'u', 'g', '.', 'i', 'n', 'f', 'o', '\0', /* "loune.net", true */ 'l', 'o', 'u', 'n', 'e', '.', 'n', 'e', 't', '\0', @@ -7371,7 +7367,6 @@ static const char kSTSHostTable[] = { /* "macnemo.de", true */ 'm', 'a', 'c', 'n', 'e', 'm', 'o', '.', 'd', 'e', '\0', /* "maco.org.uk", true */ 'm', 'a', 'c', 'o', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', /* "macosxfilerecovery.com", true */ 'm', 'a', 'c', 'o', 's', 'x', 'f', 'i', 'l', 'e', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'c', 'o', 'm', '\0', - /* "maddi.biz", true */ 'm', 'a', 'd', 'd', 'i', '.', 'b', 'i', 'z', '\0', /* "madebyshore.com", true */ 'm', 'a', 'd', 'e', 'b', 'y', 's', 'h', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "madeglobal.com", true */ 'm', 'a', 'd', 'e', 'g', 'l', 'o', 'b', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "madeitwor.se", true */ 'm', 'a', 'd', 'e', 'i', 't', 'w', 'o', 'r', '.', 's', 'e', '\0', @@ -7385,7 +7380,6 @@ static const char kSTSHostTable[] = { /* "mae-berlinistanbul.com", true */ 'm', 'a', 'e', '-', 'b', 'e', 'r', 'l', 'i', 'n', 'i', 's', 't', 'a', 'n', 'b', 'u', 'l', '.', 'c', 'o', 'm', '\0', /* "maelstrom.ninja", true */ 'm', 'a', 'e', 'l', 's', 't', 'r', 'o', 'm', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "maff.scot", false */ 'm', 'a', 'f', 'f', '.', 's', 'c', 'o', 't', '\0', - /* "mafiaforum.de", true */ 'm', 'a', 'f', 'i', 'a', 'f', 'o', 'r', 'u', 'm', '.', 'd', 'e', '\0', /* "mafiasi.de", true */ 'm', 'a', 'f', 'i', 'a', 's', 'i', '.', 'd', 'e', '\0', /* "magdic.eu", true */ 'm', 'a', 'g', 'd', 'i', 'c', '.', 'e', 'u', '\0', /* "magenbrot.net", true */ 'm', 'a', 'g', 'e', 'n', 'b', 'r', 'o', 't', '.', 'n', 'e', 't', '\0', @@ -7533,7 +7527,6 @@ static const char kSTSHostTable[] = { /* "markri.nl", false */ 'm', 'a', 'r', 'k', 'r', 'i', '.', 'n', 'l', '\0', /* "marksouthall.com", true */ 'm', 'a', 'r', 'k', 's', 'o', 'u', 't', 'h', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "markt-heiligenstadt.de", true */ 'm', 'a', 'r', 'k', 't', '-', 'h', 'e', 'i', 'l', 'i', 'g', 'e', 'n', 's', 't', 'a', 'd', 't', '.', 'd', 'e', '\0', - /* "marktboten.de", true */ 'm', 'a', 'r', 'k', 't', 'b', 'o', 't', 'e', 'n', '.', 'd', 'e', '\0', /* "marktcontact.com", true */ 'm', 'a', 'r', 'k', 't', 'c', 'o', 'n', 't', 'a', 'c', 't', '.', 'c', 'o', 'm', '\0', /* "marktissink.nl", true */ 'm', 'a', 'r', 'k', 't', 'i', 's', 's', 'i', 'n', 'k', '.', 'n', 'l', '\0', /* "markusehrlicher.de", true */ 'm', 'a', 'r', 'k', 'u', 's', 'e', 'h', 'r', 'l', 'i', 'c', 'h', 'e', 'r', '.', 'd', 'e', '\0', @@ -7768,7 +7761,6 @@ static const char kSTSHostTable[] = { /* "mercamaris.es", true */ 'm', 'e', 'r', 'c', 'a', 'm', 'a', 'r', 'i', 's', '.', 'e', 's', '\0', /* "merccorp.de", true */ 'm', 'e', 'r', 'c', 'c', 'o', 'r', 'p', '.', 'd', 'e', '\0', /* "mercuryamericas.com", false */ 'm', 'e', 'r', 'c', 'u', 'r', 'y', 'a', 'm', 'e', 'r', 'i', 'c', 'a', 's', '.', 'c', 'o', 'm', '\0', - /* "meredithkm.info", true */ 'm', 'e', 'r', 'e', 'd', 'i', 't', 'h', 'k', 'm', '.', 'i', 'n', 'f', 'o', '\0', /* "merkel.me", true */ 'm', 'e', 'r', 'k', 'e', 'l', '.', 'm', 'e', '\0', /* "meronberry.jp", true */ 'm', 'e', 'r', 'o', 'n', 'b', 'e', 'r', 'r', 'y', '.', 'j', 'p', '\0', /* "mertcangokgoz.com", true */ 'm', 'e', 'r', 't', 'c', 'a', 'n', 'g', 'o', 'k', 'g', 'o', 'z', '.', 'c', 'o', 'm', '\0', @@ -7809,7 +7801,6 @@ static const char kSTSHostTable[] = { /* "miasarafina.de", true */ 'm', 'i', 'a', 's', 'a', 'r', 'a', 'f', 'i', 'n', 'a', '.', 'd', 'e', '\0', /* "micbase.com", true */ 'm', 'i', 'c', 'b', 'a', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "michael-rigart.be", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', '-', 'r', 'i', 'g', 'a', 'r', 't', '.', 'b', 'e', '\0', - /* "michaelcullen.name", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', 'c', 'u', 'l', 'l', 'e', 'n', '.', 'n', 'a', 'm', 'e', '\0', /* "michaelleibundgut.com", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', 'l', 'e', 'i', 'b', 'u', 'n', 'd', 'g', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "michaelmorpurgo.com", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', 'm', 'o', 'r', 'p', 'u', 'r', 'g', 'o', '.', 'c', 'o', 'm', '\0', /* "michaelrigart.be", true */ 'm', 'i', 'c', 'h', 'a', 'e', 'l', 'r', 'i', 'g', 'a', 'r', 't', '.', 'b', 'e', '\0', @@ -7861,6 +7852,7 @@ static const char kSTSHostTable[] = { /* "miknight.com", true */ 'm', 'i', 'k', 'n', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '\0', /* "mikroskeem.eu", true */ 'm', 'i', 'k', 'r', 'o', 's', 'k', 'e', 'e', 'm', '.', 'e', 'u', '\0', /* "mil0.com", true */ 'm', 'i', 'l', '0', '.', 'c', 'o', 'm', '\0', + /* "milahendri.com", true */ 'm', 'i', 'l', 'a', 'h', 'e', 'n', 'd', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "milanpala.cz", true */ 'm', 'i', 'l', 'a', 'n', 'p', 'a', 'l', 'a', '.', 'c', 'z', '\0', /* "milatrans.pl", true */ 'm', 'i', 'l', 'a', 't', 'r', 'a', 'n', 's', '.', 'p', 'l', '\0', /* "milcoresonline.com", true */ 'm', 'i', 'l', 'c', 'o', 'r', 'e', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', @@ -7955,7 +7947,6 @@ static const char kSTSHostTable[] = { /* "mizque.ch", true */ 'm', 'i', 'z', 'q', 'u', 'e', '.', 'c', 'h', '\0', /* "mjacobson.net", true */ 'm', 'j', 'a', 'c', 'o', 'b', 's', 'o', 'n', '.', 'n', 'e', 't', '\0', /* "mjanja.ch", true */ 'm', 'j', 'a', 'n', 'j', 'a', '.', 'c', 'h', '\0', - /* "mjcaffarattilaw.com", true */ 'm', 'j', 'c', 'a', 'f', 'f', 'a', 'r', 'a', 't', 't', 'i', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0', /* "mjec.net", true */ 'm', 'j', 'e', 'c', '.', 'n', 'e', 't', '\0', /* "mkasu.org", true */ 'm', 'k', 'a', 's', 'u', '.', 'o', 'r', 'g', '\0', /* "mkcert.org", true */ 'm', 'k', 'c', 'e', 'r', 't', '.', 'o', 'r', 'g', '\0', @@ -8200,7 +8191,6 @@ static const char kSTSHostTable[] = { /* "my.xero.com", false */ 'm', 'y', '.', 'x', 'e', 'r', 'o', '.', 'c', 'o', 'm', '\0', /* "myaccount.google.com", true */ 'm', 'y', 'a', 'c', 'c', 'o', 'u', 'n', 't', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "myadself.com", true */ 'm', 'y', 'a', 'd', 's', 'e', 'l', 'f', '.', 'c', 'o', 'm', '\0', - /* "myandroidtools.cc", true */ 'm', 'y', 'a', 'n', 'd', 'r', 'o', 'i', 'd', 't', 'o', 'o', 'l', 's', '.', 'c', 'c', '\0', /* "myartsjournal.com", true */ 'm', 'y', 'a', 'r', 't', 's', 'j', 'o', 'u', 'r', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "mybb.com", true */ 'm', 'y', 'b', 'b', '.', 'c', 'o', 'm', '\0', /* "mybeautyjobs.de", true */ 'm', 'y', 'b', 'e', 'a', 'u', 't', 'y', 'j', 'o', 'b', 's', '.', 'd', 'e', '\0', @@ -8249,7 +8239,6 @@ static const char kSTSHostTable[] = { /* "mypaperwriter.com", true */ 'm', 'y', 'p', 'a', 'p', 'e', 'r', 'w', 'r', 'i', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "mypayoffloan.com", true */ 'm', 'y', 'p', 'a', 'y', 'o', 'f', 'f', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "myphonebox.de", true */ 'm', 'y', 'p', 'h', 'o', 'n', 'e', 'b', 'o', 'x', '.', 'd', 'e', '\0', - /* "mypillcard.com", true */ 'm', 'y', 'p', 'i', 'l', 'l', 'c', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "myplaceonline.com", true */ 'm', 'y', 'p', 'l', 'a', 'c', 'e', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "myprintcard.de", true */ 'm', 'y', 'p', 'r', 'i', 'n', 't', 'c', 'a', 'r', 'd', '.', 'd', 'e', '\0', /* "myptsite.com", true */ 'm', 'y', 'p', 't', 's', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0', @@ -8269,10 +8258,6 @@ static const char kSTSHostTable[] = { /* "mythlogic.com", true */ 'm', 'y', 't', 'h', 'l', 'o', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "mythslegendscollection.com", true */ 'm', 'y', 't', 'h', 's', 'l', 'e', 'g', 'e', 'n', 'd', 's', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "mytraiteurs.com", true */ 'm', 'y', 't', 'r', 'a', 'i', 't', 'e', 'u', 'r', 's', '.', 'c', 'o', 'm', '\0', - /* "mytripcar.co.uk", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "mytripcar.com", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0', - /* "mytripcar.de", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'd', 'e', '\0', - /* "mytripcar.es", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'e', 's', '\0', /* "mytty.net", true */ 'm', 'y', 't', 't', 'y', '.', 'n', 'e', 't', '\0', /* "mytweeps.com", true */ 'm', 'y', 't', 'w', 'e', 'e', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "myvpl.com", true */ 'm', 'y', 'v', 'p', 'l', '.', 'c', 'o', 'm', '\0', @@ -8380,14 +8365,12 @@ static const char kSTSHostTable[] = { /* "nebra.io", true */ 'n', 'e', 'b', 'r', 'a', '.', 'i', 'o', '\0', /* "nebulousenhanced.com", true */ 'n', 'e', 'b', 'u', 'l', 'o', 'u', 's', 'e', 'n', 'h', 'a', 'n', 'c', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "necesitodinero.org", true */ 'n', 'e', 'c', 'e', 's', 'i', 't', 'o', 'd', 'i', 'n', 'e', 'r', 'o', '.', 'o', 'r', 'g', '\0', - /* "necormansir.com", true */ 'n', 'e', 'c', 'o', 'r', 'm', 'a', 'n', 's', 'i', 'r', '.', 'c', 'o', 'm', '\0', /* "nectarleaf.com", true */ 'n', 'e', 'c', 't', 'a', 'r', 'l', 'e', 'a', 'f', '.', 'c', 'o', 'm', '\0', /* "nedcdata.org", true */ 'n', 'e', 'd', 'c', 'd', 'a', 't', 'a', '.', 'o', 'r', 'g', '\0', /* "nedim-accueil.fr", true */ 'n', 'e', 'd', 'i', 'm', '-', 'a', 'c', 'c', 'u', 'e', 'i', 'l', '.', 'f', 'r', '\0', /* "nedraconsult.ru", true */ 'n', 'e', 'd', 'r', 'a', 'c', 'o', 'n', 's', 'u', 'l', 't', '.', 'r', 'u', '\0', /* "neel.ch", true */ 'n', 'e', 'e', 'l', '.', 'c', 'h', '\0', /* "neels.ch", true */ 'n', 'e', 'e', 'l', 's', '.', 'c', 'h', '\0', - /* "neer.io", true */ 'n', 'e', 'e', 'r', '.', 'i', 'o', '\0', /* "nefertitis.cz", true */ 'n', 'e', 'f', 'e', 'r', 't', 'i', 't', 'i', 's', '.', 'c', 'z', '\0', /* "neftebitum-kngk.ru", true */ 'n', 'e', 'f', 't', 'e', 'b', 'i', 't', 'u', 'm', '-', 'k', 'n', 'g', 'k', '.', 'r', 'u', '\0', /* "neg9.org", false */ 'n', 'e', 'g', '9', '.', 'o', 'r', 'g', '\0', @@ -8974,6 +8957,7 @@ static const char kSTSHostTable[] = { /* "ourchoice2016.com", true */ 'o', 'u', 'r', 'c', 'h', 'o', 'i', 'c', 'e', '2', '0', '1', '6', '.', 'c', 'o', 'm', '\0', /* "ourcloud.at", true */ 'o', 'u', 'r', 'c', 'l', 'o', 'u', 'd', '.', 'a', 't', '\0', /* "ourcodinglives.com", true */ 'o', 'u', 'r', 'c', 'o', 'd', 'i', 'n', 'g', 'l', 'i', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0', + /* "ourevents.net", true */ 'o', 'u', 'r', 'e', 'v', 'e', 'n', 't', 's', '.', 'n', 'e', 't', '\0', /* "outgress.com", true */ 'o', 'u', 't', 'g', 'r', 'e', 's', 's', '.', 'c', 'o', 'm', '\0', /* "outline.ski", true */ 'o', 'u', 't', 'l', 'i', 'n', 'e', '.', 's', 'k', 'i', '\0', /* "outlookonthedesktop.com", true */ 'o', 'u', 't', 'l', 'o', 'o', 'k', 'o', 'n', 't', 'h', 'e', 'd', 'e', 's', 'k', 't', 'o', 'p', '.', 'c', 'o', 'm', '\0', @@ -8982,6 +8966,7 @@ static const char kSTSHostTable[] = { /* "overkillshop.com", true */ 'o', 'v', 'e', 'r', 'k', 'i', 'l', 'l', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0', /* "overseamusic.de", true */ 'o', 'v', 'e', 'r', 's', 'e', 'a', 'm', 'u', 's', 'i', 'c', '.', 'd', 'e', '\0', /* "oversight.garden", true */ 'o', 'v', 'e', 'r', 's', 'i', 'g', 'h', 't', '.', 'g', 'a', 'r', 'd', 'e', 'n', '\0', + /* "overthinkingit.com", true */ 'o', 'v', 'e', 'r', 't', 'h', 'i', 'n', 'k', 'i', 'n', 'g', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "ovpn.to", true */ 'o', 'v', 'p', 'n', '.', 't', 'o', '\0', /* "owensmith.website", true */ 'o', 'w', 'e', 'n', 's', 'm', 'i', 't', 'h', '.', 'w', 'e', 'b', 's', 'i', 't', 'e', '\0', /* "own3d.ch", true */ 'o', 'w', 'n', '3', 'd', '.', 'c', 'h', '\0', @@ -9042,6 +9027,7 @@ static const char kSTSHostTable[] = { /* "paraborsa.net", true */ 'p', 'a', 'r', 'a', 'b', 'o', 'r', 's', 'a', '.', 'n', 'e', 't', '\0', /* "paradiselost.com", true */ 'p', 'a', 'r', 'a', 'd', 'i', 's', 'e', 'l', 'o', 's', 't', '.', 'c', 'o', 'm', '\0', /* "paradoxdesigns.org", true */ 'p', 'a', 'r', 'a', 'd', 'o', 'x', 'd', 'e', 's', 'i', 'g', 'n', 's', '.', 'o', 'r', 'g', '\0', + /* "paragon.com.sg", true */ 'p', 'a', 'r', 'a', 'g', 'o', 'n', '.', 'c', 'o', 'm', '.', 's', 'g', '\0', /* "paragonie.com", false */ 'p', 'a', 'r', 'a', 'g', 'o', 'n', 'i', 'e', '.', 'c', 'o', 'm', '\0', /* "paragreen.net", true */ 'p', 'a', 'r', 'a', 'g', 'r', 'e', 'e', 'n', '.', 'n', 'e', 't', '\0', /* "paranoxer.hu", true */ 'p', 'a', 'r', 'a', 'n', 'o', 'x', 'e', 'r', '.', 'h', 'u', '\0', @@ -9054,7 +9040,6 @@ static const char kSTSHostTable[] = { /* "parkingpoint.co.uk", true */ 'p', 'a', 'r', 'k', 'i', 'n', 'g', 'p', 'o', 'i', 'n', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "parlamento.gub.uy", true */ 'p', 'a', 'r', 'l', 'a', 'm', 'e', 'n', 't', 'o', '.', 'g', 'u', 'b', '.', 'u', 'y', '\0', /* "parleu2016.nl", true */ 'p', 'a', 'r', 'l', 'e', 'u', '2', '0', '1', '6', '.', 'n', 'l', '\0', - /* "parleur.net", true */ 'p', 'a', 'r', 'l', 'e', 'u', 'r', '.', 'n', 'e', 't', '\0', /* "parolu.io", true */ 'p', 'a', 'r', 'o', 'l', 'u', '.', 'i', 'o', '\0', /* "parsemail.org", true */ 'p', 'a', 'r', 's', 'e', 'm', 'a', 'i', 'l', '.', 'o', 'r', 'g', '\0', /* "parser.nu", true */ 'p', 'a', 'r', 's', 'e', 'r', '.', 'n', 'u', '\0', @@ -9111,6 +9096,7 @@ static const char kSTSHostTable[] = { /* "pauladamsmith.com", true */ 'p', 'a', 'u', 'l', 'a', 'd', 'a', 'm', 's', 'm', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "paulbakaus.com", true */ 'p', 'a', 'u', 'l', 'b', 'a', 'k', 'a', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "paulbdelaat.nl", true */ 'p', 'a', 'u', 'l', 'b', 'd', 'e', 'l', 'a', 'a', 't', '.', 'n', 'l', '\0', + /* "paulchen.at", true */ 'p', 'a', 'u', 'l', 'c', 'h', 'e', 'n', '.', 'a', 't', '\0', /* "paulewen.ca", true */ 'p', 'a', 'u', 'l', 'e', 'w', 'e', 'n', '.', 'c', 'a', '\0', /* "paulinewesterman.nl", true */ 'p', 'a', 'u', 'l', 'i', 'n', 'e', 'w', 'e', 's', 't', 'e', 'r', 'm', 'a', 'n', '.', 'n', 'l', '\0', /* "paulov.info", true */ 'p', 'a', 'u', 'l', 'o', 'v', '.', 'i', 'n', 'f', 'o', '\0', @@ -9493,6 +9479,7 @@ static const char kSTSHostTable[] = { /* "port443.hamburg", true */ 'p', 'o', 'r', 't', '4', '4', '3', '.', 'h', 'a', 'm', 'b', 'u', 'r', 'g', '\0', /* "port80.hamburg", true */ 'p', 'o', 'r', 't', '8', '0', '.', 'h', 'a', 'm', 'b', 'u', 'r', 'g', '\0', /* "portal.tirol.gv.at", true */ 'p', 'o', 'r', 't', 'a', 'l', '.', 't', 'i', 'r', 'o', 'l', '.', 'g', 'v', '.', 'a', 't', '\0', + /* "portalzine.de", true */ 'p', 'o', 'r', 't', 'a', 'l', 'z', 'i', 'n', 'e', '.', 'd', 'e', '\0', /* "portercup.com", true */ 'p', 'o', 'r', 't', 'e', 'r', 'c', 'u', 'p', '.', 'c', 'o', 'm', '\0', /* "portofrotterdam.com", true */ 'p', 'o', 'r', 't', 'o', 'f', 'r', 'o', 't', 't', 'e', 'r', 'd', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "portosonline.pl", true */ 'p', 'o', 'r', 't', 'o', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'p', 'l', '\0', @@ -9893,6 +9880,7 @@ static const char kSTSHostTable[] = { /* "ramsor-gaming.de", true */ 'r', 'a', 'm', 's', 'o', 'r', '-', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'd', 'e', '\0', /* "randc.org", true */ 'r', 'a', 'n', 'd', 'c', '.', 'o', 'r', 'g', '\0', /* "randomkoalafacts.com", true */ 'r', 'a', 'n', 'd', 'o', 'm', 'k', 'o', 'a', 'l', 'a', 'f', 'a', 'c', 't', 's', '.', 'c', 'o', 'm', '\0', + /* "randomprecision.co.uk", true */ 'r', 'a', 'n', 'd', 'o', 'm', 'p', 'r', 'e', 'c', 'i', 's', 'i', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "randstaddirect.nl", true */ 'r', 'a', 'n', 'd', 's', 't', 'a', 'd', 'd', 'i', 'r', 'e', 'c', 't', '.', 'n', 'l', '\0', /* "rangde.org", true */ 'r', 'a', 'n', 'g', 'd', 'e', '.', 'o', 'r', 'g', '\0', /* "rantanda.com", true */ 'r', 'a', 'n', 't', 'a', 'n', 'd', 'a', '.', 'c', 'o', 'm', '\0', @@ -10168,7 +10156,6 @@ static const char kSTSHostTable[] = { /* "ristoarea.it", true */ 'r', 'i', 's', 't', 'o', 'a', 'r', 'e', 'a', '.', 'i', 't', '\0', /* "ristorantefattoamano.eu", true */ 'r', 'i', 's', 't', 'o', 'r', 'a', 'n', 't', 'e', 'f', 'a', 't', 't', 'o', 'a', 'm', 'a', 'n', 'o', '.', 'e', 'u', '\0', /* "rithm.ch", true */ 'r', 'i', 't', 'h', 'm', '.', 'c', 'h', '\0', - /* "rivastation.de", true */ 'r', 'i', 'v', 'a', 's', 't', 'a', 't', 'i', 'o', 'n', '.', 'd', 'e', '\0', /* "rivermendhealthcenters.com", true */ 'r', 'i', 'v', 'e', 'r', 'm', 'e', 'n', 'd', 'h', 'e', 'a', 'l', 't', 'h', 'c', 'e', 'n', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "riversideauto.net", true */ 'r', 'i', 'v', 'e', 'r', 's', 'i', 'd', 'e', 'a', 'u', 't', 'o', '.', 'n', 'e', 't', '\0', /* "rivy.org", true */ 'r', 'i', 'v', 'y', '.', 'o', 'r', 'g', '\0', @@ -10223,14 +10210,12 @@ static const char kSTSHostTable[] = { /* "roguetechhub.org", true */ 'r', 'o', 'g', 'u', 'e', 't', 'e', 'c', 'h', 'h', 'u', 'b', '.', 'o', 'r', 'g', '\0', /* "rohedaten.de", true */ 'r', 'o', 'h', 'e', 'd', 'a', 't', 'e', 'n', '.', 'd', 'e', '\0', /* "rohitagr.com", true */ 'r', 'o', 'h', 'i', 't', 'a', 'g', 'r', '.', 'c', 'o', 'm', '\0', - /* "rohlik.cz", true */ 'r', 'o', 'h', 'l', 'i', 'k', '.', 'c', 'z', '\0', /* "rointe.online", true */ 'r', 'o', 'i', 'n', 't', 'e', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0', /* "rokki.ch", true */ 'r', 'o', 'k', 'k', 'i', '.', 'c', 'h', '\0', /* "rokort.dk", true */ 'r', 'o', 'k', 'o', 'r', 't', '.', 'd', 'k', '\0', /* "rokudenashi.de", true */ 'r', 'o', 'k', 'u', 'd', 'e', 'n', 'a', 's', 'h', 'i', '.', 'd', 'e', '\0', /* "roland.io", true */ 'r', 'o', 'l', 'a', 'n', 'd', '.', 'i', 'o', '\0', /* "rolandreed.cn", true */ 'r', 'o', 'l', 'a', 'n', 'd', 'r', 'e', 'e', 'd', '.', 'c', 'n', '\0', - /* "rolandszabo.com", true */ 'r', 'o', 'l', 'a', 'n', 'd', 's', 'z', 'a', 'b', 'o', '.', 'c', 'o', 'm', '\0', /* "rolodato.com", true */ 'r', 'o', 'l', 'o', 'd', 'a', 't', 'o', '.', 'c', 'o', 'm', '\0', /* "romab.com", true */ 'r', 'o', 'm', 'a', 'b', '.', 'c', 'o', 'm', '\0', /* "romaimperator.com", true */ 'r', 'o', 'm', 'a', 'i', 'm', 'p', 'e', 'r', 'a', 't', 'o', 'r', '.', 'c', 'o', 'm', '\0', @@ -10563,6 +10548,7 @@ static const char kSTSHostTable[] = { /* "schutzwerk.com", true */ 's', 'c', 'h', 'u', 't', 'z', 'w', 'e', 'r', 'k', '.', 'c', 'o', 'm', '\0', /* "schwabenhaus-ka.de", true */ 's', 'c', 'h', 'w', 'a', 'b', 'e', 'n', 'h', 'a', 'u', 's', '-', 'k', 'a', '.', 'd', 'e', '\0', /* "schwarzer.it", true */ 's', 'c', 'h', 'w', 'a', 'r', 'z', 'e', 'r', '.', 'i', 't', '\0', + /* "schwarzwaldcon.de", true */ 's', 'c', 'h', 'w', 'a', 'r', 'z', 'w', 'a', 'l', 'd', 'c', 'o', 'n', '.', 'd', 'e', '\0', /* "schweizerbolzonello.net", true */ 's', 'c', 'h', 'w', 'e', 'i', 'z', 'e', 'r', 'b', 'o', 'l', 'z', 'o', 'n', 'e', 'l', 'l', 'o', '.', 'n', 'e', 't', '\0', /* "schwinabart.com", true */ 's', 'c', 'h', 'w', 'i', 'n', 'a', 'b', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0', /* "schwinger.me", true */ 's', 'c', 'h', 'w', 'i', 'n', 'g', 'e', 'r', '.', 'm', 'e', '\0', @@ -10629,7 +10615,6 @@ static const char kSTSHostTable[] = { /* "secondarysurvivor.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'h', 'e', 'l', 'p', '\0', /* "secondarysurvivorportal.com", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "secondarysurvivorportal.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'h', 'e', 'l', 'p', '\0', - /* "secondpay.nl", true */ 's', 'e', 'c', 'o', 'n', 'd', 'p', 'a', 'y', '.', 'n', 'l', '\0', /* "secondspace.ca", true */ 's', 'e', 'c', 'o', 'n', 'd', 's', 'p', 'a', 'c', 'e', '.', 'c', 'a', '\0', /* "seconfig.sytes.net", true */ 's', 'e', 'c', 'o', 'n', 'f', 'i', 'g', '.', 's', 'y', 't', 'e', 's', '.', 'n', 'e', 't', '\0', /* "secpatrol.de", true */ 's', 'e', 'c', 'p', 'a', 't', 'r', 'o', 'l', '.', 'd', 'e', '\0', @@ -10659,6 +10644,7 @@ static const char kSTSHostTable[] = { /* "securityheaders.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'h', 'e', 'a', 'd', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "securityheaders.io", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'h', 'e', 'a', 'd', 'e', 'r', 's', '.', 'i', 'o', '\0', /* "securitymap.wiki", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'm', 'a', 'p', '.', 'w', 'i', 'k', 'i', '\0', + /* "securityprimes.in", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'p', 'r', 'i', 'm', 'e', 's', '.', 'i', 'n', '\0', /* "securitysnobs.com", false */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'n', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "securitysoapbox.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'o', 'a', 'p', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "securitystreak.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 't', 'r', 'e', 'a', 'k', '.', 'c', 'o', 'm', '\0', @@ -10666,6 +10652,7 @@ static const char kSTSHostTable[] = { /* "secuvera.de", true */ 's', 'e', 'c', 'u', 'v', 'e', 'r', 'a', '.', 'd', 'e', '\0', /* "sedrubal.de", true */ 's', 'e', 'd', 'r', 'u', 'b', 'a', 'l', '.', 'd', 'e', '\0', /* "sedussa.ro", true */ 's', 'e', 'd', 'u', 's', 's', 'a', '.', 'r', 'o', '\0', + /* "sedziapilkarski.pl", true */ 's', 'e', 'd', 'z', 'i', 'a', 'p', 'i', 'l', 'k', 'a', 'r', 's', 'k', 'i', '.', 'p', 'l', '\0', /* "seedalpha.com", true */ 's', 'e', 'e', 'd', 'a', 'l', 'p', 'h', 'a', '.', 'c', 'o', 'm', '\0', /* "seedboxers.net", true */ 's', 'e', 'e', 'd', 'b', 'o', 'x', 'e', 'r', 's', '.', 'n', 'e', 't', '\0', /* "seeks.ru", true */ 's', 'e', 'e', 'k', 's', '.', 'r', 'u', '\0', @@ -10793,6 +10780,7 @@ static const char kSTSHostTable[] = { /* "sharepic.xyz", true */ 's', 'h', 'a', 'r', 'e', 'p', 'i', 'c', '.', 'x', 'y', 'z', '\0', /* "sharepointdrive.com", true */ 's', 'h', 'a', 'r', 'e', 'p', 'o', 'i', 'n', 't', 'd', 'r', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "sharesplitter.com", true */ 's', 'h', 'a', 'r', 'e', 's', 'p', 'l', 'i', 't', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', + /* "sharevari.com", true */ 's', 'h', 'a', 'r', 'e', 'v', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "shareworx.net", true */ 's', 'h', 'a', 'r', 'e', 'w', 'o', 'r', 'x', '.', 'n', 'e', 't', '\0', /* "sharvey.ca", true */ 's', 'h', 'a', 'r', 'v', 'e', 'y', '.', 'c', 'a', '\0', /* "shasso.com", true */ 's', 'h', 'a', 's', 's', 'o', '.', 'c', 'o', 'm', '\0', @@ -10902,6 +10890,7 @@ static const char kSTSHostTable[] = { /* "silvergoldbull.com", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "silvergoldbull.de", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'd', 'e', '\0', /* "silvergoldbull.kr", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'k', 'r', '\0', + /* "silverhome.ninja", false */ 's', 'i', 'l', 'v', 'e', 'r', 'h', 'o', 'm', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "silvistefi.com", true */ 's', 'i', 'l', 'v', 'i', 's', 't', 'e', 'f', 'i', '.', 'c', 'o', 'm', '\0', /* "simbihaiti.com", false */ 's', 'i', 'm', 'b', 'i', 'h', 'a', 'i', 't', 'i', '.', 'c', 'o', 'm', '\0', /* "simbolo.co.uk", false */ 's', 'i', 'm', 'b', 'o', 'l', 'o', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -11046,6 +11035,7 @@ static const char kSTSHostTable[] = { /* "slotcar.com", false */ 's', 'l', 'o', 't', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "slow.zone", true */ 's', 'l', 'o', 'w', '.', 'z', 'o', 'n', 'e', '\0', /* "slowb.ro", true */ 's', 'l', 'o', 'w', 'b', '.', 'r', 'o', '\0', + /* "slowfood.es", true */ 's', 'l', 'o', 'w', 'f', 'o', 'o', 'd', '.', 'e', 's', '\0', /* "slse.ca", true */ 's', 'l', 's', 'e', '.', 'c', 'a', '\0', /* "slxh.eu", true */ 's', 'l', 'x', 'h', '.', 'e', 'u', '\0', /* "slxh.nl", true */ 's', 'l', 'x', 'h', '.', 'n', 'l', '\0', @@ -11105,7 +11095,6 @@ static const char kSTSHostTable[] = { /* "smpetrey.com", true */ 's', 'm', 'p', 'e', 't', 'r', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "sms1.ro", true */ 's', 'm', 's', '1', '.', 'r', 'o', '\0', /* "smskeywords.co.uk", true */ 's', 'm', 's', 'k', 'e', 'y', 'w', 'o', 'r', 'd', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "smvfd.info", true */ 's', 'm', 'v', 'f', 'd', '.', 'i', 'n', 'f', 'o', '\0', /* "snakehosting.dk", false */ 's', 'n', 'a', 'k', 'e', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'k', '\0', /* "snapappointments.com", true */ 's', 'n', 'a', 'p', 'a', 'p', 'p', 'o', 'i', 'n', 't', 'm', 'e', 'n', 't', 's', '.', 'c', 'o', 'm', '\0', /* "snapfinance.com", true */ 's', 'n', 'a', 'p', 'f', 'i', 'n', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0', @@ -11245,7 +11234,6 @@ static const char kSTSHostTable[] = { /* "southamerican.dating", true */ 's', 'o', 'u', 't', 'h', 'a', 'm', 'e', 'r', 'i', 'c', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "southernjamusa.com", true */ 's', 'o', 'u', 't', 'h', 'e', 'r', 'n', 'j', 'a', 'm', 'u', 's', 'a', '.', 'c', 'o', 'm', '\0', /* "southernutahinfluencers.com", true */ 's', 'o', 'u', 't', 'h', 'e', 'r', 'n', 'u', 't', 'a', 'h', 'i', 'n', 'f', 'l', 'u', 'e', 'n', 'c', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', - /* "southmeriden-vfd.org", true */ 's', 'o', 'u', 't', 'h', 'm', 'e', 'r', 'i', 'd', 'e', 'n', '-', 'v', 'f', 'd', '.', 'o', 'r', 'g', '\0', /* "southside-crew.com", true */ 's', 'o', 'u', 't', 'h', 's', 'i', 'd', 'e', '-', 'c', 'r', 'e', 'w', '.', 'c', 'o', 'm', '\0', /* "southside-tuning-day.de", true */ 's', 'o', 'u', 't', 'h', 's', 'i', 'd', 'e', '-', 't', 'u', 'n', 'i', 'n', 'g', '-', 'd', 'a', 'y', '.', 'd', 'e', '\0', /* "souvik.me", true */ 's', 'o', 'u', 'v', 'i', 'k', '.', 'm', 'e', '\0', @@ -11450,6 +11438,7 @@ static const char kSTSHostTable[] = { /* "steemit.com", true */ 's', 't', 'e', 'e', 'm', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "steenackers.be", true */ 's', 't', 'e', 'e', 'n', 'a', 'c', 'k', 'e', 'r', 's', '.', 'b', 'e', '\0', /* "stefanovski.io", true */ 's', 't', 'e', 'f', 'a', 'n', 'o', 'v', 's', 'k', 'i', '.', 'i', 'o', '\0', + /* "stefany.eu", true */ 's', 't', 'e', 'f', 'a', 'n', 'y', '.', 'e', 'u', '\0', /* "steidlewirt.de", true */ 's', 't', 'e', 'i', 'd', 'l', 'e', 'w', 'i', 'r', 't', '.', 'd', 'e', '\0', /* "steigerplank.com", false */ 's', 't', 'e', 'i', 'g', 'e', 'r', 'p', 'l', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "steklein.de", true */ 's', 't', 'e', 'k', 'l', 'e', 'i', 'n', '.', 'd', 'e', '\0', @@ -11969,7 +11958,6 @@ static const char kSTSHostTable[] = { /* "thedreamtravelgroup.co.uk", true */ 't', 'h', 'e', 'd', 'r', 'e', 'a', 'm', 't', 'r', 'a', 'v', 'e', 'l', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "thedutchmarketers.com", true */ 't', 'h', 'e', 'd', 'u', 't', 'c', 'h', 'm', 'a', 'r', 'k', 'e', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "theescapistswiki.com", true */ 't', 'h', 'e', 'e', 's', 'c', 'a', 'p', 'i', 's', 't', 's', 'w', 'i', 'k', 'i', '.', 'c', 'o', 'm', '\0', - /* "theeyeopener.com", false */ 't', 'h', 'e', 'e', 'y', 'e', 'o', 'p', 'e', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "thefarbeyond.com", true */ 't', 'h', 'e', 'f', 'a', 'r', 'b', 'e', 'y', 'o', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "theflyingbear.net", true */ 't', 'h', 'e', 'f', 'l', 'y', 'i', 'n', 'g', 'b', 'e', 'a', 'r', '.', 'n', 'e', 't', '\0', /* "thefox.co", true */ 't', 'h', 'e', 'f', 'o', 'x', '.', 'c', 'o', '\0', @@ -12075,6 +12063,7 @@ static const char kSTSHostTable[] = { /* "thkb.net", true */ 't', 'h', 'k', 'b', '.', 'n', 'e', 't', '\0', /* "thole.org", true */ 't', 'h', 'o', 'l', 'e', '.', 'o', 'r', 'g', '\0', /* "thom4s.info", true */ 't', 'h', 'o', 'm', '4', 's', '.', 'i', 'n', 'f', 'o', '\0', + /* "thomas-grobelny.de", true */ 't', 'h', 'o', 'm', 'a', 's', '-', 'g', 'r', 'o', 'b', 'e', 'l', 'n', 'y', '.', 'd', 'e', '\0', /* "thomasbreads.com", true */ 't', 'h', 'o', 'm', 'a', 's', 'b', 'r', 'e', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "thomasgriffin.io", true */ 't', 'h', 'o', 'm', 'a', 's', 'g', 'r', 'i', 'f', 'f', 'i', 'n', '.', 'i', 'o', '\0', /* "thomasharvey.me", true */ 't', 'h', 'o', 'm', 'a', 's', 'h', 'a', 'r', 'v', 'e', 'y', '.', 'm', 'e', '\0', @@ -12106,9 +12095,11 @@ static const char kSTSHostTable[] = { /* "thyngster.com", false */ 't', 'h', 'y', 'n', 'g', 's', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "thynx.io", true */ 't', 'h', 'y', 'n', 'x', '.', 'i', 'o', '\0', /* "ti-pla.net", true */ 't', 'i', '-', 'p', 'l', 'a', '.', 'n', 'e', 't', '\0', + /* "ti.blog.br", true */ 't', 'i', '.', 'b', 'l', 'o', 'g', '.', 'b', 'r', '\0', /* "tiacollection.com", true */ 't', 'i', 'a', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "tianeptine.com", true */ 't', 'i', 'a', 'n', 'e', 'p', 't', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "tianshili.me", true */ 't', 'i', 'a', 'n', 's', 'h', 'i', 'l', 'i', '.', 'm', 'e', '\0', + /* "tianya.tv", true */ 't', 'i', 'a', 'n', 'y', 'a', '.', 't', 'v', '\0', /* "ticfleet.com", true */ 't', 'i', 'c', 'f', 'l', 'e', 'e', 't', '.', 'c', 'o', 'm', '\0', /* "ticketmates.com.au", true */ 't', 'i', 'c', 'k', 'e', 't', 'm', 'a', 't', 'e', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "ticketoplichting.nl", true */ 't', 'i', 'c', 'k', 'e', 't', 'o', 'p', 'l', 'i', 'c', 'h', 't', 'i', 'n', 'g', '.', 'n', 'l', '\0', @@ -12169,7 +12160,6 @@ static const char kSTSHostTable[] = { /* "tjs.me", true */ 't', 'j', 's', '.', 'm', 'e', '\0', /* "tkat.ch", true */ 't', 'k', 'a', 't', '.', 'c', 'h', '\0', /* "tkn.tokyo", true */ 't', 'k', 'n', '.', 't', 'o', 'k', 'y', 'o', '\0', - /* "tlach.cz", true */ 't', 'l', 'a', 'c', 'h', '.', 'c', 'z', '\0', /* "tlo.link", true */ 't', 'l', 'o', '.', 'l', 'i', 'n', 'k', '\0', /* "tlo.xyz", true */ 't', 'l', 'o', '.', 'x', 'y', 'z', '\0', /* "tls.builders", true */ 't', 'l', 's', '.', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\0', @@ -12196,6 +12186,7 @@ static const char kSTSHostTable[] = { /* "toccoig.com", true */ 't', 'o', 'c', 'c', 'o', 'i', 'g', '.', 'c', 'o', 'm', '\0', /* "todamateria.com.br", true */ 't', 'o', 'd', 'a', 'm', 'a', 't', 'e', 'r', 'i', 'a', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "todesschaf.org", true */ 't', 'o', 'd', 'e', 's', 's', 'c', 'h', 'a', 'f', '.', 'o', 'r', 'g', '\0', + /* "todoescine.com", true */ 't', 'o', 'd', 'o', 'e', 's', 'c', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "todoist.com", true */ 't', 'o', 'd', 'o', 'i', 's', 't', '.', 'c', 'o', 'm', '\0', /* "tofu.im", true */ 't', 'o', 'f', 'u', '.', 'i', 'm', '\0', /* "togelonlinecommunity.com", false */ 't', 'o', 'g', 'e', 'l', 'o', 'n', 'l', 'i', 'n', 'e', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', @@ -12407,6 +12398,7 @@ static const char kSTSHostTable[] = { /* "tribut.de", true */ 't', 'r', 'i', 'b', 'u', 't', '.', 'd', 'e', '\0', /* "tributh.net", true */ 't', 'r', 'i', 'b', 'u', 't', 'h', '.', 'n', 'e', 't', '\0', /* "trident-online.de", true */ 't', 'r', 'i', 'd', 'e', 'n', 't', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', + /* "trik.es", false */ 't', 'r', 'i', 'k', '.', 'e', 's', '\0', /* "trim-a-slab.com", true */ 't', 'r', 'i', 'm', '-', 'a', '-', 's', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0', /* "trimage.org", true */ 't', 'r', 'i', 'm', 'a', 'g', 'e', '.', 'o', 'r', 'g', '\0', /* "trineco.com", true */ 't', 'r', 'i', 'n', 'e', 'c', 'o', '.', 'c', 'o', 'm', '\0', @@ -12672,6 +12664,7 @@ static const char kSTSHostTable[] = { /* "upload.facebook.com", false */ 'u', 'p', 'l', 'o', 'a', 'd', '.', 'f', 'a', 'c', 'e', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "uploadbeta.com", true */ 'u', 'p', 'l', 'o', 'a', 'd', 'b', 'e', 't', 'a', '.', 'c', 'o', 'm', '\0', /* "upplevelse.com", true */ 'u', 'p', 'p', 'l', 'e', 'v', 'e', 'l', 's', 'e', '.', 'c', 'o', 'm', '\0', + /* "upr.com.ua", true */ 'u', 'p', 'r', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0', /* "uptic.net", true */ 'u', 'p', 't', 'i', 'c', '.', 'n', 'e', 't', '\0', /* "uptimed.com", true */ 'u', 'p', 't', 'i', 'm', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "uptimenotguaranteed.com", true */ 'u', 'p', 't', 'i', 'm', 'e', 'n', 'o', 't', 'g', 'u', 'a', 'r', 'a', 'n', 't', 'e', 'e', 'd', '.', 'c', 'o', 'm', '\0', @@ -12698,7 +12691,6 @@ static const char kSTSHostTable[] = { /* "usbtypeccompliant.com", true */ 'u', 's', 'b', 't', 'y', 'p', 'e', 'c', 'c', 'o', 'm', 'p', 'l', 'i', 'a', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "uscloud.nl", true */ 'u', 's', 'c', 'l', 'o', 'u', 'd', '.', 'n', 'l', '\0', /* "uscntalk.com", true */ 'u', 's', 'c', 'n', 't', 'a', 'l', 'k', '.', 'c', 'o', 'm', '\0', - /* "uscurrency.gov", true */ 'u', 's', 'c', 'u', 'r', 'r', 'e', 'n', 'c', 'y', '.', 'g', 'o', 'v', '\0', /* "usd.de", true */ 'u', 's', 'd', '.', 'd', 'e', '\0', /* "use.be", true */ 'u', 's', 'e', '.', 'b', 'e', '\0', /* "usedesk.ru", true */ 'u', 's', 'e', 'd', 'e', 's', 'k', '.', 'r', 'u', '\0', @@ -12715,7 +12707,6 @@ static const char kSTSHostTable[] = { /* "uspsoig.gov", true */ 'u', 's', 'p', 's', 'o', 'i', 'g', '.', 'g', 'o', 'v', '\0', /* "ussm.gov", true */ 'u', 's', 's', 'm', '.', 'g', 'o', 'v', '\0', /* "ust.space", true */ 'u', 's', 't', '.', 's', 'p', 'a', 'c', 'e', '\0', - /* "uswitch.com", true */ 'u', 's', 'w', 'i', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "utdsgda.com", true */ 'u', 't', 'd', 's', 'g', 'd', 'a', '.', 'c', 'o', 'm', '\0', /* "utilia.tools", true */ 'u', 't', 'i', 'l', 'i', 'a', '.', 't', 'o', 'o', 'l', 's', '\0', /* "utilitarian.com", true */ 'u', 't', 'i', 'l', 'i', 't', 'a', 'r', 'i', 'a', 'n', '.', 'c', 'o', 'm', '\0', @@ -12748,6 +12739,7 @@ static const char kSTSHostTable[] = { /* "valokuva-albumi.fi", true */ 'v', 'a', 'l', 'o', 'k', 'u', 'v', 'a', '-', 'a', 'l', 'b', 'u', 'm', 'i', '.', 'f', 'i', '\0', /* "valopv.be", true */ 'v', 'a', 'l', 'o', 'p', 'v', '.', 'b', 'e', '\0', /* "valordolarblue.com.ar", true */ 'v', 'a', 'l', 'o', 'r', 'd', 'o', 'l', 'a', 'r', 'b', 'l', 'u', 'e', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', + /* "valshamar.is", true */ 'v', 'a', 'l', 's', 'h', 'a', 'm', 'a', 'r', '.', 'i', 's', '\0', /* "valsk.is", true */ 'v', 'a', 'l', 's', 'k', '.', 'i', 's', '\0', /* "valskis.lt", true */ 'v', 'a', 'l', 's', 'k', 'i', 's', '.', 'l', 't', '\0', /* "valtoaho.com", true */ 'v', 'a', 'l', 't', 'o', 'a', 'h', 'o', '.', 'c', 'o', 'm', '\0', @@ -12756,7 +12748,6 @@ static const char kSTSHostTable[] = { /* "vandalfsen.me", true */ 'v', 'a', 'n', 'd', 'a', 'l', 'f', 's', 'e', 'n', '.', 'm', 'e', '\0', /* "vande-walle.eu", true */ 'v', 'a', 'n', 'd', 'e', '-', 'w', 'a', 'l', 'l', 'e', '.', 'e', 'u', '\0', /* "vanderziel.org", true */ 'v', 'a', 'n', 'd', 'e', 'r', 'z', 'i', 'e', 'l', '.', 'o', 'r', 'g', '\0', - /* "vangeluwedeberlaere.be", true */ 'v', 'a', 'n', 'g', 'e', 'l', 'u', 'w', 'e', 'd', 'e', 'b', 'e', 'r', 'l', 'a', 'e', 'r', 'e', '.', 'b', 'e', '\0', /* "vanhoutte.be", false */ 'v', 'a', 'n', 'h', 'o', 'u', 't', 't', 'e', '.', 'b', 'e', '\0', /* "vanmalland.com", true */ 'v', 'a', 'n', 'm', 'a', 'l', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "vantien.com", true */ 'v', 'a', 'n', 't', 'i', 'e', 'n', '.', 'c', 'o', 'm', '\0', @@ -12829,6 +12820,7 @@ static const char kSTSHostTable[] = { /* "verspai.de", true */ 'v', 'e', 'r', 's', 'p', 'a', 'i', '.', 'd', 'e', '\0', /* "vertner.net", true */ 'v', 'e', 'r', 't', 'n', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "veryapt.com", true */ 'v', 'e', 'r', 'y', 'a', 'p', 't', '.', 'c', 'o', 'm', '\0', + /* "ves.vn.ua", true */ 'v', 'e', 's', '.', 'v', 'n', '.', 'u', 'a', '\0', /* "vespacascadia.com", true */ 'v', 'e', 's', 'p', 'a', 'c', 'a', 's', 'c', 'a', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "vetdnacenter.com", false */ 'v', 'e', 't', 'd', 'n', 'a', 'c', 'e', 'n', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "veterinaire-cazeres-foucault.fr", true */ 'v', 'e', 't', 'e', 'r', 'i', 'n', 'a', 'i', 'r', 'e', '-', 'c', 'a', 'z', 'e', 'r', 'e', 's', '-', 'f', 'o', 'u', 'c', 'a', 'u', 'l', 't', '.', 'f', 'r', '\0', @@ -12930,6 +12922,7 @@ static const char kSTSHostTable[] = { /* "vleij.family", true */ 'v', 'l', 'e', 'i', 'j', '.', 'f', 'a', 'm', 'i', 'l', 'y', '\0', /* "vleij.se", true */ 'v', 'l', 'e', 'i', 'j', '.', 's', 'e', '\0', /* "vloeck.de", true */ 'v', 'l', 'o', 'e', 'c', 'k', '.', 'd', 'e', '\0', + /* "vlogge.com", true */ 'v', 'l', 'o', 'g', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "vmc.co.id", true */ 'v', 'm', 'c', '.', 'c', 'o', '.', 'i', 'd', '\0', /* "vmem.jp", true */ 'v', 'm', 'e', 'm', '.', 'j', 'p', '\0', /* "vmis.nl", true */ 'v', 'm', 'i', 's', '.', 'n', 'l', '\0', @@ -13209,6 +13202,7 @@ static const char kSTSHostTable[] = { /* "wf-trial-hrd.appspot.com", true */ 'w', 'f', '-', 't', 'r', 'i', 'a', 'l', '-', 'h', 'r', 'd', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "wfh.ovh", true */ 'w', 'f', 'h', '.', 'o', 'v', 'h', '\0', /* "wfh.se", true */ 'w', 'f', 'h', '.', 's', 'e', '\0', + /* "wg-tools.de", true */ 'w', 'g', '-', 't', 'o', 'o', 'l', 's', '.', 'd', 'e', '\0', /* "wg3k.us", true */ 'w', 'g', '3', 'k', '.', 'u', 's', '\0', /* "wh-guide.de", true */ 'w', 'h', '-', 'g', 'u', 'i', 'd', 'e', '.', 'd', 'e', '\0', /* "whatanime.ga", true */ 'w', 'h', 'a', 't', 'a', 'n', 'i', 'm', 'e', '.', 'g', 'a', '\0', @@ -13229,6 +13223,7 @@ static const char kSTSHostTable[] = { /* "whing.org", true */ 'w', 'h', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "whipnic.com", true */ 'w', 'h', 'i', 'p', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "whisker.network", true */ 'w', 'h', 'i', 's', 'k', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '\0', + /* "whiskeyriver.co.uk", true */ 'w', 'h', 'i', 's', 'k', 'e', 'y', 'r', 'i', 'v', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "whiskynerd.ca", true */ 'w', 'h', 'i', 's', 'k', 'y', 'n', 'e', 'r', 'd', '.', 'c', 'a', '\0', /* "whisp.ly", false */ 'w', 'h', 'i', 's', 'p', '.', 'l', 'y', '\0', /* "whispeer.de", true */ 'w', 'h', 'i', 's', 'p', 'e', 'e', 'r', '.', 'd', 'e', '\0', @@ -13406,6 +13401,7 @@ static const char kSTSHostTable[] = { /* "wpruby.com", true */ 'w', 'p', 'r', 'u', 'b', 'y', '.', 'c', 'o', 'm', '\0', /* "wpserp.com", true */ 'w', 'p', 's', 'e', 'r', 'p', '.', 'c', 'o', 'm', '\0', /* "wpvulndb.com", true */ 'w', 'p', 'v', 'u', 'l', 'n', 'd', 'b', '.', 'c', 'o', 'm', '\0', + /* "wpzhiku.com", true */ 'w', 'p', 'z', 'h', 'i', 'k', 'u', '.', 'c', 'o', 'm', '\0', /* "wql.zj.cn", true */ 'w', 'q', 'l', '.', 'z', 'j', '.', 'c', 'n', '\0', /* "wrara.org", true */ 'w', 'r', 'a', 'r', 'a', '.', 'o', 'r', 'g', '\0', /* "wrbunderwriting.com", true */ 'w', 'r', 'b', 'u', 'n', 'd', 'e', 'r', 'w', 'r', 'i', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -13566,6 +13562,7 @@ static const char kSTSHostTable[] = { /* "xmedius.eu", true */ 'x', 'm', 'e', 'd', 'i', 'u', 's', '.', 'e', 'u', '\0', /* "xmerak.com", true */ 'x', 'm', 'e', 'r', 'a', 'k', '.', 'c', 'o', 'm', '\0', /* "xmlbeam.org", true */ 'x', 'm', 'l', 'b', 'e', 'a', 'm', '.', 'o', 'r', 'g', '\0', + /* "xmonk.org", true */ 'x', 'm', 'o', 'n', 'k', '.', 'o', 'r', 'g', '\0', /* "xmpp.dk", true */ 'x', 'm', 'p', 'p', '.', 'd', 'k', '\0', /* "xmppwocky.net", true */ 'x', 'm', 'p', 'p', 'w', 'o', 'c', 'k', 'y', '.', 'n', 'e', 't', '\0', /* "xmr.my", true */ 'x', 'm', 'r', '.', 'm', 'y', '\0', @@ -13623,6 +13620,7 @@ static const char kSTSHostTable[] = { /* "xss.sk", true */ 'x', 's', 's', '.', 's', 'k', '\0', /* "xtarget.ru", true */ 'x', 't', 'a', 'r', 'g', 'e', 't', '.', 'r', 'u', '\0', /* "xtom.com", true */ 'x', 't', 'o', 'm', '.', 'c', 'o', 'm', '\0', + /* "xtremegaming.it", true */ 'x', 't', 'r', 'e', 'm', 'e', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'i', 't', '\0', /* "xtrim.ru", true */ 'x', 't', 'r', 'i', 'm', '.', 'r', 'u', '\0', /* "xtronics.com", true */ 'x', 't', 'r', 'o', 'n', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "xuc.me", true */ 'x', 'u', 'c', '.', 'm', 'e', '\0', @@ -13789,6 +13787,7 @@ static const char kSTSHostTable[] = { /* "zdrojak.cz", true */ 'z', 'd', 'r', 'o', 'j', 'a', 'k', '.', 'c', 'z', '\0', /* "ze3kr.com", true */ 'z', 'e', '3', 'k', 'r', '.', 'c', 'o', 'm', '\0', /* "zebry.nl", true */ 'z', 'e', 'b', 'r', 'y', '.', 'n', 'l', '\0', + /* "zeedroom.be", true */ 'z', 'e', 'e', 'd', 'r', 'o', 'o', 'm', '.', 'b', 'e', '\0', /* "zeel.com", true */ 'z', 'e', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "zehdenick-bleibt-bunt.de", true */ 'z', 'e', 'h', 'd', 'e', 'n', 'i', 'c', 'k', '-', 'b', 'l', 'e', 'i', 'b', 't', '-', 'b', 'u', 'n', 't', '.', 'd', 'e', '\0', /* "zehntner.ch", true */ 'z', 'e', 'h', 'n', 't', 'n', 'e', 'r', '.', 'c', 'h', '\0', @@ -13921,159 +13920,159 @@ static const nsSTSPreload kSTSPreloadList[] = { { 82, true }, { 92, true }, { 99, true }, - { 113, true }, - { 124, true }, - { 130, true }, - { 139, true }, - { 147, true }, - { 156, true }, - { 165, true }, - { 174, true }, - { 183, true }, - { 191, true }, - { 199, true }, - { 209, true }, + { 106, true }, + { 120, true }, + { 131, true }, + { 137, true }, + { 146, true }, + { 154, true }, + { 163, true }, + { 172, true }, + { 181, true }, + { 190, true }, + { 198, true }, + { 206, true }, { 216, true }, - { 226, true }, - { 237, true }, - { 250, true }, - { 258, true }, - { 266, true }, + { 223, true }, + { 233, true }, + { 244, true }, + { 257, true }, + { 265, true }, { 273, true }, - { 287, true }, - { 297, false }, - { 320, true }, - { 332, true }, - { 348, true }, - { 356, true }, - { 364, true }, - { 374, true }, + { 280, true }, + { 294, true }, + { 304, false }, + { 327, true }, + { 339, true }, + { 355, true }, + { 363, true }, + { 371, true }, { 381, true }, - { 396, true }, - { 410, true }, - { 422, true }, - { 433, true }, - { 444, true }, - { 455, true }, - { 466, true }, - { 477, true }, - { 487, true }, - { 497, true }, - { 522, true }, - { 530, true }, - { 538, true }, - { 549, false }, - { 565, true }, - { 576, true }, - { 597, true }, - { 613, true }, - { 621, true }, - { 646, true }, - { 668, true }, - { 685, true }, - { 708, true }, - { 718, true }, - { 729, true }, - { 740, true }, - { 754, true }, - { 776, true }, - { 788, true }, + { 388, true }, + { 403, true }, + { 417, true }, + { 429, true }, + { 440, true }, + { 451, true }, + { 462, true }, + { 473, true }, + { 484, true }, + { 494, true }, + { 504, true }, + { 529, true }, + { 537, true }, + { 545, true }, + { 556, false }, + { 572, true }, + { 583, true }, + { 604, true }, + { 620, true }, + { 628, true }, + { 653, true }, + { 675, true }, + { 692, true }, + { 715, true }, + { 725, true }, + { 736, true }, + { 747, true }, + { 761, true }, + { 783, true }, { 795, true }, - { 804, true }, + { 802, true }, { 811, true }, - { 822, true }, - { 833, true }, + { 818, true }, + { 829, true }, { 840, true }, { 847, true }, - { 858, true }, + { 854, true }, { 865, true }, - { 877, true }, - { 894, true }, - { 912, true }, - { 926, true }, - { 938, true }, - { 949, true }, - { 959, true }, - { 968, true }, - { 974, true }, - { 989, true }, - { 997, true }, - { 1006, true }, - { 1024, true }, - { 1040, true }, - { 1049, true }, - { 1057, true }, - { 1065, true }, - { 1076, true }, - { 1085, true }, - { 1097, true }, - { 1105, true }, - { 1115, true }, - { 1131, false }, - { 1144, true }, - { 1153, true }, - { 1167, true }, - { 1176, true }, - { 1197, true }, - { 1206, true }, - { 1216, true }, - { 1231, true }, - { 1248, true }, - { 1264, true }, - { 1271, true }, - { 1284, true }, - { 1293, true }, - { 1305, false }, - { 1317, true }, - { 1325, true }, - { 1336, true }, - { 1343, true }, - { 1352, true }, - { 1361, true }, - { 1374, true }, - { 1383, true }, - { 1402, true }, - { 1421, true }, - { 1433, true }, - { 1447, true }, - { 1459, true }, - { 1472, true }, - { 1480, true }, - { 1495, true }, - { 1507, true }, - { 1520, true }, - { 1530, true }, - { 1544, true }, - { 1560, true }, - { 1574, true }, - { 1588, true }, - { 1596, true }, - { 1603, true }, - { 1615, true }, - { 1626, true }, - { 1639, true }, - { 1648, true }, - { 1660, true }, - { 1671, true }, - { 1684, true }, - { 1692, false }, - { 1701, false }, - { 1714, true }, + { 872, true }, + { 884, true }, + { 901, true }, + { 919, true }, + { 933, true }, + { 945, true }, + { 956, true }, + { 965, true }, + { 971, true }, + { 986, true }, + { 994, true }, + { 1003, true }, + { 1021, true }, + { 1037, true }, + { 1046, true }, + { 1054, true }, + { 1062, true }, + { 1073, true }, + { 1082, true }, + { 1094, true }, + { 1102, true }, + { 1112, true }, + { 1128, false }, + { 1141, true }, + { 1150, true }, + { 1164, true }, + { 1173, true }, + { 1194, true }, + { 1203, true }, + { 1213, true }, + { 1228, true }, + { 1245, true }, + { 1261, true }, + { 1268, true }, + { 1281, true }, + { 1290, true }, + { 1302, false }, + { 1314, true }, + { 1322, true }, + { 1333, true }, + { 1340, true }, + { 1349, true }, + { 1358, true }, + { 1371, true }, + { 1380, true }, + { 1399, true }, + { 1418, true }, + { 1430, true }, + { 1444, true }, + { 1456, true }, + { 1469, true }, + { 1477, true }, + { 1492, true }, + { 1504, true }, + { 1517, true }, + { 1527, true }, + { 1541, true }, + { 1557, true }, + { 1571, true }, + { 1585, true }, + { 1593, true }, + { 1600, true }, + { 1612, true }, + { 1623, true }, + { 1636, true }, + { 1645, true }, + { 1657, true }, + { 1668, true }, + { 1679, true }, + { 1692, true }, + { 1700, false }, + { 1709, false }, { 1722, true }, - { 1734, true }, - { 1746, true }, - { 1761, true }, - { 1780, true }, - { 1787, false }, - { 1806, true }, - { 1816, true }, - { 1822, true }, - { 1831, true }, - { 1844, true }, - { 1856, true }, - { 1865, true }, - { 1878, true }, - { 1888, true }, + { 1730, true }, + { 1742, true }, + { 1754, true }, + { 1769, true }, + { 1788, true }, + { 1795, false }, + { 1814, true }, + { 1824, true }, + { 1830, true }, + { 1839, true }, + { 1852, true }, + { 1864, true }, + { 1873, true }, + { 1886, true }, { 1896, false }, { 1903, true }, { 1914, true }, @@ -14215,13595 +14214,13594 @@ static const nsSTSPreload kSTSPreloadList[] = { { 3806, true }, { 3825, true }, { 3844, true }, - { 3855, true }, - { 3867, true }, + { 3856, true }, + { 3871, true }, { 3882, true }, - { 3893, true }, - { 3906, true }, - { 3918, true }, - { 3931, true }, - { 3945, true }, - { 3955, true }, - { 3964, true }, - { 3978, true }, - { 3990, true }, - { 4017, true }, + { 3895, true }, + { 3907, true }, + { 3920, true }, + { 3934, true }, + { 3944, true }, + { 3953, true }, + { 3967, true }, + { 3979, true }, + { 4006, true }, + { 4032, true }, { 4043, true }, - { 4054, true }, + { 4056, true }, { 4067, true }, - { 4078, true }, - { 4102, true }, - { 4119, true }, - { 4147, true }, - { 4163, true }, - { 4172, true }, - { 4182, true }, - { 4196, true }, - { 4215, true }, - { 4225, true }, - { 4239, true }, - { 4247, false }, - { 4268, true }, - { 4286, true }, - { 4295, true }, - { 4314, true }, - { 4328, true }, - { 4347, true }, + { 4091, true }, + { 4108, true }, + { 4136, true }, + { 4152, true }, + { 4161, true }, + { 4171, true }, + { 4185, true }, + { 4204, true }, + { 4214, true }, + { 4228, true }, + { 4236, false }, + { 4257, true }, + { 4275, true }, + { 4284, true }, + { 4303, true }, + { 4317, true }, + { 4336, true }, + { 4349, true }, { 4360, true }, - { 4371, true }, - { 4391, true }, - { 4409, true }, - { 4427, false }, - { 4446, true }, - { 4460, true }, - { 4481, true }, - { 4497, true }, - { 4507, true }, - { 4520, true }, - { 4533, true }, - { 4547, true }, - { 4561, true }, - { 4571, true }, - { 4581, true }, - { 4591, true }, - { 4601, true }, - { 4611, true }, - { 4621, true }, - { 4638, true }, - { 4648, false }, + { 4380, true }, + { 4398, true }, + { 4416, false }, + { 4435, true }, + { 4449, true }, + { 4470, true }, + { 4486, true }, + { 4496, true }, + { 4509, true }, + { 4522, true }, + { 4536, true }, + { 4550, true }, + { 4560, true }, + { 4570, true }, + { 4580, true }, + { 4590, true }, + { 4600, true }, + { 4610, true }, + { 4627, true }, + { 4637, false }, + { 4645, true }, { 4656, true }, { 4667, true }, { 4678, true }, - { 4689, true }, - { 4698, true }, + { 4687, true }, + { 4707, true }, { 4718, true }, - { 4729, true }, - { 4746, true }, - { 4770, true }, - { 4784, true }, - { 4803, true }, - { 4815, true }, + { 4735, true }, + { 4759, true }, + { 4773, true }, + { 4792, true }, + { 4804, true }, + { 4820, true }, { 4831, true }, - { 4842, true }, - { 4856, true }, - { 4872, true }, - { 4887, true }, - { 4895, true }, - { 4912, true }, - { 4924, true }, - { 4941, true }, - { 4949, false }, + { 4845, true }, + { 4861, true }, + { 4876, true }, + { 4884, true }, + { 4901, true }, + { 4913, true }, + { 4930, true }, + { 4938, false }, + { 4954, true }, { 4965, true }, - { 4976, true }, - { 4984, true }, - { 4998, true }, - { 5010, true }, - { 5023, true }, - { 5035, true }, - { 5047, true }, - { 5061, true }, - { 5073, true }, - { 5083, true }, - { 5091, true }, - { 5101, true }, - { 5115, true }, - { 5128, true }, - { 5140, true }, - { 5159, true }, - { 5178, true }, - { 5211, true }, - { 5221, true }, - { 5235, true }, - { 5242, true }, - { 5259, true }, - { 5268, true }, - { 5275, true }, - { 5289, true }, + { 4973, true }, + { 4987, true }, + { 4999, true }, + { 5012, true }, + { 5024, true }, + { 5036, true }, + { 5050, true }, + { 5062, true }, + { 5072, true }, + { 5080, true }, + { 5090, true }, + { 5104, true }, + { 5117, true }, + { 5129, true }, + { 5148, true }, + { 5167, true }, + { 5200, true }, + { 5210, true }, + { 5224, true }, + { 5231, true }, + { 5248, true }, + { 5257, true }, + { 5264, true }, + { 5278, true }, + { 5286, true }, { 5297, true }, - { 5308, true }, - { 5323, true }, - { 5338, true }, - { 5355, true }, + { 5312, true }, + { 5327, true }, + { 5344, true }, + { 5354, true }, { 5365, true }, - { 5376, true }, + { 5380, true }, { 5391, true }, - { 5402, true }, + { 5403, true }, { 5414, true }, - { 5425, true }, + { 5434, true }, { 5445, true }, { 5456, true }, { 5467, true }, - { 5478, true }, - { 5491, true }, - { 5509, true }, - { 5521, true }, - { 5530, true }, + { 5480, true }, + { 5498, true }, + { 5510, true }, + { 5519, true }, + { 5533, true }, { 5544, true }, - { 5555, true }, + { 5561, true }, { 5572, true }, - { 5583, true }, - { 5591, true }, - { 5600, false }, - { 5626, false }, - { 5637, true }, - { 5647, false }, - { 5664, true }, - { 5674, true }, - { 5688, true }, - { 5700, true }, - { 5717, true }, - { 5724, true }, - { 5748, true }, - { 5764, true }, - { 5789, true }, - { 5814, true }, - { 5839, true }, - { 5851, true }, - { 5863, true }, - { 5872, true }, - { 5899, true }, - { 5912, false }, - { 5921, true }, - { 5937, true }, - { 5953, true }, - { 5965, true }, - { 5979, true }, - { 5999, true }, - { 6014, true }, - { 6035, true }, - { 6047, true }, - { 6057, true }, - { 6069, true }, - { 6081, true }, - { 6090, true }, - { 6102, true }, - { 6121, true }, + { 5580, true }, + { 5589, false }, + { 5615, false }, + { 5626, true }, + { 5636, false }, + { 5653, true }, + { 5663, true }, + { 5677, true }, + { 5689, true }, + { 5706, true }, + { 5713, true }, + { 5737, true }, + { 5753, true }, + { 5778, true }, + { 5803, true }, + { 5828, true }, + { 5840, true }, + { 5852, true }, + { 5861, true }, + { 5888, true }, + { 5901, false }, + { 5910, true }, + { 5926, true }, + { 5942, true }, + { 5954, true }, + { 5968, true }, + { 5988, true }, + { 6003, true }, + { 6024, true }, + { 6036, true }, + { 6046, true }, + { 6058, true }, + { 6070, true }, + { 6079, true }, + { 6091, true }, + { 6110, true }, + { 6123, true }, { 6134, true }, - { 6145, true }, - { 6154, true }, - { 6168, true }, - { 6182, true }, - { 6198, true }, - { 6214, true }, - { 6234, true }, - { 6255, true }, - { 6269, true }, - { 6282, true }, - { 6297, true }, - { 6315, true }, - { 6325, true }, - { 6340, true }, - { 6358, true }, - { 6372, true }, - { 6384, true }, - { 6399, true }, - { 6413, true }, - { 6428, true }, - { 6438, true }, - { 6452, true }, - { 6469, true }, - { 6484, true }, - { 6498, true }, - { 6512, true }, - { 6528, true }, - { 6540, false }, - { 6555, true }, - { 6567, true }, - { 6582, true }, - { 6596, true }, - { 6618, true }, - { 6630, true }, - { 6651, true }, - { 6663, true }, - { 6676, true }, - { 6688, true }, - { 6701, true }, + { 6143, true }, + { 6157, true }, + { 6171, true }, + { 6187, true }, + { 6203, true }, + { 6223, true }, + { 6244, true }, + { 6258, true }, + { 6271, true }, + { 6286, true }, + { 6304, true }, + { 6314, true }, + { 6329, true }, + { 6347, true }, + { 6361, true }, + { 6373, true }, + { 6388, true }, + { 6402, true }, + { 6417, true }, + { 6427, true }, + { 6441, true }, + { 6458, true }, + { 6473, true }, + { 6487, true }, + { 6501, true }, + { 6517, true }, + { 6529, false }, + { 6544, true }, + { 6556, true }, + { 6571, true }, + { 6585, true }, + { 6607, true }, + { 6619, true }, + { 6640, true }, + { 6652, true }, + { 6665, true }, + { 6677, true }, + { 6690, true }, + { 6705, true }, { 6716, true }, - { 6727, true }, + { 6732, true }, { 6743, true }, - { 6754, true }, - { 6766, true }, - { 6779, true }, - { 6799, true }, - { 6812, true }, - { 6830, true }, - { 6847, true }, - { 6871, true }, - { 6890, true }, - { 6904, true }, - { 6920, true }, - { 6939, true }, - { 6952, true }, - { 6973, true }, - { 6993, true }, - { 7013, true }, - { 7026, false }, - { 7039, true }, - { 7051, true }, - { 7061, true }, - { 7074, true }, - { 7088, true }, - { 7104, true }, - { 7118, true }, - { 7134, true }, - { 7146, true }, - { 7160, true }, - { 7173, true }, - { 7187, true }, - { 7195, true }, - { 7208, true }, - { 7223, true }, - { 7237, true }, - { 7256, true }, - { 7268, true }, - { 7282, true }, - { 7296, true }, - { 7308, true }, + { 6755, true }, + { 6768, true }, + { 6788, true }, + { 6801, true }, + { 6819, true }, + { 6836, true }, + { 6860, true }, + { 6879, true }, + { 6893, true }, + { 6909, true }, + { 6928, true }, + { 6941, true }, + { 6962, true }, + { 6982, true }, + { 7002, true }, + { 7015, false }, + { 7028, true }, + { 7040, true }, + { 7050, true }, + { 7063, true }, + { 7077, true }, + { 7093, true }, + { 7107, true }, + { 7123, true }, + { 7135, true }, + { 7149, true }, + { 7162, true }, + { 7176, true }, + { 7184, true }, + { 7197, true }, + { 7212, true }, + { 7226, true }, + { 7245, true }, + { 7257, true }, + { 7271, true }, + { 7285, true }, + { 7297, true }, + { 7312, true }, { 7323, true }, { 7334, true }, - { 7345, true }, - { 7357, true }, + { 7346, true }, + { 7354, true }, { 7365, true }, - { 7376, true }, - { 7384, true }, - { 7392, true }, - { 7400, true }, - { 7413, true }, - { 7420, true }, - { 7430, true }, - { 7443, true }, - { 7455, true }, - { 7468, true }, - { 7488, true }, - { 7500, true }, - { 7518, true }, - { 7531, true }, - { 7540, true }, - { 7552, true }, - { 7566, true }, - { 7579, true }, - { 7590, true }, - { 7600, true }, - { 7611, true }, - { 7621, true }, - { 7632, true }, - { 7641, true }, - { 7650, true }, - { 7666, true }, - { 7682, true }, - { 7710, true }, - { 7729, true }, - { 7744, true }, - { 7764, true }, - { 7776, true }, - { 7788, true }, - { 7799, true }, - { 7810, true }, - { 7825, true }, - { 7845, true }, - { 7863, true }, - { 7873, false }, - { 7884, true }, - { 7894, true }, - { 7911, true }, - { 7922, true }, - { 7931, true }, - { 7942, true }, - { 7961, true }, - { 7972, true }, - { 7990, true }, - { 8016, false }, - { 8027, true }, - { 8049, true }, - { 8063, true }, - { 8078, true }, - { 8092, true }, - { 8106, true }, - { 8121, true }, - { 8142, true }, - { 8152, true }, - { 8163, true }, - { 8184, true }, - { 8202, true }, - { 8215, true }, - { 8223, true }, - { 8236, true }, - { 8250, true }, - { 8268, true }, - { 8290, true }, - { 8305, true }, - { 8322, true }, - { 8344, true }, - { 8359, true }, - { 8376, true }, - { 8392, true }, - { 8408, true }, - { 8425, true }, - { 8440, true }, - { 8457, true }, - { 8474, true }, - { 8486, true }, - { 8504, true }, - { 8521, true }, - { 8536, true }, - { 8550, true }, - { 8567, true }, - { 8585, true }, - { 8600, true }, - { 8612, true }, - { 8625, true }, - { 8645, true }, - { 8656, true }, - { 8667, true }, - { 8678, true }, - { 8689, true }, - { 8701, true }, - { 8714, true }, - { 8733, true }, - { 8744, true }, - { 8757, true }, - { 8771, false }, - { 8784, false }, - { 8793, true }, - { 8810, true }, - { 8830, true }, - { 8841, true }, - { 8859, true }, - { 8891, true }, - { 8918, true }, - { 8928, true }, - { 8946, true }, - { 8961, true }, - { 8973, true }, - { 8985, true }, - { 9005, true }, - { 9024, true }, - { 9044, true }, - { 9067, true }, - { 9091, true }, - { 9103, true }, - { 9114, true }, - { 9126, true }, - { 9138, true }, - { 9154, true }, - { 9171, true }, - { 9190, true }, - { 9204, true }, - { 9215, true }, - { 9228, true }, - { 9240, false }, - { 9264, true }, - { 9280, true }, - { 9296, true }, - { 9308, true }, - { 9324, true }, - { 9341, true }, - { 9355, true }, - { 9366, true }, - { 9384, true }, - { 9400, true }, - { 9414, true }, - { 9429, true }, - { 9439, true }, - { 9456, true }, - { 9469, true }, - { 9482, true }, - { 9498, true }, - { 9509, true }, - { 9521, true }, - { 9532, true }, - { 9539, true }, - { 9547, true }, - { 9560, false }, - { 9568, true }, - { 9578, true }, - { 9592, false }, - { 9606, true }, - { 9622, true }, - { 9652, true }, - { 9675, true }, - { 9688, true }, - { 9707, true }, - { 9720, false }, - { 9739, true }, - { 9755, false }, - { 9771, true }, - { 9787, false }, - { 9802, false }, + { 7373, true }, + { 7381, true }, + { 7389, true }, + { 7397, true }, + { 7410, true }, + { 7417, true }, + { 7427, true }, + { 7440, true }, + { 7452, true }, + { 7465, true }, + { 7485, true }, + { 7497, true }, + { 7515, true }, + { 7528, true }, + { 7537, true }, + { 7549, true }, + { 7563, true }, + { 7576, true }, + { 7587, true }, + { 7597, true }, + { 7608, true }, + { 7618, true }, + { 7629, true }, + { 7638, true }, + { 7647, true }, + { 7663, true }, + { 7679, true }, + { 7707, true }, + { 7726, true }, + { 7741, true }, + { 7761, true }, + { 7773, true }, + { 7785, true }, + { 7796, true }, + { 7807, true }, + { 7822, true }, + { 7842, true }, + { 7860, true }, + { 7870, false }, + { 7881, true }, + { 7891, true }, + { 7908, true }, + { 7919, true }, + { 7928, true }, + { 7939, true }, + { 7958, true }, + { 7969, true }, + { 7987, true }, + { 8013, false }, + { 8024, true }, + { 8046, true }, + { 8060, true }, + { 8075, true }, + { 8089, true }, + { 8103, true }, + { 8118, true }, + { 8139, true }, + { 8149, true }, + { 8160, true }, + { 8181, true }, + { 8199, true }, + { 8212, true }, + { 8220, true }, + { 8233, true }, + { 8247, true }, + { 8265, true }, + { 8287, true }, + { 8302, true }, + { 8319, true }, + { 8341, true }, + { 8356, true }, + { 8373, true }, + { 8389, true }, + { 8405, true }, + { 8422, true }, + { 8437, true }, + { 8454, true }, + { 8471, true }, + { 8483, true }, + { 8501, true }, + { 8518, true }, + { 8533, true }, + { 8547, true }, + { 8564, true }, + { 8582, true }, + { 8597, true }, + { 8609, true }, + { 8622, true }, + { 8642, true }, + { 8653, true }, + { 8664, true }, + { 8675, true }, + { 8686, true }, + { 8698, true }, + { 8711, true }, + { 8730, true }, + { 8741, true }, + { 8754, true }, + { 8768, false }, + { 8781, false }, + { 8790, true }, + { 8807, true }, + { 8827, true }, + { 8838, true }, + { 8856, true }, + { 8888, true }, + { 8915, true }, + { 8925, true }, + { 8943, true }, + { 8958, true }, + { 8970, true }, + { 8982, true }, + { 9002, true }, + { 9021, true }, + { 9041, true }, + { 9064, true }, + { 9088, true }, + { 9100, true }, + { 9111, true }, + { 9123, true }, + { 9135, true }, + { 9151, true }, + { 9168, true }, + { 9187, true }, + { 9201, true }, + { 9212, true }, + { 9225, true }, + { 9237, false }, + { 9261, true }, + { 9277, true }, + { 9293, true }, + { 9305, true }, + { 9321, true }, + { 9338, true }, + { 9352, true }, + { 9363, true }, + { 9381, true }, + { 9397, true }, + { 9411, true }, + { 9426, true }, + { 9436, true }, + { 9453, true }, + { 9466, true }, + { 9479, true }, + { 9495, true }, + { 9506, true }, + { 9518, true }, + { 9529, true }, + { 9536, true }, + { 9544, true }, + { 9557, false }, + { 9565, true }, + { 9575, true }, + { 9589, false }, + { 9603, true }, + { 9619, true }, + { 9649, true }, + { 9672, true }, + { 9691, true }, + { 9704, false }, + { 9723, true }, + { 9739, false }, + { 9755, true }, + { 9771, false }, + { 9786, false }, + { 9799, true }, { 9815, true }, - { 9831, true }, - { 9843, true }, - { 9862, true }, - { 9883, true }, - { 9896, true }, - { 9909, true }, - { 9919, true }, - { 9930, true }, - { 9941, true }, + { 9827, true }, + { 9846, true }, + { 9867, true }, + { 9880, true }, + { 9893, true }, + { 9903, true }, + { 9914, true }, + { 9925, true }, + { 9939, true }, { 9955, true }, - { 9971, true }, - { 9988, false }, - { 10005, true }, - { 10031, true }, - { 10044, true }, - { 10058, true }, - { 10077, true }, - { 10098, true }, - { 10110, true }, - { 10124, true }, - { 10148, true }, - { 10161, true }, - { 10174, true }, - { 10188, true }, - { 10199, true }, - { 10208, true }, - { 10221, true }, - { 10234, true }, - { 10246, false }, - { 10264, true }, - { 10287, true }, - { 10314, true }, - { 10333, true }, - { 10353, true }, - { 10364, true }, - { 10376, true }, - { 10390, true }, - { 10398, true }, - { 10415, true }, - { 10428, true }, - { 10440, true }, - { 10458, true }, - { 10481, false }, - { 10497, true }, - { 10503, true }, - { 10515, true }, - { 10526, true }, - { 10543, true }, - { 10562, true }, - { 10574, true }, + { 9972, false }, + { 9989, true }, + { 10015, true }, + { 10028, true }, + { 10042, true }, + { 10061, true }, + { 10082, true }, + { 10094, true }, + { 10108, true }, + { 10132, true }, + { 10145, true }, + { 10158, true }, + { 10172, true }, + { 10183, true }, + { 10192, true }, + { 10205, true }, + { 10218, true }, + { 10230, false }, + { 10248, true }, + { 10271, true }, + { 10298, true }, + { 10317, true }, + { 10337, true }, + { 10348, true }, + { 10360, true }, + { 10374, true }, + { 10382, true }, + { 10399, true }, + { 10412, true }, + { 10424, true }, + { 10442, true }, + { 10465, false }, + { 10481, true }, + { 10487, true }, + { 10499, true }, + { 10510, true }, + { 10527, true }, + { 10546, true }, + { 10558, true }, + { 10587, true }, { 10603, true }, - { 10619, true }, - { 10632, true }, + { 10616, true }, + { 10630, true }, { 10646, true }, - { 10662, true }, - { 10675, true }, - { 10686, true }, - { 10695, true }, + { 10659, true }, + { 10670, true }, + { 10679, true }, + { 10691, true }, { 10707, true }, - { 10723, true }, + { 10721, true }, { 10737, true }, - { 10753, true }, - { 10767, true }, - { 10781, true }, - { 10801, true }, + { 10751, true }, + { 10765, true }, + { 10785, true }, + { 10797, true }, { 10813, true }, - { 10829, true }, - { 10843, false }, - { 10856, true }, - { 10871, true }, - { 10885, true }, - { 10894, true }, - { 10906, true }, - { 10924, false }, - { 10939, true }, - { 10952, true }, - { 10962, true }, - { 10976, true }, - { 11002, true }, - { 11012, true }, - { 11026, true }, - { 11040, true }, - { 11058, true }, - { 11076, false }, - { 11092, true }, - { 11102, true }, + { 10827, false }, + { 10840, true }, + { 10855, true }, + { 10869, true }, + { 10878, true }, + { 10890, true }, + { 10908, false }, + { 10923, true }, + { 10936, true }, + { 10946, true }, + { 10960, true }, + { 10986, true }, + { 10996, true }, + { 11010, true }, + { 11024, true }, + { 11042, true }, + { 11060, false }, + { 11076, true }, + { 11086, true }, + { 11097, true }, { 11113, true }, - { 11129, true }, - { 11137, true }, - { 11148, true }, - { 11158, true }, - { 11173, true }, - { 11192, true }, - { 11205, true }, - { 11220, true }, - { 11238, false }, - { 11253, true }, - { 11273, true }, - { 11284, true }, - { 11296, true }, - { 11309, true }, - { 11329, false }, - { 11343, true }, - { 11356, true }, - { 11374, true }, - { 11388, true }, - { 11401, true }, - { 11413, true }, - { 11427, true }, - { 11441, true }, - { 11453, true }, - { 11464, true }, - { 11475, true }, - { 11488, true }, - { 11503, true }, - { 11514, true }, - { 11525, true }, - { 11540, true }, + { 11121, true }, + { 11132, true }, + { 11142, true }, + { 11157, true }, + { 11176, true }, + { 11189, true }, + { 11204, true }, + { 11222, false }, + { 11237, true }, + { 11257, true }, + { 11268, true }, + { 11280, true }, + { 11293, true }, + { 11313, false }, + { 11327, true }, + { 11340, true }, + { 11358, true }, + { 11372, true }, + { 11385, true }, + { 11397, true }, + { 11411, true }, + { 11425, true }, + { 11437, true }, + { 11448, true }, + { 11459, true }, + { 11472, true }, + { 11487, true }, + { 11498, true }, + { 11509, true }, + { 11520, true }, + { 11530, true }, { 11551, true }, - { 11561, true }, - { 11582, true }, - { 11591, true }, - { 11598, true }, - { 11612, false }, - { 11625, true }, - { 11635, true }, - { 11648, true }, - { 11661, true }, - { 11673, true }, - { 11687, true }, - { 11697, true }, - { 11715, true }, - { 11725, true }, - { 11737, true }, - { 11751, true }, - { 11761, true }, - { 11777, true }, - { 11788, true }, - { 11805, true }, - { 11827, true }, - { 11853, true }, - { 11868, true }, + { 11560, true }, + { 11567, true }, + { 11581, false }, + { 11594, true }, + { 11604, true }, + { 11617, true }, + { 11630, true }, + { 11642, true }, + { 11656, true }, + { 11666, true }, + { 11684, true }, + { 11694, true }, + { 11706, true }, + { 11720, true }, + { 11730, true }, + { 11746, true }, + { 11757, true }, + { 11774, true }, + { 11796, true }, + { 11822, true }, + { 11837, true }, + { 11855, true }, + { 11866, true }, + { 11876, true }, { 11886, true }, - { 11897, true }, - { 11907, true }, - { 11917, true }, - { 11936, true }, - { 11956, true }, + { 11905, true }, + { 11925, true }, + { 11937, true }, + { 11951, true }, + { 11958, true }, { 11968, true }, - { 11982, true }, - { 11989, true }, - { 11999, true }, - { 12017, true }, - { 12039, true }, - { 12051, true }, - { 12063, true }, - { 12076, true }, + { 11986, true }, + { 12008, true }, + { 12020, true }, + { 12032, true }, + { 12045, true }, + { 12053, true }, + { 12065, false }, { 12085, true }, - { 12093, true }, - { 12105, false }, - { 12125, true }, - { 12132, true }, - { 12148, true }, - { 12164, true }, - { 12179, true }, - { 12189, true }, - { 12207, true }, - { 12234, true }, + { 12092, true }, + { 12108, true }, + { 12124, true }, + { 12139, true }, + { 12149, true }, + { 12167, true }, + { 12194, true }, + { 12211, true }, + { 12229, true }, + { 12237, true }, { 12251, true }, - { 12269, true }, - { 12277, true }, - { 12291, true }, - { 12302, true }, - { 12311, true }, - { 12338, true }, - { 12348, true }, - { 12364, true }, - { 12376, true }, - { 12391, true }, - { 12403, true }, - { 12418, true }, - { 12433, true }, - { 12445, true }, - { 12466, true }, - { 12483, true }, - { 12497, true }, - { 12509, true }, + { 12262, true }, + { 12271, true }, + { 12298, true }, + { 12308, true }, + { 12324, true }, + { 12336, true }, + { 12351, true }, + { 12363, true }, + { 12378, true }, + { 12393, true }, + { 12405, true }, + { 12426, true }, + { 12443, true }, + { 12457, true }, + { 12469, true }, + { 12479, true }, + { 12489, true }, + { 12504, true }, { 12519, true }, - { 12529, true }, + { 12532, true }, { 12544, true }, - { 12559, true }, - { 12572, true }, - { 12584, true }, - { 12592, true }, - { 12605, true }, - { 12623, true }, + { 12552, true }, + { 12565, true }, + { 12583, true }, + { 12604, true }, + { 12618, true }, + { 12634, true }, { 12644, true }, - { 12658, true }, - { 12674, true }, - { 12684, true }, - { 12697, true }, - { 12716, true }, + { 12657, true }, + { 12676, true }, + { 12702, true }, + { 12714, true }, + { 12730, true }, { 12742, true }, - { 12754, true }, - { 12770, true }, - { 12782, true }, - { 12801, true }, + { 12761, true }, + { 12774, true }, + { 12785, true }, + { 12796, true }, { 12814, true }, - { 12825, true }, - { 12836, true }, - { 12854, true }, - { 12884, true }, - { 12907, true }, - { 12920, false }, - { 12928, true }, - { 12940, true }, - { 12950, true }, - { 12965, true }, - { 12983, true }, - { 12993, true }, - { 13022, true }, - { 13038, true }, - { 13054, true }, - { 13075, true }, - { 13086, true }, - { 13098, true }, - { 13110, true }, - { 13128, true }, - { 13146, true }, - { 13167, true }, - { 13192, true }, - { 13206, true }, - { 13219, true }, - { 13234, true }, - { 13247, true }, - { 13260, true }, - { 13271, true }, - { 13297, true }, - { 13313, true }, - { 13323, true }, - { 13335, true }, - { 13352, true }, - { 13364, true }, - { 13377, true }, + { 12844, true }, + { 12867, true }, + { 12880, false }, + { 12888, true }, + { 12900, true }, + { 12910, true }, + { 12925, true }, + { 12943, true }, + { 12953, true }, + { 12982, true }, + { 12998, true }, + { 13014, true }, + { 13035, true }, + { 13046, true }, + { 13058, true }, + { 13070, true }, + { 13088, true }, + { 13106, true }, + { 13127, true }, + { 13152, true }, + { 13166, true }, + { 13179, true }, + { 13194, true }, + { 13207, true }, + { 13220, true }, + { 13231, true }, + { 13257, true }, + { 13273, true }, + { 13283, true }, + { 13295, true }, + { 13312, true }, + { 13324, true }, + { 13337, true }, + { 13345, true }, + { 13356, true }, + { 13367, true }, { 13385, true }, - { 13396, true }, - { 13407, true }, - { 13425, true }, - { 13440, true }, - { 13458, true }, - { 13467, true }, - { 13481, true }, - { 13492, true }, - { 13500, true }, - { 13510, true }, - { 13518, true }, - { 13528, true }, - { 13543, true }, - { 13563, true }, - { 13571, true }, - { 13596, true }, - { 13612, true }, - { 13619, true }, - { 13627, true }, - { 13636, false }, - { 13645, true }, - { 13661, true }, - { 13674, true }, - { 13683, true }, - { 13692, true }, - { 13707, true }, - { 13717, true }, - { 13729, true }, - { 13747, false }, - { 13763, true }, - { 13773, true }, - { 13783, true }, - { 13793, true }, - { 13805, true }, - { 13818, true }, - { 13831, true }, - { 13841, true }, + { 13400, true }, + { 13418, true }, + { 13427, true }, + { 13441, true }, + { 13452, true }, + { 13460, true }, + { 13470, true }, + { 13478, true }, + { 13488, true }, + { 13503, true }, + { 13523, true }, + { 13531, true }, + { 13556, true }, + { 13572, true }, + { 13579, true }, + { 13587, true }, + { 13596, false }, + { 13605, true }, + { 13621, true }, + { 13634, true }, + { 13643, true }, + { 13652, true }, + { 13667, true }, + { 13677, true }, + { 13689, true }, + { 13707, false }, + { 13723, true }, + { 13733, true }, + { 13743, true }, + { 13753, true }, + { 13765, true }, + { 13778, true }, + { 13791, true }, + { 13801, true }, + { 13811, true }, + { 13823, true }, + { 13835, true }, { 13851, true }, - { 13863, true }, - { 13875, true }, - { 13891, true }, - { 13902, false }, - { 13912, true }, - { 13920, true }, - { 13929, true }, - { 13943, true }, - { 13958, false }, - { 13967, true }, - { 13981, true }, - { 13995, true }, - { 14006, true }, - { 14019, true }, - { 14043, true }, - { 14056, true }, - { 14068, true }, - { 14079, true }, - { 14099, true }, - { 14117, true }, - { 14135, true }, - { 14150, true }, - { 14171, true }, - { 14195, true }, - { 14205, true }, - { 14215, true }, - { 14225, true }, - { 14236, true }, - { 14261, true }, - { 14290, true }, - { 14303, true }, - { 14315, true }, - { 14325, true }, + { 13862, false }, + { 13872, true }, + { 13880, true }, + { 13889, true }, + { 13903, true }, + { 13918, false }, + { 13927, true }, + { 13941, true }, + { 13955, true }, + { 13966, true }, + { 13979, true }, + { 14003, true }, + { 14016, true }, + { 14028, true }, + { 14039, true }, + { 14059, true }, + { 14077, true }, + { 14095, true }, + { 14110, true }, + { 14131, true }, + { 14155, true }, + { 14165, true }, + { 14175, true }, + { 14185, true }, + { 14196, true }, + { 14221, true }, + { 14250, true }, + { 14263, true }, + { 14275, true }, + { 14285, true }, + { 14293, true }, + { 14302, true }, + { 14316, false }, { 14333, true }, - { 14342, true }, - { 14356, false }, - { 14373, true }, - { 14385, true }, + { 14345, true }, + { 14360, true }, + { 14367, true }, + { 14380, true }, + { 14392, true }, { 14400, true }, - { 14407, true }, - { 14420, true }, - { 14432, true }, - { 14440, true }, - { 14455, true }, - { 14464, true }, - { 14477, true }, - { 14489, true }, - { 14500, true }, - { 14510, true }, + { 14415, true }, + { 14424, true }, + { 14437, true }, + { 14449, true }, + { 14460, true }, + { 14470, true }, + { 14485, true }, + { 14502, true }, + { 14515, true }, { 14525, true }, - { 14542, true }, - { 14555, true }, - { 14565, true }, + { 14538, true }, + { 14552, true }, + { 14566, true }, { 14578, true }, - { 14592, true }, - { 14606, true }, - { 14618, true }, - { 14633, true }, - { 14649, true }, - { 14664, true }, - { 14678, true }, - { 14691, true }, - { 14707, true }, - { 14719, true }, - { 14733, true }, - { 14745, true }, - { 14757, true }, - { 14768, true }, - { 14779, true }, - { 14794, false }, - { 14809, false }, - { 14825, true }, - { 14843, true }, - { 14860, true }, - { 14878, true }, - { 14889, true }, - { 14902, true }, - { 14919, true }, - { 14935, true }, + { 14593, true }, + { 14609, true }, + { 14624, true }, + { 14638, true }, + { 14651, true }, + { 14667, true }, + { 14679, true }, + { 14693, true }, + { 14705, true }, + { 14717, true }, + { 14728, true }, + { 14739, true }, + { 14754, false }, + { 14769, false }, + { 14785, true }, + { 14803, true }, + { 14820, true }, + { 14838, true }, + { 14849, true }, + { 14862, true }, + { 14879, true }, + { 14895, true }, + { 14915, true }, + { 14930, true }, + { 14944, true }, { 14955, true }, - { 14970, true }, - { 14981, true }, - { 14993, true }, - { 15006, true }, - { 15020, true }, - { 15033, true }, - { 15051, true }, - { 15069, true }, - { 15087, true }, - { 15104, true }, - { 15114, true }, - { 15127, true }, - { 15136, true }, - { 15147, false }, - { 15157, true }, - { 15168, true }, - { 15182, true }, - { 15195, true }, - { 15205, true }, - { 15218, true }, - { 15232, true }, - { 15243, true }, - { 15253, true }, + { 14967, true }, + { 14980, true }, + { 14994, true }, + { 15007, true }, + { 15025, true }, + { 15043, true }, + { 15061, true }, + { 15078, true }, + { 15088, true }, + { 15101, true }, + { 15110, true }, + { 15121, false }, + { 15131, true }, + { 15142, true }, + { 15156, true }, + { 15169, true }, + { 15179, true }, + { 15192, true }, + { 15206, true }, + { 15217, true }, + { 15227, true }, + { 15245, true }, + { 15254, true }, { 15271, true }, - { 15280, true }, - { 15297, true }, - { 15317, true }, - { 15336, true }, - { 15351, true }, - { 15369, true }, + { 15291, true }, + { 15310, true }, + { 15325, true }, + { 15343, true }, + { 15356, true }, + { 15371, true }, { 15382, true }, - { 15397, true }, - { 15408, true }, - { 15422, true }, - { 15430, true }, - { 15440, true }, - { 15451, true }, - { 15462, true }, - { 15489, true }, - { 15501, true }, - { 15513, true }, - { 15522, true }, - { 15531, true }, - { 15540, true }, - { 15555, true }, - { 15567, true }, - { 15576, true }, - { 15586, true }, - { 15597, true }, + { 15396, true }, + { 15404, true }, + { 15414, true }, + { 15425, true }, + { 15436, true }, + { 15463, true }, + { 15475, true }, + { 15487, true }, + { 15496, true }, + { 15505, true }, + { 15514, true }, + { 15529, true }, + { 15541, true }, + { 15550, true }, + { 15560, true }, + { 15571, true }, + { 15581, true }, + { 15593, true }, { 15607, true }, - { 15619, true }, - { 15633, true }, - { 15643, true }, - { 15653, true }, - { 15663, false }, - { 15674, true }, - { 15692, true }, - { 15702, true }, - { 15721, true }, + { 15617, true }, + { 15627, true }, + { 15637, false }, + { 15648, true }, + { 15666, true }, + { 15685, true }, + { 15697, true }, + { 15712, true }, { 15733, true }, - { 15748, true }, - { 15769, true }, - { 15782, true }, - { 15795, true }, - { 15809, true }, - { 15822, false }, - { 15836, true }, - { 15848, true }, - { 15862, true }, - { 15880, true }, - { 15893, false }, - { 15902, true }, - { 15920, true }, - { 15931, true }, - { 15945, true }, - { 15958, true }, - { 15972, true }, - { 15985, true }, - { 15999, true }, - { 16011, true }, - { 16027, false }, - { 16038, true }, - { 16053, true }, - { 16066, true }, - { 16079, true }, - { 16095, true }, - { 16107, true }, - { 16120, true }, - { 16132, true }, - { 16148, true }, - { 16161, true }, - { 16171, true }, - { 16199, true }, - { 16214, true }, - { 16230, true }, - { 16241, true }, - { 16252, true }, - { 16262, true }, - { 16272, false }, - { 16286, true }, - { 16298, false }, - { 16317, true }, - { 16344, true }, - { 16365, true }, - { 16381, true }, - { 16392, true }, - { 16410, true }, - { 16425, true }, - { 16436, true }, - { 16451, false }, - { 16466, true }, + { 15746, true }, + { 15759, true }, + { 15773, true }, + { 15786, false }, + { 15800, true }, + { 15812, true }, + { 15826, true }, + { 15844, true }, + { 15857, false }, + { 15866, true }, + { 15884, true }, + { 15895, true }, + { 15909, true }, + { 15922, true }, + { 15936, true }, + { 15949, true }, + { 15963, true }, + { 15975, true }, + { 15991, false }, + { 16002, true }, + { 16017, true }, + { 16030, true }, + { 16043, true }, + { 16059, true }, + { 16071, true }, + { 16084, true }, + { 16096, true }, + { 16112, true }, + { 16125, true }, + { 16135, true }, + { 16163, true }, + { 16178, true }, + { 16194, true }, + { 16205, true }, + { 16216, true }, + { 16226, true }, + { 16236, false }, + { 16250, true }, + { 16262, false }, + { 16281, true }, + { 16308, true }, + { 16329, true }, + { 16345, true }, + { 16356, true }, + { 16374, true }, + { 16389, true }, + { 16400, true }, + { 16415, false }, + { 16430, true }, + { 16440, true }, + { 16454, true }, { 16476, true }, - { 16490, true }, + { 16491, true }, { 16512, true }, - { 16527, true }, - { 16548, true }, - { 16558, true }, - { 16572, true }, + { 16522, true }, + { 16536, true }, + { 16549, true }, + { 16564, true }, { 16585, true }, - { 16600, true }, - { 16621, true }, + { 16597, true }, + { 16615, true }, { 16633, true }, - { 16651, true }, - { 16669, true }, - { 16683, true }, - { 16702, false }, - { 16716, true }, - { 16726, true }, - { 16737, true }, - { 16747, true }, - { 16760, true }, - { 16775, true }, - { 16789, true }, - { 16802, true }, - { 16815, true }, - { 16832, true }, - { 16848, true }, - { 16861, true }, - { 16878, true }, - { 16892, true }, - { 16910, true }, + { 16647, true }, + { 16666, false }, + { 16680, true }, + { 16690, true }, + { 16701, true }, + { 16711, true }, + { 16724, true }, + { 16739, true }, + { 16753, true }, + { 16766, true }, + { 16779, true }, + { 16796, true }, + { 16812, true }, + { 16825, true }, + { 16842, true }, + { 16856, true }, + { 16874, true }, + { 16887, true }, + { 16907, true }, { 16923, true }, - { 16943, true }, - { 16959, true }, - { 16975, true }, - { 16984, true }, - { 16992, true }, - { 17001, true }, - { 17010, true }, - { 17027, true }, - { 17040, true }, - { 17050, true }, - { 17060, true }, - { 17070, true }, - { 17088, true }, - { 17107, true }, - { 17131, true }, - { 17146, true }, - { 17164, true }, - { 17180, true }, - { 17192, true }, - { 17215, true }, - { 17237, true }, - { 17263, true }, + { 16939, true }, + { 16948, true }, + { 16956, true }, + { 16965, true }, + { 16974, true }, + { 16991, true }, + { 17004, true }, + { 17014, true }, + { 17024, true }, + { 17034, true }, + { 17052, true }, + { 17071, true }, + { 17095, true }, + { 17110, true }, + { 17128, true }, + { 17144, true }, + { 17156, true }, + { 17179, true }, + { 17201, true }, + { 17227, true }, + { 17245, true }, + { 17267, true }, { 17281, true }, - { 17303, true }, - { 17317, true }, - { 17330, true }, - { 17342, true }, - { 17354, false }, - { 17370, true }, - { 17384, true }, - { 17399, true }, - { 17411, true }, - { 17433, true }, + { 17294, true }, + { 17306, true }, + { 17318, false }, + { 17334, true }, + { 17348, true }, + { 17363, true }, + { 17375, true }, + { 17397, true }, + { 17414, true }, + { 17429, true }, { 17450, true }, - { 17465, true }, - { 17486, true }, + { 17464, true }, + { 17483, true }, { 17500, true }, - { 17519, true }, - { 17536, true }, - { 17550, true }, - { 17571, true }, - { 17584, true }, - { 17600, true }, + { 17514, true }, + { 17535, true }, + { 17548, true }, + { 17564, true }, + { 17577, true }, + { 17596, true }, { 17613, true }, - { 17632, true }, + { 17631, true }, { 17649, true }, - { 17667, true }, - { 17685, true }, - { 17694, true }, - { 17710, true }, - { 17726, true }, - { 17745, true }, - { 17763, true }, - { 17779, true }, - { 17793, true }, - { 17805, true }, - { 17816, true }, - { 17830, true }, - { 17840, true }, - { 17851, true }, - { 17860, false }, - { 17869, true }, - { 17883, true }, - { 17897, true }, - { 17909, true }, - { 17924, true }, - { 17934, true }, + { 17658, true }, + { 17674, true }, + { 17690, true }, + { 17709, true }, + { 17727, true }, + { 17743, true }, + { 17757, true }, + { 17769, true }, + { 17780, true }, + { 17794, true }, + { 17804, true }, + { 17815, true }, + { 17824, false }, + { 17833, true }, + { 17847, true }, + { 17861, true }, + { 17873, true }, + { 17888, true }, + { 17901, true }, + { 17912, true }, + { 17935, true }, { 17947, true }, - { 17958, true }, - { 17981, true }, - { 17993, true }, - { 18008, true }, - { 18024, true }, + { 17962, true }, + { 17978, true }, + { 17987, true }, + { 18002, true }, + { 18018, true }, { 18033, true }, - { 18048, true }, - { 18064, true }, - { 18079, true }, - { 18092, true }, - { 18105, true }, - { 18124, true }, - { 18134, true }, - { 18144, true }, - { 18156, true }, - { 18171, true }, - { 18186, true }, - { 18196, true }, - { 18211, true }, - { 18227, true }, - { 18246, true }, - { 18255, true }, - { 18268, true }, - { 18288, true }, - { 18303, true }, - { 18318, true }, - { 18333, true }, - { 18348, true }, - { 18358, true }, - { 18368, true }, - { 18383, true }, - { 18405, true }, - { 18420, true }, - { 18433, true }, - { 18460, true }, - { 18474, true }, - { 18486, true }, - { 18501, true }, - { 18515, true }, - { 18525, true }, - { 18546, true }, - { 18563, true }, - { 18585, true }, - { 18603, false }, - { 18622, true }, - { 18636, true }, - { 18648, true }, - { 18665, true }, - { 18680, true }, + { 18046, true }, + { 18059, true }, + { 18078, true }, + { 18088, true }, + { 18098, true }, + { 18110, true }, + { 18125, true }, + { 18140, true }, + { 18150, true }, + { 18165, true }, + { 18181, true }, + { 18200, true }, + { 18209, true }, + { 18222, true }, + { 18242, true }, + { 18257, true }, + { 18272, true }, + { 18287, true }, + { 18302, true }, + { 18312, true }, + { 18322, true }, + { 18337, true }, + { 18359, true }, + { 18374, true }, + { 18387, true }, + { 18414, true }, + { 18428, true }, + { 18440, true }, + { 18455, true }, + { 18469, true }, + { 18479, true }, + { 18500, true }, + { 18517, true }, + { 18539, true }, + { 18557, false }, + { 18576, true }, + { 18590, true }, + { 18602, true }, + { 18619, true }, + { 18634, true }, + { 18645, true }, + { 18661, true }, + { 18679, true }, { 18691, true }, - { 18707, true }, - { 18725, true }, - { 18737, true }, - { 18749, true }, - { 18763, false }, - { 18776, true }, - { 18789, true }, - { 18801, true }, - { 18824, true }, - { 18837, true }, - { 18845, false }, - { 18856, true }, - { 18874, true }, + { 18703, true }, + { 18717, false }, + { 18730, true }, + { 18743, true }, + { 18755, true }, + { 18778, true }, + { 18791, true }, + { 18799, false }, + { 18810, true }, + { 18828, true }, + { 18840, true }, + { 18861, true }, + { 18872, true }, { 18886, true }, - { 18907, true }, - { 18918, true }, - { 18932, true }, - { 18949, true }, - { 18960, true }, - { 18969, true }, - { 18981, true }, - { 18992, true }, - { 19002, false }, - { 19016, true }, - { 19034, true }, - { 19047, true }, - { 19058, true }, - { 19072, true }, - { 19084, true }, - { 19095, true }, - { 19106, true }, - { 19119, true }, + { 18903, true }, + { 18914, true }, + { 18923, true }, + { 18935, true }, + { 18946, true }, + { 18956, false }, + { 18970, true }, + { 18988, true }, + { 19001, true }, + { 19012, true }, + { 19026, true }, + { 19038, true }, + { 19049, true }, + { 19060, true }, + { 19073, true }, + { 19085, true }, + { 19096, true }, + { 19115, true }, { 19131, true }, - { 19142, true }, - { 19161, true }, - { 19177, true }, + { 19145, true }, + { 19164, true }, + { 19176, true }, { 19191, true }, - { 19210, true }, - { 19222, true }, - { 19237, true }, - { 19246, true }, - { 19261, true }, - { 19275, true }, - { 19288, true }, - { 19300, true }, - { 19312, true }, - { 19326, true }, + { 19200, true }, + { 19215, true }, + { 19229, true }, + { 19242, true }, + { 19254, true }, + { 19266, true }, + { 19280, true }, + { 19291, true }, + { 19305, true }, + { 19316, true }, + { 19327, true }, { 19337, true }, - { 19351, true }, - { 19362, true }, - { 19373, true }, - { 19383, true }, + { 19347, true }, + { 19358, true }, + { 19369, true }, + { 19380, true }, { 19393, true }, - { 19404, true }, - { 19415, true }, - { 19426, true }, - { 19439, true }, - { 19453, true }, - { 19465, true }, - { 19479, true }, - { 19491, true }, - { 19504, true }, - { 19529, true }, - { 19541, true }, - { 19558, true }, - { 19569, true }, + { 19407, true }, + { 19419, true }, + { 19433, true }, + { 19445, true }, + { 19458, true }, + { 19483, true }, + { 19495, true }, + { 19512, true }, + { 19523, true }, + { 19534, true }, + { 19545, true }, + { 19564, true }, { 19580, true }, - { 19591, true }, - { 19610, true }, - { 19626, true }, - { 19636, true }, + { 19590, true }, + { 19601, true }, + { 19613, true }, + { 19628, true }, { 19647, true }, - { 19659, true }, - { 19674, true }, - { 19693, true }, - { 19710, false }, - { 19718, true }, - { 19734, true }, - { 19748, true }, - { 19765, true }, - { 19782, true }, - { 19795, true }, - { 19808, true }, - { 19821, true }, - { 19834, true }, - { 19847, true }, - { 19860, true }, - { 19873, true }, - { 19886, true }, - { 19899, true }, - { 19912, true }, - { 19925, true }, - { 19938, true }, - { 19951, true }, - { 19964, true }, - { 19981, true }, + { 19664, false }, + { 19672, true }, + { 19688, true }, + { 19702, true }, + { 19719, true }, + { 19736, true }, + { 19749, true }, + { 19762, true }, + { 19775, true }, + { 19788, true }, + { 19801, true }, + { 19814, true }, + { 19827, true }, + { 19840, true }, + { 19853, true }, + { 19866, true }, + { 19879, true }, + { 19892, true }, + { 19905, true }, + { 19918, true }, + { 19935, true }, + { 19950, true }, + { 19962, true }, + { 19984, true }, { 19996, true }, - { 20008, true }, - { 20030, true }, - { 20042, true }, - { 20065, true }, - { 20089, true }, - { 20107, true }, - { 20126, true }, - { 20147, true }, - { 20160, true }, - { 20175, true }, - { 20191, true }, - { 20201, true }, - { 20218, true }, - { 20233, true }, - { 20252, true }, - { 20269, true }, - { 20280, true }, - { 20296, true }, - { 20308, true }, - { 20318, true }, - { 20328, true }, - { 20349, true }, - { 20371, true }, - { 20383, true }, - { 20394, true }, - { 20409, true }, - { 20420, true }, + { 20019, true }, + { 20043, true }, + { 20061, true }, + { 20080, true }, + { 20101, true }, + { 20114, true }, + { 20129, true }, + { 20145, true }, + { 20155, true }, + { 20172, true }, + { 20187, true }, + { 20206, true }, + { 20223, true }, + { 20234, true }, + { 20250, true }, + { 20262, true }, + { 20272, true }, + { 20282, true }, + { 20303, true }, + { 20325, true }, + { 20337, true }, + { 20348, true }, + { 20363, true }, + { 20374, true }, + { 20389, true }, + { 20404, true }, + { 20416, true }, { 20435, true }, - { 20450, true }, + { 20448, true }, { 20462, true }, - { 20481, true }, - { 20494, true }, - { 20508, true }, - { 20530, true }, - { 20549, true }, - { 20569, true }, - { 20577, true }, - { 20590, true }, - { 20604, true }, - { 20618, true }, - { 20629, true }, - { 20642, true }, - { 20658, true }, - { 20673, true }, - { 20687, true }, - { 20699, true }, - { 20716, false }, - { 20732, false }, - { 20752, true }, - { 20765, true }, - { 20781, true }, - { 20806, true }, - { 20819, true }, - { 20832, true }, - { 20843, true }, - { 20859, true }, - { 20873, true }, - { 20889, true }, - { 20900, true }, - { 20913, true }, - { 20928, true }, - { 20942, true }, - { 20954, true }, - { 20974, true }, - { 20986, true }, - { 20999, true }, - { 21012, true }, - { 21033, true }, - { 21053, true }, - { 21067, true }, - { 21082, true }, - { 21091, true }, - { 21102, true }, - { 21112, true }, - { 21122, true }, - { 21140, true }, + { 20484, true }, + { 20503, true }, + { 20523, true }, + { 20531, true }, + { 20544, true }, + { 20558, true }, + { 20572, true }, + { 20583, true }, + { 20596, true }, + { 20612, true }, + { 20627, true }, + { 20641, true }, + { 20653, true }, + { 20670, false }, + { 20686, false }, + { 20706, true }, + { 20719, true }, + { 20735, true }, + { 20760, true }, + { 20773, true }, + { 20786, true }, + { 20797, true }, + { 20813, true }, + { 20829, true }, + { 20840, true }, + { 20853, true }, + { 20868, true }, + { 20882, true }, + { 20894, true }, + { 20914, true }, + { 20926, true }, + { 20939, true }, + { 20952, true }, + { 20973, true }, + { 20993, true }, + { 21007, true }, + { 21022, true }, + { 21031, true }, + { 21042, true }, + { 21052, true }, + { 21062, true }, + { 21080, true }, + { 21105, true }, + { 21127, true }, + { 21139, true }, + { 21152, true }, { 21165, true }, - { 21187, true }, - { 21199, true }, - { 21212, true }, - { 21225, true }, - { 21233, true }, - { 21252, true }, - { 21262, true }, + { 21173, true }, + { 21192, true }, + { 21202, true }, + { 21215, true }, + { 21230, true }, + { 21247, true }, + { 21263, true }, { 21275, true }, - { 21290, true }, - { 21307, true }, - { 21323, true }, - { 21335, true }, - { 21347, true }, - { 21358, true }, - { 21372, true }, - { 21396, true }, - { 21411, true }, - { 21426, true }, - { 21448, true }, - { 21459, true }, - { 21472, true }, - { 21492, true }, - { 21503, true }, - { 21511, false }, - { 21523, true }, - { 21540, true }, - { 21559, true }, - { 21573, true }, + { 21287, true }, + { 21298, true }, + { 21312, true }, + { 21336, true }, + { 21351, true }, + { 21366, true }, + { 21388, true }, + { 21399, true }, + { 21412, true }, + { 21432, true }, + { 21443, true }, + { 21451, false }, + { 21463, true }, + { 21480, true }, + { 21499, true }, + { 21513, true }, + { 21528, true }, + { 21543, true }, + { 21553, false }, + { 21562, true }, + { 21576, true }, { 21588, true }, { 21603, true }, - { 21613, false }, - { 21622, true }, - { 21636, true }, - { 21648, true }, - { 21663, true }, - { 21675, true }, - { 21693, true }, - { 21713, true }, - { 21729, true }, - { 21741, true }, - { 21758, true }, - { 21770, true }, - { 21784, true }, - { 21804, true }, - { 21816, true }, - { 21833, true }, - { 21842, true }, - { 21854, true }, - { 21876, false }, - { 21890, true }, - { 21906, true }, - { 21923, true }, - { 21935, true }, - { 21953, false }, - { 21975, false }, - { 22000, false }, - { 22024, true }, - { 22036, true }, - { 22046, true }, + { 21615, true }, + { 21633, true }, + { 21653, true }, + { 21669, true }, + { 21681, true }, + { 21698, true }, + { 21710, true }, + { 21724, true }, + { 21744, true }, + { 21756, true }, + { 21773, true }, + { 21782, true }, + { 21794, true }, + { 21816, false }, + { 21830, true }, + { 21846, true }, + { 21863, true }, + { 21875, true }, + { 21893, false }, + { 21915, false }, + { 21940, false }, + { 21964, true }, + { 21976, true }, + { 21986, true }, + { 21999, true }, + { 22009, true }, + { 22019, true }, + { 22029, true }, + { 22039, true }, + { 22049, true }, { 22059, true }, { 22069, true }, - { 22079, true }, - { 22089, true }, - { 22099, true }, - { 22109, true }, - { 22119, true }, - { 22129, true }, - { 22143, true }, - { 22161, true }, - { 22176, true }, - { 22190, true }, - { 22202, true }, - { 22214, true }, - { 22225, true }, - { 22239, true }, - { 22254, true }, + { 22083, true }, + { 22101, true }, + { 22116, true }, + { 22130, true }, + { 22142, true }, + { 22154, true }, + { 22165, true }, + { 22179, true }, + { 22194, true }, + { 22208, true }, + { 22215, true }, + { 22229, false }, + { 22249, true }, { 22268, true }, - { 22275, true }, - { 22289, false }, - { 22309, true }, - { 22328, true }, - { 22343, true }, + { 22283, true }, + { 22295, true }, + { 22306, true }, + { 22317, true }, + { 22329, true }, + { 22342, false }, { 22355, true }, - { 22366, true }, - { 22377, true }, - { 22389, true }, - { 22402, false }, - { 22415, true }, - { 22431, true }, - { 22444, true }, - { 22456, true }, - { 22471, true }, - { 22481, true }, - { 22506, true }, - { 22523, true }, - { 22543, true }, - { 22555, true }, - { 22571, true }, - { 22599, false }, - { 22611, true }, - { 22624, true }, - { 22633, true }, - { 22643, true }, - { 22652, true }, - { 22661, true }, - { 22668, true }, - { 22683, true }, - { 22694, false }, - { 22710, true }, - { 22727, true }, - { 22741, true }, - { 22751, true }, - { 22771, true }, - { 22791, true }, + { 22371, true }, + { 22384, true }, + { 22396, true }, + { 22411, true }, + { 22421, true }, + { 22446, true }, + { 22463, true }, + { 22483, true }, + { 22495, true }, + { 22511, true }, + { 22539, false }, + { 22551, true }, + { 22564, true }, + { 22573, true }, + { 22583, true }, + { 22592, true }, + { 22601, true }, + { 22608, true }, + { 22623, true }, + { 22634, false }, + { 22650, true }, + { 22667, true }, + { 22681, true }, + { 22691, true }, + { 22711, true }, + { 22731, true }, + { 22742, true }, + { 22757, true }, + { 22770, true }, + { 22785, true }, { 22802, true }, - { 22817, true }, - { 22830, true }, - { 22845, true }, - { 22862, true }, - { 22870, true }, - { 22893, true }, - { 22907, true }, - { 22919, true }, - { 22936, false }, - { 22957, false }, - { 22979, false }, - { 22998, false }, - { 23016, true }, - { 23032, true }, - { 23056, true }, - { 23084, true }, - { 23095, true }, - { 23110, true }, - { 23129, true }, - { 23152, true }, + { 22810, true }, + { 22833, true }, + { 22847, true }, + { 22859, true }, + { 22876, false }, + { 22897, false }, + { 22919, false }, + { 22938, false }, + { 22956, true }, + { 22972, true }, + { 22996, true }, + { 23024, true }, + { 23035, true }, + { 23050, true }, + { 23069, true }, + { 23092, true }, + { 23116, true }, + { 23133, true }, + { 23147, true }, + { 23158, true }, { 23176, true }, - { 23193, true }, - { 23207, true }, - { 23218, true }, - { 23236, true }, - { 23251, true }, - { 23264, true }, - { 23277, true }, - { 23292, true }, - { 23307, true }, - { 23322, true }, + { 23191, true }, + { 23204, true }, + { 23217, true }, + { 23232, true }, + { 23247, true }, + { 23262, true }, + { 23274, true }, + { 23289, true }, + { 23308, true }, + { 23326, true }, { 23334, true }, - { 23349, true }, - { 23368, true }, - { 23386, true }, - { 23394, true }, - { 23402, true }, + { 23342, true }, + { 23354, true }, + { 23366, true }, + { 23384, true }, + { 23399, true }, { 23414, true }, - { 23426, true }, - { 23444, true }, - { 23459, true }, - { 23474, true }, - { 23489, true }, - { 23505, true }, - { 23522, true }, - { 23531, true }, + { 23429, true }, + { 23445, true }, + { 23462, true }, + { 23471, true }, + { 23484, true }, + { 23494, true }, + { 23507, false }, + { 23521, true }, + { 23537, false }, { 23544, true }, { 23554, true }, - { 23567, false }, - { 23581, true }, - { 23597, false }, - { 23604, true }, - { 23614, true }, - { 23628, true }, - { 23643, true }, - { 23651, true }, - { 23659, true }, - { 23669, true }, - { 23687, true }, - { 23700, true }, - { 23713, true }, - { 23727, true }, - { 23736, true }, - { 23751, true }, - { 23780, true }, - { 23797, true }, - { 23815, true }, - { 23825, true }, - { 23839, true }, - { 23850, true }, - { 23867, true }, + { 23568, true }, + { 23583, true }, + { 23591, true }, + { 23599, true }, + { 23609, true }, + { 23627, true }, + { 23640, true }, + { 23653, true }, + { 23667, true }, + { 23676, true }, + { 23691, true }, + { 23720, true }, + { 23737, true }, + { 23755, true }, + { 23765, true }, + { 23779, true }, + { 23790, true }, + { 23807, true }, + { 23821, true }, + { 23843, true }, + { 23868, true }, { 23881, true }, - { 23903, true }, - { 23928, true }, - { 23941, true }, + { 23894, true }, + { 23911, true }, + { 23929, true }, + { 23944, true }, { 23954, true }, - { 23971, true }, - { 23989, true }, + { 23975, true }, + { 23985, false }, { 24004, true }, - { 24014, true }, - { 24035, true }, - { 24045, false }, - { 24064, true }, - { 24076, true }, - { 24105, true }, - { 24126, true }, - { 24140, true }, - { 24154, true }, - { 24162, true }, - { 24175, true }, - { 24187, true }, - { 24199, true }, - { 24215, true }, - { 24229, true }, - { 24248, true }, - { 24261, true }, - { 24280, false }, - { 24290, true }, - { 24312, true }, - { 24326, true }, - { 24342, true }, - { 24357, true }, - { 24373, true }, - { 24390, true }, - { 24401, false }, - { 24409, true }, - { 24425, true }, - { 24445, true }, - { 24459, true }, - { 24474, true }, + { 24016, true }, + { 24045, true }, + { 24066, true }, + { 24080, true }, + { 24094, true }, + { 24102, true }, + { 24115, true }, + { 24127, true }, + { 24139, true }, + { 24155, true }, + { 24169, true }, + { 24188, true }, + { 24201, true }, + { 24220, false }, + { 24230, true }, + { 24252, true }, + { 24266, true }, + { 24282, true }, + { 24297, true }, + { 24313, true }, + { 24330, true }, + { 24341, false }, + { 24349, true }, + { 24365, true }, + { 24385, true }, + { 24399, true }, + { 24414, true }, + { 24427, true }, + { 24439, true }, + { 24452, true }, + { 24465, false }, { 24487, true }, - { 24499, true }, - { 24512, true }, - { 24525, false }, - { 24547, true }, - { 24570, true }, - { 24588, true }, - { 24614, true }, - { 24641, true }, - { 24657, true }, - { 24682, true }, - { 24711, true }, - { 24727, true }, - { 24739, true }, - { 24752, true }, - { 24763, true }, - { 24776, true }, - { 24785, true }, - { 24794, true }, - { 24811, true }, - { 24824, true }, - { 24833, true }, - { 24850, true }, - { 24859, true }, - { 24867, true }, - { 24876, true }, - { 24885, false }, - { 24896, true }, - { 24920, true }, - { 24930, true }, - { 24940, true }, - { 24949, true }, - { 24962, true }, - { 24974, true }, - { 24988, true }, - { 25002, true }, - { 25020, true }, - { 25035, true }, - { 25049, true }, - { 25061, true }, - { 25077, true }, - { 25090, true }, - { 25105, true }, - { 25117, true }, - { 25132, true }, - { 25146, true }, - { 25155, true }, + { 24510, true }, + { 24528, true }, + { 24554, true }, + { 24581, true }, + { 24597, true }, + { 24622, true }, + { 24651, true }, + { 24667, true }, + { 24679, true }, + { 24692, true }, + { 24703, true }, + { 24716, true }, + { 24725, true }, + { 24734, true }, + { 24751, true }, + { 24764, true }, + { 24773, true }, + { 24790, true }, + { 24799, true }, + { 24807, true }, + { 24816, true }, + { 24825, false }, + { 24836, true }, + { 24860, true }, + { 24870, true }, + { 24880, true }, + { 24889, true }, + { 24902, true }, + { 24914, true }, + { 24928, true }, + { 24942, true }, + { 24960, true }, + { 24975, true }, + { 24989, true }, + { 25001, true }, + { 25017, true }, + { 25030, true }, + { 25045, true }, + { 25057, true }, + { 25072, true }, + { 25086, true }, + { 25095, true }, + { 25104, true }, + { 25118, true }, + { 25127, true }, + { 25141, true }, + { 25154, true }, { 25164, true }, - { 25178, true }, - { 25187, true }, - { 25201, true }, - { 25214, true }, - { 25224, true }, - { 25234, true }, - { 25249, true }, - { 25264, true }, - { 25278, true }, - { 25293, true }, - { 25312, true }, - { 25328, true }, - { 25342, false }, - { 25358, true }, - { 25369, true }, - { 25383, true }, - { 25393, true }, - { 25405, true }, - { 25421, true }, - { 25435, true }, - { 25440, true }, - { 25448, true }, - { 25455, true }, - { 25464, true }, - { 25479, false }, - { 25499, true }, - { 25509, true }, - { 25522, true }, - { 25540, true }, - { 25553, true }, + { 25174, true }, + { 25189, true }, + { 25204, true }, + { 25218, true }, + { 25233, true }, + { 25252, true }, + { 25268, true }, + { 25282, false }, + { 25298, true }, + { 25309, true }, + { 25323, true }, + { 25333, true }, + { 25345, true }, + { 25361, true }, + { 25375, true }, + { 25380, true }, + { 25388, true }, + { 25395, true }, + { 25404, true }, + { 25419, false }, + { 25439, true }, + { 25449, true }, + { 25462, true }, + { 25480, true }, + { 25496, true }, + { 25508, true }, + { 25520, true }, + { 25533, true }, + { 25544, true }, + { 25555, true }, { 25569, true }, - { 25581, true }, - { 25593, true }, - { 25606, true }, - { 25617, true }, - { 25628, true }, - { 25642, true }, - { 25660, true }, - { 25673, true }, - { 25686, true }, - { 25702, true }, - { 25722, true }, - { 25730, true }, - { 25741, false }, - { 25751, true }, - { 25763, true }, - { 25777, true }, - { 25796, true }, + { 25587, true }, + { 25600, true }, + { 25613, true }, + { 25629, true }, + { 25649, true }, + { 25657, true }, + { 25668, false }, + { 25678, true }, + { 25690, true }, + { 25704, true }, + { 25723, true }, + { 25731, true }, + { 25755, true }, + { 25774, true }, + { 25788, false }, { 25804, true }, - { 25828, true }, - { 25847, true }, - { 25861, false }, - { 25877, true }, - { 25889, false }, - { 25904, true }, - { 25916, false }, - { 25924, true }, - { 25936, true }, - { 25950, false }, - { 25962, true }, - { 25974, true }, - { 25985, true }, - { 25999, true }, - { 26012, true }, - { 26024, true }, - { 26037, true }, - { 26057, true }, - { 26067, true }, - { 26086, true }, - { 26098, true }, - { 26109, true }, - { 26121, true }, - { 26144, true }, - { 26167, true }, - { 26178, true }, + { 25816, false }, + { 25831, true }, + { 25843, false }, + { 25851, true }, + { 25863, true }, + { 25877, false }, + { 25889, true }, + { 25901, true }, + { 25912, true }, + { 25926, true }, + { 25939, true }, + { 25951, true }, + { 25964, true }, + { 25984, true }, + { 25994, true }, + { 26013, true }, + { 26025, true }, + { 26036, true }, + { 26048, true }, + { 26071, true }, + { 26094, true }, + { 26105, true }, + { 26120, true }, + { 26136, true }, + { 26152, true }, + { 26170, false }, { 26193, true }, - { 26209, true }, - { 26225, true }, - { 26243, false }, - { 26266, true }, - { 26286, true }, - { 26300, true }, - { 26323, true }, - { 26342, true }, - { 26360, true }, - { 26377, true }, - { 26403, true }, - { 26422, true }, - { 26438, true }, - { 26452, true }, + { 26213, true }, + { 26227, true }, + { 26250, true }, + { 26269, true }, + { 26287, true }, + { 26304, true }, + { 26330, true }, + { 26349, true }, + { 26365, true }, + { 26379, true }, + { 26400, true }, + { 26416, true }, + { 26441, true }, + { 26455, true }, { 26473, true }, - { 26489, true }, - { 26514, true }, - { 26528, true }, + { 26482, true }, + { 26494, true }, + { 26507, true }, + { 26519, true }, + { 26532, true }, { 26546, true }, - { 26555, true }, - { 26567, true }, - { 26580, true }, - { 26592, true }, - { 26605, true }, - { 26619, true }, - { 26629, true }, - { 26642, true }, - { 26650, true }, - { 26657, true }, + { 26556, true }, + { 26569, true }, + { 26577, true }, + { 26584, true }, + { 26596, true }, + { 26616, true }, + { 26628, true }, + { 26643, true }, { 26669, true }, - { 26689, true }, - { 26701, true }, - { 26716, true }, - { 26742, true }, - { 26764, true }, - { 26778, true }, - { 26790, true }, + { 26691, true }, + { 26705, true }, + { 26717, true }, + { 26727, true }, + { 26740, true }, + { 26748, true }, + { 26762, true }, + { 26786, true }, { 26800, true }, - { 26813, true }, - { 26821, true }, + { 26824, true }, { 26835, true }, - { 26859, true }, - { 26873, true }, - { 26897, true }, - { 26908, true }, - { 26917, true }, - { 26939, true }, - { 26962, true }, - { 26986, true }, - { 27009, false }, - { 27040, false }, - { 27055, true }, - { 27067, true }, - { 27087, true }, - { 27102, true }, - { 27118, true }, + { 26844, true }, + { 26866, true }, + { 26889, true }, + { 26913, true }, + { 26936, false }, + { 26967, false }, + { 26982, true }, + { 26994, true }, + { 27014, true }, + { 27029, true }, + { 27045, true }, + { 27056, true }, + { 27072, true }, + { 27083, true }, + { 27097, true }, + { 27107, true }, + { 27116, false }, { 27129, true }, - { 27145, true }, - { 27156, true }, - { 27170, true }, - { 27180, true }, - { 27189, false }, - { 27202, true }, - { 27219, true }, - { 27233, true }, + { 27146, true }, + { 27160, true }, + { 27174, true }, + { 27186, true }, + { 27205, true }, + { 27225, true }, { 27247, true }, - { 27259, true }, - { 27278, true }, - { 27291, true }, - { 27311, true }, - { 27333, true }, - { 27346, true }, - { 27357, true }, - { 27371, true }, - { 27382, true }, - { 27398, true }, - { 27407, true }, - { 27422, true }, - { 27436, true }, - { 27452, true }, - { 27465, true }, - { 27478, true }, - { 27490, true }, - { 27503, true }, - { 27516, true }, - { 27528, true }, - { 27540, true }, - { 27559, true }, - { 27574, true }, - { 27590, true }, - { 27608, true }, - { 27619, true }, - { 27627, false }, - { 27650, true }, - { 27663, true }, - { 27674, true }, - { 27686, false }, - { 27696, true }, - { 27712, false }, - { 27723, true }, - { 27732, true }, - { 27745, true }, - { 27763, true }, - { 27774, true }, - { 27784, true }, + { 27260, true }, + { 27271, true }, + { 27285, true }, + { 27296, true }, + { 27312, true }, + { 27321, true }, + { 27336, true }, + { 27350, true }, + { 27366, true }, + { 27379, true }, + { 27392, true }, + { 27404, true }, + { 27417, true }, + { 27430, true }, + { 27442, true }, + { 27454, true }, + { 27473, true }, + { 27488, true }, + { 27504, true }, + { 27522, true }, + { 27533, true }, + { 27541, false }, + { 27564, true }, + { 27577, true }, + { 27588, true }, + { 27600, false }, + { 27610, true }, + { 27626, false }, + { 27637, true }, + { 27646, true }, + { 27659, true }, + { 27677, true }, + { 27688, true }, + { 27698, true }, + { 27709, true }, + { 27721, true }, + { 27738, true }, + { 27754, true }, + { 27764, true }, + { 27772, false }, + { 27780, true }, { 27795, true }, - { 27807, true }, - { 27824, true }, - { 27840, true }, - { 27850, true }, - { 27858, false }, - { 27866, true }, - { 27881, true }, - { 27895, true }, - { 27909, true }, - { 27919, true }, - { 27927, true }, - { 27941, true }, - { 27955, true }, - { 27971, true }, - { 27986, true }, - { 27997, false }, - { 28010, true }, - { 28028, true }, - { 28044, true }, - { 28055, true }, + { 27809, true }, + { 27823, true }, + { 27833, true }, + { 27841, true }, + { 27855, true }, + { 27869, true }, + { 27885, true }, + { 27900, true }, + { 27911, false }, + { 27924, true }, + { 27942, true }, + { 27958, true }, + { 27969, true }, + { 27987, true }, + { 28009, false }, + { 28026, true }, + { 28041, true }, + { 28057, true }, { 28073, true }, - { 28095, false }, - { 28112, true }, - { 28127, true }, - { 28143, true }, - { 28159, true }, - { 28178, true }, - { 28195, true }, - { 28210, true }, - { 28225, true }, - { 28240, true }, - { 28261, true }, - { 28279, true }, - { 28292, true }, - { 28305, true }, - { 28319, true }, - { 28334, true }, - { 28348, true }, - { 28361, true }, + { 28092, true }, + { 28109, true }, + { 28124, true }, + { 28139, true }, + { 28154, true }, + { 28175, true }, + { 28193, true }, + { 28206, true }, + { 28219, true }, + { 28233, true }, + { 28248, true }, + { 28262, true }, + { 28275, true }, + { 28286, true }, + { 28296, true }, + { 28313, true }, + { 28329, true }, + { 28345, true }, + { 28360, true }, { 28372, true }, - { 28382, true }, - { 28399, true }, - { 28415, true }, - { 28431, true }, - { 28446, true }, - { 28458, true }, - { 28469, false }, - { 28477, true }, - { 28498, true }, - { 28506, true }, - { 28519, true }, + { 28383, false }, + { 28391, true }, + { 28412, true }, + { 28420, true }, + { 28433, true }, + { 28441, true }, + { 28449, true }, + { 28467, true }, + { 28481, true }, + { 28495, true }, + { 28503, true }, + { 28513, true }, { 28527, true }, - { 28535, true }, - { 28553, true }, - { 28567, true }, - { 28581, true }, - { 28589, true }, - { 28599, true }, + { 28547, true }, + { 28555, true }, + { 28564, false }, + { 28584, true }, + { 28602, true }, { 28613, true }, - { 28633, true }, - { 28641, true }, - { 28650, false }, - { 28670, true }, - { 28688, true }, - { 28699, true }, - { 28717, true }, - { 28735, true }, - { 28755, true }, - { 28767, true }, - { 28779, true }, - { 28795, true }, - { 28809, true }, - { 28826, true }, - { 28839, true }, - { 28856, true }, - { 28869, true }, - { 28883, true }, - { 28896, true }, - { 28910, true }, - { 28920, true }, + { 28631, true }, + { 28649, true }, + { 28669, true }, + { 28681, true }, + { 28693, true }, + { 28709, true }, + { 28723, true }, + { 28740, true }, + { 28753, true }, + { 28770, true }, + { 28783, true }, + { 28797, true }, + { 28810, true }, + { 28824, true }, + { 28834, true }, + { 28851, true }, + { 28871, true }, + { 28880, true }, + { 28900, true }, + { 28917, true }, { 28937, true }, - { 28957, true }, - { 28966, true }, - { 28986, true }, + { 28951, true }, + { 28971, true }, + { 28989, true }, { 29003, true }, - { 29023, true }, - { 29037, true }, - { 29057, true }, - { 29075, true }, + { 29021, true }, + { 29031, true }, + { 29061, true }, + { 29076, true }, { 29089, true }, - { 29107, true }, - { 29117, true }, - { 29147, true }, - { 29162, true }, - { 29175, true }, - { 29188, true }, - { 29202, true }, - { 29217, true }, - { 29237, false }, - { 29247, true }, - { 29264, true }, - { 29274, false }, - { 29285, true }, - { 29293, true }, - { 29306, true }, + { 29102, true }, + { 29116, true }, + { 29131, true }, + { 29151, false }, + { 29161, true }, + { 29178, true }, + { 29188, false }, + { 29199, true }, + { 29207, true }, + { 29220, true }, + { 29241, true }, + { 29262, true }, + { 29283, false }, + { 29299, true }, + { 29312, true }, { 29327, true }, - { 29348, true }, - { 29369, false }, - { 29385, true }, - { 29398, true }, - { 29413, true }, - { 29425, false }, - { 29446, true }, - { 29466, true }, - { 29488, true }, - { 29502, true }, - { 29520, true }, - { 29540, true }, + { 29339, false }, + { 29360, true }, + { 29380, true }, + { 29402, true }, + { 29416, true }, + { 29434, true }, + { 29454, true }, + { 29467, true }, + { 29481, true }, + { 29497, true }, + { 29515, true }, + { 29526, true }, + { 29539, true }, { 29553, true }, - { 29567, true }, - { 29583, true }, - { 29601, true }, - { 29612, true }, - { 29625, true }, - { 29639, true }, - { 29654, true }, - { 29673, true }, - { 29685, false }, - { 29707, true }, - { 29715, true }, - { 29730, true }, - { 29747, true }, + { 29568, true }, + { 29587, true }, + { 29599, false }, + { 29621, true }, + { 29629, true }, + { 29644, true }, + { 29661, true }, + { 29675, true }, + { 29692, true }, + { 29710, true }, + { 29721, true }, + { 29745, true }, { 29761, true }, - { 29778, true }, - { 29796, true }, - { 29807, true }, - { 29831, true }, - { 29847, true }, - { 29863, true }, - { 29878, true }, - { 29891, true }, - { 29912, true }, - { 29921, true }, - { 29936, true }, - { 29949, false }, - { 29959, true }, - { 29978, true }, - { 29992, true }, - { 30012, true }, - { 30021, true }, - { 30039, false }, - { 30061, true }, - { 30070, true }, - { 30089, false }, - { 30105, false }, - { 30119, true }, - { 30135, true }, - { 30150, true }, - { 30168, true }, - { 30186, true }, - { 30206, true }, - { 30228, true }, - { 30246, true }, - { 30263, true }, - { 30278, true }, - { 30293, true }, - { 30310, false }, - { 30326, true }, - { 30340, true }, - { 30354, true }, - { 30373, true }, - { 30390, true }, - { 30405, true }, - { 30432, true }, - { 30452, true }, - { 30474, false }, - { 30493, true }, - { 30516, true }, - { 30536, true }, - { 30554, true }, - { 30576, true }, - { 30595, true }, - { 30615, true }, - { 30638, true }, - { 30655, true }, - { 30669, true }, + { 29777, true }, + { 29792, true }, + { 29805, true }, + { 29826, true }, + { 29835, true }, + { 29850, true }, + { 29863, false }, + { 29873, true }, + { 29892, true }, + { 29906, true }, + { 29926, true }, + { 29935, true }, + { 29953, false }, + { 29975, true }, + { 29984, true }, + { 30003, false }, + { 30019, false }, + { 30033, true }, + { 30049, true }, + { 30064, true }, + { 30082, true }, + { 30100, true }, + { 30120, true }, + { 30142, true }, + { 30160, true }, + { 30177, true }, + { 30192, true }, + { 30207, true }, + { 30224, false }, + { 30240, true }, + { 30254, true }, + { 30268, true }, + { 30287, true }, + { 30304, true }, + { 30319, true }, + { 30346, true }, + { 30366, true }, + { 30388, false }, + { 30407, true }, + { 30430, true }, + { 30450, true }, + { 30468, true }, + { 30490, true }, + { 30509, true }, + { 30529, true }, + { 30552, true }, + { 30569, true }, + { 30583, true }, + { 30596, true }, + { 30633, false }, + { 30644, true }, + { 30662, true }, { 30682, true }, - { 30719, false }, - { 30730, true }, - { 30748, true }, - { 30768, true }, - { 30791, true }, - { 30816, false }, - { 30847, true }, - { 30861, true }, - { 30870, true }, - { 30881, true }, + { 30705, true }, + { 30730, false }, + { 30761, true }, + { 30775, true }, + { 30784, true }, + { 30795, true }, + { 30807, true }, + { 30819, true }, + { 30828, true }, + { 30840, true }, + { 30857, true }, + { 30867, true }, + { 30885, false }, { 30893, true }, - { 30905, true }, - { 30914, true }, - { 30926, true }, - { 30943, true }, + { 30904, true }, + { 30923, true }, + { 30935, false }, { 30953, true }, - { 30971, false }, + { 30966, true }, { 30979, true }, - { 30990, true }, - { 31009, true }, - { 31021, false }, - { 31039, true }, - { 31052, true }, - { 31065, true }, - { 31082, true }, + { 30996, true }, + { 31012, true }, + { 31023, true }, + { 31037, true }, + { 31049, true }, + { 31064, true }, + { 31072, true }, + { 31086, true }, { 31098, true }, - { 31109, true }, - { 31123, true }, - { 31135, true }, - { 31150, true }, - { 31158, true }, - { 31172, true }, - { 31184, true }, - { 31196, true }, - { 31206, true }, - { 31217, true }, - { 31228, true }, - { 31242, true }, - { 31265, true }, - { 31273, true }, - { 31288, true }, - { 31307, true }, - { 31326, true }, - { 31342, true }, - { 31352, true }, - { 31371, true }, - { 31384, true }, - { 31392, true }, - { 31407, true }, - { 31419, true }, - { 31427, true }, - { 31433, true }, + { 31110, true }, + { 31120, true }, + { 31131, true }, + { 31142, true }, + { 31156, true }, + { 31179, true }, + { 31187, true }, + { 31202, true }, + { 31221, true }, + { 31240, true }, + { 31256, true }, + { 31266, true }, + { 31285, true }, + { 31298, true }, + { 31306, true }, + { 31321, true }, + { 31333, true }, + { 31341, true }, + { 31347, true }, + { 31360, true }, + { 31369, true }, + { 31383, true }, + { 31397, true }, + { 31410, false }, + { 31430, true }, { 31446, true }, - { 31455, true }, - { 31469, true }, - { 31483, true }, - { 31496, false }, - { 31516, true }, - { 31532, true }, - { 31544, true }, - { 31560, true }, - { 31573, true }, - { 31593, true }, - { 31607, true }, - { 31623, true }, - { 31637, true }, - { 31657, true }, - { 31671, true }, - { 31686, true }, - { 31700, true }, - { 31713, true }, - { 31722, true }, - { 31732, true }, - { 31745, false }, - { 31755, true }, - { 31771, true }, - { 31793, true }, - { 31825, true }, - { 31844, true }, - { 31860, true }, - { 31881, true }, - { 31901, true }, - { 31914, true }, - { 31931, true }, - { 31951, true }, - { 31965, true }, - { 31984, true }, + { 31458, true }, + { 31474, true }, + { 31487, true }, + { 31507, true }, + { 31521, true }, + { 31537, true }, + { 31551, true }, + { 31571, true }, + { 31585, true }, + { 31600, true }, + { 31614, true }, + { 31627, true }, + { 31636, true }, + { 31646, true }, + { 31659, false }, + { 31669, true }, + { 31685, true }, + { 31707, true }, + { 31739, true }, + { 31758, true }, + { 31774, true }, + { 31795, true }, + { 31815, true }, + { 31828, true }, + { 31845, true }, + { 31865, true }, + { 31879, true }, + { 31898, true }, + { 31917, true }, + { 31932, true }, + { 31945, true }, + { 31960, true }, + { 31976, true }, + { 31988, true }, { 32003, true }, - { 32018, true }, - { 32031, true }, - { 32046, true }, - { 32062, true }, - { 32074, true }, - { 32089, true }, - { 32112, true }, - { 32128, true }, - { 32140, false }, - { 32161, true }, - { 32169, true }, - { 32178, true }, - { 32192, true }, - { 32201, true }, - { 32213, true }, - { 32229, true }, - { 32246, false }, - { 32256, true }, - { 32267, true }, - { 32279, true }, - { 32292, true }, - { 32310, true }, - { 32327, true }, - { 32344, false }, - { 32354, true }, - { 32372, true }, - { 32386, true }, - { 32403, true }, - { 32425, true }, - { 32438, true }, - { 32459, true }, - { 32481, true }, - { 32497, true }, - { 32512, true }, - { 32526, true }, - { 32552, true }, - { 32577, true }, - { 32597, true }, - { 32612, true }, - { 32625, true }, - { 32637, true }, - { 32647, true }, - { 32662, true }, - { 32672, true }, - { 32681, true }, - { 32695, true }, - { 32706, true }, - { 32717, true }, - { 32732, true }, - { 32747, true }, - { 32759, true }, - { 32773, true }, - { 32786, true }, - { 32802, true }, - { 32812, true }, - { 32822, true }, - { 32831, true }, - { 32843, true }, - { 32854, true }, - { 32863, true }, - { 32879, true }, - { 32889, true }, - { 32900, true }, - { 32911, false }, - { 32931, true }, - { 32955, true }, - { 32976, true }, - { 32984, true }, - { 32994, true }, - { 33008, true }, - { 33028, false }, - { 33038, false }, - { 33052, true }, - { 33071, true }, - { 33088, true }, - { 33102, false }, - { 33120, true }, + { 32026, true }, + { 32038, false }, + { 32059, true }, + { 32067, true }, + { 32076, true }, + { 32090, true }, + { 32099, true }, + { 32111, true }, + { 32127, true }, + { 32144, false }, + { 32154, true }, + { 32165, true }, + { 32177, true }, + { 32190, true }, + { 32208, true }, + { 32225, true }, + { 32242, false }, + { 32252, true }, + { 32270, true }, + { 32284, true }, + { 32301, true }, + { 32323, true }, + { 32336, true }, + { 32357, true }, + { 32379, true }, + { 32395, true }, + { 32410, true }, + { 32424, true }, + { 32450, true }, + { 32475, true }, + { 32495, true }, + { 32510, true }, + { 32523, true }, + { 32535, true }, + { 32545, true }, + { 32560, true }, + { 32570, true }, + { 32579, true }, + { 32593, true }, + { 32604, true }, + { 32615, true }, + { 32630, true }, + { 32645, true }, + { 32657, true }, + { 32671, true }, + { 32684, true }, + { 32700, true }, + { 32710, true }, + { 32720, true }, + { 32729, true }, + { 32741, true }, + { 32752, true }, + { 32761, true }, + { 32777, true }, + { 32787, true }, + { 32798, true }, + { 32809, false }, + { 32829, true }, + { 32853, true }, + { 32874, true }, + { 32882, true }, + { 32892, true }, + { 32906, true }, + { 32926, false }, + { 32936, false }, + { 32950, true }, + { 32969, true }, + { 32986, true }, + { 33000, false }, + { 33018, true }, + { 33026, true }, + { 33042, true }, + { 33053, true }, + { 33066, true }, + { 33081, true }, + { 33101, false }, + { 33116, true }, { 33128, true }, - { 33144, true }, - { 33155, true }, - { 33168, true }, - { 33183, true }, - { 33203, false }, - { 33218, true }, - { 33230, true }, - { 33243, true }, - { 33255, true }, - { 33275, true }, - { 33288, true }, - { 33303, true }, - { 33316, true }, - { 33329, false }, - { 33352, false }, - { 33376, true }, - { 33393, true }, - { 33406, true }, - { 33417, true }, - { 33429, true }, - { 33449, true }, + { 33141, true }, + { 33153, true }, + { 33173, true }, + { 33186, true }, + { 33201, true }, + { 33214, true }, + { 33227, false }, + { 33250, false }, + { 33274, true }, + { 33291, true }, + { 33304, true }, + { 33315, true }, + { 33327, true }, + { 33347, true }, + { 33361, true }, + { 33372, true }, + { 33391, true }, + { 33408, true }, + { 33430, true }, + { 33444, true }, { 33463, true }, - { 33474, true }, - { 33493, true }, - { 33510, true }, - { 33532, true }, - { 33546, true }, - { 33565, true }, - { 33575, true }, - { 33589, true }, - { 33610, true }, - { 33622, true }, - { 33637, true }, - { 33651, true }, - { 33662, true }, - { 33676, true }, - { 33689, true }, - { 33705, true }, + { 33473, true }, + { 33487, true }, + { 33508, true }, + { 33520, true }, + { 33535, true }, + { 33549, true }, + { 33560, true }, + { 33574, true }, + { 33587, true }, + { 33603, true }, + { 33616, true }, + { 33636, true }, + { 33644, true }, + { 33656, false }, + { 33668, true }, + { 33679, true }, + { 33696, true }, { 33718, true }, { 33738, true }, - { 33746, true }, - { 33758, false }, - { 33770, true }, - { 33781, true }, - { 33798, true }, - { 33820, true }, - { 33840, true }, - { 33852, true }, - { 33864, true }, - { 33882, true }, - { 33896, true }, - { 33911, true }, - { 33930, true }, - { 33945, true }, - { 33959, true }, - { 33971, true }, - { 33987, true }, - { 34008, true }, - { 34027, true }, - { 34044, true }, - { 34071, false }, - { 34090, true }, + { 33750, true }, + { 33762, true }, + { 33780, true }, + { 33794, true }, + { 33809, true }, + { 33828, true }, + { 33843, true }, + { 33857, true }, + { 33869, true }, + { 33885, true }, + { 33906, true }, + { 33925, true }, + { 33942, true }, + { 33969, false }, + { 33988, true }, + { 34002, true }, + { 34022, true }, + { 34036, true }, + { 34056, true }, + { 34069, true }, + { 34083, true }, { 34104, true }, - { 34124, true }, + { 34125, true }, { 34138, true }, - { 34158, true }, - { 34171, true }, - { 34185, true }, - { 34206, true }, - { 34227, true }, - { 34240, true }, - { 34247, true }, - { 34259, true }, - { 34281, true }, - { 34297, true }, - { 34312, true }, - { 34325, true }, - { 34345, true }, - { 34359, true }, - { 34374, true }, - { 34384, true }, - { 34398, true }, - { 34408, true }, - { 34420, true }, - { 34432, true }, - { 34450, true }, - { 34469, true }, - { 34484, true }, - { 34505, false }, - { 34526, true }, - { 34546, true }, - { 34566, true }, - { 34598, true }, - { 34608, true }, - { 34621, true }, - { 34640, true }, - { 34657, false }, - { 34681, false }, - { 34703, true }, - { 34727, true }, - { 34757, true }, - { 34781, true }, - { 34797, true }, - { 34814, true }, - { 34832, true }, - { 34847, true }, - { 34864, true }, - { 34878, true }, - { 34900, true }, - { 34925, true }, - { 34938, true }, - { 34953, true }, - { 34968, false }, - { 34993, true }, + { 34145, true }, + { 34157, true }, + { 34179, true }, + { 34195, true }, + { 34210, true }, + { 34223, true }, + { 34243, true }, + { 34257, true }, + { 34272, true }, + { 34282, true }, + { 34296, true }, + { 34306, true }, + { 34318, true }, + { 34330, true }, + { 34348, true }, + { 34367, true }, + { 34382, true }, + { 34403, false }, + { 34424, true }, + { 34444, true }, + { 34464, true }, + { 34496, true }, + { 34506, true }, + { 34519, true }, + { 34538, true }, + { 34555, false }, + { 34579, false }, + { 34601, true }, + { 34625, true }, + { 34655, true }, + { 34679, true }, + { 34695, true }, + { 34712, true }, + { 34730, true }, + { 34745, true }, + { 34762, true }, + { 34776, true }, + { 34798, true }, + { 34823, true }, + { 34836, true }, + { 34851, true }, + { 34866, false }, + { 34891, true }, + { 34915, true }, + { 34936, true }, + { 34950, true }, + { 34965, true }, + { 34981, true }, + { 35000, true }, { 35017, true }, - { 35038, true }, - { 35052, true }, - { 35067, true }, - { 35083, true }, - { 35102, true }, - { 35119, true }, - { 35137, true }, - { 35161, false }, - { 35183, true }, - { 35196, true }, - { 35207, true }, - { 35219, true }, - { 35237, true }, - { 35256, true }, - { 35271, false }, - { 35282, true }, - { 35310, true }, - { 35325, true }, + { 35035, true }, + { 35059, false }, + { 35081, true }, + { 35094, true }, + { 35105, true }, + { 35117, true }, + { 35135, true }, + { 35154, true }, + { 35169, false }, + { 35180, true }, + { 35208, true }, + { 35223, true }, + { 35246, true }, + { 35259, true }, + { 35270, true }, + { 35283, true }, + { 35301, true }, + { 35323, true }, { 35348, true }, - { 35361, true }, - { 35372, true }, + { 35371, true }, { 35385, true }, - { 35403, true }, - { 35425, true }, - { 35450, true }, - { 35473, true }, - { 35487, true }, - { 35500, true }, - { 35516, true }, - { 35529, true }, - { 35547, true }, - { 35557, true }, - { 35570, true }, - { 35588, true }, - { 35609, true }, + { 35398, true }, + { 35414, true }, + { 35427, true }, + { 35445, true }, + { 35455, true }, + { 35468, true }, + { 35486, true }, + { 35507, true }, + { 35522, true }, + { 35537, true }, + { 35561, true }, + { 35586, true }, + { 35601, false }, { 35624, true }, - { 35639, true }, - { 35663, true }, - { 35688, true }, - { 35703, false }, - { 35726, true }, - { 35735, true }, - { 35756, true }, - { 35773, true }, - { 35784, true }, - { 35797, true }, - { 35810, false }, - { 35849, true }, - { 35862, true }, - { 35878, true }, - { 35892, false }, - { 35907, false }, - { 35923, true }, - { 35942, true }, - { 35953, true }, - { 35966, true }, - { 35978, true }, - { 36001, true }, - { 36013, true }, - { 36022, true }, - { 36032, true }, - { 36046, true }, - { 36061, true }, - { 36075, true }, - { 36086, true }, - { 36105, true }, - { 36121, true }, - { 36137, true }, - { 36154, true }, - { 36166, true }, - { 36189, true }, - { 36214, true }, - { 36226, true }, - { 36241, true }, - { 36258, true }, - { 36277, true }, - { 36290, true }, - { 36302, true }, - { 36332, true }, - { 36346, true }, - { 36370, true }, - { 36393, true }, - { 36407, true }, - { 36420, true }, - { 36432, true }, - { 36444, true }, - { 36467, true }, - { 36486, true }, - { 36497, true }, - { 36511, true }, - { 36523, true }, - { 36541, true }, - { 36557, true }, - { 36575, true }, - { 36591, true }, - { 36608, true }, + { 35633, true }, + { 35654, true }, + { 35671, true }, + { 35682, true }, + { 35695, true }, + { 35708, false }, + { 35747, true }, + { 35760, true }, + { 35776, true }, + { 35790, false }, + { 35805, false }, + { 35821, true }, + { 35840, true }, + { 35851, true }, + { 35864, true }, + { 35876, true }, + { 35899, true }, + { 35911, true }, + { 35920, true }, + { 35930, true }, + { 35944, true }, + { 35959, true }, + { 35973, true }, + { 35984, true }, + { 36003, true }, + { 36019, true }, + { 36035, true }, + { 36052, true }, + { 36064, true }, + { 36087, true }, + { 36112, true }, + { 36124, true }, + { 36139, true }, + { 36156, true }, + { 36175, true }, + { 36188, true }, + { 36200, true }, + { 36230, true }, + { 36244, true }, + { 36268, true }, + { 36291, true }, + { 36305, true }, + { 36318, true }, + { 36330, true }, + { 36342, true }, + { 36365, true }, + { 36384, true }, + { 36395, true }, + { 36409, true }, + { 36421, true }, + { 36439, true }, + { 36455, true }, + { 36473, true }, + { 36489, true }, + { 36506, true }, + { 36519, true }, + { 36530, true }, + { 36548, true }, + { 36566, true }, + { 36589, true }, + { 36606, false }, { 36621, true }, - { 36632, true }, - { 36650, true }, - { 36668, true }, - { 36691, true }, - { 36708, false }, - { 36723, true }, - { 36735, true }, - { 36747, true }, - { 36760, true }, - { 36769, true }, - { 36784, true }, - { 36803, true }, - { 36817, true }, - { 36832, true }, - { 36844, true }, - { 36856, true }, - { 36870, false }, - { 36887, true }, - { 36898, true }, - { 36911, true }, - { 36928, true }, - { 36947, true }, - { 36960, true }, - { 36978, true }, - { 37004, true }, - { 37021, true }, - { 37040, true }, - { 37055, true }, - { 37069, true }, - { 37086, true }, - { 37102, true }, - { 37121, true }, - { 37140, true }, - { 37160, true }, - { 37176, true }, - { 37192, true }, - { 37206, true }, - { 37216, true }, - { 37224, true }, - { 37250, true }, - { 37267, true }, - { 37288, true }, - { 37306, true }, - { 37320, true }, + { 36633, true }, + { 36645, true }, + { 36658, true }, + { 36667, true }, + { 36682, true }, + { 36701, true }, + { 36715, true }, + { 36730, true }, + { 36742, true }, + { 36754, true }, + { 36768, false }, + { 36785, true }, + { 36796, true }, + { 36809, true }, + { 36826, true }, + { 36845, true }, + { 36858, true }, + { 36876, true }, + { 36902, true }, + { 36919, true }, + { 36938, true }, + { 36953, true }, + { 36967, true }, + { 36984, true }, + { 37000, true }, + { 37019, true }, + { 37038, true }, + { 37058, true }, + { 37074, true }, + { 37090, true }, + { 37104, true }, + { 37114, true }, + { 37122, true }, + { 37148, true }, + { 37165, true }, + { 37186, true }, + { 37204, true }, + { 37218, true }, + { 37237, true }, + { 37249, true }, + { 37265, false }, + { 37284, true }, + { 37293, true }, + { 37307, true }, + { 37322, true }, { 37339, true }, - { 37351, true }, - { 37367, false }, - { 37386, true }, - { 37395, true }, - { 37409, true }, - { 37424, true }, - { 37435, true }, - { 37446, true }, - { 37465, true }, - { 37478, true }, - { 37500, true }, - { 37514, false }, - { 37528, true }, + { 37350, true }, + { 37361, true }, + { 37380, true }, + { 37393, true }, + { 37415, true }, + { 37429, false }, + { 37443, true }, + { 37459, true }, + { 37474, true }, + { 37486, true }, + { 37509, true }, + { 37521, true }, { 37544, true }, - { 37559, true }, - { 37571, true }, + { 37563, true }, + { 37579, true }, { 37594, true }, - { 37606, true }, - { 37629, true }, - { 37648, true }, - { 37664, true }, - { 37679, true }, - { 37689, true }, - { 37696, true }, - { 37707, true }, - { 37724, true }, - { 37738, true }, - { 37747, true }, - { 37755, true }, + { 37604, true }, + { 37611, true }, + { 37622, true }, + { 37639, true }, + { 37653, true }, + { 37662, true }, + { 37670, true }, + { 37684, true }, + { 37703, false }, + { 37714, true }, + { 37730, false }, + { 37740, false }, + { 37756, true }, { 37769, true }, - { 37788, false }, - { 37799, true }, - { 37815, false }, - { 37825, false }, - { 37841, true }, - { 37854, true }, - { 37868, true }, - { 37883, true }, - { 37899, true }, - { 37921, true }, - { 37935, true }, - { 37949, true }, - { 37963, true }, - { 37978, true }, - { 37993, true }, - { 38018, true }, - { 38038, true }, - { 38054, true }, - { 38067, true }, - { 38080, true }, - { 38110, true }, - { 38122, true }, - { 38137, true }, - { 38147, true }, - { 38163, true }, - { 38171, false }, - { 38183, true }, - { 38194, true }, - { 38203, true }, + { 37783, true }, + { 37798, true }, + { 37814, true }, + { 37836, true }, + { 37850, true }, + { 37864, true }, + { 37878, true }, + { 37893, true }, + { 37908, true }, + { 37933, true }, + { 37953, true }, + { 37969, true }, + { 37982, true }, + { 37995, true }, + { 38025, true }, + { 38037, true }, + { 38052, true }, + { 38062, true }, + { 38078, true }, + { 38086, false }, + { 38098, true }, + { 38109, true }, + { 38118, true }, + { 38133, true }, + { 38150, true }, + { 38166, true }, + { 38179, true }, + { 38192, true }, + { 38209, true }, { 38218, true }, - { 38235, true }, - { 38251, true }, - { 38264, true }, - { 38277, true }, - { 38294, true }, - { 38303, true }, - { 38311, true }, - { 38322, true }, - { 38331, true }, - { 38345, true }, - { 38358, true }, - { 38366, true }, - { 38384, true }, - { 38393, true }, - { 38402, true }, - { 38410, true }, - { 38418, true }, - { 38437, true }, - { 38456, true }, - { 38465, true }, - { 38485, true }, - { 38508, true }, - { 38518, true }, - { 38536, true }, - { 38556, true }, - { 38569, true }, - { 38583, true }, - { 38599, true }, - { 38609, true }, - { 38620, true }, - { 38630, true }, - { 38647, true }, - { 38663, true }, - { 38678, true }, - { 38689, true }, - { 38696, true }, - { 38707, true }, - { 38718, true }, - { 38726, true }, - { 38746, true }, - { 38767, true }, - { 38786, true }, - { 38801, true }, - { 38823, true }, - { 38835, false }, + { 38226, true }, + { 38237, true }, + { 38246, true }, + { 38260, true }, + { 38273, true }, + { 38281, true }, + { 38299, true }, + { 38308, true }, + { 38317, true }, + { 38325, true }, + { 38333, true }, + { 38352, true }, + { 38371, true }, + { 38380, true }, + { 38400, true }, + { 38423, true }, + { 38433, true }, + { 38451, true }, + { 38471, true }, + { 38484, true }, + { 38498, true }, + { 38514, true }, + { 38524, true }, + { 38535, true }, + { 38545, true }, + { 38562, true }, + { 38578, true }, + { 38593, true }, + { 38604, true }, + { 38611, true }, + { 38622, true }, + { 38633, true }, + { 38641, true }, + { 38661, true }, + { 38682, true }, + { 38701, true }, + { 38716, true }, + { 38738, true }, + { 38750, false }, + { 38772, true }, + { 38791, true }, + { 38807, true }, + { 38825, true }, + { 38840, true }, { 38857, true }, - { 38876, true }, - { 38892, true }, - { 38910, true }, - { 38925, true }, - { 38942, true }, - { 38957, true }, - { 38976, true }, - { 38988, true }, - { 39008, true }, - { 39025, true }, - { 39039, true }, - { 39048, true }, - { 39060, true }, - { 39070, true }, - { 39079, true }, - { 39088, true }, - { 39097, true }, - { 39106, true }, - { 39116, true }, - { 39126, true }, - { 39135, true }, - { 39144, true }, - { 39162, true }, - { 39178, true }, - { 39186, true }, - { 39193, true }, - { 39206, true }, - { 39223, true }, - { 39237, true }, - { 39244, true }, - { 39254, true }, - { 39265, true }, - { 39282, true }, - { 39302, true }, - { 39321, false }, - { 39335, true }, - { 39353, true }, - { 39366, true }, + { 38872, true }, + { 38891, true }, + { 38903, true }, + { 38923, true }, + { 38940, true }, + { 38954, true }, + { 38963, true }, + { 38975, true }, + { 38985, true }, + { 38994, true }, + { 39003, true }, + { 39012, true }, + { 39021, true }, + { 39031, true }, + { 39041, true }, + { 39050, true }, + { 39059, true }, + { 39077, true }, + { 39093, true }, + { 39101, true }, + { 39108, true }, + { 39121, true }, + { 39138, true }, + { 39152, true }, + { 39159, true }, + { 39169, true }, + { 39180, true }, + { 39197, true }, + { 39217, true }, + { 39236, false }, + { 39250, true }, + { 39268, true }, + { 39281, true }, + { 39298, true }, + { 39312, true }, + { 39326, true }, + { 39343, true }, + { 39369, true }, { 39383, true }, - { 39397, true }, - { 39411, true }, - { 39428, true }, - { 39454, true }, - { 39468, true }, - { 39485, true }, - { 39500, true }, - { 39514, true }, - { 39525, true }, - { 39538, true }, - { 39548, true }, - { 39559, true }, - { 39578, true }, - { 39593, true }, - { 39608, true }, - { 39635, true }, - { 39645, true }, - { 39657, true }, - { 39669, true }, - { 39677, true }, - { 39688, true }, - { 39697, true }, - { 39705, true }, - { 39716, true }, - { 39743, true }, - { 39753, true }, - { 39764, true }, - { 39775, true }, - { 39785, true }, - { 39799, true }, - { 39813, true }, - { 39824, true }, - { 39831, true }, - { 39839, true }, - { 39847, true }, - { 39863, true }, - { 39877, true }, - { 39891, true }, - { 39900, true }, - { 39912, true }, - { 39919, true }, - { 39926, true }, - { 39942, true }, + { 39400, true }, + { 39415, true }, + { 39429, true }, + { 39440, true }, + { 39453, true }, + { 39463, true }, + { 39474, true }, + { 39493, true }, + { 39508, true }, + { 39523, true }, + { 39550, true }, + { 39560, true }, + { 39572, true }, + { 39584, true }, + { 39592, true }, + { 39603, true }, + { 39612, true }, + { 39620, true }, + { 39631, true }, + { 39658, true }, + { 39668, true }, + { 39679, true }, + { 39690, true }, + { 39700, true }, + { 39714, true }, + { 39728, true }, + { 39739, true }, + { 39746, true }, + { 39754, true }, + { 39762, true }, + { 39778, true }, + { 39792, true }, + { 39806, true }, + { 39815, true }, + { 39827, true }, + { 39834, true }, + { 39841, true }, + { 39857, true }, + { 39869, true }, + { 39883, true }, + { 39905, true }, + { 39916, true }, + { 39927, true }, + { 39938, true }, { 39954, true }, - { 39968, true }, - { 39990, true }, - { 40001, true }, - { 40012, true }, - { 40028, true }, - { 40045, true }, - { 40058, true }, - { 40084, false }, - { 40107, true }, - { 40123, true }, - { 40133, true }, - { 40144, true }, - { 40159, true }, - { 40177, true }, - { 40189, false }, - { 40201, true }, - { 40215, true }, - { 40229, true }, - { 40246, true }, - { 40264, true }, - { 40277, true }, - { 40296, true }, - { 40306, true }, - { 40317, true }, - { 40330, true }, - { 40347, true }, - { 40365, true }, - { 40381, true }, - { 40394, true }, - { 40412, true }, - { 40426, true }, - { 40444, true }, - { 40459, true }, - { 40480, true }, - { 40501, true }, - { 40517, true }, - { 40536, false }, - { 40557, false }, - { 40577, true }, - { 40597, true }, - { 40617, true }, + { 39971, true }, + { 39984, true }, + { 40010, false }, + { 40033, true }, + { 40049, true }, + { 40059, true }, + { 40070, true }, + { 40085, true }, + { 40103, true }, + { 40115, false }, + { 40127, true }, + { 40141, true }, + { 40155, true }, + { 40172, true }, + { 40190, true }, + { 40203, true }, + { 40222, true }, + { 40232, true }, + { 40243, true }, + { 40256, true }, + { 40273, true }, + { 40291, true }, + { 40307, true }, + { 40320, true }, + { 40338, true }, + { 40352, true }, + { 40370, true }, + { 40385, true }, + { 40406, true }, + { 40427, true }, + { 40443, true }, + { 40462, false }, + { 40483, false }, + { 40503, true }, + { 40523, true }, + { 40543, true }, + { 40559, true }, + { 40576, true }, + { 40595, true }, + { 40613, true }, { 40633, true }, - { 40650, true }, - { 40669, true }, - { 40687, true }, - { 40707, true }, - { 40723, true }, - { 40734, false }, - { 40744, true }, - { 40753, true }, - { 40771, true }, - { 40789, false }, - { 40801, true }, - { 40814, true }, - { 40829, true }, - { 40844, true }, - { 40852, true }, - { 40886, true }, - { 40897, false }, - { 40911, true }, - { 40929, true }, - { 40947, true }, - { 40962, true }, - { 40973, true }, - { 40987, true }, - { 41002, true }, - { 41019, true }, - { 41031, true }, - { 41060, true }, - { 41093, true }, - { 41105, true }, - { 41117, true }, + { 40649, true }, + { 40660, false }, + { 40670, true }, + { 40679, true }, + { 40697, true }, + { 40711, true }, + { 40729, false }, + { 40741, true }, + { 40754, true }, + { 40769, true }, + { 40784, true }, + { 40792, true }, + { 40826, true }, + { 40837, false }, + { 40851, true }, + { 40869, true }, + { 40887, true }, + { 40902, true }, + { 40913, true }, + { 40927, true }, + { 40942, true }, + { 40959, true }, + { 40971, true }, + { 41000, true }, + { 41033, true }, + { 41045, true }, + { 41057, true }, + { 41074, true }, + { 41086, true }, + { 41098, true }, + { 41113, false }, + { 41125, true }, { 41134, true }, - { 41146, true }, - { 41158, true }, - { 41173, false }, - { 41185, true }, - { 41194, true }, - { 41210, true }, - { 41222, true }, - { 41239, true }, - { 41254, false }, - { 41268, true }, - { 41288, false }, - { 41302, true }, - { 41313, true }, - { 41326, true }, - { 41336, false }, - { 41352, true }, - { 41366, true }, - { 41380, true }, - { 41391, true }, - { 41404, true }, - { 41420, true }, - { 41431, true }, + { 41150, true }, + { 41162, true }, + { 41179, true }, + { 41194, false }, + { 41208, true }, + { 41228, false }, + { 41242, true }, + { 41253, true }, + { 41266, true }, + { 41276, false }, + { 41292, true }, + { 41306, true }, + { 41320, true }, + { 41331, true }, + { 41344, true }, + { 41360, true }, + { 41371, true }, + { 41388, true }, + { 41414, true }, + { 41434, true }, { 41448, true }, - { 41474, true }, - { 41494, true }, - { 41508, true }, - { 41525, false }, - { 41539, true }, - { 41553, false }, - { 41570, true }, - { 41586, true }, - { 41613, true }, - { 41624, true }, - { 41639, true }, - { 41651, true }, - { 41666, true }, - { 41688, true }, - { 41706, true }, - { 41722, true }, - { 41742, true }, - { 41756, true }, - { 41772, true }, - { 41790, true }, - { 41803, true }, - { 41820, true }, - { 41833, true }, - { 41848, true }, - { 41864, true }, - { 41883, true }, - { 41900, true }, - { 41916, true }, - { 41928, true }, - { 41941, true }, - { 41967, true }, - { 41987, false }, - { 41998, true }, - { 42016, true }, - { 42030, true }, - { 42039, true }, - { 42056, true }, - { 42067, true }, - { 42079, true }, - { 42089, true }, + { 41465, false }, + { 41479, true }, + { 41493, false }, + { 41510, true }, + { 41526, true }, + { 41553, true }, + { 41564, true }, + { 41579, true }, + { 41591, true }, + { 41606, true }, + { 41628, true }, + { 41646, true }, + { 41662, true }, + { 41682, true }, + { 41696, true }, + { 41712, true }, + { 41730, true }, + { 41743, true }, + { 41760, true }, + { 41773, true }, + { 41788, true }, + { 41804, true }, + { 41823, true }, + { 41840, true }, + { 41856, true }, + { 41868, true }, + { 41881, true }, + { 41907, true }, + { 41927, false }, + { 41938, true }, + { 41956, true }, + { 41970, true }, + { 41979, true }, + { 41996, true }, + { 42007, true }, + { 42019, true }, + { 42029, true }, + { 42040, true }, + { 42061, true }, + { 42073, true }, + { 42084, true }, + { 42092, true }, { 42100, true }, - { 42121, true }, - { 42133, true }, - { 42144, true }, - { 42152, true }, - { 42160, true }, - { 42171, true }, - { 42187, true }, - { 42197, true }, - { 42208, true }, - { 42221, true }, + { 42111, true }, + { 42127, true }, + { 42137, true }, + { 42148, true }, + { 42161, true }, + { 42176, true }, + { 42193, true }, + { 42215, true }, { 42236, true }, - { 42253, true }, - { 42275, true }, - { 42296, true }, - { 42304, true }, - { 42317, true }, - { 42328, false }, - { 42348, true }, + { 42244, true }, + { 42257, true }, + { 42268, false }, + { 42288, true }, + { 42303, true }, + { 42316, true }, + { 42328, true }, + { 42349, true }, { 42363, true }, - { 42376, true }, - { 42388, true }, + { 42377, true }, + { 42394, true }, { 42409, true }, { 42423, true }, { 42437, true }, - { 42454, true }, - { 42469, true }, - { 42483, true }, - { 42497, true }, - { 42511, true }, - { 42525, true }, - { 42539, true }, - { 42554, true }, - { 42566, true }, - { 42580, true }, - { 42598, true }, - { 42613, true }, + { 42451, true }, + { 42465, true }, + { 42479, true }, + { 42494, true }, + { 42506, true }, + { 42520, true }, + { 42538, true }, + { 42553, true }, + { 42563, true }, + { 42574, true }, + { 42595, true }, + { 42610, true }, { 42623, true }, - { 42634, true }, - { 42655, true }, - { 42670, true }, - { 42683, true }, - { 42698, true }, - { 42710, true }, - { 42725, true }, - { 42742, true }, - { 42759, true }, - { 42771, true }, - { 42780, true }, - { 42800, true }, - { 42811, true }, + { 42638, true }, + { 42650, true }, + { 42665, true }, + { 42682, true }, + { 42699, true }, + { 42711, true }, + { 42720, true }, + { 42740, true }, + { 42751, true }, + { 42766, true }, + { 42782, true }, + { 42789, true }, + { 42812, true }, { 42826, true }, - { 42842, true }, - { 42849, true }, - { 42872, true }, - { 42886, true }, + { 42841, true }, + { 42856, true }, + { 42871, true }, + { 42882, true }, + { 42892, true }, { 42901, true }, - { 42916, true }, - { 42931, true }, - { 42942, true }, - { 42952, true }, - { 42961, true }, - { 42973, true }, - { 42984, true }, + { 42913, true }, + { 42924, true }, + { 42935, true }, + { 42948, true }, + { 42964, true }, + { 42979, true }, { 42995, true }, - { 43008, true }, - { 43024, true }, - { 43039, true }, - { 43055, true }, - { 43072, true }, + { 43012, true }, + { 43029, true }, + { 43043, true }, + { 43058, true }, + { 43074, true }, { 43089, true }, - { 43103, true }, - { 43118, true }, - { 43134, true }, - { 43149, true }, - { 43159, true }, - { 43172, true }, - { 43184, true }, - { 43212, true }, - { 43224, true }, - { 43238, true }, - { 43254, true }, - { 43267, true }, - { 43278, true }, - { 43300, true }, + { 43099, true }, + { 43112, true }, + { 43124, true }, + { 43152, true }, + { 43164, true }, + { 43178, true }, + { 43194, true }, + { 43207, true }, + { 43218, true }, + { 43240, true }, + { 43260, true }, + { 43281, true }, + { 43296, true }, + { 43310, true }, { 43320, true }, - { 43341, true }, + { 43339, true }, { 43356, true }, - { 43370, true }, - { 43380, true }, - { 43399, true }, - { 43416, true }, - { 43429, true }, - { 43443, true }, - { 43455, true }, - { 43466, true }, - { 43484, true }, - { 43502, true }, - { 43514, true }, - { 43528, true }, - { 43542, true }, - { 43550, true }, - { 43579, true }, - { 43598, true }, - { 43611, true }, - { 43636, true }, - { 43653, true }, - { 43674, true }, - { 43686, true }, - { 43710, true }, - { 43743, true }, - { 43755, true }, - { 43777, true }, - { 43794, true }, - { 43809, true }, - { 43823, true }, - { 43849, true }, - { 43859, true }, - { 43878, true }, - { 43891, true }, - { 43901, true }, - { 43911, true }, - { 43929, true }, - { 43947, true }, - { 43974, true }, + { 43369, true }, + { 43383, true }, + { 43395, true }, + { 43406, true }, + { 43424, true }, + { 43442, true }, + { 43454, true }, + { 43468, true }, + { 43482, true }, + { 43490, true }, + { 43519, true }, + { 43538, true }, + { 43551, true }, + { 43576, true }, + { 43593, true }, + { 43614, true }, + { 43626, true }, + { 43650, true }, + { 43683, true }, + { 43695, true }, + { 43717, true }, + { 43734, true }, + { 43749, true }, + { 43763, true }, + { 43789, true }, + { 43799, true }, + { 43818, true }, + { 43831, true }, + { 43841, true }, + { 43851, true }, + { 43869, true }, + { 43887, true }, + { 43914, true }, + { 43930, true }, + { 43955, true }, + { 43970, true }, { 43990, true }, - { 44015, true }, - { 44030, true }, - { 44050, true }, + { 44005, true }, + { 44020, true }, + { 44041, true }, { 44065, true }, - { 44080, true }, - { 44101, true }, + { 44078, false }, + { 44092, true }, + { 44106, true }, { 44125, true }, - { 44138, true }, - { 44148, false }, - { 44162, true }, - { 44176, true }, - { 44195, true }, - { 44210, false }, - { 44225, true }, - { 44234, true }, - { 44244, true }, - { 44259, true }, - { 44271, true }, - { 44289, true }, - { 44300, true }, - { 44308, true }, - { 44317, true }, - { 44327, true }, - { 44340, true }, - { 44350, true }, - { 44364, false }, - { 44389, true }, - { 44407, false }, - { 44431, true }, - { 44445, true }, + { 44140, false }, + { 44155, true }, + { 44164, true }, + { 44174, true }, + { 44189, true }, + { 44201, true }, + { 44219, true }, + { 44230, true }, + { 44238, true }, + { 44247, true }, + { 44257, true }, + { 44270, true }, + { 44280, true }, + { 44294, false }, + { 44319, true }, + { 44337, false }, + { 44361, true }, + { 44375, true }, + { 44394, true }, + { 44421, true }, + { 44433, true }, + { 44441, true }, + { 44450, true }, { 44464, true }, - { 44491, true }, - { 44503, true }, - { 44511, true }, - { 44520, true }, - { 44534, true }, - { 44551, true }, - { 44566, true }, - { 44578, true }, - { 44595, true }, - { 44607, true }, - { 44619, true }, - { 44629, true }, - { 44641, true }, - { 44654, true }, - { 44668, true }, - { 44685, true }, - { 44696, true }, - { 44714, false }, - { 44734, true }, - { 44746, true }, - { 44758, true }, + { 44481, true }, + { 44496, true }, + { 44508, true }, + { 44525, true }, + { 44537, true }, + { 44549, true }, + { 44559, true }, + { 44571, true }, + { 44584, true }, + { 44598, true }, + { 44615, true }, + { 44626, true }, + { 44644, false }, + { 44664, true }, + { 44676, true }, + { 44688, true }, + { 44698, true }, + { 44711, true }, + { 44733, true }, + { 44747, true }, + { 44756, true }, { 44768, true }, - { 44781, true }, - { 44803, true }, - { 44817, true }, - { 44826, true }, - { 44838, true }, - { 44845, true }, - { 44857, true }, - { 44866, true }, - { 44876, true }, - { 44890, true }, + { 44775, true }, + { 44787, true }, + { 44796, true }, + { 44806, true }, + { 44820, true }, + { 44837, true }, + { 44848, true }, + { 44862, true }, + { 44871, true }, + { 44880, true }, + { 44895, true }, { 44907, true }, - { 44918, true }, - { 44932, true }, - { 44941, true }, - { 44950, true }, - { 44965, true }, - { 44977, true }, - { 44993, true }, + { 44923, true }, + { 44939, true }, + { 44956, true }, + { 44966, true }, + { 44988, true }, + { 44997, true }, { 45009, true }, - { 45026, true }, - { 45036, true }, - { 45058, true }, - { 45067, true }, - { 45079, true }, - { 45093, true }, - { 45126, true }, - { 45151, true }, - { 45160, true }, - { 45176, true }, - { 45188, true }, - { 45199, true }, - { 45224, true }, - { 45239, true }, - { 45261, true }, - { 45286, true }, - { 45317, true }, - { 45328, true }, - { 45344, true }, - { 45358, true }, - { 45376, true }, - { 45390, true }, - { 45405, false }, - { 45422, true }, - { 45440, true }, - { 45453, true }, - { 45463, true }, - { 45475, true }, - { 45490, true }, - { 45501, true }, - { 45515, true }, - { 45528, true }, - { 45540, true }, - { 45552, true }, - { 45563, true }, - { 45579, true }, - { 45592, true }, - { 45604, false }, - { 45621, true }, - { 45641, true }, - { 45658, true }, - { 45674, true }, - { 45689, true }, - { 45704, true }, - { 45727, true }, - { 45753, false }, - { 45773, true }, - { 45788, false }, - { 45806, true }, - { 45825, true }, - { 45842, true }, - { 45855, true }, - { 45872, true }, - { 45882, false }, - { 45899, true }, - { 45918, true }, - { 45935, true }, - { 45948, true }, - { 45962, true }, - { 45979, true }, + { 45023, true }, + { 45056, true }, + { 45081, true }, + { 45090, true }, + { 45106, true }, + { 45118, true }, + { 45129, true }, + { 45154, true }, + { 45169, true }, + { 45191, true }, + { 45216, true }, + { 45247, true }, + { 45258, true }, + { 45274, true }, + { 45288, true }, + { 45306, true }, + { 45320, true }, + { 45335, false }, + { 45352, true }, + { 45370, true }, + { 45383, true }, + { 45393, true }, + { 45405, true }, + { 45420, true }, + { 45431, true }, + { 45445, true }, + { 45458, true }, + { 45470, true }, + { 45482, true }, + { 45493, true }, + { 45509, false }, + { 45522, true }, + { 45534, false }, + { 45551, true }, + { 45571, true }, + { 45588, true }, + { 45604, true }, + { 45619, true }, + { 45634, true }, + { 45657, true }, + { 45683, false }, + { 45703, true }, + { 45718, false }, + { 45736, true }, + { 45755, true }, + { 45772, true }, + { 45785, true }, + { 45802, true }, + { 45812, false }, + { 45829, true }, + { 45848, true }, + { 45865, true }, + { 45878, true }, + { 45892, true }, + { 45909, true }, + { 45917, true }, + { 45929, true }, + { 45939, true }, + { 45950, true }, + { 45960, true }, + { 45973, true }, { 45987, true }, - { 45999, true }, - { 46009, true }, - { 46020, true }, - { 46030, true }, - { 46043, true }, - { 46057, true }, - { 46068, true }, - { 46081, true }, - { 46100, false }, - { 46108, true }, - { 46119, true }, - { 46132, true }, - { 46145, true }, - { 46164, true }, - { 46180, true }, - { 46192, true }, - { 46206, true }, - { 46220, true }, - { 46232, true }, - { 46248, true }, - { 46260, true }, - { 46275, true }, - { 46293, true }, - { 46308, true }, - { 46323, true }, + { 45998, true }, + { 46011, true }, + { 46030, false }, + { 46038, true }, + { 46049, true }, + { 46062, true }, + { 46075, true }, + { 46094, true }, + { 46110, true }, + { 46122, true }, + { 46136, true }, + { 46150, true }, + { 46162, true }, + { 46178, true }, + { 46190, true }, + { 46205, true }, + { 46223, true }, + { 46238, true }, + { 46253, true }, + { 46269, true }, + { 46283, true }, + { 46304, true }, + { 46320, true }, { 46339, true }, - { 46353, true }, - { 46374, true }, - { 46390, true }, - { 46409, true }, - { 46428, true }, - { 46445, false }, - { 46465, true }, - { 46495, true }, - { 46521, true }, - { 46538, true }, - { 46550, true }, - { 46570, true }, - { 46584, true }, - { 46603, true }, - { 46621, true }, - { 46636, true }, - { 46647, true }, - { 46658, true }, - { 46668, true }, - { 46686, true }, - { 46705, true }, - { 46715, true }, - { 46733, true }, - { 46742, false }, - { 46753, false }, - { 46773, true }, - { 46781, true }, - { 46795, true }, - { 46808, true }, - { 46818, true }, - { 46827, true }, - { 46847, false }, - { 46862, true }, - { 46871, false }, - { 46880, true }, - { 46896, true }, - { 46913, true }, - { 46922, true }, - { 46929, true }, - { 46941, true }, - { 46950, true }, - { 46960, true }, - { 46977, true }, - { 46987, true }, - { 46995, true }, - { 47003, true }, - { 47010, true }, - { 47021, true }, - { 47034, true }, - { 47041, true }, - { 47051, true }, - { 47066, true }, - { 47081, true }, - { 47094, true }, - { 47106, true }, - { 47121, true }, - { 47132, true }, - { 47142, true }, - { 47150, true }, - { 47159, true }, - { 47167, true }, - { 47181, true }, - { 47193, true }, - { 47208, true }, - { 47218, true }, - { 47235, true }, - { 47245, true }, - { 47261, true }, - { 47277, true }, - { 47296, true }, + { 46358, true }, + { 46375, false }, + { 46395, true }, + { 46425, true }, + { 46451, true }, + { 46468, true }, + { 46480, true }, + { 46500, true }, + { 46514, true }, + { 46533, true }, + { 46551, true }, + { 46566, true }, + { 46577, true }, + { 46588, true }, + { 46598, true }, + { 46616, true }, + { 46635, true }, + { 46645, true }, + { 46663, true }, + { 46672, false }, + { 46683, false }, + { 46703, true }, + { 46711, true }, + { 46725, true }, + { 46738, true }, + { 46748, true }, + { 46757, true }, + { 46770, true }, + { 46790, false }, + { 46805, true }, + { 46814, false }, + { 46823, true }, + { 46839, true }, + { 46856, true }, + { 46865, true }, + { 46872, true }, + { 46884, true }, + { 46893, true }, + { 46903, true }, + { 46920, true }, + { 46928, true }, + { 46936, true }, + { 46943, true }, + { 46954, true }, + { 46967, true }, + { 46974, true }, + { 46984, true }, + { 46999, true }, + { 47014, true }, + { 47027, true }, + { 47039, true }, + { 47054, true }, + { 47065, true }, + { 47075, true }, + { 47083, true }, + { 47092, true }, + { 47100, true }, + { 47114, true }, + { 47126, true }, + { 47141, true }, + { 47151, true }, + { 47168, true }, + { 47178, true }, + { 47194, true }, + { 47210, true }, + { 47229, true }, + { 47243, true }, + { 47259, true }, + { 47272, true }, + { 47287, true }, + { 47298, true }, { 47310, true }, - { 47326, true }, - { 47339, true }, - { 47354, true }, - { 47365, true }, - { 47377, true }, - { 47402, false }, - { 47411, true }, - { 47424, true }, - { 47433, true }, - { 47449, true }, - { 47470, true }, - { 47484, true }, - { 47498, true }, - { 47510, true }, - { 47532, true }, - { 47543, true }, - { 47555, true }, - { 47566, true }, - { 47580, true }, - { 47600, true }, - { 47614, true }, - { 47637, true }, - { 47651, true }, - { 47666, true }, - { 47683, true }, - { 47697, true }, - { 47716, true }, - { 47732, true }, - { 47743, true }, - { 47754, true }, - { 47766, true }, - { 47787, false }, - { 47803, true }, - { 47820, true }, - { 47838, true }, - { 47853, true }, - { 47881, true }, - { 47891, true }, - { 47901, true }, - { 47920, false }, - { 47932, true }, - { 47946, true }, - { 47959, true }, + { 47335, false }, + { 47344, true }, + { 47357, true }, + { 47366, true }, + { 47382, true }, + { 47403, true }, + { 47417, true }, + { 47431, true }, + { 47443, true }, + { 47465, true }, + { 47476, true }, + { 47488, true }, + { 47499, true }, + { 47513, true }, + { 47533, true }, + { 47547, true }, + { 47570, true }, + { 47584, true }, + { 47599, true }, + { 47616, true }, + { 47630, true }, + { 47649, true }, + { 47665, true }, + { 47676, true }, + { 47687, true }, + { 47699, true }, + { 47720, false }, + { 47736, true }, + { 47753, true }, + { 47771, true }, + { 47786, true }, + { 47814, true }, + { 47824, true }, + { 47834, true }, + { 47853, false }, + { 47865, true }, + { 47879, true }, + { 47892, true }, + { 47911, true }, + { 47927, true }, + { 47942, true }, + { 47965, true }, { 47978, true }, - { 47994, true }, - { 48009, true }, - { 48032, true }, - { 48045, true }, - { 48062, true }, - { 48071, true }, - { 48092, true }, - { 48107, true }, - { 48123, true }, - { 48136, true }, - { 48149, true }, - { 48161, true }, - { 48175, true }, - { 48192, true }, + { 47995, true }, + { 48004, true }, + { 48025, true }, + { 48040, true }, + { 48056, true }, + { 48069, true }, + { 48082, true }, + { 48094, true }, + { 48108, true }, + { 48125, true }, + { 48142, true }, + { 48153, true }, + { 48167, true }, + { 48174, true }, + { 48183, true }, + { 48198, true }, { 48209, true }, - { 48220, true }, - { 48234, true }, - { 48243, true }, - { 48258, true }, - { 48269, true }, - { 48293, true }, - { 48304, true }, - { 48314, true }, - { 48327, true }, - { 48338, true }, - { 48350, true }, - { 48371, true }, - { 48385, true }, - { 48400, true }, + { 48233, true }, + { 48244, true }, + { 48254, true }, + { 48267, true }, + { 48278, true }, + { 48290, true }, + { 48311, true }, + { 48325, true }, + { 48340, true }, + { 48357, true }, + { 48372, true }, + { 48384, true }, + { 48401, true }, { 48417, true }, - { 48432, true }, - { 48444, true }, - { 48461, true }, - { 48477, true }, + { 48438, true }, + { 48455, true }, + { 48484, true }, { 48498, true }, - { 48515, true }, - { 48544, true }, - { 48558, true }, - { 48569, false }, - { 48592, false }, - { 48606, true }, + { 48509, false }, + { 48532, false }, + { 48546, true }, + { 48564, true }, + { 48579, true }, + { 48596, true }, + { 48613, true }, { 48624, true }, - { 48639, true }, - { 48656, true }, - { 48673, true }, - { 48684, true }, - { 48702, true }, - { 48725, true }, - { 48739, true }, - { 48758, true }, - { 48777, true }, - { 48791, true }, - { 48802, true }, - { 48812, true }, - { 48825, true }, - { 48841, true }, - { 48861, false }, - { 48879, true }, - { 48908, true }, - { 48924, true }, - { 48940, true }, - { 48950, true }, - { 48966, true }, - { 48975, true }, - { 48990, true }, - { 49002, true }, - { 49016, true }, - { 49031, true }, - { 49044, true }, - { 49060, false }, - { 49070, true }, - { 49087, true }, - { 49100, true }, - { 49118, true }, - { 49140, true }, - { 49162, true }, - { 49173, true }, - { 49182, true }, - { 49203, true }, - { 49215, false }, - { 49228, true }, - { 49240, true }, - { 49253, true }, - { 49268, true }, - { 49280, true }, - { 49297, true }, - { 49312, true }, + { 48642, true }, + { 48665, true }, + { 48679, true }, + { 48698, true }, + { 48717, true }, + { 48731, true }, + { 48742, true }, + { 48752, true }, + { 48765, true }, + { 48781, true }, + { 48801, false }, + { 48819, true }, + { 48848, true }, + { 48864, true }, + { 48880, true }, + { 48890, true }, + { 48906, true }, + { 48915, true }, + { 48930, true }, + { 48942, true }, + { 48956, true }, + { 48971, true }, + { 48984, true }, + { 49000, false }, + { 49010, true }, + { 49027, true }, + { 49040, true }, + { 49058, true }, + { 49080, true }, + { 49102, true }, + { 49113, true }, + { 49122, true }, + { 49143, true }, + { 49155, false }, + { 49168, true }, + { 49180, true }, + { 49193, true }, + { 49208, true }, + { 49220, true }, + { 49237, true }, + { 49252, true }, + { 49283, true }, + { 49315, true }, { 49343, true }, - { 49375, true }, - { 49403, true }, - { 49433, true }, - { 49445, true }, - { 49459, true }, - { 49475, true }, - { 49485, true }, - { 49495, true }, - { 49510, true }, - { 49532, true }, - { 49546, true }, - { 49556, true }, - { 49567, true }, - { 49583, true }, - { 49601, true }, - { 49609, true }, - { 49623, true }, - { 49638, true }, - { 49646, true }, - { 49655, true }, - { 49678, true }, - { 49693, true }, - { 49704, true }, - { 49719, true }, - { 49737, true }, - { 49749, true }, - { 49765, true }, - { 49780, true }, - { 49793, true }, - { 49804, true }, - { 49819, true }, - { 49836, true }, - { 49847, true }, - { 49856, true }, + { 49373, true }, + { 49385, true }, + { 49399, true }, + { 49415, true }, + { 49425, true }, + { 49435, true }, + { 49450, true }, + { 49472, true }, + { 49486, true }, + { 49496, true }, + { 49507, true }, + { 49523, true }, + { 49541, true }, + { 49549, true }, + { 49563, true }, + { 49578, true }, + { 49586, true }, + { 49595, true }, + { 49618, true }, + { 49633, true }, + { 49644, true }, + { 49659, true }, + { 49677, true }, + { 49689, true }, + { 49705, true }, + { 49720, true }, + { 49733, true }, + { 49744, true }, + { 49759, true }, + { 49776, true }, + { 49787, true }, + { 49796, true }, + { 49812, true }, + { 49822, false }, + { 49841, true }, + { 49855, true }, + { 49863, true }, { 49872, true }, - { 49882, false }, - { 49901, true }, - { 49915, true }, + { 49882, true }, + { 49903, true }, + { 49912, true }, { 49923, true }, - { 49932, true }, - { 49942, true }, - { 49963, true }, - { 49972, true }, - { 49983, true }, - { 49999, true }, - { 50009, true }, - { 50028, true }, - { 50046, true }, - { 50066, true }, + { 49939, true }, + { 49949, true }, + { 49968, true }, + { 49986, true }, + { 50006, true }, + { 50026, true }, + { 50034, true }, + { 50047, true }, + { 50058, true }, + { 50076, true }, { 50086, true }, - { 50094, true }, - { 50107, true }, - { 50118, true }, - { 50136, true }, - { 50146, true }, + { 50095, true }, + { 50104, true }, + { 50115, true }, + { 50123, true }, + { 50133, true }, + { 50145, true }, { 50155, true }, - { 50164, true }, - { 50175, true }, - { 50183, true }, - { 50193, true }, + { 50170, true }, + { 50177, true }, + { 50190, false }, { 50205, true }, - { 50215, true }, - { 50230, true }, - { 50237, true }, - { 50250, false }, - { 50265, true }, - { 50285, true }, - { 50304, true }, - { 50321, true }, - { 50332, true }, - { 50347, true }, - { 50357, true }, - { 50373, true }, - { 50383, true }, - { 50400, true }, + { 50225, true }, + { 50244, true }, + { 50261, true }, + { 50272, true }, + { 50287, true }, + { 50297, true }, + { 50313, true }, + { 50323, true }, + { 50340, true }, + { 50354, true }, + { 50371, true }, + { 50392, true }, + { 50401, true }, { 50414, true }, - { 50431, true }, - { 50452, true }, - { 50461, true }, - { 50474, true }, - { 50484, true }, - { 50496, true }, - { 50505, true }, - { 50515, true }, - { 50527, true }, - { 50538, true }, - { 50546, true }, - { 50553, true }, - { 50578, true }, - { 50596, true }, - { 50614, true }, - { 50628, true }, - { 50637, true }, - { 50650, true }, - { 50667, true }, - { 50680, true }, - { 50695, true }, - { 50713, false }, - { 50726, true }, - { 50742, true }, - { 50758, true }, - { 50771, true }, - { 50784, true }, - { 50797, true }, - { 50807, false }, - { 50825, true }, - { 50838, true }, - { 50851, true }, - { 50867, true }, - { 50886, true }, - { 50901, true }, - { 50908, true }, - { 50937, true }, - { 50959, true }, - { 50980, true }, - { 51007, true }, - { 51027, true }, - { 51035, true }, - { 51046, true }, - { 51066, true }, - { 51085, true }, - { 51100, true }, - { 51119, true }, - { 51135, true }, - { 51151, false }, - { 51166, true }, - { 51181, true }, - { 51196, true }, - { 51215, true }, + { 50424, true }, + { 50436, true }, + { 50445, true }, + { 50455, true }, + { 50467, true }, + { 50478, true }, + { 50486, true }, + { 50493, true }, + { 50518, true }, + { 50536, true }, + { 50554, true }, + { 50568, true }, + { 50577, true }, + { 50590, true }, + { 50607, true }, + { 50620, true }, + { 50635, true }, + { 50653, false }, + { 50666, true }, + { 50682, true }, + { 50698, true }, + { 50711, true }, + { 50724, true }, + { 50737, true }, + { 50747, false }, + { 50765, true }, + { 50778, true }, + { 50791, true }, + { 50807, true }, + { 50826, true }, + { 50841, true }, + { 50848, true }, + { 50877, true }, + { 50899, true }, + { 50920, true }, + { 50947, true }, + { 50967, true }, + { 50975, true }, + { 50986, true }, + { 51006, true }, + { 51025, true }, + { 51040, true }, + { 51059, true }, + { 51075, true }, + { 51091, false }, + { 51106, true }, + { 51121, true }, + { 51136, true }, + { 51155, true }, + { 51173, true }, + { 51182, true }, + { 51192, true }, + { 51203, true }, + { 51219, true }, { 51233, true }, - { 51242, true }, - { 51252, true }, - { 51263, true }, - { 51279, true }, - { 51293, true }, - { 51307, true }, - { 51340, true }, - { 51354, true }, - { 51368, true }, - { 51377, true }, - { 51388, true }, - { 51412, true }, - { 51424, true }, - { 51435, false }, - { 51448, true }, - { 51454, true }, - { 51464, true }, - { 51473, true }, - { 51487, true }, + { 51247, true }, + { 51261, true }, + { 51275, true }, + { 51284, true }, + { 51295, true }, + { 51319, true }, + { 51331, true }, + { 51342, false }, + { 51355, true }, + { 51361, true }, + { 51371, true }, + { 51380, true }, + { 51394, true }, + { 51404, true }, + { 51420, true }, + { 51433, true }, + { 51446, true }, + { 51458, true }, + { 51474, true }, + { 51485, true }, { 51497, true }, - { 51513, true }, - { 51526, true }, - { 51539, true }, - { 51551, true }, - { 51567, true }, - { 51578, true }, - { 51590, true }, - { 51605, true }, - { 51622, true }, - { 51633, true }, - { 51645, true }, - { 51661, false }, - { 51676, true }, - { 51686, true }, - { 51702, true }, - { 51714, true }, - { 51725, true }, - { 51742, true }, - { 51761, true }, + { 51512, true }, + { 51529, true }, + { 51540, true }, + { 51552, true }, + { 51568, false }, + { 51583, true }, + { 51593, true }, + { 51609, true }, + { 51621, true }, + { 51632, true }, + { 51649, true }, + { 51668, true }, + { 51691, true }, + { 51708, true }, + { 51717, false }, + { 51726, true }, + { 51737, true }, + { 51754, true }, + { 51770, true }, { 51784, true }, - { 51801, true }, - { 51810, false }, - { 51819, true }, - { 51830, true }, - { 51847, true }, - { 51863, true }, + { 51798, true }, + { 51816, true }, + { 51825, true }, + { 51838, true }, + { 51855, true }, + { 51867, true }, { 51877, true }, - { 51891, true }, - { 51909, true }, + { 51886, true }, + { 51894, false }, + { 51904, true }, + { 51910, true }, { 51918, true }, - { 51931, true }, - { 51948, true }, - { 51960, true }, - { 51970, true }, - { 51979, true }, - { 51987, false }, - { 51997, true }, - { 52003, true }, - { 52011, true }, - { 52029, true }, - { 52038, true }, - { 52050, true }, - { 52059, true }, - { 52074, true }, - { 52084, true }, - { 52093, true }, - { 52105, true }, - { 52126, true }, - { 52137, true }, - { 52151, true }, - { 52161, true }, - { 52178, true }, - { 52190, true }, - { 52213, true }, - { 52227, true }, - { 52242, true }, - { 52253, true }, - { 52264, true }, - { 52280, true }, - { 52308, true }, - { 52324, true }, - { 52336, false }, - { 52354, true }, - { 52365, true }, - { 52375, true }, - { 52396, true }, - { 52411, true }, - { 52425, true }, - { 52435, true }, - { 52450, true }, - { 52461, true }, - { 52473, true }, - { 52486, true }, - { 52499, true }, - { 52508, true }, - { 52517, false }, + { 51936, true }, + { 51945, true }, + { 51957, true }, + { 51966, true }, + { 51981, true }, + { 51991, true }, + { 52000, true }, + { 52012, true }, + { 52033, true }, + { 52044, true }, + { 52058, true }, + { 52068, true }, + { 52085, true }, + { 52097, true }, + { 52120, true }, + { 52134, true }, + { 52149, true }, + { 52160, true }, + { 52171, true }, + { 52187, true }, + { 52215, true }, + { 52231, true }, + { 52243, false }, + { 52261, true }, + { 52272, true }, + { 52282, true }, + { 52303, true }, + { 52318, true }, + { 52332, true }, + { 52342, true }, + { 52357, true }, + { 52368, true }, + { 52380, true }, + { 52393, true }, + { 52406, true }, + { 52415, true }, + { 52424, false }, + { 52436, true }, + { 52452, true }, + { 52463, true }, + { 52479, true }, + { 52498, true }, + { 52514, true }, { 52529, true }, - { 52545, true }, - { 52556, true }, - { 52572, true }, - { 52591, true }, - { 52607, true }, - { 52622, true }, - { 52653, true }, - { 52677, true }, - { 52696, true }, - { 52716, true }, - { 52733, true }, - { 52749, true }, - { 52764, true }, - { 52783, true }, - { 52805, true }, - { 52822, true }, - { 52837, true }, - { 52856, true }, - { 52869, true }, + { 52560, true }, + { 52584, true }, + { 52603, true }, + { 52623, true }, + { 52640, true }, + { 52656, true }, + { 52671, true }, + { 52690, true }, + { 52712, true }, + { 52729, true }, + { 52744, true }, + { 52763, true }, + { 52776, true }, + { 52791, true }, + { 52804, true }, + { 52820, true }, + { 52832, true }, + { 52845, false }, + { 52855, false }, + { 52864, true }, { 52884, true }, - { 52897, true }, - { 52913, true }, - { 52925, true }, - { 52938, false }, - { 52948, false }, - { 52957, true }, - { 52977, true }, - { 52992, true }, - { 53003, true }, - { 53024, true }, - { 53040, true }, - { 53064, false }, - { 53081, true }, - { 53094, true }, - { 53107, true }, - { 53120, true }, - { 53139, true }, - { 53148, true }, - { 53157, true }, - { 53167, true }, - { 53180, true }, + { 52899, true }, + { 52910, true }, + { 52931, true }, + { 52947, true }, + { 52971, false }, + { 52988, true }, + { 53001, true }, + { 53014, true }, + { 53027, true }, + { 53046, true }, + { 53055, true }, + { 53064, true }, + { 53074, true }, + { 53087, true }, + { 53097, true }, + { 53106, true }, + { 53122, true }, + { 53149, true }, + { 53160, true }, + { 53177, true }, { 53190, true }, - { 53199, true }, - { 53215, true }, - { 53242, true }, - { 53253, true }, - { 53270, true }, - { 53283, true }, - { 53297, true }, - { 53314, true }, - { 53329, true }, - { 53352, true }, - { 53362, true }, - { 53377, true }, - { 53402, true }, - { 53426, true }, - { 53435, true }, - { 53456, true }, - { 53476, true }, - { 53488, true }, - { 53501, true }, - { 53515, true }, + { 53204, true }, + { 53221, true }, + { 53236, true }, + { 53259, true }, + { 53269, true }, + { 53284, true }, + { 53309, true }, + { 53333, true }, + { 53342, true }, + { 53363, true }, + { 53383, true }, + { 53395, true }, + { 53408, true }, + { 53422, true }, + { 53439, true }, + { 53456, false }, + { 53468, false }, + { 53481, true }, + { 53498, true }, + { 53507, true }, + { 53518, true }, { 53532, true }, - { 53549, false }, - { 53561, false }, + { 53543, true }, + { 53557, true }, { 53574, true }, - { 53591, true }, - { 53600, true }, - { 53611, true }, + { 53583, true }, + { 53597, false }, { 53625, true }, - { 53636, true }, - { 53650, true }, - { 53667, true }, - { 53676, true }, - { 53690, false }, - { 53718, true }, - { 53727, true }, - { 53736, true }, - { 53745, true }, - { 53755, true }, - { 53771, true }, - { 53781, true }, - { 53795, true }, - { 53817, false }, - { 53831, false }, - { 53846, true }, - { 53867, true }, - { 53889, true }, - { 53903, true }, - { 53913, true }, - { 53925, true }, - { 53939, true }, + { 53634, true }, + { 53643, true }, + { 53653, true }, + { 53669, true }, + { 53679, true }, + { 53693, true }, + { 53715, false }, + { 53729, false }, + { 53744, true }, + { 53765, true }, + { 53787, true }, + { 53801, true }, + { 53811, true }, + { 53823, true }, + { 53837, true }, + { 53856, true }, + { 53872, true }, + { 53885, true }, + { 53897, true }, + { 53910, true }, + { 53922, true }, + { 53934, false }, { 53958, true }, - { 53974, true }, - { 53987, true }, - { 53999, true }, - { 54012, true }, + { 53971, true }, + { 53981, true }, + { 54000, true }, { 54024, true }, - { 54036, false }, - { 54060, true }, - { 54073, true }, - { 54083, true }, - { 54102, true }, - { 54126, true }, - { 54142, true }, - { 54152, true }, - { 54168, true }, - { 54187, true }, - { 54201, true }, - { 54219, true }, - { 54236, true }, - { 54253, true }, - { 54261, false }, - { 54287, true }, - { 54299, true }, - { 54319, true }, - { 54335, true }, - { 54353, true }, - { 54363, true }, - { 54378, true }, - { 54390, true }, - { 54405, true }, - { 54423, true }, - { 54441, true }, - { 54460, true }, - { 54474, true }, - { 54484, true }, - { 54495, true }, - { 54514, true }, - { 54530, true }, - { 54549, true }, - { 54559, true }, - { 54578, true }, - { 54590, true }, + { 54040, true }, + { 54050, true }, + { 54066, true }, + { 54085, true }, + { 54099, true }, + { 54117, true }, + { 54134, true }, + { 54151, true }, + { 54159, false }, + { 54185, true }, + { 54197, true }, + { 54217, true }, + { 54233, true }, + { 54251, true }, + { 54261, true }, + { 54276, true }, + { 54288, true }, + { 54303, true }, + { 54321, true }, + { 54339, true }, + { 54358, true }, + { 54372, true }, + { 54382, true }, + { 54393, true }, + { 54412, true }, + { 54428, true }, + { 54447, true }, + { 54457, true }, + { 54469, true }, + { 54480, true }, + { 54493, true }, + { 54517, true }, + { 54541, true }, + { 54561, true }, + { 54574, false }, + { 54586, true }, { 54601, true }, - { 54614, true }, - { 54638, true }, - { 54662, true }, + { 54621, true }, + { 54631, true }, + { 54641, false }, + { 54658, true }, + { 54666, true }, { 54682, true }, - { 54695, false }, - { 54707, true }, - { 54722, true }, - { 54742, true }, - { 54752, true }, - { 54762, false }, - { 54779, true }, - { 54787, true }, - { 54803, true }, - { 54818, true }, - { 54834, true }, - { 54850, true }, - { 54864, true }, - { 54878, true }, - { 54890, true }, - { 54910, true }, - { 54926, true }, - { 54943, true }, - { 54953, true }, - { 54966, true }, - { 54980, true }, - { 54993, true }, - { 55003, true }, - { 55017, true }, - { 55029, true }, - { 55045, true }, + { 54697, true }, + { 54713, true }, + { 54729, true }, + { 54743, true }, + { 54757, true }, + { 54769, true }, + { 54789, true }, + { 54805, true }, + { 54822, true }, + { 54832, true }, + { 54845, true }, + { 54859, true }, + { 54872, true }, + { 54882, true }, + { 54896, true }, + { 54908, true }, + { 54924, true }, + { 54948, true }, + { 54973, true }, + { 54986, true }, + { 54999, true }, + { 55011, true }, + { 55030, true }, + { 55043, true }, + { 55056, true }, { 55069, true }, - { 55094, true }, - { 55107, true }, - { 55120, true }, - { 55132, true }, - { 55151, true }, + { 55089, true }, + { 55104, true }, + { 55122, true }, + { 55131, true }, + { 55142, true }, + { 55153, true }, { 55164, true }, - { 55177, true }, - { 55190, true }, - { 55210, true }, - { 55225, true }, - { 55243, true }, - { 55252, true }, - { 55263, true }, - { 55274, true }, - { 55286, true }, - { 55297, true }, + { 55176, true }, + { 55187, true }, + { 55197, true }, + { 55211, true }, + { 55223, true }, + { 55233, true }, + { 55247, true }, + { 55281, true }, { 55311, true }, - { 55323, true }, + { 55321, true }, { 55333, true }, - { 55347, true }, - { 55381, true }, - { 55411, true }, - { 55421, true }, - { 55433, true }, - { 55442, true }, - { 55453, false }, - { 55466, true }, - { 55473, true }, - { 55485, true }, - { 55501, true }, - { 55518, true }, - { 55531, false }, - { 55551, true }, - { 55564, true }, - { 55576, true }, - { 55589, true }, - { 55608, true }, - { 55619, false }, - { 55640, true }, - { 55650, true }, - { 55659, true }, - { 55674, true }, - { 55687, true }, - { 55698, true }, - { 55707, true }, - { 55720, true }, - { 55733, true }, - { 55742, true }, - { 55754, true }, - { 55763, true }, - { 55772, true }, - { 55791, true }, - { 55805, true }, + { 55342, true }, + { 55353, false }, + { 55366, true }, + { 55373, true }, + { 55385, true }, + { 55401, true }, + { 55418, true }, + { 55431, false }, + { 55451, true }, + { 55464, true }, + { 55476, true }, + { 55489, true }, + { 55508, true }, + { 55519, false }, + { 55540, true }, + { 55550, true }, + { 55559, true }, + { 55574, true }, + { 55587, true }, + { 55598, true }, + { 55607, true }, + { 55620, true }, + { 55633, true }, + { 55642, true }, + { 55654, true }, + { 55663, true }, + { 55672, true }, + { 55691, true }, + { 55705, true }, + { 55723, true }, + { 55745, false }, + { 55770, true }, + { 55783, true }, + { 55792, true }, + { 55813, true }, { 55823, true }, - { 55845, false }, - { 55870, true }, - { 55883, true }, - { 55892, true }, - { 55913, true }, - { 55923, true }, - { 55935, true }, - { 55960, true }, - { 55976, true }, - { 55989, true }, - { 56004, true }, - { 56018, true }, - { 56027, true }, - { 56045, true }, - { 56055, true }, - { 56073, true }, - { 56084, true }, - { 56110, true }, + { 55835, true }, + { 55860, true }, + { 55876, true }, + { 55889, true }, + { 55904, true }, + { 55918, true }, + { 55927, true }, + { 55945, true }, + { 55955, true }, + { 55973, true }, + { 55984, true }, + { 56010, true }, + { 56025, true }, + { 56034, true }, + { 56043, true }, + { 56057, false }, + { 56068, true }, + { 56076, true }, + { 56085, true }, + { 56093, true }, + { 56104, true }, + { 56113, true }, { 56125, true }, - { 56134, true }, - { 56143, true }, - { 56157, false }, - { 56168, true }, - { 56176, true }, + { 56139, true }, + { 56153, true }, + { 56173, true }, { 56185, true }, - { 56193, true }, - { 56204, true }, - { 56213, true }, - { 56225, true }, - { 56239, true }, - { 56253, true }, + { 56203, true }, + { 56219, true }, + { 56233, true }, + { 56250, true }, + { 56263, true }, { 56273, true }, - { 56285, true }, - { 56303, true }, - { 56319, true }, - { 56333, true }, - { 56350, true }, + { 56287, true }, + { 56299, true }, + { 56313, true }, + { 56326, true }, + { 56339, true }, + { 56352, true }, { 56363, true }, { 56373, true }, - { 56387, true }, - { 56399, true }, - { 56413, true }, - { 56426, true }, - { 56439, true }, - { 56452, true }, - { 56463, true }, - { 56473, true }, - { 56480, true }, - { 56489, true }, - { 56508, true }, - { 56522, true }, - { 56536, true }, - { 56547, true }, + { 56380, true }, + { 56389, true }, + { 56408, true }, + { 56422, true }, + { 56436, true }, + { 56447, true }, + { 56460, true }, + { 56476, true }, + { 56499, true }, + { 56514, true }, + { 56528, true }, + { 56548, true }, { 56560, true }, - { 56576, true }, - { 56599, true }, - { 56614, true }, - { 56628, true }, - { 56648, true }, - { 56660, true }, - { 56675, true }, - { 56694, true }, - { 56708, true }, - { 56726, true }, - { 56744, true }, - { 56751, true }, + { 56575, true }, + { 56594, true }, + { 56608, true }, + { 56626, true }, + { 56644, true }, + { 56651, true }, + { 56663, true }, + { 56680, true }, + { 56699, true }, + { 56709, true }, + { 56722, true }, + { 56732, true }, + { 56746, false }, { 56763, true }, - { 56780, true }, - { 56799, true }, - { 56809, true }, - { 56822, true }, - { 56832, true }, - { 56846, false }, - { 56863, true }, - { 56876, true }, - { 56886, true }, - { 56898, true }, - { 56910, true }, - { 56923, false }, - { 56938, true }, - { 56951, true }, - { 56965, true }, - { 56982, true }, - { 56994, true }, - { 57013, true }, - { 57025, true }, - { 57037, true }, - { 57048, true }, - { 57062, true }, - { 57087, true }, - { 57110, false }, - { 57120, true }, - { 57131, true }, - { 57144, true }, - { 57155, true }, - { 57165, true }, + { 56776, true }, + { 56786, true }, + { 56798, true }, + { 56810, true }, + { 56823, false }, + { 56838, true }, + { 56851, true }, + { 56865, true }, + { 56882, true }, + { 56894, true }, + { 56913, true }, + { 56925, true }, + { 56937, true }, + { 56948, true }, + { 56962, true }, + { 56987, true }, + { 57010, false }, + { 57020, true }, + { 57031, true }, + { 57044, true }, + { 57055, true }, + { 57065, true }, + { 57078, true }, + { 57089, true }, + { 57109, true }, + { 57129, true }, + { 57147, true }, + { 57159, true }, { 57178, true }, - { 57189, true }, - { 57209, true }, - { 57229, true }, - { 57247, true }, - { 57259, true }, - { 57278, true }, - { 57301, true }, - { 57319, true }, - { 57336, true }, - { 57350, true }, - { 57373, true }, + { 57201, true }, + { 57219, true }, + { 57236, true }, + { 57250, true }, + { 57273, true }, + { 57283, true }, + { 57298, true }, + { 57314, true }, + { 57327, true }, + { 57335, true }, + { 57347, true }, + { 57361, true }, { 57383, true }, - { 57398, true }, - { 57414, true }, - { 57427, true }, - { 57435, true }, - { 57447, true }, - { 57461, true }, - { 57483, true }, - { 57490, true }, - { 57503, true }, - { 57523, true }, - { 57541, true }, - { 57563, true }, - { 57576, true }, + { 57390, true }, + { 57403, true }, + { 57423, true }, + { 57441, true }, + { 57463, true }, + { 57476, true }, + { 57487, true }, + { 57501, true }, + { 57514, true }, + { 57533, true }, + { 57549, true }, + { 57568, true }, { 57587, true }, - { 57601, true }, + { 57602, true }, { 57614, true }, - { 57633, true }, + { 57630, true }, { 57649, true }, - { 57668, true }, + { 57666, true }, { 57687, true }, - { 57702, true }, - { 57714, true }, - { 57730, true }, - { 57749, true }, - { 57766, true }, - { 57787, true }, - { 57806, true }, - { 57824, true }, - { 57842, true }, - { 57854, true }, - { 57863, true }, - { 57886, true }, - { 57900, true }, + { 57706, true }, + { 57724, true }, + { 57742, true }, + { 57754, true }, + { 57763, true }, + { 57786, true }, + { 57800, true }, + { 57813, true }, + { 57825, true }, + { 57835, true }, + { 57846, false }, + { 57856, true }, + { 57876, true }, + { 57889, true }, + { 57904, true }, { 57913, true }, { 57925, true }, { 57935, true }, - { 57946, false }, - { 57956, true }, - { 57976, true }, - { 57989, true }, - { 58004, true }, - { 58013, true }, + { 57942, true }, + { 57959, true }, + { 57972, true }, + { 57981, true }, + { 57994, true }, + { 58007, true }, { 58025, true }, - { 58035, true }, - { 58042, true }, - { 58059, true }, - { 58072, true }, - { 58081, true }, - { 58094, true }, - { 58107, true }, + { 58041, true }, + { 58057, true }, + { 58071, true }, + { 58088, true }, + { 58098, true }, { 58125, true }, - { 58141, true }, - { 58157, true }, - { 58171, true }, - { 58188, true }, - { 58198, true }, - { 58225, true }, - { 58260, true }, - { 58286, false }, - { 58299, true }, - { 58312, true }, - { 58331, true }, - { 58356, true }, - { 58371, true }, - { 58391, false }, - { 58401, true }, - { 58418, true }, - { 58435, true }, - { 58445, true }, - { 58455, true }, - { 58470, true }, - { 58483, true }, - { 58498, true }, - { 58514, true }, - { 58527, true }, - { 58540, true }, - { 58554, true }, - { 58569, true }, - { 58581, true }, - { 58594, true }, - { 58613, true }, - { 58637, true }, + { 58160, true }, + { 58186, false }, + { 58199, true }, + { 58212, true }, + { 58231, true }, + { 58256, true }, + { 58271, true }, + { 58291, false }, + { 58301, true }, + { 58318, true }, + { 58335, true }, + { 58345, true }, + { 58355, true }, + { 58370, true }, + { 58383, true }, + { 58398, true }, + { 58414, true }, + { 58427, true }, + { 58440, true }, + { 58454, true }, + { 58469, true }, + { 58481, true }, + { 58494, true }, + { 58513, true }, + { 58537, true }, + { 58559, true }, + { 58580, true }, + { 58605, true }, + { 58628, true }, + { 58648, true }, { 58659, true }, - { 58680, true }, - { 58705, true }, - { 58728, true }, - { 58748, true }, - { 58759, true }, - { 58771, true }, - { 58791, true }, - { 58808, true }, + { 58671, true }, + { 58691, true }, + { 58708, true }, + { 58729, true }, + { 58747, true }, + { 58770, true }, + { 58786, true }, + { 58806, true }, + { 58819, true }, { 58829, true }, - { 58847, true }, - { 58870, true }, - { 58886, true }, - { 58906, true }, - { 58919, true }, + { 58840, true }, + { 58859, true }, + { 58869, true }, + { 58879, true }, + { 58887, true }, + { 58900, true }, + { 58913, true }, + { 58922, true }, { 58929, true }, - { 58940, true }, - { 58959, true }, - { 58969, true }, - { 58979, true }, - { 58987, true }, - { 59000, true }, - { 59013, true }, - { 59022, true }, - { 59029, true }, - { 59036, false }, - { 59052, true }, - { 59061, true }, - { 59078, true }, - { 59092, true }, - { 59111, true }, - { 59123, true }, - { 59146, true }, + { 58936, false }, + { 58952, true }, + { 58961, true }, + { 58978, true }, + { 58992, true }, + { 59011, true }, + { 59023, true }, + { 59046, true }, + { 59060, true }, + { 59076, true }, + { 59088, true }, + { 59104, true }, + { 59121, true }, + { 59139, true }, { 59160, true }, - { 59176, true }, - { 59188, true }, - { 59204, true }, - { 59221, true }, - { 59239, true }, - { 59260, true }, - { 59277, true }, - { 59294, true }, - { 59311, true }, + { 59177, true }, + { 59194, true }, + { 59211, true }, + { 59228, true }, + { 59245, true }, + { 59262, true }, + { 59278, true }, + { 59292, true }, + { 59317, true }, { 59328, true }, - { 59345, true }, - { 59362, true }, - { 59378, true }, - { 59392, true }, - { 59417, true }, - { 59428, true }, - { 59444, true }, - { 59460, true }, - { 59476, false }, - { 59489, true }, - { 59499, false }, - { 59515, true }, + { 59344, true }, + { 59360, true }, + { 59376, false }, + { 59389, true }, + { 59399, false }, + { 59415, true }, + { 59429, true }, + { 59442, true }, + { 59453, true }, + { 59467, true }, + { 59481, true }, + { 59491, false }, + { 59501, true }, + { 59510, true }, { 59529, true }, - { 59542, true }, - { 59553, true }, - { 59567, true }, + { 59538, false }, + { 59558, true }, { 59581, true }, - { 59591, false }, - { 59601, true }, - { 59610, true }, - { 59629, true }, - { 59638, false }, - { 59658, true }, - { 59681, true }, - { 59698, true }, - { 59717, true }, - { 59734, true }, - { 59746, true }, - { 59757, false }, - { 59769, true }, - { 59780, true }, - { 59795, true }, - { 59813, true }, - { 59823, true }, - { 59831, true }, - { 59845, true }, - { 59858, false }, - { 59871, true }, - { 59886, true }, - { 59900, true }, - { 59912, true }, - { 59926, true }, - { 59940, true }, - { 59950, true }, - { 59966, true }, - { 59982, true }, - { 60001, true }, - { 60020, false }, - { 60049, true }, - { 60063, true }, - { 60077, true }, - { 60098, true }, - { 60116, true }, - { 60131, true }, + { 59598, true }, + { 59617, true }, + { 59634, true }, + { 59646, true }, + { 59657, false }, + { 59669, true }, + { 59680, true }, + { 59695, true }, + { 59713, true }, + { 59723, true }, + { 59731, true }, + { 59745, true }, + { 59758, false }, + { 59771, true }, + { 59786, true }, + { 59800, true }, + { 59812, true }, + { 59826, true }, + { 59840, true }, + { 59850, true }, + { 59866, true }, + { 59882, true }, + { 59901, true }, + { 59920, false }, + { 59949, true }, + { 59963, true }, + { 59977, true }, + { 59998, true }, + { 60016, true }, + { 60031, true }, + { 60044, true }, + { 60062, true }, + { 60082, true }, + { 60094, true }, + { 60106, true }, + { 60121, true }, { 60144, true }, - { 60162, true }, - { 60182, true }, - { 60194, true }, - { 60206, true }, - { 60221, true }, - { 60244, true }, - { 60268, true }, + { 60168, true }, + { 60192, true }, + { 60202, true }, + { 60224, true }, + { 60256, true }, + { 60267, true }, + { 60277, true }, { 60292, true }, - { 60302, true }, - { 60324, true }, - { 60356, true }, - { 60367, true }, - { 60377, true }, - { 60392, true }, - { 60406, false }, - { 60426, true }, - { 60444, true }, - { 60453, true }, - { 60460, true }, - { 60471, true }, - { 60480, true }, - { 60493, true }, - { 60516, false }, - { 60527, false }, - { 60539, false }, + { 60306, false }, + { 60326, true }, + { 60344, true }, + { 60353, true }, + { 60360, true }, + { 60371, true }, + { 60380, true }, + { 60393, true }, + { 60416, true }, + { 60431, false }, + { 60442, false }, + { 60454, false }, + { 60465, true }, + { 60481, true }, + { 60507, false }, + { 60523, true }, + { 60533, true }, + { 60541, true }, { 60550, true }, - { 60566, true }, - { 60592, false }, - { 60608, true }, - { 60618, true }, - { 60626, true }, - { 60635, true }, - { 60647, true }, - { 60659, false }, - { 60671, true }, - { 60684, true }, - { 60696, true }, + { 60562, true }, + { 60574, false }, + { 60586, true }, + { 60599, true }, + { 60611, true }, + { 60628, true }, + { 60648, true }, + { 60659, true }, + { 60675, true }, + { 60687, true }, + { 60704, true }, { 60713, true }, - { 60733, true }, - { 60744, true }, - { 60760, true }, - { 60772, true }, - { 60789, true }, - { 60798, true }, - { 60811, true }, - { 60824, true }, - { 60842, true }, - { 60855, true }, - { 60879, true }, - { 60893, true }, - { 60910, true }, - { 60925, true }, - { 60935, true }, - { 60947, true }, - { 60959, true }, - { 60974, true }, - { 60991, true }, - { 60999, true }, - { 61018, true }, - { 61035, true }, - { 61052, true }, - { 61067, true }, - { 61079, true }, - { 61104, false }, - { 61117, false }, - { 61129, true }, - { 61149, true }, - { 61162, true }, - { 61174, true }, - { 61198, true }, - { 61211, true }, - { 61230, true }, + { 60726, true }, + { 60739, true }, + { 60757, true }, + { 60770, true }, + { 60794, true }, + { 60808, true }, + { 60825, true }, + { 60840, true }, + { 60850, true }, + { 60862, true }, + { 60874, true }, + { 60889, true }, + { 60906, true }, + { 60914, true }, + { 60933, true }, + { 60950, true }, + { 60967, true }, + { 60982, true }, + { 60994, true }, + { 61019, false }, + { 61032, false }, + { 61044, true }, + { 61064, true }, + { 61077, true }, + { 61089, true }, + { 61113, true }, + { 61126, true }, + { 61145, true }, + { 61157, true }, + { 61169, true }, + { 61193, true }, + { 61214, true }, + { 61228, true }, { 61242, true }, - { 61254, true }, - { 61278, true }, - { 61299, true }, - { 61313, true }, - { 61327, true }, - { 61340, false }, - { 61356, true }, - { 61368, true }, - { 61381, true }, - { 61391, true }, - { 61402, true }, - { 61413, true }, - { 61425, true }, - { 61434, true }, - { 61444, true }, - { 61456, true }, - { 61472, true }, + { 61255, false }, + { 61271, true }, + { 61283, true }, + { 61296, true }, + { 61306, true }, + { 61317, true }, + { 61328, true }, + { 61340, true }, + { 61349, true }, + { 61359, true }, + { 61373, true }, + { 61385, true }, + { 61401, true }, + { 61423, true }, + { 61433, false }, + { 61447, true }, + { 61460, true }, + { 61481, true }, { 61494, true }, - { 61504, false }, - { 61518, true }, - { 61531, true }, - { 61552, true }, - { 61565, true }, - { 61578, true }, - { 61586, false }, - { 61603, true }, - { 61617, true }, - { 61633, true }, - { 61652, true }, - { 61671, true }, - { 61681, true }, - { 61695, true }, - { 61703, true }, - { 61722, false }, - { 61740, true }, - { 61749, true }, - { 61762, true }, - { 61782, false }, - { 61795, true }, - { 61812, true }, - { 61825, true }, - { 61838, true }, - { 61862, true }, - { 61889, true }, - { 61902, false }, - { 61916, true }, - { 61928, true }, - { 61941, false }, - { 61953, true }, - { 61965, true }, - { 61980, true }, - { 61998, true }, - { 62011, true }, - { 62034, false }, - { 62045, true }, - { 62061, true }, - { 62079, true }, - { 62099, true }, - { 62121, true }, - { 62137, true }, - { 62154, true }, - { 62171, true }, - { 62189, true }, - { 62202, true }, - { 62219, true }, - { 62234, true }, - { 62248, true }, - { 62264, true }, - { 62272, true }, - { 62291, true }, - { 62301, true }, - { 62309, true }, - { 62318, true }, - { 62333, true }, - { 62348, true }, - { 62365, false }, - { 62376, true }, - { 62392, true }, - { 62406, true }, - { 62418, true }, - { 62426, true }, - { 62435, true }, - { 62451, true }, - { 62461, true }, - { 62467, true }, - { 62479, true }, - { 62501, true }, - { 62515, true }, + { 61507, true }, + { 61515, false }, + { 61532, true }, + { 61546, true }, + { 61562, true }, + { 61581, true }, + { 61600, true }, + { 61610, true }, + { 61624, true }, + { 61632, true }, + { 61651, false }, + { 61669, true }, + { 61678, true }, + { 61691, true }, + { 61711, false }, + { 61724, true }, + { 61741, true }, + { 61754, true }, + { 61767, true }, + { 61791, true }, + { 61818, true }, + { 61831, false }, + { 61845, true }, + { 61857, true }, + { 61870, false }, + { 61882, true }, + { 61894, true }, + { 61909, true }, + { 61927, true }, + { 61940, true }, + { 61963, false }, + { 61974, true }, + { 61990, true }, + { 62008, true }, + { 62028, true }, + { 62050, true }, + { 62066, true }, + { 62083, true }, + { 62100, true }, + { 62118, true }, + { 62131, true }, + { 62148, true }, + { 62163, true }, + { 62177, true }, + { 62193, true }, + { 62201, true }, + { 62220, true }, + { 62230, true }, + { 62238, true }, + { 62247, true }, + { 62262, true }, + { 62277, true }, + { 62294, false }, + { 62305, true }, + { 62321, true }, + { 62335, true }, + { 62347, true }, + { 62355, true }, + { 62364, true }, + { 62380, true }, + { 62390, true }, + { 62396, true }, + { 62408, true }, + { 62430, true }, + { 62444, true }, + { 62459, true }, + { 62470, true }, + { 62483, true }, + { 62499, true }, + { 62517, false }, { 62530, true }, - { 62541, true }, - { 62554, true }, - { 62570, true }, - { 62588, false }, - { 62601, true }, - { 62610, true }, - { 62621, true }, - { 62640, true }, - { 62648, true }, - { 62665, true }, - { 62674, true }, - { 62683, true }, - { 62702, true }, - { 62713, true }, - { 62729, true }, - { 62750, true }, - { 62767, true }, - { 62780, true }, - { 62791, true }, + { 62539, true }, + { 62550, true }, + { 62569, true }, + { 62577, true }, + { 62594, true }, + { 62603, true }, + { 62612, true }, + { 62631, true }, + { 62642, true }, + { 62658, true }, + { 62679, true }, + { 62696, true }, + { 62709, true }, + { 62720, true }, + { 62745, true }, + { 62764, false }, + { 62778, true }, + { 62793, true }, + { 62805, true }, { 62816, true }, - { 62835, false }, - { 62849, true }, - { 62864, true }, - { 62876, true }, - { 62887, true }, - { 62901, true }, + { 62830, true }, + { 62844, true }, + { 62861, true }, + { 62881, true }, + { 62890, true }, + { 62904, true }, { 62915, true }, - { 62932, true }, - { 62952, true }, - { 62961, true }, - { 62975, true }, - { 62986, true }, - { 63006, false }, - { 63030, true }, - { 63041, false }, - { 63049, true }, - { 63067, true }, - { 63085, true }, - { 63107, true }, - { 63129, true }, - { 63145, true }, - { 63157, true }, - { 63169, true }, - { 63183, true }, - { 63196, false }, - { 63213, true }, - { 63222, true }, - { 63244, true }, - { 63264, true }, - { 63291, true }, - { 63310, true }, - { 63330, true }, - { 63339, true }, - { 63356, true }, - { 63371, true }, - { 63400, true }, - { 63422, true }, - { 63440, true }, - { 63454, true }, - { 63469, true }, - { 63482, true }, - { 63492, true }, - { 63510, true }, + { 62935, false }, + { 62959, true }, + { 62970, false }, + { 62978, true }, + { 62996, true }, + { 63014, true }, + { 63036, true }, + { 63058, true }, + { 63074, true }, + { 63086, true }, + { 63098, true }, + { 63112, true }, + { 63125, false }, + { 63142, true }, + { 63151, true }, + { 63173, true }, + { 63193, true }, + { 63220, true }, + { 63239, true }, + { 63259, true }, + { 63268, true }, + { 63285, true }, + { 63300, true }, + { 63329, true }, + { 63351, true }, + { 63369, true }, + { 63383, true }, + { 63398, true }, + { 63411, true }, + { 63421, true }, + { 63439, true }, + { 63458, true }, + { 63476, true }, + { 63494, true }, + { 63502, true }, + { 63509, false }, { 63529, true }, - { 63547, true }, - { 63565, true }, - { 63573, true }, - { 63580, false }, - { 63600, true }, - { 63609, true }, - { 63624, true }, - { 63642, true }, - { 63654, true }, - { 63663, false }, - { 63673, true }, - { 63681, true }, - { 63698, true }, - { 63709, true }, + { 63538, true }, + { 63553, true }, + { 63571, true }, + { 63583, true }, + { 63592, false }, + { 63602, true }, + { 63610, true }, + { 63627, true }, + { 63638, true }, + { 63648, true }, + { 63665, true }, + { 63687, true }, + { 63702, true }, { 63719, true }, - { 63736, true }, - { 63758, true }, + { 63729, true }, + { 63742, true }, + { 63757, true }, { 63773, true }, - { 63790, true }, - { 63800, true }, - { 63813, true }, - { 63828, true }, - { 63844, true }, - { 63855, true }, - { 63867, true }, - { 63889, true }, - { 63902, true }, - { 63913, true }, - { 63929, true }, - { 63945, true }, + { 63784, true }, + { 63796, true }, + { 63818, true }, + { 63831, true }, + { 63842, true }, + { 63858, true }, + { 63874, true }, + { 63884, true }, + { 63896, true }, + { 63904, true }, + { 63923, true }, + { 63942, true }, { 63955, true }, - { 63967, true }, - { 63975, true }, - { 63994, true }, - { 64013, true }, - { 64026, true }, - { 64040, true }, - { 64057, true }, - { 64069, true }, - { 64083, true }, - { 64095, true }, + { 63969, true }, + { 63986, true }, + { 63998, true }, + { 64012, true }, + { 64024, true }, + { 64038, true }, + { 64052, true }, + { 64074, true }, + { 64090, true }, { 64109, true }, - { 64123, true }, - { 64145, true }, - { 64161, true }, - { 64180, true }, - { 64193, true }, - { 64211, true }, - { 64226, true }, - { 64241, true }, - { 64260, true }, - { 64273, true }, - { 64298, true }, - { 64311, true }, - { 64322, true }, - { 64336, true }, - { 64349, true }, - { 64367, true }, - { 64386, true }, - { 64400, true }, - { 64411, true }, - { 64424, true }, - { 64440, true }, - { 64452, true }, - { 64468, true }, - { 64481, true }, - { 64497, true }, - { 64512, true }, - { 64527, true }, - { 64541, true }, - { 64560, true }, - { 64573, true }, - { 64583, true }, - { 64595, true }, - { 64605, true }, - { 64621, true }, - { 64629, true }, - { 64637, true }, - { 64650, false }, - { 64661, true }, - { 64677, true }, - { 64687, true }, - { 64704, true }, - { 64722, false }, - { 64735, true }, - { 64748, true }, - { 64757, true }, - { 64772, true }, - { 64786, true }, - { 64804, true }, - { 64820, true }, - { 64829, true }, - { 64838, true }, - { 64853, true }, - { 64863, true }, - { 64873, true }, - { 64887, true }, - { 64899, true }, - { 64916, true }, + { 64122, true }, + { 64140, true }, + { 64155, true }, + { 64170, true }, + { 64189, true }, + { 64202, true }, + { 64227, true }, + { 64240, true }, + { 64251, true }, + { 64265, true }, + { 64278, true }, + { 64296, true }, + { 64315, true }, + { 64329, true }, + { 64340, true }, + { 64356, true }, + { 64368, true }, + { 64384, true }, + { 64397, true }, + { 64413, true }, + { 64428, true }, + { 64443, true }, + { 64457, true }, + { 64476, true }, + { 64489, true }, + { 64499, true }, + { 64511, true }, + { 64521, true }, + { 64537, true }, + { 64545, true }, + { 64553, true }, + { 64566, false }, + { 64577, true }, + { 64593, true }, + { 64603, true }, + { 64620, true }, + { 64638, false }, + { 64651, true }, + { 64664, true }, + { 64673, true }, + { 64688, true }, + { 64702, true }, + { 64720, true }, + { 64736, true }, + { 64745, true }, + { 64754, true }, + { 64769, true }, + { 64779, true }, + { 64789, true }, + { 64803, true }, + { 64815, true }, + { 64832, true }, + { 64846, true }, + { 64854, true }, + { 64862, true }, + { 64871, true }, + { 64883, false }, + { 64891, true }, + { 64917, true }, { 64930, true }, - { 64938, true }, - { 64946, true }, - { 64955, true }, - { 64967, false }, - { 64975, true }, - { 65001, true }, + { 64944, true }, + { 64954, true }, + { 64969, true }, + { 64980, true }, + { 64991, true }, + { 65002, true }, { 65014, true }, - { 65028, true }, - { 65038, true }, - { 65053, true }, - { 65064, true }, - { 65075, true }, - { 65086, true }, - { 65098, true }, - { 65111, true }, - { 65119, false }, - { 65133, true }, + { 65027, true }, + { 65035, false }, + { 65049, true }, + { 65070, true }, + { 65081, true }, + { 65095, true }, + { 65113, true }, + { 65124, true }, + { 65138, true }, { 65154, true }, - { 65165, true }, - { 65179, true }, - { 65197, true }, - { 65208, true }, - { 65222, true }, - { 65238, true }, - { 65251, false }, - { 65267, true }, - { 65278, true }, - { 65297, true }, - { 65311, true }, + { 65167, false }, + { 65183, true }, + { 65194, true }, + { 65213, true }, + { 65227, true }, + { 65236, true }, + { 65250, true }, + { 65261, true }, + { 65270, true }, + { 65288, true }, + { 65302, true }, { 65320, true }, - { 65334, true }, - { 65345, true }, - { 65354, true }, - { 65372, true }, - { 65386, true }, - { 65404, true }, - { 65423, true }, - { 65433, true }, - { 65446, true }, - { 65457, true }, - { 65466, true }, - { 65486, true }, - { 65500, true }, - { 65508, true }, - { 65518, true }, - { 65525, true }, - { 65538, true }, + { 65339, true }, + { 65349, true }, + { 65362, true }, + { 65373, true }, + { 65382, true }, + { 65402, true }, + { 65416, true }, + { 65424, true }, + { 65434, true }, + { 65441, true }, + { 65454, true }, + { 65465, true }, + { 65479, true }, + { 65493, true }, + { 65507, true }, + { 65517, true }, + { 65527, true }, + { 65537, true }, { 65549, true }, - { 65563, true }, - { 65577, true }, - { 65591, true }, - { 65601, true }, - { 65611, true }, - { 65621, true }, - { 65633, true }, + { 65556, true }, + { 65566, true }, + { 65575, true }, + { 65590, true }, + { 65597, true }, + { 65607, true }, + { 65619, true }, + { 65629, true }, { 65640, true }, - { 65650, true }, - { 65659, true }, - { 65674, true }, - { 65681, true }, + { 65647, true }, + { 65656, true }, + { 65668, true }, + { 65677, true }, { 65691, true }, - { 65703, true }, + { 65704, true }, { 65713, true }, - { 65724, true }, - { 65731, true }, - { 65740, true }, - { 65752, true }, - { 65761, true }, - { 65775, true }, - { 65788, true }, - { 65797, true }, - { 65809, true }, - { 65831, true }, - { 65854, true }, - { 65868, true }, - { 65883, true }, - { 65898, true }, - { 65914, true }, - { 65932, true }, - { 65942, true }, - { 65962, true }, - { 65973, true }, - { 65991, true }, - { 66003, true }, - { 66014, true }, - { 66030, true }, - { 66047, true }, - { 66062, true }, - { 66078, true }, - { 66093, true }, - { 66109, true }, - { 66118, true }, - { 66135, true }, - { 66152, true }, - { 66170, true }, - { 66182, true }, - { 66199, true }, + { 65725, true }, + { 65747, true }, + { 65770, true }, + { 65784, true }, + { 65799, true }, + { 65814, true }, + { 65830, true }, + { 65848, true }, + { 65858, true }, + { 65878, true }, + { 65889, true }, + { 65907, true }, + { 65919, true }, + { 65930, true }, + { 65946, true }, + { 65963, true }, + { 65978, true }, + { 65994, true }, + { 66009, true }, + { 66025, true }, + { 66034, true }, + { 66051, true }, + { 66068, true }, + { 66086, true }, + { 66098, true }, + { 66115, true }, + { 66129, true }, + { 66143, true }, + { 66158, true }, + { 66173, true }, + { 66184, true }, + { 66198, true }, { 66213, true }, - { 66227, true }, - { 66242, true }, - { 66257, true }, - { 66268, true }, - { 66282, true }, - { 66297, true }, - { 66312, true }, - { 66327, true }, - { 66349, true }, - { 66367, true }, - { 66388, true }, - { 66412, true }, - { 66434, true }, - { 66446, true }, - { 66459, true }, - { 66475, true }, - { 66489, true }, - { 66502, true }, - { 66520, true }, - { 66533, false }, - { 66554, true }, - { 66567, true }, - { 66582, true }, - { 66596, true }, - { 66607, true }, - { 66632, true }, - { 66648, true }, - { 66665, true }, - { 66677, false }, - { 66694, true }, - { 66706, true }, - { 66719, true }, - { 66730, true }, - { 66745, true }, - { 66757, false }, - { 66768, true }, - { 66782, true }, - { 66792, true }, - { 66801, true }, + { 66228, true }, + { 66243, true }, + { 66265, true }, + { 66283, true }, + { 66304, true }, + { 66328, true }, + { 66350, true }, + { 66362, true }, + { 66375, true }, + { 66391, true }, + { 66405, true }, + { 66418, true }, + { 66436, true }, + { 66449, false }, + { 66470, true }, + { 66483, true }, + { 66498, true }, + { 66512, true }, + { 66523, true }, + { 66548, true }, + { 66564, true }, + { 66581, true }, + { 66593, false }, + { 66610, true }, + { 66622, true }, + { 66635, true }, + { 66646, true }, + { 66661, true }, + { 66673, false }, + { 66684, true }, + { 66698, true }, + { 66708, true }, + { 66717, true }, + { 66724, true }, + { 66741, true }, + { 66753, true }, + { 66762, true }, + { 66773, true }, + { 66785, true }, + { 66792, false }, + { 66799, false }, { 66808, true }, - { 66825, true }, - { 66837, true }, - { 66846, true }, - { 66857, true }, - { 66869, true }, - { 66876, false }, - { 66883, false }, - { 66892, true }, - { 66904, true }, - { 66916, true }, - { 66926, true }, - { 66935, true }, - { 66944, true }, - { 66951, true }, - { 66963, false }, - { 66975, false }, - { 66983, true }, - { 66995, true }, - { 67008, true }, - { 67022, true }, - { 67035, true }, - { 67047, true }, - { 67058, true }, - { 67068, true }, - { 67076, true }, - { 67089, true }, + { 66820, true }, + { 66832, true }, + { 66842, true }, + { 66851, true }, + { 66860, true }, + { 66867, true }, + { 66879, false }, + { 66891, false }, + { 66899, true }, + { 66911, true }, + { 66924, true }, + { 66938, false }, + { 66953, true }, + { 66966, true }, + { 66978, true }, + { 66989, true }, + { 66999, true }, + { 67007, true }, + { 67020, true }, + { 67032, true }, + { 67043, true }, + { 67055, true }, + { 67065, false }, + { 67083, true }, { 67101, true }, - { 67112, true }, - { 67124, true }, - { 67134, false }, - { 67152, true }, - { 67170, true }, - { 67192, true }, - { 67214, true }, - { 67225, true }, - { 67240, true }, - { 67251, true }, - { 67267, true }, - { 67290, true }, - { 67308, true }, - { 67319, true }, - { 67337, true }, - { 67364, true }, - { 67384, true }, - { 67396, true }, - { 67414, true }, - { 67428, true }, - { 67444, true }, - { 67460, true }, - { 67473, true }, - { 67487, true }, - { 67501, true }, - { 67515, true }, - { 67526, true }, - { 67550, true }, - { 67578, false }, - { 67589, true }, - { 67607, true }, - { 67625, true }, - { 67649, true }, + { 67123, true }, + { 67145, true }, + { 67156, true }, + { 67171, true }, + { 67182, true }, + { 67198, true }, + { 67221, true }, + { 67239, true }, + { 67250, true }, + { 67268, true }, + { 67295, true }, + { 67315, true }, + { 67327, true }, + { 67345, true }, + { 67359, true }, + { 67375, true }, + { 67391, true }, + { 67404, true }, + { 67418, true }, + { 67432, true }, + { 67446, true }, + { 67457, true }, + { 67481, true }, + { 67509, false }, + { 67520, true }, + { 67538, true }, + { 67556, true }, + { 67580, true }, + { 67601, true }, + { 67622, true }, + { 67643, true }, + { 67657, true }, { 67670, true }, - { 67691, true }, - { 67712, true }, - { 67726, true }, - { 67739, true }, - { 67758, true }, - { 67776, true }, - { 67786, true }, + { 67689, true }, + { 67707, true }, + { 67717, true }, + { 67735, true }, + { 67753, true }, + { 67774, true }, + { 67794, true }, { 67804, true }, - { 67822, true }, - { 67843, true }, - { 67863, true }, - { 67873, true }, - { 67889, true }, - { 67903, true }, - { 67919, true }, - { 67930, true }, - { 67941, true }, - { 67951, true }, - { 67961, true }, - { 67978, true }, - { 67992, false }, - { 68005, true }, + { 67820, true }, + { 67834, true }, + { 67850, true }, + { 67861, true }, + { 67872, true }, + { 67882, true }, + { 67892, true }, + { 67909, true }, + { 67923, false }, + { 67936, true }, + { 67948, true }, + { 67959, true }, + { 67976, true }, + { 67986, true }, + { 68000, true }, { 68017, true }, - { 68028, true }, - { 68045, true }, - { 68055, true }, - { 68069, true }, - { 68086, true }, - { 68105, true }, - { 68123, true }, - { 68134, true }, - { 68145, true }, - { 68156, true }, - { 68167, true }, - { 68178, true }, - { 68189, true }, - { 68200, true }, - { 68220, true }, - { 68233, true }, - { 68246, true }, - { 68256, true }, - { 68271, true }, - { 68285, true }, - { 68300, true }, - { 68313, true }, - { 68330, true }, - { 68347, true }, - { 68360, true }, - { 68374, true }, - { 68383, true }, - { 68402, false }, - { 68413, true }, - { 68424, true }, - { 68441, true }, - { 68450, true }, - { 68464, true }, - { 68472, true }, - { 68480, true }, - { 68487, true }, - { 68494, true }, - { 68503, true }, - { 68522, true }, - { 68537, true }, - { 68558, true }, - { 68578, true }, - { 68595, true }, - { 68611, true }, - { 68631, true }, - { 68650, true }, - { 68671, true }, - { 68684, true }, - { 68699, true }, - { 68711, true }, - { 68727, false }, - { 68741, false }, - { 68754, false }, + { 68036, true }, + { 68054, true }, + { 68065, true }, + { 68076, true }, + { 68087, true }, + { 68098, true }, + { 68109, true }, + { 68120, true }, + { 68131, true }, + { 68151, true }, + { 68164, true }, + { 68177, true }, + { 68187, true }, + { 68202, true }, + { 68216, true }, + { 68231, true }, + { 68244, true }, + { 68261, true }, + { 68278, true }, + { 68291, true }, + { 68305, true }, + { 68314, true }, + { 68333, false }, + { 68344, true }, + { 68355, true }, + { 68372, true }, + { 68381, true }, + { 68395, true }, + { 68403, true }, + { 68411, true }, + { 68418, true }, + { 68425, true }, + { 68434, true }, + { 68453, true }, + { 68468, true }, + { 68489, true }, + { 68509, true }, + { 68526, true }, + { 68542, true }, + { 68562, true }, + { 68581, true }, + { 68602, true }, + { 68615, true }, + { 68630, true }, + { 68642, true }, + { 68658, false }, + { 68672, false }, + { 68685, false }, + { 68692, true }, + { 68700, true }, + { 68712, true }, + { 68722, true }, + { 68737, true }, + { 68750, true }, { 68761, true }, - { 68769, true }, - { 68779, true }, - { 68794, true }, - { 68807, true }, - { 68818, true }, - { 68833, true }, - { 68855, true }, + { 68776, true }, + { 68798, true }, + { 68817, true }, + { 68829, true }, + { 68840, true }, + { 68856, true }, { 68874, true }, - { 68886, true }, - { 68897, true }, - { 68913, true }, - { 68931, true }, - { 68949, true }, - { 68963, true }, - { 68973, true }, - { 68980, true }, - { 68991, true }, - { 69003, false }, - { 69023, false }, - { 69039, true }, - { 69050, true }, - { 69065, true }, - { 69078, true }, - { 69091, true }, - { 69103, true }, - { 69120, false }, - { 69131, false }, - { 69141, true }, - { 69156, true }, - { 69172, true }, - { 69201, true }, + { 68892, true }, + { 68906, true }, + { 68916, true }, + { 68923, true }, + { 68934, true }, + { 68946, false }, + { 68966, false }, + { 68982, true }, + { 68993, true }, + { 69008, true }, + { 69021, true }, + { 69034, true }, + { 69046, true }, + { 69063, false }, + { 69074, false }, + { 69084, true }, + { 69099, true }, + { 69115, true }, + { 69144, true }, + { 69163, true }, + { 69177, true }, + { 69194, true }, { 69220, true }, - { 69234, true }, - { 69251, true }, - { 69277, true }, - { 69292, true }, - { 69307, true }, - { 69322, true }, - { 69336, true }, - { 69355, true }, - { 69380, true }, - { 69396, true }, - { 69417, true }, - { 69451, true }, - { 69475, true }, - { 69504, false }, - { 69519, true }, - { 69535, true }, - { 69560, true }, - { 69572, true }, - { 69586, true }, - { 69595, true }, - { 69615, false }, - { 69625, true }, - { 69640, true }, - { 69648, true }, - { 69657, true }, - { 69665, true }, - { 69681, true }, - { 69703, true }, - { 69715, true }, + { 69235, true }, + { 69250, true }, + { 69265, true }, + { 69279, true }, + { 69298, true }, + { 69323, true }, + { 69339, true }, + { 69360, true }, + { 69394, true }, + { 69418, true }, + { 69447, false }, + { 69462, true }, + { 69478, true }, + { 69503, true }, + { 69515, true }, + { 69529, true }, + { 69538, true }, + { 69558, false }, + { 69568, true }, + { 69583, true }, + { 69591, true }, + { 69600, true }, + { 69608, true }, + { 69624, true }, + { 69646, true }, + { 69658, true }, + { 69670, true }, + { 69678, true }, + { 69689, true }, + { 69699, false }, + { 69711, true }, { 69727, true }, - { 69735, true }, - { 69746, true }, - { 69756, false }, - { 69768, true }, - { 69784, true }, - { 69800, true }, - { 69814, true }, - { 69829, true }, - { 69843, true }, - { 69854, true }, - { 69869, true }, - { 69884, true }, - { 69895, false }, - { 69907, true }, - { 69921, true }, - { 69932, true }, - { 69942, true }, - { 69959, true }, - { 69977, true }, - { 69987, true }, - { 70010, true }, - { 70024, true }, - { 70040, true }, - { 70053, true }, - { 70072, true }, - { 70085, true }, - { 70102, true }, - { 70120, false }, - { 70133, true }, - { 70147, true }, - { 70157, true }, - { 70168, false }, - { 70177, true }, - { 70193, true }, - { 70200, true }, - { 70221, false }, - { 70236, true }, - { 70251, true }, - { 70268, true }, - { 70277, true }, - { 70286, true }, - { 70298, true }, - { 70316, true }, - { 70326, true }, - { 70339, true }, - { 70350, true }, - { 70365, true }, - { 70376, true }, - { 70392, true }, - { 70405, true }, - { 70415, true }, - { 70431, true }, - { 70453, true }, - { 70465, true }, - { 70478, true }, - { 70491, true }, - { 70506, true }, - { 70520, true }, - { 70536, false }, + { 69743, true }, + { 69757, true }, + { 69772, true }, + { 69786, true }, + { 69797, true }, + { 69812, true }, + { 69827, true }, + { 69838, false }, + { 69850, true }, + { 69864, true }, + { 69875, true }, + { 69885, true }, + { 69902, true }, + { 69920, true }, + { 69930, true }, + { 69953, true }, + { 69967, true }, + { 69983, true }, + { 69996, true }, + { 70015, true }, + { 70028, true }, + { 70045, true }, + { 70063, false }, + { 70076, true }, + { 70090, true }, + { 70100, true }, + { 70111, false }, + { 70120, true }, + { 70136, true }, + { 70143, true }, + { 70164, false }, + { 70179, true }, + { 70194, true }, + { 70211, true }, + { 70220, true }, + { 70229, true }, + { 70241, true }, + { 70259, true }, + { 70269, true }, + { 70282, true }, + { 70293, true }, + { 70308, true }, + { 70319, true }, + { 70335, true }, + { 70348, true }, + { 70358, true }, + { 70374, true }, + { 70396, true }, + { 70408, true }, + { 70421, true }, + { 70434, true }, + { 70449, true }, + { 70463, true }, + { 70479, false }, + { 70492, true }, + { 70504, true }, + { 70516, true }, + { 70533, true }, { 70549, true }, - { 70561, true }, - { 70573, true }, - { 70590, true }, - { 70606, true }, - { 70618, false }, - { 70628, true }, - { 70641, true }, - { 70657, true }, - { 70668, true }, - { 70688, false }, - { 70696, true }, - { 70708, true }, - { 70719, true }, - { 70738, false }, - { 70758, true }, - { 70767, true }, - { 70778, true }, - { 70809, true }, - { 70823, true }, - { 70837, true }, - { 70857, true }, - { 70876, true }, - { 70892, true }, + { 70561, false }, + { 70571, true }, + { 70584, true }, + { 70600, true }, + { 70611, true }, + { 70631, false }, + { 70639, true }, + { 70651, true }, + { 70662, true }, + { 70681, false }, + { 70701, true }, + { 70710, true }, + { 70721, true }, + { 70752, true }, + { 70766, true }, + { 70780, true }, + { 70800, true }, + { 70819, true }, + { 70835, true }, + { 70850, true }, + { 70864, true }, + { 70886, true }, + { 70894, true }, { 70907, true }, - { 70921, true }, - { 70943, true }, - { 70951, true }, - { 70964, true }, - { 70975, true }, - { 70987, true }, - { 70999, true }, - { 71015, true }, + { 70918, true }, + { 70930, true }, + { 70942, true }, + { 70958, true }, + { 70969, true }, + { 70994, true }, + { 71010, true }, { 71026, true }, - { 71051, true }, - { 71067, true }, - { 71083, true }, - { 71099, true }, - { 71118, true }, - { 71142, true }, - { 71158, true }, - { 71174, false }, - { 71187, true }, - { 71197, true }, - { 71209, true }, - { 71221, true }, + { 71042, true }, + { 71061, true }, + { 71085, true }, + { 71101, true }, + { 71117, false }, + { 71130, true }, + { 71140, true }, + { 71152, true }, + { 71164, true }, + { 71184, true }, + { 71204, true }, + { 71225, false }, { 71241, true }, - { 71261, true }, - { 71282, false }, - { 71298, true }, - { 71316, true }, - { 71331, true }, - { 71344, true }, - { 71356, false }, - { 71364, true }, - { 71378, true }, - { 71392, true }, - { 71404, true }, + { 71259, true }, + { 71274, true }, + { 71287, true }, + { 71299, false }, + { 71307, true }, + { 71321, true }, + { 71335, true }, + { 71347, true }, + { 71361, true }, + { 71373, true }, + { 71387, true }, + { 71400, true }, { 71418, true }, - { 71430, true }, - { 71444, true }, - { 71457, true }, - { 71475, true }, - { 71491, true }, - { 71511, true }, - { 71542, true }, - { 71573, true }, - { 71595, true }, - { 71613, true }, - { 71627, true }, - { 71649, true }, - { 71664, true }, - { 71683, true }, - { 71693, true }, - { 71708, true }, - { 71723, true }, - { 71738, true }, - { 71755, true }, + { 71434, true }, + { 71454, true }, + { 71485, true }, + { 71516, true }, + { 71538, true }, + { 71556, true }, + { 71570, true }, + { 71592, true }, + { 71607, true }, + { 71626, true }, + { 71636, true }, + { 71651, true }, + { 71666, true }, + { 71681, true }, + { 71698, true }, + { 71711, true }, + { 71724, true }, + { 71734, true }, + { 71757, true }, { 71768, true }, - { 71781, true }, - { 71791, true }, + { 71780, true }, + { 71797, true }, { 71814, true }, - { 71825, true }, - { 71837, true }, - { 71854, true }, - { 71871, true }, - { 71886, true }, - { 71893, true }, - { 71906, true }, - { 71923, true }, - { 71933, true }, - { 71942, true }, - { 71961, true }, - { 71979, true }, - { 72000, true }, - { 72020, true }, - { 72033, true }, - { 72050, true }, - { 72063, true }, - { 72085, true }, - { 72097, true }, - { 72113, true }, - { 72123, true }, - { 72136, true }, - { 72158, true }, - { 72172, true }, - { 72194, true }, - { 72211, true }, - { 72225, true }, - { 72233, true }, - { 72245, true }, - { 72260, true }, - { 72270, true }, - { 72281, true }, - { 72293, true }, - { 72304, true }, - { 72313, true }, - { 72323, true }, - { 72345, true }, - { 72357, true }, - { 72375, true }, + { 71829, true }, + { 71836, true }, + { 71849, true }, + { 71866, true }, + { 71876, true }, + { 71885, true }, + { 71904, true }, + { 71922, true }, + { 71943, true }, + { 71963, true }, + { 71976, true }, + { 71993, true }, + { 72006, true }, + { 72028, true }, + { 72040, true }, + { 72056, true }, + { 72066, true }, + { 72079, true }, + { 72101, true }, + { 72115, true }, + { 72137, true }, + { 72154, true }, + { 72168, true }, + { 72176, true }, + { 72188, true }, + { 72203, true }, + { 72213, true }, + { 72224, true }, + { 72236, true }, + { 72247, true }, + { 72256, true }, + { 72266, true }, + { 72278, true }, + { 72296, true }, + { 72307, true }, + { 72322, true }, + { 72335, true }, + { 72349, true }, + { 72364, true }, + { 72376, true }, { 72386, true }, - { 72401, true }, - { 72414, true }, - { 72428, true }, - { 72443, true }, - { 72455, true }, - { 72465, true }, - { 72483, true }, - { 72491, true }, - { 72502, true }, + { 72404, true }, + { 72412, true }, + { 72423, true }, + { 72437, true }, + { 72450, true }, + { 72461, true }, + { 72472, false }, + { 72488, true }, + { 72501, true }, { 72516, true }, - { 72529, true }, - { 72540, true }, - { 72551, false }, - { 72567, true }, - { 72580, true }, - { 72601, true }, - { 72616, true }, - { 72627, true }, + { 72527, true }, + { 72543, true }, + { 72561, true }, + { 72582, true }, + { 72594, true }, + { 72603, true }, + { 72616, false }, + { 72634, true }, { 72643, true }, - { 72661, true }, - { 72682, true }, - { 72694, true }, - { 72703, true }, - { 72716, false }, - { 72734, true }, - { 72743, true }, + { 72654, true }, + { 72666, false }, + { 72684, true }, + { 72702, true }, + { 72721, true }, + { 72740, true }, { 72754, true }, - { 72766, false }, - { 72784, true }, - { 72802, true }, - { 72821, true }, - { 72840, true }, - { 72854, true }, - { 72874, false }, - { 72894, true }, - { 72906, true }, - { 72919, true }, - { 72938, true }, - { 72950, true }, - { 72963, true }, - { 72978, true }, - { 72992, true }, - { 73002, true }, - { 73012, true }, + { 72774, false }, + { 72794, true }, + { 72806, true }, + { 72819, true }, + { 72838, true }, + { 72850, true }, + { 72863, true }, + { 72878, true }, + { 72892, true }, + { 72902, true }, + { 72912, true }, + { 72922, true }, + { 72934, true }, + { 72943, true }, + { 72958, true }, + { 72973, true }, + { 72982, true }, + { 72995, true }, { 73022, true }, - { 73034, true }, - { 73043, true }, - { 73058, true }, - { 73073, true }, - { 73082, true }, - { 73095, true }, - { 73122, true }, + { 73030, true }, + { 73051, true }, + { 73065, true }, + { 73075, true }, + { 73083, true }, + { 73092, true }, + { 73101, true }, + { 73118, true }, { 73130, true }, - { 73151, true }, - { 73165, true }, - { 73175, true }, - { 73183, true }, - { 73192, true }, - { 73201, true }, - { 73218, true }, - { 73230, true }, - { 73238, true }, - { 73259, true }, - { 73278, true }, - { 73290, true }, - { 73308, true }, - { 73320, true }, - { 73331, true }, - { 73343, true }, - { 73352, true }, - { 73361, true }, - { 73368, true }, - { 73376, true }, - { 73390, false }, - { 73401, true }, + { 73138, true }, + { 73159, true }, + { 73178, true }, + { 73190, true }, + { 73208, true }, + { 73220, true }, + { 73231, true }, + { 73243, true }, + { 73252, true }, + { 73261, true }, + { 73268, true }, + { 73276, true }, + { 73290, false }, + { 73301, true }, + { 73312, true }, + { 73327, true }, + { 73340, false }, + { 73350, true }, + { 73364, true }, + { 73384, true }, + { 73399, true }, { 73412, true }, - { 73427, true }, - { 73440, false }, - { 73450, true }, - { 73464, true }, - { 73484, true }, - { 73499, true }, - { 73512, true }, - { 73524, true }, - { 73539, true }, - { 73552, true }, - { 73579, true }, - { 73593, true }, - { 73610, true }, - { 73630, true }, + { 73424, true }, + { 73439, true }, + { 73452, true }, + { 73479, true }, + { 73493, true }, + { 73510, true }, + { 73530, true }, + { 73545, true }, + { 73555, true }, + { 73568, true }, + { 73585, true }, + { 73598, true }, + { 73608, true }, + { 73635, true }, { 73645, true }, - { 73655, true }, - { 73668, true }, - { 73685, true }, - { 73698, true }, - { 73708, true }, - { 73735, true }, - { 73745, true }, - { 73754, true }, - { 73761, true }, - { 73777, true }, - { 73788, true }, - { 73799, true }, - { 73813, true }, - { 73824, true }, - { 73834, true }, - { 73855, true }, - { 73863, true }, - { 73873, true }, - { 73885, true }, - { 73908, true }, - { 73922, true }, - { 73941, true }, - { 73949, true }, - { 73959, true }, - { 73968, true }, - { 73986, true }, - { 74018, true }, - { 74034, true }, - { 74055, true }, - { 74072, true }, - { 74083, true }, - { 74103, true }, - { 74116, true }, - { 74130, true }, - { 74140, true }, - { 74159, true }, - { 74177, true }, - { 74188, true }, - { 74196, true }, - { 74210, true }, - { 74222, true }, - { 74235, true }, - { 74248, true }, - { 74257, true }, - { 74267, true }, - { 74279, true }, - { 74290, true }, - { 74302, true }, - { 74312, true }, - { 74335, false }, + { 73654, true }, + { 73661, true }, + { 73677, true }, + { 73688, true }, + { 73699, true }, + { 73713, true }, + { 73724, true }, + { 73734, true }, + { 73755, true }, + { 73763, true }, + { 73773, true }, + { 73785, true }, + { 73808, true }, + { 73822, true }, + { 73841, true }, + { 73849, true }, + { 73859, true }, + { 73868, true }, + { 73886, true }, + { 73918, true }, + { 73934, true }, + { 73955, true }, + { 73972, true }, + { 73983, true }, + { 74003, true }, + { 74016, true }, + { 74030, true }, + { 74040, true }, + { 74059, true }, + { 74077, true }, + { 74088, true }, + { 74096, true }, + { 74110, true }, + { 74122, true }, + { 74135, true }, + { 74148, true }, + { 74157, true }, + { 74167, true }, + { 74179, true }, + { 74190, true }, + { 74202, true }, + { 74212, true }, + { 74235, false }, + { 74250, true }, + { 74269, true }, + { 74287, true }, + { 74301, true }, + { 74315, true }, + { 74325, true }, + { 74338, true }, { 74350, true }, - { 74369, true }, - { 74387, true }, - { 74401, true }, - { 74415, true }, - { 74425, true }, - { 74438, true }, - { 74450, true }, - { 74464, true }, - { 74480, true }, - { 74495, true }, + { 74364, true }, + { 74380, true }, + { 74395, true }, + { 74404, true }, + { 74419, true }, + { 74432, true }, + { 74448, true }, + { 74465, false }, + { 74482, true }, { 74504, true }, - { 74519, true }, - { 74532, true }, + { 74526, true }, { 74548, true }, - { 74565, false }, - { 74582, true }, - { 74604, true }, - { 74626, true }, - { 74648, true }, - { 74660, true }, - { 74674, true }, - { 74687, true }, - { 74696, true }, - { 74712, true }, - { 74729, true }, - { 74743, true }, - { 74756, true }, - { 74770, true }, - { 74782, true }, - { 74795, true }, - { 74808, true }, - { 74818, true }, - { 74832, false }, - { 74844, true }, - { 74857, true }, - { 74879, true }, - { 74901, true }, - { 74912, true }, - { 74927, true }, - { 74938, true }, - { 74958, true }, - { 74975, true }, - { 74994, true }, - { 75021, true }, - { 75040, true }, - { 75052, true }, - { 75073, true }, + { 74560, true }, + { 74574, true }, + { 74587, true }, + { 74596, true }, + { 74612, true }, + { 74629, true }, + { 74643, true }, + { 74656, true }, + { 74670, true }, + { 74682, true }, + { 74695, true }, + { 74708, true }, + { 74718, true }, + { 74732, false }, + { 74744, true }, + { 74757, true }, + { 74779, true }, + { 74801, true }, + { 74812, true }, + { 74827, true }, + { 74838, false }, + { 74858, true }, + { 74875, true }, + { 74894, true }, + { 74921, true }, + { 74940, true }, + { 74952, true }, + { 74973, true }, + { 74998, true }, + { 75017, true }, + { 75032, true }, + { 75052, false }, + { 75060, true }, + { 75072, true }, + { 75084, true }, { 75098, true }, - { 75117, true }, - { 75132, true }, - { 75152, false }, + { 75108, true }, + { 75121, true }, + { 75139, true }, + { 75153, true }, { 75160, true }, - { 75172, true }, - { 75184, true }, - { 75198, true }, - { 75208, true }, - { 75221, true }, - { 75239, true }, - { 75253, true }, - { 75260, true }, - { 75267, true }, - { 75279, true }, - { 75290, true }, - { 75303, true }, - { 75317, true }, - { 75334, true }, - { 75348, true }, - { 75364, true }, + { 75167, true }, + { 75179, true }, + { 75190, true }, + { 75203, true }, + { 75217, true }, + { 75234, true }, + { 75248, true }, + { 75264, true }, + { 75275, true }, + { 75282, true }, + { 75296, false }, + { 75311, true }, + { 75339, true }, + { 75354, true }, { 75375, true }, - { 75382, true }, - { 75391, true }, - { 75405, false }, - { 75420, true }, - { 75448, true }, - { 75463, true }, - { 75484, true }, - { 75498, true }, + { 75389, true }, + { 75410, true }, + { 75426, true }, + { 75436, true }, + { 75447, true }, + { 75457, true }, + { 75470, true }, + { 75483, true }, + { 75500, true }, { 75519, true }, - { 75535, true }, - { 75545, true }, + { 75538, true }, { 75556, true }, - { 75566, true }, + { 75567, true }, { 75579, true }, - { 75592, true }, - { 75609, true }, - { 75628, true }, - { 75647, true }, - { 75665, true }, - { 75676, true }, - { 75688, true }, - { 75700, true }, - { 75711, true }, - { 75723, true }, - { 75738, true }, - { 75749, true }, - { 75760, true }, - { 75771, true }, - { 75783, true }, - { 75794, true }, - { 75807, true }, - { 75816, true }, - { 75825, true }, - { 75838, true }, - { 75845, false }, - { 75853, true }, - { 75861, true }, - { 75876, true }, - { 75889, true }, - { 75900, false }, - { 75912, true }, - { 75936, true }, + { 75591, true }, + { 75602, true }, + { 75614, true }, + { 75629, true }, + { 75640, true }, + { 75651, true }, + { 75662, true }, + { 75674, true }, + { 75685, true }, + { 75698, true }, + { 75707, true }, + { 75716, true }, + { 75729, true }, + { 75736, false }, + { 75744, true }, + { 75752, true }, + { 75767, true }, + { 75778, false }, + { 75790, true }, + { 75814, true }, + { 75829, true }, + { 75842, true }, + { 75856, true }, + { 75874, true }, + { 75882, true }, + { 75907, true }, + { 75927, true }, { 75951, true }, - { 75964, true }, - { 75978, true }, - { 75996, true }, + { 75963, true }, + { 75979, true }, + { 75988, true }, { 76004, true }, - { 76029, true }, - { 76049, true }, - { 76073, true }, - { 76085, true }, - { 76101, true }, - { 76110, true }, - { 76126, true }, - { 76144, true }, - { 76159, true }, - { 76179, true }, - { 76192, true }, - { 76208, true }, - { 76222, true }, - { 76238, true }, - { 76258, true }, - { 76276, true }, - { 76295, true }, - { 76312, true }, - { 76328, true }, - { 76357, true }, - { 76377, true }, - { 76394, true }, - { 76410, true }, - { 76419, true }, - { 76432, true }, - { 76444, false }, - { 76458, true }, - { 76475, true }, - { 76508, true }, - { 76528, true }, - { 76540, true }, - { 76553, true }, - { 76568, true }, - { 76579, true }, - { 76596, true }, - { 76608, true }, - { 76620, true }, + { 76022, true }, + { 76037, true }, + { 76057, true }, + { 76070, true }, + { 76086, true }, + { 76100, true }, + { 76116, true }, + { 76136, true }, + { 76154, true }, + { 76173, true }, + { 76190, true }, + { 76206, true }, + { 76235, true }, + { 76255, true }, + { 76272, true }, + { 76288, true }, + { 76297, true }, + { 76310, true }, + { 76322, false }, + { 76336, true }, + { 76353, true }, + { 76386, true }, + { 76406, true }, + { 76418, true }, + { 76431, true }, + { 76446, true }, + { 76457, true }, + { 76474, true }, + { 76486, true }, + { 76498, true }, + { 76507, true }, + { 76524, true }, + { 76545, true }, + { 76560, true }, + { 76578, true }, + { 76594, true }, + { 76615, true }, { 76629, true }, - { 76646, true }, - { 76667, true }, - { 76682, true }, - { 76700, true }, - { 76716, true }, + { 76643, true }, + { 76654, true }, + { 76665, true }, + { 76681, true }, + { 76693, true }, + { 76704, true }, + { 76713, true }, + { 76722, true }, { 76737, true }, - { 76751, true }, - { 76765, true }, - { 76776, true }, - { 76787, true }, - { 76803, true }, - { 76815, true }, - { 76826, true }, - { 76840, true }, - { 76849, true }, - { 76858, true }, - { 76873, true }, - { 76881, true }, - { 76892, true }, - { 76903, true }, - { 76917, true }, - { 76932, true }, - { 76950, true }, - { 76964, true }, - { 76974, true }, - { 76984, true }, - { 76993, true }, - { 77005, true }, - { 77025, true }, - { 77048, true }, - { 77063, true }, - { 77071, true }, - { 77084, true }, - { 77096, true }, - { 77108, true }, - { 77118, false }, - { 77127, false }, - { 77136, false }, - { 77145, true }, - { 77164, true }, - { 77187, true }, - { 77201, true }, - { 77216, true }, - { 77235, true }, - { 77248, true }, - { 77264, true }, - { 77277, true }, - { 77294, true }, - { 77309, true }, - { 77319, true }, - { 77335, true }, - { 77354, true }, - { 77369, true }, - { 77388, true }, - { 77396, true }, - { 77410, true }, - { 77424, true }, - { 77441, false }, - { 77461, true }, - { 77474, true }, - { 77486, true }, - { 77501, true }, - { 77519, true }, - { 77530, true }, - { 77540, true }, - { 77554, true }, - { 77567, true }, - { 77582, true }, - { 77607, true }, - { 77633, true }, - { 77648, true }, + { 76745, true }, + { 76756, true }, + { 76767, true }, + { 76781, true }, + { 76796, true }, + { 76814, true }, + { 76828, true }, + { 76838, true }, + { 76848, true }, + { 76857, true }, + { 76869, true }, + { 76889, true }, + { 76912, true }, + { 76927, true }, + { 76935, true }, + { 76948, true }, + { 76960, true }, + { 76972, true }, + { 76982, false }, + { 76991, false }, + { 77000, false }, + { 77009, true }, + { 77028, true }, + { 77051, true }, + { 77065, true }, + { 77080, true }, + { 77099, true }, + { 77112, true }, + { 77128, true }, + { 77141, true }, + { 77158, true }, + { 77173, true }, + { 77183, true }, + { 77199, true }, + { 77218, true }, + { 77233, true }, + { 77252, true }, + { 77260, true }, + { 77274, true }, + { 77288, true }, + { 77305, false }, + { 77325, true }, + { 77338, true }, + { 77350, true }, + { 77365, true }, + { 77383, true }, + { 77394, true }, + { 77404, true }, + { 77418, true }, + { 77431, true }, + { 77446, true }, + { 77471, true }, + { 77497, true }, + { 77512, true }, + { 77524, true }, + { 77549, false }, + { 77558, true }, + { 77565, true }, + { 77573, true }, + { 77581, true }, + { 77592, true }, + { 77608, true }, + { 77632, true }, + { 77646, true }, { 77660, true }, - { 77685, false }, - { 77694, true }, - { 77701, true }, - { 77709, true }, + { 77676, true }, + { 77703, true }, { 77717, true }, - { 77728, true }, - { 77744, true }, - { 77761, true }, - { 77785, true }, - { 77799, true }, + { 77726, true }, + { 77739, true }, + { 77751, true }, + { 77774, true }, + { 77794, true }, { 77813, true }, - { 77829, true }, - { 77856, true }, - { 77870, true }, - { 77879, true }, - { 77892, true }, - { 77904, true }, - { 77927, true }, - { 77947, true }, - { 77966, true }, - { 77988, true }, - { 78002, true }, - { 78022, true }, - { 78047, true }, - { 78063, true }, - { 78075, true }, + { 77835, true }, + { 77849, true }, + { 77869, true }, + { 77894, true }, + { 77910, true }, + { 77922, true }, + { 77934, true }, + { 77956, true }, + { 77971, true }, + { 77986, true }, + { 78003, true }, + { 78018, true }, + { 78035, true }, + { 78050, true }, + { 78065, true }, + { 78077, false }, { 78087, true }, - { 78109, true }, - { 78124, true }, - { 78139, true }, - { 78156, true }, - { 78171, true }, - { 78188, true }, - { 78203, true }, - { 78218, true }, - { 78230, false }, - { 78240, true }, - { 78257, true }, - { 78268, false }, - { 78283, true }, - { 78300, true }, - { 78314, true }, - { 78327, true }, - { 78339, true }, - { 78349, true }, - { 78361, true }, - { 78376, true }, - { 78387, true }, - { 78407, true }, - { 78419, true }, - { 78430, true }, - { 78455, true }, - { 78464, true }, - { 78472, true }, - { 78495, true }, + { 78104, true }, + { 78115, false }, + { 78130, true }, + { 78147, true }, + { 78161, true }, + { 78174, true }, + { 78186, true }, + { 78196, true }, + { 78208, true }, + { 78223, true }, + { 78234, true }, + { 78254, true }, + { 78266, true }, + { 78277, true }, + { 78302, true }, + { 78311, true }, + { 78319, true }, + { 78342, true }, + { 78359, true }, + { 78370, true }, + { 78386, false }, + { 78398, true }, + { 78413, true }, + { 78421, true }, + { 78431, true }, + { 78446, true }, + { 78460, true }, + { 78470, false }, + { 78488, true }, { 78512, true }, - { 78523, true }, - { 78539, false }, - { 78551, true }, - { 78566, true }, - { 78574, true }, - { 78584, true }, - { 78599, true }, - { 78613, true }, - { 78623, false }, - { 78641, true }, - { 78665, true }, - { 78677, true }, - { 78705, true }, - { 78721, true }, - { 78733, true }, - { 78747, true }, - { 78775, true }, - { 78789, true }, - { 78805, true }, - { 78822, true }, - { 78839, true }, - { 78861, true }, - { 78871, true }, - { 78889, true }, - { 78908, true }, - { 78927, true }, - { 78952, true }, - { 78971, true }, - { 78985, true }, - { 78998, true }, - { 79027, true }, - { 79057, true }, + { 78524, true }, + { 78552, true }, + { 78568, true }, + { 78580, true }, + { 78594, true }, + { 78622, true }, + { 78636, true }, + { 78652, true }, + { 78669, true }, + { 78686, true }, + { 78708, true }, + { 78718, true }, + { 78736, true }, + { 78755, true }, + { 78774, true }, + { 78799, true }, + { 78818, true }, + { 78832, true }, + { 78845, true }, + { 78874, true }, + { 78904, true }, + { 78916, true }, + { 78925, true }, + { 78938, true }, + { 78949, true }, + { 78959, true }, + { 78975, true }, + { 78992, true }, + { 79015, true }, + { 79041, true }, + { 79055, true }, { 79069, true }, - { 79078, true }, - { 79091, true }, - { 79102, true }, - { 79112, true }, - { 79128, true }, - { 79145, true }, - { 79168, true }, - { 79194, true }, - { 79208, true }, - { 79222, true }, - { 79246, false }, - { 79256, true }, - { 79272, true }, - { 79280, true }, - { 79299, true }, - { 79311, true }, - { 79322, true }, - { 79338, true }, - { 79352, true }, - { 79364, true }, - { 79377, true }, - { 79396, true }, - { 79407, true }, - { 79419, true }, - { 79432, true }, - { 79446, true }, - { 79456, true }, - { 79469, true }, - { 79481, true }, - { 79497, true }, - { 79505, false }, - { 79513, true }, - { 79535, true }, - { 79547, true }, - { 79555, true }, - { 79576, true }, - { 79600, true }, - { 79616, true }, - { 79630, true }, - { 79647, true }, - { 79659, true }, - { 79669, true }, - { 79684, true }, + { 79093, false }, + { 79103, true }, + { 79119, true }, + { 79127, true }, + { 79146, true }, + { 79158, true }, + { 79169, true }, + { 79185, true }, + { 79199, true }, + { 79211, true }, + { 79224, true }, + { 79243, true }, + { 79254, true }, + { 79266, true }, + { 79279, true }, + { 79293, true }, + { 79303, true }, + { 79316, true }, + { 79328, true }, + { 79344, true }, + { 79352, false }, + { 79360, true }, + { 79382, true }, + { 79394, true }, + { 79402, true }, + { 79423, true }, + { 79447, true }, + { 79463, true }, + { 79477, true }, + { 79494, true }, + { 79506, true }, + { 79516, true }, + { 79531, true }, + { 79541, true }, + { 79564, true }, + { 79578, true }, + { 79593, true }, + { 79605, true }, + { 79614, true }, + { 79627, true }, + { 79642, true }, + { 79656, true }, + { 79668, true }, + { 79683, true }, { 79694, true }, - { 79717, true }, - { 79731, true }, + { 79705, true }, + { 79715, true }, + { 79729, true }, + { 79738, true }, { 79746, true }, - { 79758, true }, - { 79767, true }, - { 79780, true }, - { 79795, true }, - { 79809, true }, - { 79821, true }, - { 79836, true }, - { 79847, true }, - { 79858, true }, - { 79868, true }, - { 79882, true }, - { 79891, true }, - { 79899, true }, - { 79909, true }, - { 79918, true }, - { 79926, true }, - { 79934, true }, - { 79943, true }, - { 79955, true }, - { 79967, true }, - { 79977, true }, - { 79987, true }, - { 79999, true }, - { 80013, true }, - { 80028, true }, - { 80039, true }, - { 80053, true }, - { 80064, true }, - { 80072, true }, - { 80083, true }, - { 80094, true }, - { 80109, true }, - { 80122, true }, + { 79756, true }, + { 79765, true }, + { 79773, true }, + { 79781, true }, + { 79790, true }, + { 79802, true }, + { 79814, true }, + { 79824, true }, + { 79834, true }, + { 79846, true }, + { 79860, true }, + { 79875, true }, + { 79886, true }, + { 79900, true }, + { 79911, true }, + { 79919, true }, + { 79930, true }, + { 79941, true }, + { 79956, true }, + { 79969, true }, + { 79976, true }, + { 79996, true }, + { 80005, true }, + { 80018, true }, + { 80033, true }, + { 80048, true }, + { 80068, true }, + { 80077, true }, + { 80089, true }, + { 80098, true }, + { 80108, true }, + { 80118, true }, { 80129, true }, - { 80149, true }, - { 80158, true }, - { 80171, true }, - { 80186, true }, - { 80201, true }, - { 80221, true }, - { 80230, true }, - { 80242, true }, - { 80251, true }, - { 80261, true }, - { 80271, false }, - { 80278, true }, - { 80289, true }, + { 80142, true }, + { 80157, true }, + { 80164, true }, + { 80184, true }, + { 80194, true }, + { 80205, false }, + { 80218, true }, + { 80232, true }, + { 80241, false }, + { 80257, true }, + { 80266, false }, + { 80275, true }, + { 80283, true }, + { 80295, true }, { 80302, true }, - { 80317, true }, - { 80324, true }, + { 80320, true }, + { 80332, true }, { 80344, true }, - { 80354, true }, - { 80365, false }, - { 80378, true }, - { 80392, true }, - { 80401, false }, - { 80417, true }, - { 80426, false }, - { 80435, true }, - { 80443, true }, + { 80363, true }, + { 80376, true }, + { 80389, false }, + { 80398, true }, + { 80407, true }, + { 80418, true }, + { 80438, true }, { 80455, true }, - { 80462, true }, - { 80480, true }, - { 80492, true }, - { 80504, true }, - { 80523, true }, - { 80536, true }, - { 80549, false }, - { 80558, true }, - { 80567, true }, - { 80578, true }, - { 80598, true }, - { 80615, true }, - { 80630, true }, - { 80646, false }, - { 80661, true }, - { 80680, true }, - { 80697, true }, - { 80708, true }, - { 80725, false }, - { 80746, false }, - { 80762, false }, + { 80470, true }, + { 80486, false }, + { 80501, true }, + { 80520, true }, + { 80537, true }, + { 80548, true }, + { 80565, false }, + { 80586, false }, + { 80602, false }, + { 80622, true }, + { 80634, true }, + { 80657, true }, + { 80669, true }, + { 80682, true }, + { 80694, true }, + { 80705, true }, + { 80717, true }, + { 80726, true }, + { 80737, true }, + { 80755, true }, { 80782, true }, - { 80794, true }, - { 80817, true }, + { 80792, true }, + { 80800, true }, + { 80814, true }, { 80829, true }, - { 80842, true }, - { 80854, true }, - { 80865, true }, - { 80877, true }, - { 80886, true }, - { 80897, true }, - { 80915, true }, - { 80942, true }, - { 80952, true }, - { 80960, true }, - { 80974, true }, - { 80989, true }, - { 80999, true }, - { 81010, true }, - { 81019, true }, - { 81038, true }, - { 81051, true }, - { 81061, true }, - { 81069, true }, - { 81076, true }, - { 81089, true }, - { 81099, true }, - { 81108, false }, - { 81118, true }, - { 81127, true }, - { 81137, false }, - { 81154, true }, - { 81163, true }, - { 81173, true }, - { 81181, true }, - { 81191, true }, - { 81201, true }, - { 81214, true }, - { 81226, true }, - { 81241, true }, - { 81253, true }, - { 81269, true }, - { 81283, true }, - { 81297, true }, - { 81304, true }, + { 80839, true }, + { 80850, true }, + { 80859, true }, + { 80878, true }, + { 80891, true }, + { 80901, true }, + { 80909, true }, + { 80916, true }, + { 80929, true }, + { 80939, true }, + { 80948, false }, + { 80958, true }, + { 80967, true }, + { 80979, true }, + { 80989, false }, + { 81006, true }, + { 81015, true }, + { 81025, true }, + { 81033, true }, + { 81043, true }, + { 81053, true }, + { 81066, true }, + { 81078, true }, + { 81093, true }, + { 81105, true }, + { 81121, true }, + { 81135, true }, + { 81149, true }, + { 81156, true }, + { 81168, true }, + { 81182, true }, + { 81193, true }, + { 81202, true }, + { 81216, true }, + { 81228, true }, + { 81238, true }, + { 81248, true }, + { 81260, true }, + { 81270, true }, + { 81288, true }, + { 81303, true }, { 81316, true }, - { 81330, true }, - { 81341, true }, - { 81350, true }, - { 81364, true }, - { 81376, true }, - { 81386, true }, - { 81396, true }, - { 81408, true }, - { 81418, true }, - { 81436, true }, - { 81451, true }, - { 81464, true }, - { 81471, true }, - { 81488, true }, - { 81499, true }, - { 81509, true }, - { 81519, true }, - { 81528, true }, - { 81550, true }, - { 81569, true }, - { 81576, true }, - { 81590, true }, - { 81605, true }, - { 81627, true }, - { 81641, true }, - { 81654, true }, + { 81323, true }, + { 81340, true }, + { 81351, true }, + { 81361, true }, + { 81371, true }, + { 81380, true }, + { 81402, true }, + { 81421, true }, + { 81428, true }, + { 81442, true }, + { 81457, true }, + { 81479, true }, + { 81493, true }, + { 81506, true }, + { 81520, true }, + { 81543, true }, + { 81554, true }, + { 81563, true }, + { 81574, true }, + { 81588, true }, + { 81599, true }, + { 81611, true }, + { 81630, true }, + { 81643, true }, + { 81652, true }, { 81668, true }, - { 81691, true }, - { 81702, true }, - { 81711, true }, - { 81722, true }, - { 81736, true }, - { 81747, true }, + { 81681, true }, + { 81693, true }, + { 81706, true }, + { 81714, true }, + { 81726, true }, + { 81735, true }, + { 81750, true }, { 81759, true }, - { 81778, true }, - { 81791, true }, - { 81800, true }, - { 81816, true }, - { 81829, true }, + { 81771, true }, + { 81781, true }, + { 81796, true }, + { 81804, true }, + { 81819, true }, + { 81830, true }, { 81841, true }, - { 81854, true }, - { 81862, true }, - { 81874, true }, - { 81883, true }, - { 81898, true }, - { 81907, true }, - { 81919, true }, - { 81929, true }, - { 81944, true }, - { 81952, true }, - { 81967, true }, - { 81978, true }, - { 81989, true }, - { 81998, true }, - { 82013, true }, - { 82027, true }, - { 82041, true }, - { 82064, true }, - { 82089, true }, - { 82108, true }, - { 82122, true }, - { 82138, true }, - { 82152, true }, - { 82168, true }, - { 82186, true }, - { 82203, true }, - { 82218, true }, - { 82233, true }, - { 82242, true }, - { 82255, true }, - { 82272, true }, - { 82282, true }, - { 82293, true }, - { 82304, true }, - { 82314, true }, - { 82326, true }, - { 82347, true }, - { 82361, false }, - { 82381, false }, - { 82393, true }, - { 82406, true }, - { 82416, true }, - { 82429, true }, - { 82442, true }, - { 82458, true }, - { 82475, true }, - { 82487, true }, - { 82501, true }, - { 82515, true }, - { 82531, true }, - { 82543, true }, - { 82564, false }, - { 82578, true }, - { 82596, true }, - { 82613, true }, - { 82625, true }, - { 82645, true }, - { 82661, true }, - { 82683, true }, - { 82705, true }, - { 82724, true }, - { 82741, true }, - { 82753, true }, - { 82766, true }, - { 82786, true }, - { 82811, true }, - { 82824, true }, - { 82839, true }, - { 82856, false }, - { 82869, true }, - { 82880, true }, - { 82896, true }, - { 82911, true }, - { 82931, true }, - { 82956, true }, - { 82972, true }, - { 82989, true }, - { 83000, true }, - { 83012, true }, - { 83026, true }, - { 83042, false }, + { 81850, true }, + { 81865, true }, + { 81879, true }, + { 81893, true }, + { 81916, true }, + { 81941, true }, + { 81960, true }, + { 81974, true }, + { 81990, true }, + { 82004, true }, + { 82020, true }, + { 82038, true }, + { 82055, true }, + { 82070, true }, + { 82085, true }, + { 82094, true }, + { 82107, true }, + { 82124, true }, + { 82137, true }, + { 82147, true }, + { 82158, true }, + { 82169, true }, + { 82179, true }, + { 82191, true }, + { 82212, true }, + { 82226, false }, + { 82246, false }, + { 82258, true }, + { 82271, true }, + { 82281, true }, + { 82294, true }, + { 82307, true }, + { 82323, true }, + { 82340, true }, + { 82352, true }, + { 82366, true }, + { 82380, true }, + { 82396, true }, + { 82408, true }, + { 82429, false }, + { 82443, true }, + { 82461, true }, + { 82478, true }, + { 82490, true }, + { 82510, true }, + { 82526, true }, + { 82548, true }, + { 82570, true }, + { 82589, true }, + { 82606, true }, + { 82618, true }, + { 82631, true }, + { 82651, true }, + { 82676, true }, + { 82689, true }, + { 82704, true }, + { 82721, false }, + { 82734, true }, + { 82745, true }, + { 82761, true }, + { 82776, true }, + { 82796, true }, + { 82821, true }, + { 82837, true }, + { 82854, true }, + { 82865, true }, + { 82877, true }, + { 82891, true }, + { 82907, false }, + { 82920, true }, + { 82933, true }, + { 82945, true }, + { 82962, true }, + { 82974, false }, + { 82983, false }, + { 82993, true }, + { 83004, true }, + { 83017, false }, + { 83030, true }, + { 83041, true }, { 83055, true }, - { 83068, true }, - { 83080, true }, - { 83097, true }, - { 83109, false }, - { 83118, false }, - { 83128, true }, - { 83139, true }, - { 83152, false }, + { 83071, true }, + { 83090, true }, + { 83103, true }, + { 83126, true }, + { 83140, true }, + { 83155, true }, { 83165, true }, - { 83176, true }, - { 83190, true }, - { 83206, true }, + { 83178, true }, + { 83193, true }, + { 83209, true }, { 83225, true }, - { 83238, true }, - { 83261, true }, - { 83275, true }, - { 83290, true }, - { 83300, true }, - { 83313, true }, - { 83328, true }, - { 83344, true }, + { 83242, true }, + { 83255, true }, + { 83267, true }, + { 83280, true }, + { 83292, true }, + { 83307, true }, + { 83324, true }, + { 83333, true }, { 83360, true }, - { 83377, true }, - { 83390, true }, - { 83402, true }, - { 83415, true }, + { 83381, true }, + { 83398, true }, + { 83409, false }, { 83427, true }, { 83442, true }, - { 83459, true }, - { 83468, true }, - { 83495, true }, - { 83516, true }, - { 83533, true }, - { 83544, false }, - { 83562, true }, - { 83577, true }, - { 83589, true }, - { 83601, true }, - { 83613, true }, - { 83632, true }, - { 83667, true }, - { 83690, true }, - { 83707, true }, - { 83720, true }, - { 83732, true }, - { 83749, false }, - { 83768, true }, - { 83786, true }, - { 83817, true }, - { 83832, true }, - { 83854, true }, - { 83866, true }, - { 83883, true }, - { 83900, true }, - { 83912, true }, - { 83931, true }, - { 83943, true }, - { 83958, true }, - { 83975, true }, - { 83992, true }, - { 84008, true }, - { 84032, true }, - { 84057, true }, - { 84079, true }, - { 84106, true }, - { 84124, true }, - { 84141, true }, - { 84156, true }, - { 84174, true }, + { 83454, true }, + { 83466, true }, + { 83478, true }, + { 83497, true }, + { 83532, true }, + { 83555, true }, + { 83572, true }, + { 83585, true }, + { 83597, true }, + { 83614, false }, + { 83633, true }, + { 83651, true }, + { 83682, true }, + { 83697, true }, + { 83719, true }, + { 83731, true }, + { 83748, true }, + { 83765, true }, + { 83777, true }, + { 83796, true }, + { 83808, true }, + { 83823, true }, + { 83840, true }, + { 83857, true }, + { 83873, true }, + { 83889, true }, + { 83913, true }, + { 83938, true }, + { 83960, true }, + { 83987, true }, + { 84005, true }, + { 84022, true }, + { 84037, true }, + { 84055, true }, + { 84076, true }, + { 84104, true }, + { 84128, true }, + { 84152, true }, + { 84165, true }, + { 84178, true }, { 84195, true }, - { 84223, true }, - { 84247, true }, - { 84271, true }, - { 84284, true }, - { 84297, true }, - { 84314, true }, - { 84329, true }, - { 84354, false }, - { 84368, true }, - { 84378, true }, - { 84397, true }, - { 84413, true }, - { 84437, true }, - { 84452, true }, - { 84469, true }, + { 84210, true }, + { 84235, false }, + { 84249, true }, + { 84259, true }, + { 84278, true }, + { 84294, true }, + { 84318, true }, + { 84333, true }, + { 84350, true }, + { 84360, true }, + { 84370, true }, + { 84382, true }, + { 84395, true }, + { 84408, true }, + { 84426, true }, + { 84439, true }, + { 84453, true }, + { 84463, true }, { 84479, true }, - { 84489, true }, - { 84501, true }, - { 84514, true }, - { 84527, true }, - { 84545, true }, - { 84558, true }, - { 84572, true }, - { 84582, true }, - { 84598, true }, - { 84611, true }, - { 84630, true }, - { 84648, true }, - { 84662, true }, - { 84672, true }, - { 84680, true }, + { 84492, true }, + { 84511, true }, + { 84529, true }, + { 84543, true }, + { 84553, true }, + { 84561, true }, + { 84571, true }, + { 84581, true }, + { 84593, true }, + { 84607, false }, + { 84620, true }, + { 84628, true }, + { 84639, true }, + { 84650, true }, + { 84658, true }, + { 84674, true }, { 84690, true }, - { 84700, true }, - { 84712, true }, - { 84726, false }, - { 84739, true }, - { 84747, true }, - { 84758, true }, - { 84769, true }, - { 84777, true }, - { 84793, true }, - { 84809, true }, - { 84816, true }, - { 84824, true }, - { 84834, true }, - { 84846, true }, - { 84860, true }, - { 84869, true }, - { 84885, true }, - { 84895, false }, - { 84913, true }, - { 84925, true }, - { 84937, false }, - { 84948, true }, - { 84961, true }, - { 84971, true }, - { 84981, true }, - { 84991, true }, - { 85001, true }, - { 85011, true }, - { 85030, true }, - { 85039, true }, - { 85050, true }, - { 85059, true }, - { 85079, true }, - { 85095, true }, - { 85103, true }, - { 85119, true }, - { 85136, true }, - { 85147, true }, - { 85159, true }, - { 85170, true }, - { 85185, true }, + { 84697, true }, + { 84705, true }, + { 84715, true }, + { 84727, true }, + { 84741, true }, + { 84750, true }, + { 84766, true }, + { 84776, false }, + { 84794, true }, + { 84806, true }, + { 84818, false }, + { 84829, true }, + { 84842, true }, + { 84852, true }, + { 84862, true }, + { 84872, true }, + { 84882, true }, + { 84892, true }, + { 84911, true }, + { 84920, true }, + { 84931, true }, + { 84940, true }, + { 84960, true }, + { 84976, true }, + { 84984, true }, + { 85000, true }, + { 85017, true }, + { 85028, true }, + { 85040, true }, + { 85051, true }, + { 85066, true }, + { 85077, true }, + { 85087, true }, + { 85096, true }, + { 85114, true }, + { 85130, true }, + { 85144, true }, + { 85172, true }, + { 85181, true }, { 85196, true }, - { 85206, true }, - { 85215, true }, - { 85233, true }, - { 85249, true }, - { 85263, true }, - { 85291, true }, - { 85300, true }, - { 85315, true }, - { 85332, true }, - { 85355, true }, - { 85374, true }, - { 85383, true }, - { 85401, true }, + { 85213, true }, + { 85236, true }, + { 85255, true }, + { 85264, true }, + { 85282, true }, + { 85297, true }, + { 85311, true }, + { 85334, true }, + { 85356, true }, + { 85366, true }, + { 85382, true }, + { 85398, true }, + { 85406, true }, { 85416, true }, - { 85430, true }, - { 85453, true }, - { 85475, true }, - { 85485, true }, - { 85501, true }, - { 85517, true }, - { 85525, true }, - { 85535, true }, - { 85547, true }, - { 85559, true }, - { 85576, true }, - { 85593, true }, - { 85625, true }, - { 85643, true }, - { 85657, true }, - { 85671, true }, - { 85689, true }, - { 85708, true }, - { 85719, true }, - { 85730, true }, - { 85748, true }, - { 85761, true }, - { 85772, true }, - { 85782, true }, - { 85794, true }, - { 85805, true }, - { 85816, true }, - { 85826, true }, - { 85835, true }, - { 85852, true }, + { 85428, true }, + { 85440, true }, + { 85457, true }, + { 85474, true }, + { 85506, true }, + { 85524, true }, + { 85538, true }, + { 85552, true }, + { 85570, true }, + { 85589, true }, + { 85600, true }, + { 85611, true }, + { 85629, true }, + { 85642, true }, + { 85653, true }, + { 85663, true }, + { 85675, true }, + { 85686, true }, + { 85697, true }, + { 85707, true }, + { 85716, true }, + { 85733, true }, + { 85752, true }, + { 85765, true }, + { 85778, true }, + { 85797, true }, + { 85814, true }, + { 85839, true }, { 85871, true }, - { 85884, true }, + { 85885, true }, { 85897, true }, - { 85916, true }, - { 85933, true }, - { 85965, true }, - { 85979, true }, - { 85991, true }, + { 85921, true }, + { 85944, true }, + { 85969, true }, + { 85982, true }, + { 86001, true }, { 86015, true }, - { 86038, true }, + { 86028, true }, + { 86043, false }, { 86063, true }, { 86076, true }, - { 86095, true }, - { 86109, true }, - { 86122, true }, - { 86137, false }, - { 86157, true }, - { 86170, true }, - { 86187, true }, - { 86202, true }, - { 86219, true }, - { 86228, true }, - { 86237, true }, - { 86253, true }, - { 86273, true }, - { 86292, true }, - { 86301, true }, - { 86312, true }, - { 86321, true }, - { 86334, true }, + { 86093, true }, + { 86108, true }, + { 86125, true }, + { 86134, true }, + { 86143, true }, + { 86159, true }, + { 86179, true }, + { 86198, true }, + { 86207, true }, + { 86218, true }, + { 86227, true }, + { 86240, true }, + { 86249, true }, + { 86262, true }, + { 86272, true }, + { 86285, true }, + { 86298, true }, + { 86309, true }, + { 86320, true }, + { 86329, true }, { 86343, true }, - { 86356, true }, - { 86366, true }, - { 86379, true }, - { 86392, true }, - { 86403, true }, - { 86414, true }, - { 86423, true }, - { 86437, true }, - { 86454, true }, - { 86471, true }, - { 86480, true }, - { 86495, true }, - { 86510, true }, - { 86529, true }, - { 86541, true }, - { 86554, false }, - { 86567, true }, - { 86576, true }, + { 86360, true }, + { 86377, true }, + { 86386, true }, + { 86401, true }, + { 86416, true }, + { 86435, true }, + { 86447, true }, + { 86460, false }, + { 86473, true }, + { 86482, true }, + { 86496, true }, + { 86519, false }, + { 86531, true }, + { 86542, true }, + { 86559, true }, + { 86573, true }, { 86590, true }, - { 86613, false }, - { 86625, true }, - { 86636, true }, - { 86653, true }, - { 86667, true }, - { 86684, true }, - { 86705, true }, - { 86716, true }, - { 86727, true }, - { 86734, true }, - { 86745, true }, - { 86752, true }, - { 86762, true }, - { 86774, true }, - { 86784, true }, - { 86793, true }, - { 86806, true }, - { 86818, true }, - { 86832, true }, - { 86846, true }, - { 86853, true }, - { 86860, true }, - { 86867, true }, - { 86876, true }, - { 86884, true }, + { 86611, true }, + { 86622, true }, + { 86633, true }, + { 86640, true }, + { 86651, true }, + { 86658, true }, + { 86668, true }, + { 86680, true }, + { 86690, true }, + { 86699, true }, + { 86712, true }, + { 86724, true }, + { 86741, true }, + { 86755, true }, + { 86769, true }, + { 86776, true }, + { 86783, true }, + { 86790, true }, + { 86799, true }, + { 86807, true }, + { 86817, true }, + { 86835, true }, + { 86849, true }, + { 86861, true }, + { 86872, true }, + { 86883, true }, { 86894, true }, - { 86912, true }, - { 86926, true }, - { 86938, true }, - { 86949, true }, - { 86960, true }, - { 86971, true }, - { 86984, true }, - { 86995, true }, - { 87004, true }, - { 87021, true }, - { 87032, true }, - { 87039, true }, - { 87046, true }, - { 87060, true }, - { 87068, true }, - { 87075, true }, - { 87086, false }, + { 86907, true }, + { 86918, true }, + { 86927, true }, + { 86944, true }, + { 86955, true }, + { 86962, true }, + { 86969, true }, + { 86983, true }, + { 86991, true }, + { 86998, true }, + { 87009, true }, + { 87029, true }, + { 87042, true }, + { 87055, true }, + { 87065, true }, + { 87078, true }, + { 87093, true }, { 87106, true }, - { 87119, true }, - { 87132, true }, - { 87142, true }, - { 87155, true }, - { 87170, true }, - { 87183, true }, - { 87192, true }, - { 87211, false }, - { 87223, true }, - { 87236, true }, - { 87251, true }, - { 87270, true }, - { 87283, true }, - { 87298, true }, - { 87311, true }, - { 87321, true }, - { 87334, true }, - { 87351, true }, - { 87365, false }, - { 87384, true }, - { 87399, true }, + { 87115, true }, + { 87134, false }, + { 87146, true }, + { 87159, true }, + { 87174, true }, + { 87193, true }, + { 87206, true }, + { 87221, true }, + { 87234, true }, + { 87244, true }, + { 87257, true }, + { 87274, true }, + { 87288, false }, + { 87307, true }, + { 87322, true }, + { 87336, true }, + { 87352, true }, + { 87368, true }, + { 87388, true }, + { 87397, true }, { 87413, true }, - { 87429, true }, - { 87445, true }, - { 87465, true }, - { 87474, true }, - { 87490, true }, - { 87505, true }, - { 87521, true }, - { 87541, true }, - { 87560, true }, - { 87577, true }, - { 87593, true }, - { 87613, true }, - { 87626, true }, - { 87640, false }, - { 87653, true }, - { 87663, true }, - { 87680, true }, - { 87695, true }, - { 87718, true }, - { 87735, true }, - { 87750, true }, - { 87767, true }, - { 87781, true }, - { 87796, true }, - { 87805, true }, + { 87428, true }, + { 87444, true }, + { 87464, true }, + { 87483, true }, + { 87500, true }, + { 87516, true }, + { 87536, true }, + { 87549, true }, + { 87563, false }, + { 87576, true }, + { 87586, true }, + { 87603, true }, + { 87618, true }, + { 87641, true }, + { 87658, true }, + { 87673, true }, + { 87690, true }, + { 87704, true }, + { 87719, true }, + { 87728, true }, + { 87743, true }, + { 87757, true }, + { 87768, true }, + { 87778, true }, + { 87793, true }, + { 87807, true }, { 87820, true }, - { 87834, true }, + { 87831, true }, { 87845, true }, { 87855, true }, - { 87870, true }, - { 87884, true }, - { 87897, true }, - { 87908, true }, - { 87922, true }, - { 87932, true }, - { 87944, true }, - { 87962, true }, - { 87976, true }, - { 87988, false }, - { 88003, true }, - { 88022, true }, - { 88033, true }, - { 88045, true }, - { 88063, true }, - { 88076, true }, + { 87867, true }, + { 87885, true }, + { 87899, true }, + { 87911, false }, + { 87926, true }, + { 87945, true }, + { 87956, true }, + { 87968, true }, + { 87986, true }, + { 87999, true }, + { 88016, true }, + { 88035, true }, + { 88052, true }, + { 88074, true }, { 88093, true }, - { 88112, true }, - { 88129, true }, - { 88147, true }, - { 88169, true }, - { 88188, true }, - { 88201, true }, - { 88217, true }, - { 88232, true }, - { 88240, true }, - { 88253, true }, - { 88267, true }, - { 88281, true }, - { 88292, true }, - { 88302, true }, - { 88320, true }, - { 88338, true }, - { 88351, true }, - { 88359, true }, + { 88106, true }, + { 88122, true }, + { 88137, true }, + { 88145, true }, + { 88158, true }, + { 88172, true }, + { 88186, true }, + { 88197, true }, + { 88207, true }, + { 88225, true }, + { 88243, true }, + { 88256, true }, + { 88264, true }, + { 88272, true }, + { 88285, true }, + { 88297, true }, + { 88308, true }, + { 88318, true }, + { 88326, true }, + { 88342, true }, + { 88358, true }, { 88367, true }, - { 88380, true }, + { 88379, true }, { 88392, true }, - { 88403, true }, - { 88413, true }, - { 88421, true }, - { 88437, true }, - { 88453, true }, - { 88462, true }, - { 88474, true }, - { 88487, true }, - { 88501, true }, - { 88520, true }, - { 88534, true }, - { 88547, true }, + { 88406, true }, + { 88425, true }, + { 88439, true }, + { 88452, true }, + { 88468, false }, + { 88485, true }, + { 88506, true }, + { 88525, true }, + { 88544, true }, { 88563, false }, - { 88580, true }, - { 88601, true }, - { 88620, true }, - { 88639, true }, - { 88658, false }, - { 88674, true }, - { 88689, true }, - { 88699, true }, - { 88709, true }, - { 88718, true }, - { 88731, true }, - { 88741, false }, - { 88759, true }, - { 88781, true }, - { 88798, true }, - { 88814, false }, - { 88832, true }, - { 88843, true }, - { 88859, true }, - { 88877, true }, - { 88892, false }, - { 88906, true }, - { 88923, true }, - { 88941, true }, + { 88579, true }, + { 88594, true }, + { 88604, true }, + { 88614, true }, + { 88623, true }, + { 88636, true }, + { 88646, false }, + { 88664, true }, + { 88686, true }, + { 88703, true }, + { 88719, false }, + { 88737, true }, + { 88748, true }, + { 88764, true }, + { 88782, true }, + { 88797, false }, + { 88811, true }, + { 88828, true }, + { 88846, true }, + { 88865, true }, + { 88876, true }, + { 88892, true }, + { 88909, true }, + { 88925, true }, + { 88943, true }, { 88960, true }, - { 88971, true }, - { 88987, true }, - { 89004, true }, - { 89020, true }, - { 89038, true }, - { 89055, true }, - { 89077, false }, - { 89094, true }, - { 89110, true }, - { 89124, true }, - { 89136, false }, - { 89151, true }, - { 89163, true }, - { 89171, true }, - { 89184, true }, - { 89199, true }, - { 89214, true }, - { 89224, true }, - { 89233, true }, - { 89243, true }, - { 89253, true }, - { 89267, false }, - { 89280, true }, - { 89288, true }, - { 89297, true }, - { 89306, true }, - { 89316, true }, + { 88982, false }, + { 88999, true }, + { 89015, true }, + { 89029, true }, + { 89041, false }, + { 89056, true }, + { 89068, true }, + { 89076, true }, + { 89089, true }, + { 89104, true }, + { 89119, true }, + { 89129, true }, + { 89138, true }, + { 89148, true }, + { 89158, true }, + { 89172, false }, + { 89185, true }, + { 89193, true }, + { 89202, true }, + { 89211, true }, + { 89221, true }, + { 89230, true }, + { 89250, false }, + { 89260, true }, + { 89276, true }, + { 89289, true }, + { 89302, true }, + { 89309, true }, { 89325, true }, - { 89345, false }, - { 89355, true }, - { 89371, true }, - { 89384, true }, - { 89397, true }, - { 89404, true }, - { 89420, true }, - { 89433, true }, - { 89446, true }, - { 89459, true }, - { 89474, true }, - { 89486, true }, - { 89493, true }, - { 89500, true }, - { 89509, true }, - { 89518, true }, - { 89527, true }, - { 89538, true }, - { 89552, true }, - { 89565, true }, - { 89573, true }, - { 89585, true }, - { 89599, true }, - { 89610, true }, - { 89626, true }, - { 89640, true }, - { 89655, true }, - { 89665, false }, - { 89679, true }, - { 89689, true }, - { 89704, false }, - { 89720, true }, - { 89739, true }, - { 89751, true }, - { 89764, true }, - { 89783, true }, - { 89807, false }, - { 89820, true }, - { 89836, true }, - { 89850, true }, - { 89865, true }, - { 89882, true }, - { 89899, true }, - { 89909, true }, - { 89924, true }, - { 89938, true }, - { 89951, true }, - { 89966, true }, - { 89982, true }, - { 89996, true }, - { 90011, true }, - { 90025, true }, - { 90040, true }, - { 90059, true }, - { 90074, true }, - { 90089, true }, + { 89338, true }, + { 89351, true }, + { 89364, true }, + { 89379, true }, + { 89391, true }, + { 89398, true }, + { 89405, true }, + { 89414, true }, + { 89423, true }, + { 89432, true }, + { 89443, true }, + { 89457, true }, + { 89470, true }, + { 89478, true }, + { 89490, true }, + { 89504, true }, + { 89515, true }, + { 89531, true }, + { 89545, true }, + { 89560, true }, + { 89570, false }, + { 89584, true }, + { 89594, true }, + { 89609, false }, + { 89625, true }, + { 89644, true }, + { 89656, true }, + { 89669, true }, + { 89688, true }, + { 89712, false }, + { 89725, true }, + { 89741, true }, + { 89755, true }, + { 89770, true }, + { 89787, true }, + { 89804, true }, + { 89814, true }, + { 89829, true }, + { 89843, true }, + { 89856, true }, + { 89871, true }, + { 89887, true }, + { 89901, true }, + { 89916, true }, + { 89930, true }, + { 89945, true }, + { 89964, true }, + { 89979, true }, + { 89994, true }, + { 90012, true }, + { 90031, true }, + { 90044, true }, + { 90057, true }, + { 90080, true }, + { 90096, true }, { 90107, true }, - { 90126, true }, - { 90139, true }, - { 90152, true }, - { 90175, true }, - { 90191, true }, - { 90202, true }, - { 90215, true }, - { 90230, true }, - { 90245, true }, - { 90261, true }, - { 90276, true }, - { 90292, true }, - { 90309, true }, - { 90321, true }, - { 90331, true }, - { 90349, true }, - { 90359, true }, - { 90370, true }, - { 90380, true }, - { 90393, true }, - { 90421, true }, - { 90432, true }, - { 90443, true }, - { 90454, true }, - { 90471, true }, - { 90485, false }, - { 90502, true }, - { 90516, true }, - { 90533, true }, - { 90550, true }, - { 90562, true }, - { 90576, true }, - { 90588, true }, - { 90604, true }, - { 90630, true }, - { 90640, true }, - { 90653, true }, - { 90663, true }, - { 90671, true }, + { 90120, true }, + { 90135, true }, + { 90150, true }, + { 90166, true }, + { 90182, true }, + { 90199, true }, + { 90211, true }, + { 90221, true }, + { 90239, true }, + { 90249, true }, + { 90260, true }, + { 90270, true }, + { 90283, true }, + { 90311, true }, + { 90322, true }, + { 90333, true }, + { 90344, true }, + { 90361, true }, + { 90375, false }, + { 90392, true }, + { 90406, true }, + { 90423, true }, + { 90440, true }, + { 90452, true }, + { 90466, true }, + { 90478, true }, + { 90494, true }, + { 90520, true }, + { 90530, true }, + { 90543, true }, + { 90553, true }, + { 90561, true }, + { 90572, true }, + { 90587, true }, + { 90605, true }, + { 90621, true }, + { 90635, true }, + { 90652, true }, + { 90672, true }, { 90682, true }, - { 90697, true }, - { 90715, true }, - { 90731, true }, - { 90745, true }, + { 90698, true }, + { 90711, true }, + { 90721, false }, + { 90735, true }, + { 90746, true }, { 90762, true }, - { 90782, true }, - { 90792, true }, - { 90808, true }, - { 90821, true }, - { 90831, false }, - { 90845, true }, - { 90856, true }, - { 90872, true }, - { 90880, true }, - { 90890, true }, - { 90905, true }, - { 90921, true }, - { 90940, true }, - { 90953, true }, - { 90968, true }, + { 90770, true }, + { 90780, true }, + { 90795, true }, + { 90811, true }, + { 90830, true }, + { 90843, true }, + { 90863, true }, + { 90878, true }, + { 90896, true }, + { 90909, true }, + { 90919, true }, + { 90936, true }, + { 90951, true }, + { 90962, true }, + { 90973, true }, { 90986, true }, - { 90999, true }, - { 91009, true }, - { 91026, true }, - { 91041, true }, - { 91052, true }, - { 91063, true }, + { 90994, true }, + { 91003, true }, + { 91014, true }, + { 91028, true }, + { 91051, true }, + { 91064, true }, { 91076, true }, - { 91084, true }, - { 91093, true }, - { 91104, true }, - { 91118, true }, - { 91141, true }, - { 91154, true }, - { 91166, true }, - { 91177, true }, - { 91191, true }, - { 91219, true }, - { 91234, true }, - { 91258, true }, - { 91273, true }, - { 91293, true }, - { 91306, true }, + { 91087, true }, + { 91101, true }, + { 91129, true }, + { 91144, true }, + { 91168, true }, + { 91183, true }, + { 91203, true }, + { 91216, true }, + { 91232, true }, + { 91247, true }, + { 91260, true }, + { 91274, true }, + { 91285, true }, + { 91296, true }, + { 91310, true }, { 91322, true }, - { 91337, true }, - { 91350, true }, - { 91364, true }, + { 91339, true }, + { 91352, true }, + { 91367, true }, { 91375, true }, - { 91386, true }, - { 91400, true }, - { 91412, true }, - { 91429, true }, - { 91442, true }, - { 91457, true }, - { 91465, true }, - { 91485, true }, - { 91496, true }, - { 91506, true }, - { 91517, true }, - { 91527, true }, + { 91395, true }, + { 91406, true }, + { 91416, true }, + { 91427, true }, + { 91437, true }, + { 91449, true }, + { 91464, true }, + { 91473, true }, + { 91487, true }, + { 91500, true }, + { 91510, true }, + { 91525, true }, { 91539, true }, - { 91554, true }, - { 91563, true }, - { 91577, true }, - { 91590, true }, - { 91600, true }, - { 91615, true }, - { 91629, true }, - { 91640, true }, - { 91655, false }, - { 91665, true }, - { 91684, true }, - { 91697, true }, - { 91706, true }, - { 91717, true }, - { 91731, true }, - { 91751, true }, - { 91767, true }, - { 91778, true }, - { 91794, true }, - { 91811, true }, - { 91826, true }, - { 91839, true }, - { 91856, true }, - { 91866, true }, - { 91874, true }, - { 91885, true }, - { 91895, true }, - { 91908, true }, - { 91922, true }, - { 91934, true }, - { 91944, true }, + { 91550, true }, + { 91565, false }, + { 91575, true }, + { 91594, true }, + { 91607, true }, + { 91616, true }, + { 91627, true }, + { 91641, true }, + { 91661, true }, + { 91677, true }, + { 91688, true }, + { 91704, true }, + { 91721, true }, + { 91736, true }, + { 91749, true }, + { 91766, true }, + { 91776, true }, + { 91784, true }, + { 91795, true }, + { 91805, true }, + { 91818, true }, + { 91832, true }, + { 91844, true }, + { 91854, true }, + { 91862, true }, + { 91881, true }, + { 91901, true }, + { 91910, true }, + { 91924, true }, + { 91938, true }, { 91952, true }, - { 91971, true }, - { 91991, true }, - { 92000, true }, - { 92014, true }, - { 92028, true }, - { 92042, true }, - { 92084, true }, - { 92100, true }, - { 92109, true }, - { 92121, true }, - { 92133, true }, - { 92146, true }, - { 92159, true }, - { 92177, true }, + { 91994, true }, + { 92010, true }, + { 92019, true }, + { 92031, true }, + { 92043, true }, + { 92056, true }, + { 92069, true }, + { 92087, true }, + { 92095, true }, + { 92108, true }, + { 92118, true }, + { 92130, true }, + { 92141, true }, + { 92158, true }, + { 92173, true }, { 92185, true }, { 92198, true }, - { 92208, true }, - { 92220, true }, - { 92231, true }, - { 92248, true }, - { 92263, true }, - { 92275, true }, - { 92288, true }, - { 92300, true }, - { 92315, true }, - { 92328, true }, - { 92340, true }, - { 92350, true }, - { 92366, true }, - { 92384, true }, - { 92399, true }, - { 92413, true }, - { 92431, true }, - { 92449, true }, - { 92461, true }, + { 92210, true }, + { 92225, true }, + { 92238, true }, + { 92250, true }, + { 92260, true }, + { 92276, true }, + { 92294, true }, + { 92309, true }, + { 92323, true }, + { 92341, true }, + { 92359, true }, + { 92371, true }, + { 92389, true }, + { 92400, true }, + { 92414, true }, + { 92434, true }, + { 92447, true }, + { 92459, true }, { 92479, true }, { 92490, true }, - { 92504, true }, - { 92524, true }, - { 92537, true }, - { 92549, true }, - { 92569, true }, - { 92580, true }, + { 92499, true }, + { 92508, true }, + { 92515, true }, + { 92530, true }, + { 92545, true }, + { 92559, true }, + { 92578, true }, { 92589, true }, - { 92598, true }, - { 92605, true }, - { 92620, true }, - { 92635, true }, - { 92649, true }, - { 92668, true }, - { 92679, true }, - { 92693, true }, - { 92705, true }, - { 92718, true }, - { 92731, true }, - { 92742, true }, - { 92755, true }, - { 92767, true }, - { 92790, true }, + { 92603, true }, + { 92615, true }, + { 92628, true }, + { 92641, true }, + { 92652, true }, + { 92665, true }, + { 92677, true }, + { 92700, true }, + { 92709, true }, + { 92726, true }, + { 92739, true }, + { 92751, true }, + { 92762, true }, + { 92777, true }, + { 92791, true }, { 92799, true }, - { 92816, true }, - { 92829, true }, - { 92841, true }, - { 92852, true }, - { 92867, true }, - { 92881, true }, - { 92889, true }, - { 92903, true }, - { 92917, true }, - { 92925, true }, - { 92938, true }, - { 92949, true }, - { 92961, false }, - { 92974, true }, - { 92985, true }, - { 93009, true }, - { 93017, true }, - { 93027, true }, - { 93037, true }, - { 93054, true }, - { 93072, true }, - { 93090, true }, - { 93104, true }, - { 93114, true }, - { 93138, true }, - { 93152, true }, - { 93171, true }, - { 93183, true }, - { 93202, true }, - { 93219, true }, - { 93229, true }, - { 93244, true }, - { 93256, true }, + { 92813, true }, + { 92827, true }, + { 92835, true }, + { 92848, true }, + { 92859, true }, + { 92871, false }, + { 92884, true }, + { 92895, true }, + { 92919, true }, + { 92927, true }, + { 92937, true }, + { 92947, true }, + { 92964, true }, + { 92982, true }, + { 93000, true }, + { 93014, true }, + { 93024, true }, + { 93048, true }, + { 93062, true }, + { 93081, true }, + { 93093, true }, + { 93112, true }, + { 93129, true }, + { 93139, true }, + { 93154, true }, + { 93166, true }, + { 93178, true }, + { 93191, true }, + { 93200, true }, + { 93209, true }, + { 93228, true }, + { 93240, true }, { 93268, true }, - { 93281, true }, - { 93290, true }, - { 93299, true }, - { 93318, true }, - { 93330, true }, - { 93358, true }, - { 93385, true }, - { 93411, true }, + { 93295, true }, + { 93321, true }, + { 93346, true }, + { 93356, true }, + { 93365, true }, + { 93380, true }, + { 93395, false }, + { 93413, true }, + { 93424, true }, { 93436, true }, - { 93446, true }, - { 93455, true }, - { 93470, true }, - { 93485, false }, - { 93503, true }, - { 93514, true }, - { 93526, true }, - { 93542, true }, - { 93556, true }, - { 93571, true }, - { 93587, true }, - { 93613, true }, - { 93624, true }, - { 93639, true }, - { 93654, true }, - { 93669, true }, - { 93687, true }, - { 93702, true }, - { 93715, true }, - { 93731, true }, - { 93754, true }, + { 93452, true }, + { 93466, true }, + { 93481, true }, + { 93497, true }, + { 93523, true }, + { 93534, true }, + { 93549, true }, + { 93564, true }, + { 93579, true }, + { 93597, true }, + { 93612, true }, + { 93625, true }, + { 93641, true }, + { 93664, true }, + { 93677, true }, + { 93690, true }, + { 93703, true }, + { 93722, true }, + { 93738, true }, + { 93753, true }, { 93767, true }, - { 93780, true }, - { 93793, true }, - { 93812, true }, - { 93828, true }, - { 93843, true }, - { 93857, true }, - { 93869, false }, - { 93888, true }, - { 93903, true }, - { 93921, true }, - { 93932, true }, - { 93944, true }, - { 93955, true }, - { 93968, true }, - { 93991, true }, - { 94006, true }, - { 94020, true }, - { 94037, false }, - { 94051, true }, + { 93779, false }, + { 93798, true }, + { 93813, true }, + { 93831, true }, + { 93842, true }, + { 93854, true }, + { 93865, true }, + { 93878, true }, + { 93901, true }, + { 93916, true }, + { 93930, true }, + { 93947, false }, + { 93961, true }, + { 93972, true }, + { 93988, true }, + { 94001, true }, + { 94011, true }, + { 94022, true }, + { 94030, true }, + { 94047, true }, { 94062, true }, - { 94078, true }, - { 94091, true }, - { 94101, true }, - { 94112, true }, - { 94120, true }, - { 94137, true }, - { 94152, true }, - { 94162, true }, - { 94172, true }, - { 94183, true }, - { 94194, true }, - { 94214, true }, - { 94229, true }, - { 94246, true }, - { 94260, true }, - { 94270, true }, + { 94072, true }, + { 94082, true }, + { 94093, true }, + { 94104, true }, + { 94124, true }, + { 94139, true }, + { 94156, true }, + { 94170, true }, + { 94180, true }, + { 94191, true }, + { 94210, true }, + { 94221, true }, + { 94243, true }, + { 94257, true }, + { 94268, true }, { 94281, true }, - { 94300, true }, - { 94311, true }, - { 94333, true }, - { 94347, true }, - { 94358, true }, - { 94371, true }, - { 94381, true }, - { 94399, true }, - { 94416, true }, - { 94430, true }, - { 94442, true }, - { 94458, true }, - { 94469, true }, + { 94291, true }, + { 94309, true }, + { 94326, true }, + { 94340, true }, + { 94352, true }, + { 94368, true }, + { 94379, true }, + { 94389, true }, + { 94409, true }, + { 94436, true }, + { 94452, true }, + { 94467, true }, { 94479, true }, - { 94499, true }, - { 94526, true }, - { 94542, true }, - { 94557, true }, - { 94569, true }, - { 94585, true }, - { 94597, true }, - { 94614, true }, - { 94624, true }, - { 94641, true }, - { 94658, true }, - { 94670, true }, - { 94683, false }, + { 94495, true }, + { 94507, true }, + { 94524, true }, + { 94534, true }, + { 94551, true }, + { 94568, true }, + { 94580, true }, + { 94593, false }, + { 94607, true }, + { 94630, false }, + { 94644, true }, + { 94656, true }, + { 94667, true }, + { 94679, true }, { 94697, true }, - { 94720, false }, - { 94734, true }, - { 94746, true }, - { 94757, true }, - { 94769, true }, - { 94787, true }, - { 94800, true }, - { 94815, true }, - { 94833, true }, - { 94843, true }, - { 94855, true }, - { 94865, true }, - { 94874, true }, - { 94886, true }, - { 94900, true }, - { 94921, true }, - { 94935, true }, - { 94949, true }, - { 94967, true }, - { 94985, true }, - { 94997, true }, - { 95009, true }, - { 95017, true }, - { 95031, true }, - { 95046, true }, - { 95060, true }, - { 95069, true }, - { 95079, true }, - { 95091, true }, - { 95103, true }, - { 95126, true }, - { 95139, true }, - { 95147, true }, - { 95158, true }, - { 95167, true }, - { 95175, true }, - { 95188, true }, - { 95211, true }, - { 95223, true }, - { 95239, true }, - { 95262, true }, + { 94710, true }, + { 94725, true }, + { 94743, true }, + { 94753, true }, + { 94765, true }, + { 94775, true }, + { 94784, true }, + { 94796, true }, + { 94810, true }, + { 94831, true }, + { 94845, true }, + { 94859, true }, + { 94877, true }, + { 94895, true }, + { 94907, true }, + { 94919, true }, + { 94927, true }, + { 94941, true }, + { 94956, true }, + { 94970, true }, + { 94979, true }, + { 94989, true }, + { 95001, true }, + { 95013, true }, + { 95036, true }, + { 95049, true }, + { 95057, true }, + { 95068, true }, + { 95077, true }, + { 95085, true }, + { 95098, true }, + { 95121, true }, + { 95133, true }, + { 95149, true }, + { 95172, true }, + { 95183, true }, + { 95199, true }, + { 95215, true }, + { 95230, true }, + { 95243, true }, + { 95253, true }, + { 95260, true }, { 95273, true }, - { 95289, true }, - { 95305, true }, - { 95320, true }, - { 95333, true }, - { 95343, true }, - { 95350, true }, - { 95363, true }, - { 95386, true }, - { 95403, true }, - { 95421, true }, - { 95450, true }, - { 95467, true }, - { 95477, true }, - { 95491, true }, - { 95503, true }, + { 95296, true }, + { 95313, true }, + { 95331, true }, + { 95360, true }, + { 95377, true }, + { 95387, true }, + { 95401, true }, + { 95413, true }, + { 95422, true }, + { 95438, false }, + { 95453, true }, + { 95466, true }, + { 95484, true }, + { 95502, true }, { 95512, true }, - { 95528, false }, - { 95543, true }, - { 95556, true }, + { 95520, true }, + { 95530, true }, + { 95540, true }, + { 95548, true }, + { 95560, true }, { 95574, true }, { 95592, true }, - { 95602, true }, - { 95610, true }, - { 95620, true }, - { 95630, true }, - { 95638, true }, + { 95601, true }, + { 95612, true }, + { 95627, true }, + { 95635, true }, { 95650, true }, - { 95664, true }, - { 95682, true }, - { 95691, true }, - { 95702, true }, - { 95717, true }, - { 95725, true }, - { 95740, true }, - { 95758, true }, - { 95770, true }, - { 95780, true }, - { 95791, true }, - { 95803, true }, - { 95814, false }, - { 95830, false }, - { 95851, true }, - { 95868, true }, - { 95886, true }, - { 95903, true }, - { 95920, true }, - { 95934, true }, - { 95942, true }, + { 95668, true }, + { 95680, true }, + { 95690, true }, + { 95701, true }, + { 95713, true }, + { 95724, false }, + { 95740, false }, + { 95761, true }, + { 95778, true }, + { 95796, true }, + { 95813, true }, + { 95830, true }, + { 95844, true }, + { 95852, true }, + { 95865, true }, + { 95883, true }, + { 95907, true }, + { 95924, true }, + { 95939, true }, { 95955, true }, - { 95973, true }, - { 95997, true }, - { 96014, true }, - { 96029, true }, + { 95969, true }, + { 95981, true }, + { 95992, true }, + { 96003, true }, + { 96013, true }, + { 96024, false }, { 96045, true }, - { 96059, true }, - { 96071, true }, + { 96056, true }, + { 96070, true }, { 96082, true }, - { 96093, true }, - { 96103, true }, - { 96114, false }, - { 96135, true }, - { 96146, true }, - { 96160, true }, - { 96172, true }, - { 96186, true }, - { 96204, true }, - { 96218, true }, - { 96229, true }, - { 96246, true }, - { 96257, true }, - { 96267, true }, - { 96287, true }, - { 96298, true }, - { 96312, true }, - { 96326, true }, + { 96096, true }, + { 96114, true }, + { 96128, true }, + { 96139, true }, + { 96156, true }, + { 96167, true }, + { 96177, true }, + { 96197, true }, + { 96208, true }, + { 96222, true }, + { 96236, true }, + { 96249, true }, + { 96260, true }, + { 96279, true }, + { 96292, true }, + { 96300, true }, + { 96314, true }, + { 96327, true }, { 96339, true }, - { 96350, true }, - { 96369, true }, - { 96382, true }, - { 96390, true }, - { 96404, true }, - { 96417, true }, - { 96429, true }, - { 96442, true }, - { 96454, true }, - { 96466, true }, - { 96481, true }, - { 96491, true }, - { 96506, true }, + { 96352, true }, + { 96364, true }, + { 96376, true }, + { 96391, true }, + { 96401, true }, + { 96416, true }, + { 96430, true }, + { 96443, true }, + { 96453, false }, + { 96464, true }, + { 96474, true }, + { 96485, true }, + { 96496, true }, + { 96507, true }, { 96520, true }, - { 96533, true }, - { 96543, false }, + { 96532, true }, + { 96544, true }, { 96554, true }, - { 96564, true }, - { 96575, true }, - { 96586, true }, - { 96597, true }, - { 96610, true }, - { 96622, true }, - { 96634, true }, - { 96644, true }, - { 96652, true }, - { 96674, true }, - { 96686, true }, - { 96695, true }, - { 96704, true }, - { 96716, true }, - { 96728, true }, - { 96738, true }, - { 96749, true }, - { 96759, true }, - { 96772, false }, - { 96783, true }, - { 96796, false }, - { 96821, true }, - { 96833, true }, - { 96843, true }, - { 96852, true }, - { 96869, true }, - { 96887, true }, - { 96899, true }, - { 96907, true }, - { 96926, true }, - { 96939, true }, - { 96953, true }, - { 96963, true }, - { 96975, true }, - { 96999, true }, - { 97013, true }, - { 97031, true }, - { 97049, true }, - { 97067, true }, - { 97086, true }, - { 97096, true }, - { 97110, true }, - { 97123, true }, + { 96562, true }, + { 96584, true }, + { 96596, true }, + { 96605, true }, + { 96614, true }, + { 96626, true }, + { 96638, true }, + { 96648, true }, + { 96659, true }, + { 96669, true }, + { 96682, false }, + { 96693, true }, + { 96706, false }, + { 96731, true }, + { 96743, true }, + { 96753, true }, + { 96762, true }, + { 96779, true }, + { 96797, true }, + { 96809, true }, + { 96817, true }, + { 96836, true }, + { 96849, true }, + { 96863, true }, + { 96873, true }, + { 96885, true }, + { 96909, true }, + { 96923, true }, + { 96941, true }, + { 96959, true }, + { 96973, true }, + { 96991, true }, + { 97010, true }, + { 97020, true }, + { 97034, true }, + { 97047, true }, + { 97057, true }, + { 97070, true }, + { 97079, true }, + { 97090, true }, + { 97102, true }, + { 97115, true }, + { 97125, true }, { 97133, true }, - { 97146, true }, - { 97155, true }, - { 97166, true }, - { 97178, true }, - { 97191, true }, - { 97201, true }, - { 97209, true }, - { 97221, true }, - { 97233, true }, - { 97248, true }, - { 97256, true }, + { 97145, true }, + { 97157, true }, + { 97172, true }, + { 97180, true }, + { 97192, true }, + { 97207, true }, + { 97216, true }, + { 97222, true }, + { 97234, true }, + { 97244, true }, + { 97253, false }, { 97268, true }, - { 97283, true }, - { 97292, true }, - { 97298, true }, - { 97310, true }, - { 97320, true }, - { 97329, false }, - { 97344, true }, - { 97362, true }, - { 97375, true }, - { 97389, true }, - { 97401, true }, - { 97415, true }, + { 97286, true }, + { 97299, true }, + { 97313, true }, + { 97325, true }, + { 97339, true }, + { 97352, true }, + { 97363, true }, + { 97372, true }, + { 97382, true }, + { 97395, true }, + { 97403, true }, + { 97416, true }, { 97428, true }, - { 97439, true }, - { 97448, true }, - { 97458, true }, - { 97471, true }, - { 97479, true }, - { 97492, true }, - { 97504, true }, - { 97517, true }, + { 97441, true }, + { 97461, true }, + { 97480, true }, + { 97497, true }, + { 97509, true }, + { 97524, true }, { 97537, true }, - { 97556, true }, - { 97573, true }, - { 97585, true }, - { 97600, true }, - { 97613, true }, - { 97621, true }, - { 97633, true }, - { 97652, true }, - { 97660, true }, - { 97679, true }, - { 97695, true }, - { 97706, true }, - { 97721, true }, - { 97731, true }, - { 97745, true }, - { 97756, true }, - { 97775, true }, - { 97784, false }, - { 97795, true }, - { 97803, true }, - { 97811, true }, - { 97819, true }, - { 97827, true }, - { 97838, true }, + { 97545, true }, + { 97557, true }, + { 97576, true }, + { 97584, true }, + { 97603, true }, + { 97619, true }, + { 97630, true }, + { 97645, true }, + { 97655, true }, + { 97669, true }, + { 97680, true }, + { 97699, true }, + { 97708, false }, + { 97719, true }, + { 97727, true }, + { 97735, true }, + { 97743, true }, + { 97751, true }, + { 97762, true }, + { 97774, true }, + { 97786, false }, + { 97800, true }, + { 97814, true }, + { 97825, true }, + { 97834, true }, { 97850, true }, - { 97862, false }, - { 97876, true }, - { 97890, true }, - { 97901, true }, - { 97910, true }, - { 97926, true }, - { 97948, true }, - { 97960, true }, - { 97967, true }, - { 97979, true }, - { 97989, true }, - { 97999, true }, - { 98011, true }, - { 98029, true }, - { 98039, true }, - { 98062, true }, - { 98117, true }, - { 98132, true }, - { 98142, true }, - { 98160, true }, - { 98175, true }, - { 98188, false }, + { 97872, true }, + { 97884, true }, + { 97891, true }, + { 97903, true }, + { 97913, true }, + { 97923, true }, + { 97935, true }, + { 97953, true }, + { 97963, true }, + { 97986, true }, + { 98041, true }, + { 98056, true }, + { 98066, true }, + { 98084, true }, + { 98099, true }, + { 98112, false }, + { 98126, true }, + { 98140, false }, + { 98156, true }, + { 98181, true }, + { 98191, true }, { 98202, true }, - { 98216, false }, - { 98232, true }, - { 98257, true }, - { 98267, true }, - { 98278, true }, - { 98290, true }, - { 98312, true }, - { 98335, true }, - { 98345, true }, - { 98355, false }, - { 98369, true }, - { 98387, true }, - { 98398, true }, - { 98409, true }, - { 98428, true }, - { 98444, true }, - { 98457, true }, - { 98471, true }, + { 98214, true }, + { 98236, true }, + { 98259, true }, + { 98269, true }, + { 98279, false }, + { 98293, true }, + { 98311, true }, + { 98322, true }, + { 98333, true }, + { 98352, true }, + { 98368, true }, + { 98381, true }, + { 98395, true }, + { 98408, true }, + { 98437, true }, + { 98450, true }, + { 98460, true }, + { 98472, true }, { 98484, true }, + { 98503, true }, { 98513, true }, - { 98526, true }, - { 98536, true }, - { 98548, true }, - { 98560, true }, - { 98579, true }, - { 98589, true }, - { 98603, true }, - { 98613, true }, - { 98630, true }, - { 98641, true }, - { 98657, true }, - { 98676, true }, - { 98691, true }, - { 98703, true }, - { 98712, true }, - { 98732, true }, - { 98748, true }, - { 98762, true }, - { 98775, true }, - { 98790, true }, - { 98802, true }, - { 98812, true }, - { 98826, true }, - { 98841, true }, - { 98853, true }, - { 98871, true }, - { 98881, true }, - { 98893, true }, - { 98907, true }, - { 98919, true }, - { 98931, true }, - { 98952, true }, - { 98968, true }, - { 98981, true }, - { 98998, true }, - { 99013, true }, - { 99026, true }, - { 99039, true }, - { 99053, true }, - { 99068, true }, - { 99081, true }, - { 99100, true }, - { 99123, false }, - { 99136, false }, - { 99154, true }, - { 99174, true }, - { 99187, true }, - { 99202, true }, - { 99217, true }, - { 99232, true }, - { 99246, true }, - { 99261, true }, - { 99274, true }, - { 99299, true }, - { 99310, true }, - { 99326, true }, - { 99340, true }, - { 99367, true }, - { 99392, true }, - { 99406, true }, - { 99420, true }, - { 99434, true }, - { 99445, true }, - { 99469, true }, - { 99480, true }, - { 99491, true }, - { 99503, true }, - { 99531, true }, - { 99541, true }, - { 99551, true }, - { 99568, true }, - { 99585, true }, - { 99598, true }, + { 98527, true }, + { 98537, true }, + { 98554, true }, + { 98565, true }, + { 98581, true }, + { 98600, true }, + { 98615, true }, + { 98627, true }, + { 98636, true }, + { 98656, true }, + { 98672, true }, + { 98686, true }, + { 98699, true }, + { 98714, true }, + { 98726, true }, + { 98736, true }, + { 98750, true }, + { 98765, true }, + { 98777, true }, + { 98795, true }, + { 98805, true }, + { 98817, true }, + { 98831, true }, + { 98843, true }, + { 98855, true }, + { 98876, true }, + { 98892, true }, + { 98905, true }, + { 98922, true }, + { 98937, true }, + { 98950, true }, + { 98963, true }, + { 98977, true }, + { 98992, true }, + { 99005, true }, + { 99024, true }, + { 99047, false }, + { 99060, false }, + { 99078, true }, + { 99098, true }, + { 99111, true }, + { 99126, true }, + { 99141, true }, + { 99156, true }, + { 99170, true }, + { 99185, true }, + { 99198, true }, + { 99223, true }, + { 99234, true }, + { 99250, true }, + { 99264, true }, + { 99291, true }, + { 99316, true }, + { 99330, true }, + { 99344, true }, + { 99358, true }, + { 99369, true }, + { 99393, true }, + { 99404, true }, + { 99415, true }, + { 99427, true }, + { 99455, true }, + { 99465, true }, + { 99475, true }, + { 99492, true }, + { 99509, true }, + { 99522, true }, + { 99532, true }, + { 99555, true }, + { 99565, true }, + { 99574, true }, + { 99596, true }, { 99608, true }, - { 99631, true }, - { 99641, true }, - { 99650, true }, - { 99672, true }, - { 99684, true }, - { 99696, true }, - { 99708, true }, - { 99719, true }, - { 99737, true }, - { 99752, true }, - { 99762, true }, - { 99771, true }, - { 99789, false }, - { 99800, true }, - { 99811, true }, - { 99821, true }, + { 99620, true }, + { 99632, true }, + { 99643, true }, + { 99661, true }, + { 99676, true }, + { 99686, true }, + { 99695, true }, + { 99713, false }, + { 99724, true }, + { 99735, true }, + { 99745, true }, + { 99753, true }, + { 99767, true }, + { 99779, true }, + { 99791, true }, + { 99809, true }, { 99829, true }, - { 99843, true }, - { 99855, true }, - { 99867, true }, - { 99885, true }, - { 99905, true }, - { 99920, true }, - { 99937, true }, - { 99953, true }, - { 99966, true }, - { 99977, true }, - { 99992, true }, - { 100007, true }, - { 100023, true }, + { 99844, true }, + { 99861, true }, + { 99877, true }, + { 99890, true }, + { 99901, true }, + { 99916, true }, + { 99931, true }, + { 99947, true }, + { 99960, true }, + { 99985, true }, + { 100001, true }, + { 100021, true }, { 100036, true }, - { 100061, true }, - { 100077, true }, - { 100097, true }, - { 100112, true }, - { 100123, true }, - { 100134, true }, - { 100146, true }, - { 100163, true }, - { 100171, true }, - { 100183, true }, - { 100195, true }, - { 100209, true }, - { 100226, true }, - { 100242, true }, - { 100258, true }, - { 100277, true }, - { 100292, true }, - { 100304, true }, - { 100321, false }, - { 100341, true }, - { 100361, true }, - { 100382, true }, - { 100403, false }, - { 100420, true }, - { 100439, true }, + { 100047, true }, + { 100058, true }, + { 100070, true }, + { 100087, true }, + { 100095, true }, + { 100107, true }, + { 100119, true }, + { 100133, true }, + { 100150, true }, + { 100166, true }, + { 100182, true }, + { 100201, true }, + { 100216, true }, + { 100228, true }, + { 100245, false }, + { 100265, true }, + { 100285, true }, + { 100306, true }, + { 100327, false }, + { 100344, true }, + { 100363, true }, + { 100378, true }, + { 100389, true }, + { 100406, true }, + { 100433, true }, + { 100444, true }, { 100454, true }, - { 100465, true }, - { 100482, true }, - { 100509, true }, - { 100520, true }, - { 100530, true }, - { 100545, true }, - { 100557, true }, - { 100578, true }, - { 100587, true }, - { 100600, true }, - { 100613, true }, - { 100631, true }, + { 100469, true }, + { 100481, true }, + { 100502, true }, + { 100511, true }, + { 100524, true }, + { 100537, true }, + { 100555, true }, + { 100564, true }, + { 100573, true }, + { 100582, true }, + { 100594, false }, + { 100611, false }, + { 100622, true }, { 100640, true }, - { 100649, true }, - { 100658, true }, - { 100670, false }, - { 100687, false }, - { 100698, true }, - { 100716, true }, + { 100651, true }, + { 100666, true }, + { 100682, true }, + { 100704, true }, + { 100719, true }, { 100727, true }, - { 100742, true }, - { 100758, true }, - { 100780, true }, - { 100788, true }, - { 100801, true }, - { 100813, true }, - { 100830, true }, - { 100844, true }, - { 100854, true }, - { 100872, true }, - { 100889, true }, - { 100906, true }, - { 100914, true }, - { 100938, true }, - { 100956, true }, - { 100970, true }, - { 100983, true }, - { 100997, true }, - { 101016, true }, - { 101028, true }, - { 101040, true }, - { 101052, true }, - { 101065, true }, - { 101072, true }, - { 101092, true }, - { 101104, true }, - { 101120, true }, - { 101130, true }, - { 101141, true }, + { 100740, true }, + { 100752, true }, + { 100769, true }, + { 100783, true }, + { 100793, true }, + { 100811, true }, + { 100828, true }, + { 100845, true }, + { 100853, true }, + { 100877, true }, + { 100895, true }, + { 100909, true }, + { 100922, true }, + { 100936, true }, + { 100955, true }, + { 100965, true }, + { 100977, true }, + { 100989, true }, + { 101001, true }, + { 101014, true }, + { 101021, true }, + { 101041, true }, + { 101053, true }, + { 101069, true }, + { 101079, true }, + { 101090, true }, + { 101097, true }, + { 101106, true }, + { 101125, true }, + { 101138, true }, { 101148, true }, - { 101157, true }, - { 101176, true }, - { 101189, true }, - { 101199, true }, - { 101209, true }, - { 101217, true }, - { 101230, true }, - { 101242, false }, - { 101253, true }, - { 101265, false }, - { 101280, true }, - { 101292, true }, - { 101310, true }, - { 101321, true }, - { 101333, true }, - { 101354, false }, - { 101380, true }, - { 101394, true }, + { 101158, true }, + { 101166, true }, + { 101179, true }, + { 101191, false }, + { 101202, true }, + { 101214, false }, + { 101229, true }, + { 101241, true }, + { 101259, true }, + { 101270, true }, + { 101282, true }, + { 101303, false }, + { 101329, true }, + { 101343, true }, + { 101357, true }, + { 101371, true }, + { 101384, false }, + { 101397, true }, { 101408, true }, { 101422, true }, - { 101435, false }, - { 101448, true }, - { 101459, true }, - { 101473, true }, - { 101486, true }, - { 101498, true }, - { 101511, false }, - { 101525, true }, - { 101543, true }, - { 101556, true }, - { 101566, true }, - { 101577, true }, - { 101588, true }, - { 101599, true }, - { 101612, true }, - { 101624, true }, - { 101638, true }, - { 101653, true }, - { 101676, true }, - { 101687, true }, - { 101701, false }, - { 101716, true }, - { 101732, true }, - { 101744, true }, - { 101758, true }, - { 101772, true }, - { 101785, true }, - { 101798, true }, - { 101812, true }, + { 101435, true }, + { 101447, true }, + { 101460, false }, + { 101474, true }, + { 101492, true }, + { 101505, true }, + { 101515, true }, + { 101526, true }, + { 101537, true }, + { 101548, true }, + { 101561, true }, + { 101573, true }, + { 101587, true }, + { 101602, true }, + { 101625, true }, + { 101636, true }, + { 101650, false }, + { 101665, true }, + { 101681, true }, + { 101693, true }, + { 101707, true }, + { 101721, true }, + { 101734, true }, + { 101747, true }, + { 101761, true }, + { 101789, true }, + { 101817, true }, + { 101827, true }, { 101840, true }, - { 101868, true }, - { 101878, true }, - { 101891, true }, - { 101907, true }, - { 101920, false }, - { 101935, true }, - { 101953, true }, - { 101972, true }, - { 101980, true }, - { 101993, true }, - { 102008, true }, - { 102022, true }, - { 102038, true }, - { 102052, true }, + { 101856, true }, + { 101869, false }, + { 101884, true }, + { 101902, true }, + { 101921, true }, + { 101929, true }, + { 101942, true }, + { 101957, true }, + { 101971, true }, + { 101987, true }, + { 102001, true }, + { 102019, true }, + { 102029, true }, + { 102038, false }, + { 102049, true }, + { 102060, true }, { 102070, true }, - { 102080, true }, - { 102089, false }, - { 102100, true }, - { 102111, true }, - { 102121, true }, - { 102133, true }, - { 102160, true }, - { 102171, true }, - { 102180, true }, - { 102189, true }, - { 102206, false }, - { 102220, true }, - { 102243, true }, - { 102259, true }, - { 102280, true }, - { 102296, true }, - { 102316, true }, - { 102338, true }, - { 102348, true }, - { 102356, true }, - { 102365, true }, - { 102376, true }, - { 102390, true }, - { 102400, true }, - { 102410, true }, - { 102430, true }, - { 102440, true }, - { 102454, true }, - { 102466, true }, - { 102485, true }, - { 102498, true }, - { 102522, false }, - { 102541, true }, - { 102569, true }, - { 102583, true }, - { 102597, true }, - { 102609, true }, + { 102082, true }, + { 102109, true }, + { 102120, true }, + { 102129, true }, + { 102138, true }, + { 102155, false }, + { 102169, true }, + { 102192, true }, + { 102208, true }, + { 102229, true }, + { 102245, true }, + { 102265, true }, + { 102287, true }, + { 102297, true }, + { 102305, true }, + { 102314, true }, + { 102325, true }, + { 102339, true }, + { 102349, true }, + { 102359, true }, + { 102379, true }, + { 102389, true }, + { 102403, true }, + { 102415, true }, + { 102434, true }, + { 102447, true }, + { 102471, false }, + { 102490, true }, + { 102518, true }, + { 102532, true }, + { 102546, true }, + { 102558, true }, + { 102572, true }, + { 102582, true }, + { 102604, true }, { 102623, true }, - { 102633, true }, - { 102655, true }, - { 102674, true }, - { 102692, true }, - { 102700, true }, - { 102716, true }, - { 102731, true }, - { 102739, true }, - { 102750, true }, - { 102766, true }, - { 102780, true }, - { 102796, true }, - { 102811, true }, - { 102826, true }, - { 102838, true }, - { 102850, true }, - { 102869, false }, - { 102894, true }, - { 102913, true }, - { 102930, true }, - { 102940, true }, - { 102951, true }, + { 102641, true }, + { 102649, true }, + { 102665, true }, + { 102680, true }, + { 102688, true }, + { 102699, true }, + { 102715, true }, + { 102729, true }, + { 102745, true }, + { 102760, true }, + { 102775, true }, + { 102787, true }, + { 102799, true }, + { 102818, false }, + { 102843, true }, + { 102862, true }, + { 102879, true }, + { 102889, true }, + { 102900, true }, + { 102912, true }, + { 102927, true }, + { 102945, true }, + { 102952, true }, { 102963, true }, - { 102978, true }, - { 102996, true }, + { 102977, true }, + { 102990, true }, { 103003, true }, - { 103014, true }, - { 103028, true }, - { 103041, true }, - { 103054, true }, - { 103067, true }, - { 103078, true }, - { 103091, true }, - { 103101, true }, - { 103111, true }, - { 103123, true }, - { 103135, true }, - { 103144, true }, - { 103151, true }, - { 103161, true }, - { 103172, true }, - { 103182, true }, - { 103200, true }, + { 103016, true }, + { 103027, true }, + { 103040, true }, + { 103050, true }, + { 103060, true }, + { 103072, true }, + { 103084, true }, + { 103093, true }, + { 103100, true }, + { 103110, true }, + { 103121, true }, + { 103131, true }, + { 103149, true }, + { 103167, true }, + { 103181, true }, + { 103195, true }, { 103218, true }, - { 103232, true }, - { 103246, true }, - { 103269, true }, - { 103279, true }, - { 103294, true }, - { 103312, true }, - { 103329, true }, + { 103228, true }, + { 103243, true }, + { 103261, true }, + { 103278, true }, + { 103292, true }, + { 103306, true }, + { 103319, true }, + { 103331, true }, { 103343, true }, - { 103357, true }, - { 103370, true }, - { 103382, true }, - { 103394, true }, + { 103355, true }, + { 103368, true }, + { 103381, false }, + { 103392, true }, { 103406, true }, { 103419, true }, - { 103432, false }, - { 103443, true }, - { 103457, true }, - { 103470, true }, - { 103485, true }, - { 103492, true }, - { 103511, true }, - { 103530, true }, - { 103554, false }, - { 103569, true }, - { 103580, true }, - { 103603, false }, - { 103614, false }, - { 103625, false }, - { 103637, true }, - { 103651, true }, - { 103664, true }, - { 103677, true }, - { 103690, true }, - { 103712, true }, - { 103722, true }, - { 103742, true }, - { 103760, true }, - { 103774, true }, - { 103791, false }, - { 103806, false }, - { 103822, true }, - { 103839, true }, - { 103850, true }, - { 103872, true }, - { 103886, true }, - { 103906, true }, - { 103916, true }, - { 103927, true }, - { 103936, true }, - { 103947, true }, - { 103959, true }, - { 103969, true }, - { 103982, true }, - { 103990, true }, - { 104007, true }, - { 104028, true }, - { 104042, true }, - { 104057, true }, - { 104071, true }, + { 103434, true }, + { 103441, true }, + { 103460, true }, + { 103479, true }, + { 103503, false }, + { 103518, true }, + { 103529, true }, + { 103552, false }, + { 103563, false }, + { 103574, false }, + { 103586, true }, + { 103600, true }, + { 103613, true }, + { 103626, true }, + { 103639, true }, + { 103661, true }, + { 103671, true }, + { 103691, true }, + { 103709, true }, + { 103723, true }, + { 103740, false }, + { 103755, false }, + { 103771, true }, + { 103788, true }, + { 103799, true }, + { 103821, true }, + { 103835, true }, + { 103855, true }, + { 103865, true }, + { 103876, true }, + { 103885, true }, + { 103896, true }, + { 103908, true }, + { 103918, true }, + { 103931, true }, + { 103939, true }, + { 103956, true }, + { 103977, true }, + { 103991, true }, + { 104006, true }, + { 104020, true }, + { 104040, true }, + { 104055, true }, + { 104066, true }, + { 104078, true }, { 104091, true }, - { 104106, true }, - { 104117, true }, + { 104102, true }, + { 104115, true }, { 104129, true }, { 104142, true }, - { 104153, true }, - { 104166, true }, - { 104180, true }, - { 104193, true }, - { 104203, true }, - { 104226, true }, - { 104236, true }, - { 104246, true }, - { 104256, true }, - { 104273, true }, - { 104289, true }, - { 104304, true }, - { 104324, true }, - { 104334, true }, - { 104348, true }, + { 104152, true }, + { 104175, true }, + { 104185, true }, + { 104195, true }, + { 104205, true }, + { 104222, true }, + { 104237, true }, + { 104257, true }, + { 104267, true }, + { 104281, true }, + { 104293, true }, + { 104318, true }, + { 104332, true }, + { 104346, true }, { 104360, true }, - { 104385, true }, - { 104399, true }, - { 104413, true }, - { 104427, true }, - { 104441, true }, - { 104455, true }, - { 104470, true }, - { 104484, true }, - { 104498, true }, - { 104512, true }, - { 104532, true }, - { 104549, true }, - { 104564, true }, - { 104577, true }, - { 104595, true }, - { 104610, true }, - { 104626, true }, - { 104638, true }, - { 104655, true }, - { 104668, true }, - { 104683, true }, - { 104692, false }, - { 104707, true }, - { 104718, true }, + { 104374, true }, + { 104388, true }, + { 104403, true }, + { 104417, true }, + { 104431, true }, + { 104445, true }, + { 104465, true }, + { 104482, true }, + { 104497, true }, + { 104510, true }, + { 104528, true }, + { 104543, true }, + { 104559, true }, + { 104571, true }, + { 104588, true }, + { 104601, true }, + { 104616, true }, + { 104625, false }, + { 104640, true }, + { 104651, true }, + { 104666, true }, + { 104678, true }, + { 104687, true }, + { 104704, false }, + { 104714, true }, { 104733, true }, - { 104745, true }, - { 104754, true }, - { 104771, false }, - { 104781, true }, - { 104800, true }, - { 104810, true }, - { 104826, true }, - { 104846, true }, - { 104860, true }, - { 104879, true }, - { 104899, true }, - { 104915, true }, - { 104925, true }, - { 104940, true }, - { 104950, true }, - { 104964, true }, - { 104985, true }, - { 104995, true }, + { 104743, true }, + { 104759, true }, + { 104779, true }, + { 104793, true }, + { 104812, true }, + { 104832, true }, + { 104848, true }, + { 104858, true }, + { 104873, true }, + { 104883, true }, + { 104897, true }, + { 104918, true }, + { 104928, true }, + { 104937, true }, + { 104946, true }, + { 104961, true }, + { 104975, true }, + { 104989, true }, { 105004, true }, - { 105013, true }, - { 105028, true }, - { 105042, true }, - { 105056, true }, - { 105071, true }, - { 105087, true }, - { 105103, true }, - { 105111, true }, - { 105119, true }, - { 105131, true }, + { 105020, true }, + { 105036, true }, + { 105044, true }, + { 105052, true }, + { 105064, true }, + { 105076, true }, + { 105088, true }, + { 105101, true }, + { 105114, true }, + { 105128, true }, { 105143, true }, - { 105155, true }, - { 105168, true }, - { 105181, true }, - { 105195, true }, - { 105210, true }, - { 105224, false }, - { 105250, true }, - { 105261, true }, - { 105270, true }, - { 105278, true }, - { 105286, true }, - { 105294, true }, - { 105302, true }, - { 105312, true }, - { 105321, true }, + { 105157, false }, + { 105183, true }, + { 105194, true }, + { 105203, true }, + { 105211, true }, + { 105219, true }, + { 105227, true }, + { 105235, true }, + { 105245, true }, + { 105254, true }, + { 105266, true }, + { 105285, true }, + { 105295, true }, + { 105306, true }, + { 105316, true }, { 105333, true }, - { 105352, true }, - { 105362, true }, - { 105373, true }, - { 105383, true }, - { 105400, true }, - { 105413, true }, - { 105423, true }, + { 105346, true }, + { 105356, true }, + { 105367, true }, + { 105385, true }, + { 105403, true }, + { 105417, true }, + { 105427, true }, { 105434, true }, - { 105452, true }, - { 105470, true }, - { 105484, true }, - { 105494, true }, - { 105501, true }, - { 105516, true }, - { 105538, true }, - { 105546, true }, - { 105556, true }, - { 105575, true }, - { 105587, true }, - { 105597, true }, - { 105607, true }, + { 105449, true }, + { 105471, true }, + { 105479, true }, + { 105489, true }, + { 105508, true }, + { 105520, true }, + { 105530, true }, + { 105540, true }, + { 105550, true }, + { 105561, true }, + { 105574, true }, + { 105582, true }, + { 105596, true }, + { 105606, true }, { 105617, true }, - { 105628, true }, - { 105641, true }, - { 105649, true }, - { 105663, true }, - { 105673, true }, - { 105684, true }, - { 105691, true }, - { 105699, true }, - { 105717, true }, - { 105728, false }, - { 105743, true }, - { 105753, true }, - { 105762, true }, - { 105773, true }, - { 105782, true }, - { 105791, true }, - { 105811, true }, - { 105827, true }, - { 105836, false }, - { 105847, true }, - { 105859, false }, - { 105873, true }, - { 105882, true }, - { 105898, true }, - { 105911, true }, - { 105924, true }, - { 105936, true }, - { 105951, true }, - { 105961, true }, - { 105973, true }, - { 105984, true }, - { 105995, true }, + { 105624, true }, + { 105632, true }, + { 105650, true }, + { 105661, false }, + { 105676, true }, + { 105686, true }, + { 105695, true }, + { 105706, true }, + { 105715, true }, + { 105724, true }, + { 105744, true }, + { 105760, true }, + { 105769, false }, + { 105780, true }, + { 105792, false }, + { 105806, true }, + { 105815, true }, + { 105831, true }, + { 105844, true }, + { 105857, true }, + { 105869, true }, + { 105884, true }, + { 105894, true }, + { 105906, true }, + { 105917, true }, + { 105928, true }, + { 105940, true }, + { 105963, true }, + { 105979, true }, + { 105994, true }, { 106007, true }, - { 106030, true }, - { 106040, true }, - { 106056, true }, - { 106071, true }, - { 106084, true }, - { 106093, true }, - { 106108, true }, - { 106121, true }, - { 106134, true }, - { 106149, true }, + { 106016, true }, + { 106031, true }, + { 106044, true }, + { 106057, true }, + { 106072, true }, + { 106082, true }, + { 106099, true }, + { 106122, true }, + { 106138, false }, + { 106148, true }, { 106159, true }, - { 106176, true }, - { 106199, true }, - { 106215, false }, - { 106225, true }, - { 106239, true }, + { 106169, true }, + { 106183, true }, + { 106194, true }, + { 106207, true }, + { 106220, true }, + { 106232, true }, { 106250, true }, - { 106260, true }, + { 106261, true }, { 106274, true }, { 106285, true }, - { 106298, true }, - { 106311, true }, - { 106323, true }, - { 106341, true }, - { 106352, true }, - { 106365, true }, - { 106376, true }, + { 106309, true }, + { 106324, true }, + { 106349, true }, + { 106357, true }, + { 106373, false }, + { 106388, true }, { 106400, true }, - { 106415, true }, + { 106412, true }, + { 106426, true }, { 106440, true }, - { 106448, true }, - { 106464, false }, - { 106479, true }, - { 106491, true }, - { 106503, true }, - { 106517, true }, - { 106531, true }, - { 106545, true }, - { 106559, true }, - { 106576, true }, - { 106593, true }, - { 106605, true }, - { 106619, true }, - { 106641, true }, - { 106655, true }, - { 106673, true }, - { 106694, true }, - { 106711, true }, - { 106722, true }, - { 106735, true }, - { 106751, true }, - { 106763, true }, - { 106777, true }, - { 106793, true }, - { 106810, true }, - { 106824, true }, - { 106836, false }, - { 106861, true }, - { 106871, false }, - { 106897, true }, - { 106914, true }, - { 106928, true }, - { 106939, true }, - { 106969, false }, - { 106983, true }, - { 107000, true }, - { 107014, true }, - { 107037, true }, - { 107055, true }, + { 106454, true }, + { 106468, true }, + { 106485, true }, + { 106502, true }, + { 106514, true }, + { 106528, true }, + { 106550, true }, + { 106564, true }, + { 106582, true }, + { 106603, true }, + { 106620, true }, + { 106631, true }, + { 106644, true }, + { 106660, true }, + { 106672, true }, + { 106686, true }, + { 106702, true }, + { 106719, true }, + { 106733, true }, + { 106745, false }, + { 106770, true }, + { 106780, false }, + { 106806, true }, + { 106823, true }, + { 106837, true }, + { 106848, true }, + { 106878, false }, + { 106892, true }, + { 106909, true }, + { 106923, true }, + { 106946, true }, + { 106964, true }, + { 106979, true }, + { 106987, true }, + { 106995, true }, + { 107003, true }, + { 107011, true }, + { 107019, true }, + { 107030, true }, + { 107040, true }, + { 107054, true }, { 107070, true }, - { 107078, true }, - { 107086, true }, - { 107094, true }, - { 107102, true }, - { 107110, true }, - { 107121, true }, + { 107081, true }, + { 107106, true }, + { 107115, false }, { 107131, true }, - { 107145, true }, - { 107161, true }, - { 107172, true }, - { 107197, true }, - { 107206, false }, + { 107141, false }, + { 107163, true }, + { 107178, true }, + { 107192, true }, + { 107205, true }, { 107222, true }, - { 107232, false }, - { 107254, true }, - { 107269, true }, + { 107238, true }, + { 107261, true }, { 107283, true }, - { 107296, true }, - { 107313, true }, - { 107329, true }, + { 107301, true }, + { 107320, false }, + { 107339, true }, { 107352, true }, - { 107374, true }, - { 107392, true }, - { 107411, false }, - { 107430, true }, - { 107443, true }, - { 107456, true }, - { 107480, true }, - { 107491, true }, - { 107510, true }, - { 107538, true }, - { 107559, true }, - { 107572, true }, - { 107588, true }, - { 107608, true }, - { 107628, true }, - { 107648, true }, - { 107662, true }, - { 107683, false }, - { 107694, true }, - { 107713, true }, - { 107724, true }, - { 107736, true }, - { 107747, true }, - { 107777, true }, - { 107788, true }, - { 107802, true }, - { 107816, true }, - { 107828, true }, + { 107365, true }, + { 107389, true }, + { 107400, true }, + { 107419, true }, + { 107447, true }, + { 107468, true }, + { 107481, true }, + { 107497, true }, + { 107517, true }, + { 107537, true }, + { 107557, true }, + { 107571, true }, + { 107592, false }, + { 107603, true }, + { 107622, true }, + { 107633, true }, + { 107645, true }, + { 107656, true }, + { 107686, true }, + { 107697, true }, + { 107711, true }, + { 107725, true }, + { 107737, true }, + { 107748, true }, + { 107772, true }, + { 107793, true }, + { 107806, true }, + { 107823, true }, { 107839, true }, - { 107863, true }, - { 107884, true }, - { 107897, true }, - { 107914, true }, - { 107930, true }, - { 107948, true }, - { 107965, true }, - { 107979, true }, - { 107993, true }, - { 108009, true }, - { 108029, true }, - { 108040, true }, - { 108055, true }, - { 108082, true }, + { 107857, true }, + { 107874, true }, + { 107888, true }, + { 107902, true }, + { 107918, true }, + { 107938, true }, + { 107949, true }, + { 107964, true }, + { 107991, true }, + { 108010, true }, + { 108025, true }, + { 108036, true }, + { 108053, true }, + { 108069, true }, + { 108086, true }, { 108101, true }, - { 108116, true }, - { 108127, true }, - { 108144, true }, - { 108160, true }, - { 108177, true }, - { 108192, true }, - { 108208, true }, - { 108225, true }, - { 108245, true }, - { 108260, true }, - { 108279, true }, - { 108295, true }, - { 108305, true }, - { 108318, true }, - { 108337, true }, - { 108353, true }, - { 108373, true }, - { 108385, true }, - { 108402, false }, + { 108117, true }, + { 108134, true }, + { 108154, true }, + { 108169, true }, + { 108188, true }, + { 108204, true }, + { 108214, true }, + { 108227, true }, + { 108246, true }, + { 108262, true }, + { 108282, true }, + { 108294, true }, + { 108311, false }, + { 108326, true }, + { 108338, true }, + { 108351, true }, + { 108361, true }, + { 108378, true }, + { 108390, false }, + { 108400, true }, { 108417, true }, - { 108429, true }, - { 108442, true }, - { 108452, true }, - { 108469, true }, - { 108481, false }, + { 108440, true }, + { 108457, true }, + { 108472, true }, { 108491, true }, - { 108508, true }, - { 108531, true }, - { 108545, true }, - { 108562, true }, - { 108577, true }, - { 108596, true }, - { 108629, true }, - { 108639, true }, - { 108653, true }, - { 108669, false }, - { 108692, true }, - { 108706, true }, - { 108718, true }, - { 108733, true }, - { 108753, true }, - { 108765, true }, - { 108783, true }, - { 108796, true }, - { 108809, true }, - { 108822, true }, - { 108833, true }, - { 108848, true }, - { 108859, true }, - { 108873, true }, - { 108885, true }, - { 108899, true }, - { 108907, true }, - { 108926, true }, - { 108948, true }, - { 108961, true }, - { 108971, false }, - { 108983, true }, - { 109006, true }, - { 109020, true }, - { 109035, true }, - { 109054, true }, - { 109068, true }, - { 109082, true }, - { 109099, true }, - { 109112, true }, - { 109129, true }, - { 109145, true }, - { 109164, true }, - { 109181, true }, - { 109189, true }, - { 109205, true }, + { 108524, true }, + { 108534, true }, + { 108548, true }, + { 108564, false }, + { 108587, true }, + { 108601, true }, + { 108613, true }, + { 108628, true }, + { 108648, true }, + { 108660, true }, + { 108678, true }, + { 108691, true }, + { 108704, true }, + { 108717, true }, + { 108728, true }, + { 108743, true }, + { 108754, true }, + { 108768, true }, + { 108780, true }, + { 108794, true }, + { 108802, true }, + { 108821, true }, + { 108843, true }, + { 108856, true }, + { 108866, false }, + { 108878, true }, + { 108901, true }, + { 108915, true }, + { 108930, true }, + { 108949, true }, + { 108963, true }, + { 108977, true }, + { 108994, true }, + { 109007, true }, + { 109024, true }, + { 109040, true }, + { 109059, true }, + { 109076, true }, + { 109084, true }, + { 109100, true }, + { 109116, true }, + { 109136, true }, + { 109154, true }, + { 109168, true }, + { 109185, true }, + { 109204, true }, { 109221, true }, - { 109241, true }, - { 109259, true }, - { 109273, true }, - { 109290, true }, - { 109309, true }, - { 109326, true }, - { 109345, true }, - { 109363, true }, - { 109376, true }, - { 109386, true }, - { 109404, true }, - { 109424, true }, - { 109433, true }, - { 109447, true }, - { 109464, true }, - { 109487, true }, - { 109496, true }, - { 109512, true }, - { 109530, true }, - { 109542, true }, - { 109551, true }, - { 109564, true }, - { 109577, true }, - { 109593, true }, - { 109601, false }, - { 109613, true }, - { 109623, true }, - { 109642, true }, - { 109657, true }, - { 109672, true }, - { 109691, true }, - { 109713, true }, - { 109732, true }, - { 109746, true }, + { 109240, true }, + { 109258, true }, + { 109271, true }, + { 109281, true }, + { 109299, true }, + { 109319, true }, + { 109328, true }, + { 109342, true }, + { 109359, true }, + { 109382, true }, + { 109391, true }, + { 109407, true }, + { 109425, true }, + { 109437, true }, + { 109446, true }, + { 109459, true }, + { 109472, true }, + { 109488, true }, + { 109496, false }, + { 109508, true }, + { 109518, true }, + { 109537, true }, + { 109552, true }, + { 109567, true }, + { 109586, true }, + { 109608, true }, + { 109627, true }, + { 109641, true }, + { 109653, true }, + { 109667, true }, + { 109680, false }, + { 109702, true }, + { 109720, true }, + { 109733, true }, + { 109747, true }, { 109758, true }, - { 109772, true }, - { 109785, false }, - { 109807, true }, - { 109825, true }, - { 109838, true }, - { 109852, true }, - { 109863, true }, - { 109877, false }, - { 109897, true }, - { 109908, false }, - { 109917, true }, - { 109932, false }, - { 109950, true }, - { 109960, true }, - { 109971, false }, - { 109986, true }, - { 109995, true }, - { 110007, true }, + { 109772, false }, + { 109792, true }, + { 109803, false }, + { 109812, true }, + { 109827, false }, + { 109845, true }, + { 109855, true }, + { 109866, false }, + { 109881, true }, + { 109890, true }, + { 109902, true }, + { 109911, true }, + { 109924, true }, + { 109937, true }, + { 109948, true }, + { 109962, true }, + { 109975, true }, + { 109992, false }, + { 110009, true }, { 110016, true }, - { 110029, true }, - { 110042, true }, - { 110053, true }, - { 110067, true }, - { 110080, true }, - { 110097, false }, - { 110114, true }, - { 110121, true }, - { 110129, true }, - { 110138, true }, + { 110024, true }, + { 110033, true }, + { 110045, true }, + { 110068, true }, + { 110082, true }, + { 110096, true }, + { 110113, false }, + { 110129, false }, + { 110143, true }, { 110150, true }, - { 110173, true }, - { 110187, true }, - { 110201, true }, - { 110218, false }, - { 110234, false }, - { 110248, true }, - { 110255, true }, - { 110266, true }, - { 110281, true }, - { 110293, true }, - { 110301, true }, - { 110316, false }, - { 110326, true }, - { 110338, true }, - { 110350, true }, - { 110365, true }, - { 110394, true }, - { 110408, true }, - { 110416, true }, - { 110424, true }, - { 110433, true }, - { 110446, true }, - { 110457, true }, - { 110468, true }, - { 110475, true }, - { 110484, true }, - { 110494, true }, - { 110514, true }, - { 110526, true }, - { 110537, false }, - { 110546, false }, - { 110567, true }, - { 110578, true }, - { 110587, true }, - { 110601, true }, - { 110618, true }, - { 110634, true }, - { 110651, true }, + { 110161, true }, + { 110176, true }, + { 110188, true }, + { 110196, true }, + { 110211, false }, + { 110221, true }, + { 110233, true }, + { 110245, true }, + { 110260, true }, + { 110289, true }, + { 110303, true }, + { 110311, true }, + { 110319, true }, + { 110328, true }, + { 110341, true }, + { 110352, true }, + { 110363, true }, + { 110370, true }, + { 110379, true }, + { 110389, true }, + { 110409, true }, + { 110421, true }, + { 110432, false }, + { 110441, false }, + { 110462, true }, + { 110473, true }, + { 110482, true }, + { 110496, true }, + { 110513, true }, + { 110529, true }, + { 110546, true }, + { 110558, true }, + { 110571, true }, + { 110583, true }, + { 110597, true }, + { 110615, true }, + { 110629, true }, + { 110645, false }, { 110663, true }, - { 110676, true }, - { 110688, true }, + { 110680, true }, { 110702, true }, - { 110720, true }, - { 110734, true }, - { 110750, false }, - { 110768, true }, - { 110785, true }, - { 110807, true }, - { 110818, true }, - { 110829, true }, - { 110840, true }, + { 110713, true }, + { 110724, true }, + { 110735, true }, + { 110746, true }, + { 110760, true }, + { 110771, true }, + { 110787, true }, + { 110816, false }, + { 110835, true }, { 110851, true }, - { 110865, true }, - { 110876, true }, - { 110892, true }, - { 110921, false }, - { 110940, true }, - { 110956, true }, - { 110982, true }, - { 110996, true }, - { 111013, true }, - { 111032, true }, - { 111049, true }, - { 111060, true }, - { 111068, true }, - { 111080, true }, - { 111093, true }, - { 111108, true }, - { 111121, true }, - { 111134, true }, - { 111148, true }, - { 111160, true }, - { 111172, true }, - { 111189, true }, - { 111202, true }, - { 111217, true }, - { 111230, true }, - { 111242, true }, + { 110877, true }, + { 110891, true }, + { 110908, true }, + { 110927, true }, + { 110944, true }, + { 110955, true }, + { 110963, true }, + { 110975, true }, + { 110988, true }, + { 111003, true }, + { 111016, true }, + { 111029, true }, + { 111043, true }, + { 111055, true }, + { 111067, true }, + { 111084, true }, + { 111097, true }, + { 111112, true }, + { 111125, true }, + { 111137, true }, + { 111151, true }, + { 111162, true }, + { 111185, true }, + { 111203, true }, + { 111224, true }, + { 111243, true }, { 111256, true }, - { 111267, true }, - { 111290, true }, - { 111308, true }, - { 111329, true }, - { 111348, true }, - { 111361, true }, - { 111379, true }, - { 111396, true }, - { 111407, true }, - { 111429, true }, - { 111441, true }, - { 111449, true }, - { 111470, true }, - { 111491, true }, - { 111509, true }, - { 111525, true }, - { 111537, true }, - { 111549, true }, - { 111567, true }, - { 111577, true }, - { 111591, true }, - { 111607, true }, - { 111633, false }, - { 111662, true }, - { 111673, true }, - { 111688, true }, - { 111704, true }, - { 111719, true }, - { 111733, true }, - { 111760, true }, - { 111778, false }, - { 111789, true }, - { 111799, true }, - { 111814, true }, - { 111825, true }, - { 111843, true }, - { 111866, true }, - { 111884, true }, - { 111897, true }, - { 111908, false }, - { 111922, true }, - { 111944, true }, - { 111963, true }, - { 111977, true }, - { 111989, false }, - { 112009, true }, - { 112025, true }, - { 112035, true }, - { 112049, true }, - { 112067, true }, - { 112079, true }, - { 112089, true }, - { 112101, true }, - { 112109, true }, - { 112123, true }, - { 112135, true }, - { 112153, true }, - { 112165, true }, - { 112177, true }, - { 112189, true }, - { 112201, true }, - { 112213, true }, - { 112225, true }, - { 112237, true }, - { 112249, true }, - { 112265, false }, - { 112285, true }, + { 111274, true }, + { 111291, true }, + { 111302, true }, + { 111324, true }, + { 111336, true }, + { 111344, true }, + { 111365, true }, + { 111386, true }, + { 111404, true }, + { 111420, true }, + { 111432, true }, + { 111444, true }, + { 111462, true }, + { 111472, true }, + { 111486, true }, + { 111502, true }, + { 111528, false }, + { 111557, true }, + { 111568, true }, + { 111583, true }, + { 111599, true }, + { 111614, true }, + { 111628, true }, + { 111655, true }, + { 111673, false }, + { 111684, true }, + { 111694, true }, + { 111709, true }, + { 111720, true }, + { 111738, true }, + { 111761, true }, + { 111779, true }, + { 111792, true }, + { 111803, false }, + { 111817, true }, + { 111839, true }, + { 111858, true }, + { 111872, true }, + { 111884, false }, + { 111904, true }, + { 111914, true }, + { 111928, true }, + { 111946, true }, + { 111958, true }, + { 111968, true }, + { 111980, true }, + { 111988, true }, + { 112002, true }, + { 112014, true }, + { 112032, true }, + { 112044, true }, + { 112056, true }, + { 112068, true }, + { 112080, true }, + { 112092, true }, + { 112104, true }, + { 112116, true }, + { 112128, true }, + { 112144, false }, + { 112164, true }, + { 112173, true }, + { 112187, true }, + { 112203, true }, + { 112216, true }, + { 112239, true }, + { 112252, true }, + { 112260, false }, + { 112276, true }, { 112294, true }, { 112308, true }, - { 112324, true }, - { 112337, true }, + { 112317, true }, + { 112330, true }, + { 112346, false }, { 112360, true }, - { 112373, true }, - { 112381, false }, - { 112397, true }, - { 112415, true }, - { 112429, true }, - { 112438, true }, - { 112451, true }, - { 112467, false }, - { 112481, true }, - { 112497, true }, - { 112504, true }, - { 112519, true }, - { 112534, true }, - { 112546, true }, - { 112564, true }, - { 112583, true }, - { 112605, true }, - { 112625, true }, - { 112642, true }, - { 112660, true }, - { 112678, true }, - { 112700, true }, - { 112714, true }, - { 112730, true }, + { 112376, true }, + { 112383, true }, + { 112398, true }, + { 112413, true }, + { 112425, true }, + { 112443, true }, + { 112465, true }, + { 112485, true }, + { 112502, true }, + { 112520, true }, + { 112538, true }, + { 112560, true }, + { 112574, true }, + { 112590, true }, + { 112607, true }, + { 112628, true }, + { 112643, true }, + { 112667, true }, + { 112684, true }, + { 112695, true }, + { 112708, true }, + { 112721, true }, + { 112735, true }, { 112747, true }, + { 112757, true }, { 112768, true }, { 112783, true }, - { 112807, true }, - { 112824, true }, - { 112835, true }, - { 112848, true }, - { 112861, true }, - { 112875, true }, - { 112887, true }, - { 112897, true }, - { 112908, true }, - { 112923, true }, - { 112934, true }, - { 112946, true }, - { 112955, true }, - { 112965, true }, - { 112974, true }, - { 112985, true }, - { 113010, true }, + { 112794, true }, + { 112806, true }, + { 112815, true }, + { 112825, true }, + { 112834, true }, + { 112845, true }, + { 112870, true }, + { 112882, true }, + { 112900, true }, + { 112916, true }, + { 112927, true }, + { 112950, true }, + { 112971, true }, + { 112989, true }, + { 113008, false }, { 113022, true }, - { 113040, true }, - { 113056, true }, - { 113067, true }, - { 113090, true }, + { 113033, true }, + { 113046, true }, + { 113060, true }, + { 113075, true }, + { 113086, true }, + { 113097, true }, { 113111, true }, - { 113129, true }, - { 113148, false }, + { 113124, true }, + { 113138, true }, + { 113151, true }, { 113162, true }, - { 113173, true }, - { 113186, true }, - { 113200, true }, - { 113215, true }, + { 113175, true }, + { 113189, true }, + { 113198, true }, + { 113213, true }, { 113226, true }, - { 113237, true }, - { 113251, true }, - { 113264, true }, - { 113278, true }, - { 113291, true }, - { 113302, true }, - { 113315, true }, - { 113329, true }, - { 113338, true }, - { 113351, true }, - { 113364, true }, - { 113383, true }, - { 113401, true }, - { 113417, true }, - { 113430, true }, - { 113442, true }, - { 113457, true }, - { 113467, true }, - { 113477, true }, - { 113491, true }, - { 113502, true }, - { 113529, true }, - { 113543, true }, - { 113551, true }, - { 113573, true }, - { 113587, true }, - { 113601, true }, - { 113620, true }, - { 113639, true }, - { 113658, true }, - { 113677, true }, - { 113697, true }, - { 113717, true }, - { 113737, true }, - { 113755, true }, - { 113774, true }, - { 113793, true }, - { 113812, true }, - { 113831, true }, - { 113845, true }, - { 113857, true }, - { 113869, true }, - { 113882, false }, - { 113904, true }, - { 113919, true }, - { 113931, true }, - { 113939, true }, - { 113964, true }, - { 113980, true }, - { 113989, true }, - { 114001, true }, - { 114018, true }, - { 114031, true }, - { 114046, true }, - { 114059, true }, - { 114071, true }, - { 114081, true }, - { 114092, true }, - { 114106, true }, - { 114121, true }, - { 114134, true }, - { 114145, true }, - { 114159, true }, - { 114174, true }, - { 114183, true }, - { 114199, true }, + { 113239, true }, + { 113258, true }, + { 113276, true }, + { 113292, true }, + { 113305, true }, + { 113317, true }, + { 113332, true }, + { 113342, true }, + { 113352, true }, + { 113366, true }, + { 113377, true }, + { 113404, true }, + { 113418, true }, + { 113426, true }, + { 113448, true }, + { 113462, true }, + { 113476, true }, + { 113495, true }, + { 113514, true }, + { 113533, true }, + { 113552, true }, + { 113572, true }, + { 113592, true }, + { 113612, true }, + { 113630, true }, + { 113649, true }, + { 113668, true }, + { 113687, true }, + { 113706, true }, + { 113720, true }, + { 113732, true }, + { 113744, true }, + { 113757, false }, + { 113779, true }, + { 113794, true }, + { 113806, true }, + { 113814, true }, + { 113839, true }, + { 113855, true }, + { 113864, true }, + { 113876, true }, + { 113893, true }, + { 113906, true }, + { 113921, true }, + { 113934, true }, + { 113946, true }, + { 113956, true }, + { 113967, true }, + { 113981, true }, + { 113996, true }, + { 114009, true }, + { 114020, true }, + { 114034, true }, + { 114049, true }, + { 114058, true }, + { 114074, true }, + { 114093, true }, + { 114107, true }, + { 114122, true }, + { 114133, true }, + { 114143, true }, + { 114155, true }, + { 114170, true }, + { 114187, true }, { 114218, true }, - { 114232, true }, - { 114247, true }, - { 114258, true }, + { 114233, true }, + { 114254, true }, { 114268, true }, - { 114280, true }, - { 114295, true }, - { 114312, true }, - { 114343, true }, - { 114358, true }, + { 114286, true }, + { 114296, true }, + { 114308, true }, + { 114318, true }, + { 114331, true }, + { 114346, true }, + { 114359, true }, + { 114371, true }, { 114379, true }, - { 114393, true }, - { 114411, true }, - { 114421, true }, - { 114433, true }, - { 114443, true }, - { 114456, true }, - { 114471, true }, - { 114484, true }, - { 114496, true }, - { 114504, true }, - { 114522, true }, - { 114537, true }, - { 114554, true }, - { 114569, true }, - { 114582, true }, + { 114397, true }, + { 114412, true }, + { 114429, true }, + { 114444, true }, + { 114457, true }, + { 114469, true }, + { 114485, true }, + { 114505, true }, + { 114520, true }, + { 114531, true }, + { 114545, true }, + { 114557, true }, + { 114570, true }, + { 114580, true }, { 114594, true }, - { 114610, true }, - { 114630, true }, - { 114645, true }, + { 114604, true }, + { 114613, true }, + { 114623, true }, + { 114634, false }, + { 114643, true }, { 114656, true }, - { 114670, true }, - { 114682, true }, - { 114695, true }, - { 114705, true }, - { 114719, true }, - { 114729, true }, - { 114749, true }, - { 114758, true }, + { 114675, true }, + { 114685, true }, + { 114696, true }, + { 114709, true }, + { 114716, true }, + { 114725, true }, + { 114741, true }, + { 114752, true }, + { 114759, true }, { 114768, true }, - { 114779, false }, - { 114788, true }, - { 114801, true }, - { 114820, true }, - { 114830, true }, - { 114841, true }, - { 114854, true }, - { 114861, true }, - { 114870, true }, - { 114886, true }, - { 114897, true }, - { 114904, true }, - { 114913, true }, - { 114921, true }, - { 114931, true }, - { 114952, true }, - { 114964, true }, - { 114973, true }, - { 114981, true }, - { 114990, true }, - { 115001, true }, - { 115011, true }, - { 115022, true }, - { 115029, true }, - { 115038, true }, - { 115046, true }, - { 115057, true }, - { 115069, true }, - { 115077, true }, - { 115085, true }, - { 115095, true }, - { 115111, true }, - { 115123, true }, - { 115153, true }, - { 115173, true }, - { 115187, false }, - { 115205, false }, - { 115221, true }, - { 115236, true }, - { 115257, true }, - { 115271, true }, - { 115290, true }, - { 115301, true }, - { 115311, true }, - { 115322, true }, - { 115336, true }, - { 115349, true }, - { 115359, false }, - { 115375, true }, + { 114776, true }, + { 114786, true }, + { 114807, true }, + { 114819, true }, + { 114828, true }, + { 114836, true }, + { 114845, true }, + { 114856, true }, + { 114866, true }, + { 114877, true }, + { 114884, true }, + { 114893, true }, + { 114901, true }, + { 114912, true }, + { 114924, true }, + { 114932, true }, + { 114940, true }, + { 114950, true }, + { 114966, true }, + { 114978, true }, + { 115008, true }, + { 115028, true }, + { 115042, false }, + { 115060, false }, + { 115076, true }, + { 115091, true }, + { 115112, true }, + { 115126, true }, + { 115145, true }, + { 115156, true }, + { 115166, true }, + { 115177, true }, + { 115191, true }, + { 115204, true }, + { 115214, false }, + { 115230, true }, + { 115249, true }, + { 115275, true }, + { 115298, true }, + { 115315, true }, + { 115328, true }, + { 115344, true }, + { 115352, true }, + { 115365, true }, + { 115372, true }, + { 115384, true }, { 115394, true }, - { 115420, true }, - { 115443, true }, - { 115460, true }, - { 115473, true }, - { 115489, true }, - { 115497, true }, - { 115510, true }, - { 115517, true }, - { 115529, true }, - { 115539, true }, - { 115551, true }, - { 115571, false }, - { 115589, true }, - { 115602, true }, + { 115406, true }, + { 115426, false }, + { 115444, true }, + { 115457, true }, + { 115468, true }, + { 115478, true }, + { 115492, false }, + { 115508, true }, + { 115519, true }, + { 115528, true }, + { 115536, true }, + { 115546, true }, + { 115563, true }, + { 115574, true }, + { 115590, true }, + { 115601, true }, { 115613, true }, - { 115623, true }, - { 115637, false }, - { 115653, true }, - { 115664, true }, - { 115673, true }, - { 115681, true }, - { 115691, true }, - { 115708, true }, - { 115719, true }, - { 115735, true }, - { 115746, true }, - { 115758, true }, - { 115768, false }, - { 115783, true }, - { 115798, false }, - { 115806, true }, - { 115821, true }, - { 115840, true }, + { 115623, false }, + { 115638, true }, + { 115653, false }, + { 115661, true }, + { 115676, true }, + { 115695, true }, + { 115715, true }, + { 115726, true }, + { 115740, true }, + { 115756, true }, + { 115778, true }, + { 115791, true }, + { 115810, true }, + { 115823, true }, + { 115832, true }, + { 115847, true }, { 115860, true }, - { 115871, true }, - { 115885, true }, - { 115901, true }, - { 115923, true }, - { 115936, true }, + { 115872, true }, + { 115889, true }, + { 115913, true }, + { 115926, true }, + { 115943, true }, { 115955, true }, { 115968, true }, - { 115977, true }, - { 115992, true }, - { 116005, true }, - { 116017, true }, - { 116034, true }, - { 116058, true }, - { 116071, true }, + { 115983, true }, + { 115990, true }, + { 116003, true }, + { 116016, true }, + { 116030, true }, + { 116047, true }, + { 116062, true }, + { 116076, true }, { 116088, true }, - { 116100, true }, - { 116113, true }, - { 116128, true }, - { 116135, true }, - { 116148, true }, - { 116161, true }, - { 116175, true }, - { 116192, true }, - { 116207, true }, - { 116221, true }, - { 116233, true }, - { 116248, true }, - { 116263, true }, - { 116278, true }, + { 116103, true }, + { 116118, true }, + { 116133, true }, + { 116152, true }, + { 116171, true }, + { 116190, true }, + { 116205, true }, + { 116215, true }, + { 116228, false }, + { 116241, true }, + { 116255, true }, + { 116266, true }, + { 116281, true }, { 116297, true }, - { 116316, true }, - { 116335, true }, - { 116350, true }, - { 116360, true }, - { 116373, false }, - { 116386, true }, - { 116400, true }, - { 116411, true }, - { 116426, true }, - { 116442, true }, - { 116455, true }, - { 116468, true }, - { 116488, true }, - { 116497, true }, - { 116513, true }, - { 116526, true }, - { 116541, true }, - { 116554, true }, - { 116572, true }, - { 116580, false }, - { 116593, true }, - { 116611, true }, - { 116629, true }, - { 116660, true }, - { 116690, true }, - { 116712, true }, - { 116728, true }, - { 116739, false }, - { 116752, true }, - { 116764, true }, - { 116779, true }, - { 116796, false }, - { 116815, true }, - { 116826, true }, + { 116310, true }, + { 116323, true }, + { 116343, true }, + { 116352, true }, + { 116368, true }, + { 116381, true }, + { 116396, true }, + { 116409, true }, + { 116427, true }, + { 116435, false }, + { 116448, true }, + { 116466, true }, + { 116484, true }, + { 116515, true }, + { 116545, true }, + { 116567, true }, + { 116583, true }, + { 116594, false }, + { 116607, true }, + { 116619, true }, + { 116634, true }, + { 116651, false }, + { 116670, true }, + { 116681, true }, + { 116697, true }, + { 116707, true }, + { 116719, true }, + { 116735, true }, + { 116746, true }, + { 116763, true }, + { 116776, true }, + { 116796, true }, + { 116806, true }, + { 116817, true }, + { 116827, false }, { 116842, true }, - { 116852, true }, - { 116864, true }, - { 116880, true }, - { 116891, true }, - { 116908, true }, - { 116921, true }, - { 116941, true }, - { 116951, true }, - { 116962, true }, - { 116972, false }, - { 116987, true }, - { 117002, true }, - { 117019, true }, - { 117034, true }, - { 117045, false }, - { 117058, true }, - { 117071, true }, - { 117088, true }, - { 117100, true }, - { 117117, true }, - { 117130, true }, - { 117139, true }, - { 117150, true }, - { 117160, true }, - { 117174, true }, - { 117185, true }, - { 117199, true }, - { 117209, true }, - { 117221, true }, - { 117231, true }, - { 117240, true }, - { 117253, true }, - { 117264, false }, - { 117272, true }, - { 117279, true }, - { 117290, false }, - { 117310, true }, - { 117317, false }, - { 117333, true }, - { 117345, true }, - { 117365, true }, - { 117379, true }, - { 117395, true }, - { 117405, true }, - { 117418, true }, - { 117436, true }, - { 117450, true }, - { 117467, true }, - { 117486, true }, - { 117509, true }, - { 117521, true }, - { 117543, true }, - { 117553, true }, - { 117567, true }, - { 117577, true }, - { 117588, true }, - { 117597, true }, - { 117606, true }, - { 117623, true }, - { 117639, true }, - { 117653, true }, - { 117661, true }, - { 117675, true }, - { 117694, true }, - { 117710, false }, - { 117724, true }, - { 117737, true }, - { 117754, true }, - { 117769, true }, - { 117780, true }, - { 117791, true }, - { 117805, true }, - { 117819, true }, - { 117834, true }, - { 117855, true }, - { 117871, true }, - { 117889, true }, - { 117907, true }, - { 117920, true }, - { 117932, true }, - { 117948, true }, - { 117959, true }, - { 117967, true }, - { 117981, false }, - { 117990, true }, - { 117997, false }, - { 118017, true }, + { 116857, true }, + { 116874, true }, + { 116889, true }, + { 116900, false }, + { 116913, true }, + { 116926, true }, + { 116943, true }, + { 116955, true }, + { 116972, true }, + { 116985, true }, + { 116994, true }, + { 117005, true }, + { 117015, true }, + { 117029, true }, + { 117040, true }, + { 117054, true }, + { 117064, true }, + { 117076, true }, + { 117086, true }, + { 117095, true }, + { 117108, true }, + { 117119, false }, + { 117127, true }, + { 117134, true }, + { 117145, false }, + { 117165, true }, + { 117172, false }, + { 117188, true }, + { 117200, true }, + { 117220, true }, + { 117234, true }, + { 117250, true }, + { 117260, true }, + { 117273, true }, + { 117291, true }, + { 117305, true }, + { 117322, true }, + { 117341, true }, + { 117364, true }, + { 117376, true }, + { 117398, true }, + { 117408, true }, + { 117422, true }, + { 117432, true }, + { 117443, true }, + { 117452, true }, + { 117461, true }, + { 117478, true }, + { 117494, true }, + { 117508, true }, + { 117516, true }, + { 117530, true }, + { 117549, true }, + { 117565, false }, + { 117579, true }, + { 117592, true }, + { 117609, true }, + { 117624, true }, + { 117635, true }, + { 117646, true }, + { 117660, true }, + { 117674, true }, + { 117689, true }, + { 117710, true }, + { 117726, true }, + { 117744, true }, + { 117762, true }, + { 117775, true }, + { 117787, true }, + { 117803, true }, + { 117814, true }, + { 117822, true }, + { 117836, false }, + { 117845, true }, + { 117852, false }, + { 117872, true }, + { 117882, false }, + { 117901, false }, + { 117914, false }, + { 117926, true }, + { 117947, true }, + { 117960, true }, + { 117978, true }, + { 117987, true }, + { 118003, true }, { 118027, false }, - { 118046, false }, - { 118059, false }, - { 118071, true }, - { 118092, true }, - { 118105, true }, - { 118123, true }, - { 118141, true }, - { 118150, true }, - { 118166, true }, - { 118190, false }, - { 118206, true }, - { 118224, true }, - { 118236, true }, - { 118253, true }, - { 118267, true }, - { 118282, true }, - { 118301, true }, - { 118315, true }, - { 118333, true }, - { 118343, false }, - { 118372, true }, - { 118396, true }, - { 118415, true }, + { 118043, true }, + { 118061, true }, + { 118073, true }, + { 118090, true }, + { 118104, true }, + { 118119, true }, + { 118138, true }, + { 118152, true }, + { 118170, true }, + { 118180, false }, + { 118209, true }, + { 118233, true }, + { 118252, true }, + { 118265, true }, + { 118280, true }, + { 118294, true }, + { 118309, true }, + { 118327, true }, + { 118337, false }, + { 118352, true }, + { 118360, true }, + { 118373, false }, + { 118387, true }, + { 118398, true }, + { 118406, true }, + { 118414, true }, { 118428, true }, - { 118443, true }, - { 118457, true }, - { 118472, true }, - { 118490, true }, - { 118500, false }, - { 118515, true }, - { 118523, true }, - { 118536, false }, - { 118550, true }, - { 118561, true }, - { 118569, true }, - { 118577, true }, - { 118591, true }, - { 118613, true }, - { 118625, true }, - { 118637, true }, - { 118652, true }, - { 118672, true }, - { 118695, true }, - { 118714, true }, - { 118733, true }, - { 118752, true }, - { 118771, true }, - { 118790, true }, - { 118809, true }, - { 118828, true }, - { 118845, true }, - { 118863, true }, - { 118880, true }, - { 118894, true }, - { 118909, true }, - { 118927, true }, - { 118942, true }, - { 118955, true }, - { 118979, true }, - { 118996, true }, - { 119014, true }, - { 119030, true }, - { 119048, true }, - { 119065, true }, - { 119081, true }, - { 119094, true }, - { 119107, true }, - { 119124, true }, - { 119141, true }, - { 119149, true }, - { 119162, true }, - { 119176, true }, - { 119203, true }, - { 119219, true }, - { 119235, true }, - { 119249, true }, - { 119262, true }, - { 119275, true }, - { 119285, true }, - { 119298, true }, - { 119308, true }, - { 119323, true }, - { 119338, false }, - { 119348, false }, - { 119358, false }, - { 119368, true }, - { 119380, false }, - { 119391, true }, - { 119398, true }, - { 119411, true }, - { 119423, true }, - { 119443, true }, - { 119454, true }, - { 119475, true }, - { 119491, true }, - { 119510, true }, - { 119520, true }, - { 119531, true }, - { 119540, true }, - { 119549, true }, - { 119562, true }, - { 119591, true }, - { 119610, true }, - { 119627, true }, - { 119650, true }, - { 119658, true }, - { 119676, true }, - { 119689, true }, - { 119700, true }, - { 119713, true }, - { 119730, true }, - { 119743, true }, - { 119754, false }, - { 119766, true }, - { 119775, true }, - { 119785, true }, - { 119794, true }, - { 119804, true }, - { 119817, true }, - { 119827, true }, - { 119840, true }, - { 119850, true }, - { 119863, true }, - { 119882, true }, - { 119893, true }, - { 119908, true }, - { 119922, true }, - { 119933, true }, - { 119945, true }, - { 119953, true }, - { 119967, true }, - { 119982, false }, - { 119996, false }, - { 120008, true }, - { 120022, true }, - { 120031, true }, - { 120050, true }, - { 120071, true }, - { 120086, true }, - { 120098, true }, - { 120109, true }, - { 120122, true }, - { 120132, true }, + { 118450, true }, + { 118462, true }, + { 118474, true }, + { 118489, true }, + { 118509, true }, + { 118532, true }, + { 118551, true }, + { 118570, true }, + { 118589, true }, + { 118608, true }, + { 118627, true }, + { 118646, true }, + { 118665, true }, + { 118682, true }, + { 118700, true }, + { 118717, true }, + { 118731, true }, + { 118749, true }, + { 118764, true }, + { 118777, true }, + { 118801, true }, + { 118818, true }, + { 118836, true }, + { 118852, true }, + { 118870, true }, + { 118887, true }, + { 118903, true }, + { 118916, true }, + { 118929, true }, + { 118946, true }, + { 118963, true }, + { 118971, true }, + { 118984, true }, + { 118998, true }, + { 119025, true }, + { 119041, true }, + { 119051, true }, + { 119064, true }, + { 119074, true }, + { 119089, true }, + { 119104, false }, + { 119114, false }, + { 119124, false }, + { 119134, true }, + { 119146, false }, + { 119157, true }, + { 119164, true }, + { 119177, true }, + { 119189, true }, + { 119209, true }, + { 119220, true }, + { 119241, true }, + { 119257, true }, + { 119276, true }, + { 119286, true }, + { 119297, true }, + { 119306, true }, + { 119315, true }, + { 119328, true }, + { 119357, true }, + { 119376, true }, + { 119393, true }, + { 119416, true }, + { 119424, true }, + { 119442, true }, + { 119455, true }, + { 119466, true }, + { 119479, true }, + { 119496, true }, + { 119509, true }, + { 119520, false }, + { 119532, true }, + { 119541, true }, + { 119551, true }, + { 119560, true }, + { 119570, true }, + { 119583, true }, + { 119593, true }, + { 119606, true }, + { 119616, true }, + { 119629, true }, + { 119648, true }, + { 119659, true }, + { 119674, true }, + { 119688, true }, + { 119699, true }, + { 119711, true }, + { 119719, true }, + { 119733, true }, + { 119748, false }, + { 119762, false }, + { 119774, true }, + { 119788, true }, + { 119797, true }, + { 119816, true }, + { 119837, true }, + { 119852, true }, + { 119864, true }, + { 119875, true }, + { 119888, true }, + { 119898, true }, + { 119919, true }, + { 119937, true }, + { 119958, true }, + { 119984, true }, + { 120007, true }, + { 120040, true }, + { 120059, true }, + { 120083, true }, + { 120094, true }, + { 120105, true }, + { 120118, false }, + { 120142, true }, { 120153, true }, - { 120171, true }, - { 120192, true }, - { 120218, true }, - { 120241, true }, + { 120167, true }, + { 120178, true }, + { 120188, true }, + { 120196, true }, + { 120203, true }, + { 120214, true }, + { 120225, true }, + { 120235, true }, + { 120244, true }, + { 120259, true }, { 120274, true }, - { 120293, true }, - { 120317, true }, - { 120328, true }, + { 120285, true }, + { 120294, true }, + { 120305, true }, + { 120316, true }, + { 120330, true }, { 120339, true }, - { 120352, false }, - { 120376, true }, + { 120355, true }, + { 120363, true }, + { 120375, true }, { 120387, true }, - { 120401, true }, - { 120412, true }, - { 120422, true }, - { 120430, true }, - { 120437, true }, - { 120448, true }, - { 120459, true }, - { 120469, true }, - { 120478, true }, - { 120493, true }, - { 120508, true }, - { 120519, true }, - { 120528, true }, - { 120539, true }, - { 120550, true }, - { 120564, true }, - { 120573, true }, - { 120589, true }, - { 120597, true }, - { 120609, true }, - { 120621, true }, - { 120637, true }, - { 120647, true }, - { 120666, true }, - { 120674, true }, - { 120687, true }, - { 120696, true }, - { 120717, true }, - { 120736, true }, - { 120752, true }, - { 120767, true }, - { 120780, true }, - { 120797, true }, - { 120813, true }, - { 120821, true }, - { 120830, true }, - { 120838, true }, - { 120852, true }, - { 120871, false }, - { 120880, true }, - { 120890, true }, - { 120912, true }, + { 120403, true }, + { 120413, true }, + { 120432, true }, + { 120440, true }, + { 120453, true }, + { 120462, true }, + { 120483, true }, + { 120502, true }, + { 120517, true }, + { 120530, true }, + { 120547, true }, + { 120563, true }, + { 120571, true }, + { 120580, true }, + { 120594, true }, + { 120613, false }, + { 120622, true }, + { 120632, true }, + { 120654, true }, + { 120668, true }, + { 120683, true }, + { 120696, false }, + { 120710, true }, + { 120718, true }, + { 120730, true }, + { 120741, true }, + { 120753, true }, + { 120763, true }, + { 120772, true }, + { 120783, false }, + { 120793, false }, + { 120809, true }, + { 120819, true }, + { 120829, true }, + { 120843, true }, + { 120858, true }, + { 120870, true }, + { 120879, true }, + { 120892, true }, + { 120902, true }, + { 120915, true }, { 120926, true }, - { 120941, true }, - { 120954, false }, - { 120968, true }, - { 120976, true }, + { 120949, false }, + { 120963, true }, + { 120975, true }, { 120988, true }, - { 120999, true }, - { 121011, true }, - { 121021, true }, - { 121030, true }, - { 121041, false }, - { 121051, false }, - { 121067, true }, - { 121077, true }, - { 121087, true }, - { 121101, true }, - { 121116, true }, - { 121128, true }, - { 121137, true }, - { 121150, true }, - { 121160, true }, - { 121173, true }, - { 121184, true }, - { 121207, false }, - { 121221, true }, - { 121233, true }, - { 121246, true }, + { 120997, true }, + { 121010, true }, + { 121026, true }, + { 121037, true }, + { 121051, true }, + { 121065, true }, + { 121075, true }, + { 121084, true }, + { 121094, true }, + { 121104, true }, + { 121119, true }, + { 121131, true }, + { 121143, true }, + { 121157, true }, + { 121174, true }, + { 121184, false }, + { 121193, false }, + { 121212, true }, + { 121228, true }, + { 121243, true }, { 121255, true }, - { 121268, true }, - { 121284, true }, - { 121295, true }, - { 121309, true }, - { 121323, true }, - { 121333, true }, - { 121342, true }, - { 121352, true }, - { 121362, true }, - { 121377, true }, - { 121389, true }, - { 121401, true }, - { 121415, true }, - { 121432, true }, - { 121442, false }, - { 121451, false }, - { 121470, true }, - { 121486, true }, - { 121501, true }, - { 121513, true }, - { 121525, false }, - { 121537, true }, - { 121550, true }, - { 121568, true }, - { 121583, true }, - { 121598, false }, - { 121614, true }, + { 121267, false }, + { 121279, true }, + { 121292, true }, + { 121310, true }, + { 121325, true }, + { 121340, false }, + { 121356, true }, + { 121368, true }, + { 121380, true }, + { 121391, true }, + { 121404, false }, + { 121419, true }, + { 121429, true }, + { 121439, true }, + { 121453, true }, + { 121467, true }, + { 121479, true }, + { 121490, true }, + { 121506, true }, + { 121517, true }, + { 121535, true }, + { 121553, true }, + { 121566, true }, + { 121587, false }, + { 121606, true }, { 121626, true }, - { 121638, true }, - { 121649, true }, - { 121662, false }, - { 121677, true }, - { 121687, true }, - { 121697, true }, - { 121711, true }, - { 121725, true }, - { 121737, true }, - { 121748, true }, - { 121764, true }, - { 121775, true }, - { 121793, true }, - { 121811, true }, - { 121824, true }, - { 121845, false }, - { 121864, true }, - { 121884, true }, - { 121906, true }, - { 121918, true }, - { 121936, true }, - { 121951, true }, - { 121963, true }, - { 121979, true }, - { 121994, true }, - { 122010, true }, - { 122026, true }, - { 122042, true }, - { 122059, true }, - { 122081, true }, - { 122092, true }, - { 122108, true }, - { 122128, true }, - { 122139, true }, - { 122154, true }, - { 122170, true }, - { 122185, true }, - { 122200, true }, - { 122223, true }, - { 122238, true }, - { 122263, true }, - { 122278, true }, + { 121648, true }, + { 121660, true }, + { 121678, true }, + { 121693, true }, + { 121705, true }, + { 121721, true }, + { 121736, true }, + { 121752, true }, + { 121768, true }, + { 121784, true }, + { 121801, true }, + { 121823, true }, + { 121834, true }, + { 121850, true }, + { 121870, true }, + { 121881, true }, + { 121896, true }, + { 121912, true }, + { 121927, true }, + { 121942, true }, + { 121965, true }, + { 121980, true }, + { 122005, true }, + { 122020, true }, + { 122036, true }, + { 122051, true }, + { 122080, true }, + { 122105, true }, + { 122127, true }, + { 122145, true }, + { 122159, true }, + { 122172, true }, + { 122187, true }, + { 122194, true }, + { 122210, true }, + { 122221, true }, + { 122232, true }, + { 122242, true }, + { 122256, true }, + { 122270, true }, + { 122282, true }, { 122294, true }, - { 122309, true }, - { 122338, true }, - { 122363, true }, - { 122385, true }, - { 122403, true }, - { 122417, true }, - { 122430, true }, - { 122445, true }, - { 122452, true }, - { 122468, true }, - { 122479, true }, - { 122490, true }, - { 122500, true }, - { 122514, true }, - { 122528, true }, - { 122540, true }, - { 122552, true }, - { 122563, true }, - { 122578, true }, - { 122593, true }, - { 122600, true }, - { 122610, true }, - { 122620, true }, - { 122629, true }, - { 122645, true }, - { 122654, true }, - { 122663, true }, - { 122672, true }, - { 122684, true }, + { 122305, true }, + { 122320, true }, + { 122335, true }, + { 122342, true }, + { 122352, true }, + { 122362, true }, + { 122371, true }, + { 122387, true }, + { 122396, true }, + { 122405, true }, + { 122414, true }, + { 122426, true }, + { 122442, true }, + { 122461, true }, + { 122473, false }, + { 122490, false }, + { 122510, true }, + { 122525, true }, + { 122538, true }, + { 122556, true }, + { 122571, true }, + { 122580, true }, + { 122595, true }, + { 122609, true }, + { 122625, true }, + { 122640, true }, + { 122662, true }, + { 122681, true }, { 122700, true }, - { 122719, true }, - { 122731, false }, - { 122748, false }, - { 122768, true }, - { 122783, true }, - { 122796, true }, - { 122814, true }, - { 122829, true }, - { 122838, true }, - { 122853, true }, - { 122867, true }, - { 122883, true }, - { 122898, true }, - { 122920, true }, - { 122939, true }, - { 122958, true }, - { 122974, true }, - { 122985, true }, - { 122994, true }, - { 123004, true }, - { 123023, true }, - { 123038, true }, - { 123052, true }, - { 123065, true }, - { 123073, true }, - { 123081, true }, - { 123090, true }, - { 123102, true }, - { 123114, true }, - { 123123, true }, - { 123135, true }, - { 123143, true }, - { 123155, true }, - { 123181, true }, - { 123204, false }, - { 123220, true }, - { 123240, true }, - { 123261, true }, + { 122716, true }, + { 122727, true }, + { 122736, true }, + { 122746, true }, + { 122765, true }, + { 122780, true }, + { 122794, true }, + { 122807, true }, + { 122815, true }, + { 122823, true }, + { 122832, true }, + { 122844, true }, + { 122856, true }, + { 122865, true }, + { 122877, true }, + { 122885, true }, + { 122897, true }, + { 122923, true }, + { 122946, false }, + { 122962, true }, + { 122982, true }, + { 123003, true }, + { 123022, true }, + { 123036, true }, + { 123050, true }, + { 123067, true }, + { 123081, false }, + { 123096, true }, + { 123104, true }, + { 123119, true }, + { 123134, true }, + { 123148, true }, + { 123159, true }, + { 123177, true }, + { 123194, true }, + { 123214, true }, + { 123238, true }, + { 123245, true }, + { 123256, true }, + { 123267, true }, { 123280, true }, - { 123294, true }, - { 123308, true }, - { 123325, true }, - { 123339, false }, - { 123354, true }, - { 123362, true }, - { 123377, true }, - { 123392, true }, - { 123406, true }, - { 123417, true }, - { 123435, true }, + { 123292, false }, + { 123307, true }, + { 123323, true }, + { 123336, true }, + { 123346, true }, + { 123361, false }, + { 123370, true }, + { 123384, true }, + { 123399, true }, + { 123409, true }, + { 123419, true }, + { 123432, true }, + { 123444, true }, { 123452, true }, - { 123472, true }, - { 123496, true }, - { 123503, true }, + { 123463, true }, + { 123484, true }, + { 123494, false }, { 123514, true }, { 123525, true }, - { 123538, true }, - { 123550, false }, - { 123565, true }, - { 123581, true }, - { 123594, true }, - { 123604, true }, - { 123619, false }, + { 123532, true }, + { 123542, true }, + { 123552, true }, + { 123560, false }, + { 123580, true }, + { 123589, true }, + { 123598, true }, + { 123616, true }, { 123628, true }, { 123642, true }, { 123657, true }, - { 123667, true }, - { 123677, true }, + { 123669, true }, + { 123682, true }, { 123690, true }, - { 123702, true }, - { 123710, true }, - { 123721, true }, - { 123742, true }, - { 123752, false }, - { 123772, true }, - { 123783, true }, - { 123790, true }, - { 123800, true }, - { 123810, true }, - { 123818, false }, - { 123838, true }, - { 123847, true }, - { 123856, true }, - { 123874, true }, - { 123886, true }, - { 123900, true }, - { 123915, true }, - { 123927, true }, - { 123940, true }, - { 123948, true }, - { 123966, true }, - { 123977, true }, - { 123985, true }, - { 123995, true }, - { 124004, true }, - { 124017, true }, + { 123708, true }, + { 123719, true }, + { 123727, true }, + { 123737, true }, + { 123746, true }, + { 123759, true }, + { 123769, true }, + { 123781, true }, + { 123793, true }, + { 123807, true }, + { 123823, true }, + { 123841, true }, + { 123854, true }, + { 123867, false }, + { 123880, true }, + { 123899, true }, + { 123907, true }, + { 123919, true }, + { 123931, true }, + { 123957, true }, + { 123975, true }, + { 123986, true }, + { 123998, true }, + { 124011, true }, { 124027, true }, - { 124039, true }, - { 124051, true }, - { 124065, true }, - { 124081, true }, - { 124099, true }, - { 124112, true }, - { 124125, false }, - { 124138, true }, - { 124157, true }, - { 124165, true }, - { 124177, true }, - { 124189, true }, - { 124215, true }, - { 124233, true }, - { 124244, true }, - { 124256, true }, - { 124269, true }, - { 124285, true }, - { 124299, true }, - { 124317, true }, - { 124333, true }, - { 124356, true }, - { 124375, true }, - { 124389, true }, - { 124405, true }, - { 124421, true }, - { 124438, true }, - { 124468, false }, - { 124484, true }, - { 124496, true }, - { 124509, true }, - { 124523, true }, - { 124540, true }, - { 124555, true }, - { 124570, true }, - { 124581, true }, - { 124599, true }, - { 124615, true }, - { 124627, true }, - { 124637, true }, - { 124654, true }, - { 124666, false }, - { 124680, true }, - { 124687, false }, - { 124719, true }, - { 124733, true }, - { 124743, true }, - { 124757, true }, - { 124774, true }, - { 124786, true }, - { 124800, true }, - { 124816, false }, - { 124831, true }, - { 124842, true }, - { 124853, true }, - { 124865, true }, - { 124874, true }, - { 124881, true }, + { 124041, true }, + { 124059, true }, + { 124075, true }, + { 124098, true }, + { 124117, true }, + { 124131, true }, + { 124147, true }, + { 124163, true }, + { 124180, true }, + { 124210, false }, + { 124226, true }, + { 124238, true }, + { 124251, true }, + { 124265, true }, + { 124282, true }, + { 124297, true }, + { 124312, true }, + { 124323, true }, + { 124341, true }, + { 124357, true }, + { 124369, true }, + { 124379, true }, + { 124396, true }, + { 124408, false }, + { 124422, true }, + { 124429, false }, + { 124461, true }, + { 124475, true }, + { 124485, true }, + { 124499, true }, + { 124516, true }, + { 124528, true }, + { 124542, true }, + { 124558, false }, + { 124573, true }, + { 124584, true }, + { 124595, true }, + { 124607, true }, + { 124616, true }, + { 124623, true }, + { 124634, true }, + { 124642, true }, + { 124649, true }, + { 124659, true }, + { 124670, true }, + { 124678, true }, + { 124686, true }, + { 124694, true }, + { 124707, true }, + { 124722, true }, + { 124732, true }, + { 124742, true }, + { 124749, true }, + { 124761, true }, + { 124777, true }, + { 124789, true }, + { 124801, true }, + { 124813, true }, + { 124822, true }, + { 124833, true }, + { 124848, true }, + { 124856, true }, + { 124867, true }, + { 124878, true }, { 124892, true }, - { 124900, true }, - { 124907, true }, - { 124917, true }, - { 124928, true }, - { 124936, true }, - { 124944, true }, - { 124952, true }, - { 124965, true }, - { 124980, true }, - { 124990, true }, + { 124908, true }, + { 124920, true }, + { 124934, true }, + { 124948, false }, + { 124958, true }, + { 124979, true }, { 125000, true }, - { 125007, true }, - { 125019, true }, - { 125035, true }, - { 125047, true }, - { 125059, true }, - { 125071, true }, - { 125080, true }, - { 125091, true }, - { 125106, true }, - { 125114, true }, - { 125125, true }, - { 125136, true }, - { 125150, true }, - { 125166, true }, - { 125178, true }, - { 125192, true }, - { 125206, false }, - { 125216, true }, - { 125237, true }, - { 125258, true }, - { 125272, true }, - { 125284, true }, - { 125301, true }, - { 125314, true }, - { 125328, true }, - { 125339, true }, - { 125348, true }, - { 125358, true }, - { 125365, true }, - { 125377, true }, - { 125386, true }, - { 125395, true }, - { 125403, true }, - { 125418, true }, - { 125426, true }, - { 125438, false }, - { 125448, true }, - { 125458, true }, - { 125469, true }, - { 125478, true }, - { 125496, true }, - { 125506, false }, - { 125517, true }, - { 125539, true }, - { 125547, true }, - { 125555, false }, - { 125563, true }, - { 125579, true }, - { 125592, true }, - { 125603, true }, - { 125615, true }, - { 125634, true }, - { 125660, true }, - { 125674, true }, - { 125688, true }, - { 125703, false }, - { 125721, true }, - { 125737, true }, - { 125752, true }, - { 125763, true }, - { 125779, true }, - { 125791, true }, - { 125803, true }, - { 125816, true }, - { 125828, true }, - { 125835, true }, - { 125848, true }, - { 125865, true }, - { 125887, true }, - { 125897, true }, - { 125907, true }, - { 125919, false }, - { 125930, true }, - { 125944, true }, - { 125953, true }, - { 125964, true }, - { 125980, true }, - { 125993, true }, - { 126009, true }, - { 126036, true }, - { 126048, true }, - { 126062, true }, - { 126070, true }, - { 126080, true }, - { 126103, true }, - { 126112, false }, - { 126135, true }, - { 126153, true }, - { 126170, true }, - { 126179, true }, - { 126191, true }, - { 126200, true }, - { 126208, true }, - { 126221, true }, - { 126246, true }, - { 126257, true }, - { 126270, true }, - { 126284, true }, - { 126297, false }, - { 126308, true }, - { 126316, true }, - { 126328, false }, - { 126339, true }, - { 126354, true }, - { 126374, true }, + { 125014, true }, + { 125026, true }, + { 125043, true }, + { 125056, true }, + { 125070, true }, + { 125081, true }, + { 125090, true }, + { 125100, true }, + { 125107, true }, + { 125119, true }, + { 125128, true }, + { 125137, true }, + { 125145, true }, + { 125160, true }, + { 125168, true }, + { 125180, false }, + { 125190, true }, + { 125200, true }, + { 125211, true }, + { 125220, true }, + { 125238, true }, + { 125248, false }, + { 125259, true }, + { 125281, true }, + { 125289, true }, + { 125297, false }, + { 125305, true }, + { 125321, true }, + { 125334, true }, + { 125345, true }, + { 125357, true }, + { 125376, true }, + { 125402, true }, + { 125416, true }, + { 125430, true }, + { 125445, false }, + { 125463, true }, + { 125479, true }, + { 125494, true }, + { 125505, true }, + { 125521, true }, + { 125533, true }, + { 125545, true }, + { 125558, true }, + { 125570, true }, + { 125577, true }, + { 125590, true }, + { 125607, true }, + { 125629, true }, + { 125639, true }, + { 125649, true }, + { 125661, false }, + { 125672, true }, + { 125686, true }, + { 125695, true }, + { 125706, true }, + { 125722, true }, + { 125735, true }, + { 125751, true }, + { 125778, true }, + { 125790, true }, + { 125804, true }, + { 125812, true }, + { 125822, true }, + { 125845, true }, + { 125854, false }, + { 125877, true }, + { 125895, true }, + { 125912, true }, + { 125921, true }, + { 125933, true }, + { 125942, true }, + { 125950, true }, + { 125963, true }, + { 125988, true }, + { 125999, true }, + { 126012, true }, + { 126026, true }, + { 126039, false }, + { 126050, true }, + { 126058, true }, + { 126070, false }, + { 126081, true }, + { 126096, true }, + { 126116, true }, + { 126124, true }, + { 126142, true }, + { 126162, true }, + { 126183, true }, + { 126193, true }, + { 126206, false }, + { 126224, true }, + { 126255, true }, + { 126275, true }, + { 126292, true }, + { 126305, true }, + { 126320, true }, + { 126332, true }, + { 126342, true }, + { 126349, true }, + { 126366, true }, { 126382, true }, - { 126400, true }, + { 126394, true }, + { 126408, true }, { 126420, true }, - { 126441, true }, - { 126451, true }, - { 126464, false }, - { 126482, true }, - { 126513, true }, - { 126533, true }, - { 126550, true }, - { 126563, true }, - { 126578, true }, + { 126435, true }, + { 126453, true }, + { 126466, true }, + { 126476, true }, + { 126487, true }, + { 126498, true }, + { 126509, true }, + { 126524, true }, + { 126535, true }, + { 126547, false }, + { 126559, true }, + { 126573, true }, { 126590, true }, { 126600, true }, - { 126607, true }, - { 126624, true }, - { 126640, true }, - { 126652, true }, - { 126666, true }, - { 126678, true }, - { 126693, true }, - { 126711, true }, - { 126724, true }, - { 126734, true }, - { 126745, true }, - { 126756, true }, - { 126767, true }, - { 126782, true }, - { 126793, true }, - { 126805, false }, - { 126817, true }, - { 126831, true }, - { 126848, true }, - { 126858, true }, - { 126871, false }, - { 126889, false }, - { 126900, true }, - { 126915, true }, - { 126932, true }, - { 126949, true }, - { 126959, true }, - { 126974, true }, - { 126984, true }, - { 126999, true }, - { 127016, true }, - { 127028, true }, - { 127046, true }, - { 127061, true }, + { 126613, false }, + { 126631, false }, + { 126642, true }, + { 126657, true }, + { 126674, true }, + { 126691, true }, + { 126701, true }, + { 126716, true }, + { 126726, true }, + { 126741, true }, + { 126758, true }, + { 126770, true }, + { 126788, true }, + { 126803, true }, + { 126828, true }, + { 126845, true }, + { 126864, true }, + { 126881, true }, + { 126901, true }, + { 126922, true }, + { 126936, true }, + { 126961, true }, + { 126982, true }, + { 127004, true }, + { 127034, true }, + { 127058, true }, + { 127073, true }, { 127086, true }, - { 127103, true }, - { 127122, true }, - { 127139, true }, - { 127159, true }, - { 127180, true }, - { 127194, true }, - { 127219, true }, - { 127240, true }, - { 127262, true }, - { 127292, true }, - { 127316, true }, - { 127331, true }, - { 127344, true }, - { 127354, true }, - { 127377, true }, - { 127388, true }, - { 127395, true }, + { 127096, true }, + { 127119, true }, + { 127130, true }, + { 127137, true }, + { 127151, true }, + { 127170, true }, + { 127177, true }, + { 127197, true }, + { 127208, true }, + { 127227, true }, + { 127243, true }, + { 127253, true }, + { 127264, true }, + { 127274, true }, + { 127285, true }, + { 127299, true }, + { 127311, true }, + { 127327, true }, + { 127335, true }, + { 127345, true }, + { 127355, true }, + { 127367, true }, + { 127378, true }, + { 127394, true }, { 127409, true }, - { 127428, true }, - { 127435, true }, + { 127433, true }, + { 127447, true }, { 127455, true }, - { 127466, true }, - { 127485, true }, - { 127501, true }, - { 127511, true }, - { 127522, true }, - { 127532, true }, - { 127543, true }, - { 127557, true }, - { 127569, true }, - { 127585, true }, - { 127593, true }, - { 127603, true }, - { 127613, true }, - { 127625, true }, - { 127636, true }, - { 127652, true }, - { 127667, true }, - { 127691, true }, - { 127705, true }, - { 127713, true }, - { 127731, true }, - { 127742, true }, - { 127755, true }, - { 127766, true }, - { 127785, true }, - { 127796, true }, - { 127811, true }, - { 127826, true }, - { 127840, true }, - { 127852, true }, - { 127870, true }, + { 127473, true }, + { 127484, true }, + { 127497, true }, + { 127508, true }, + { 127527, true }, + { 127538, true }, + { 127553, true }, + { 127568, true }, + { 127582, true }, + { 127594, true }, + { 127612, true }, + { 127632, true }, + { 127644, true }, + { 127661, true }, + { 127676, true }, + { 127690, true }, + { 127704, true }, + { 127715, true }, + { 127724, true }, + { 127733, true }, + { 127751, true }, + { 127762, true }, + { 127769, true }, + { 127780, true }, + { 127797, false }, + { 127823, false }, + { 127835, true }, + { 127848, true }, + { 127862, true }, + { 127873, true }, { 127890, true }, - { 127902, true }, - { 127919, true }, - { 127934, true }, - { 127948, true }, - { 127962, true }, + { 127900, true }, + { 127913, true }, + { 127928, true }, + { 127949, true }, { 127973, true }, - { 127982, true }, - { 127991, true }, - { 128009, true }, - { 128020, true }, + { 127987, true }, + { 127998, true }, + { 128012, true }, { 128027, true }, - { 128038, true }, - { 128055, false }, - { 128081, false }, - { 128093, true }, - { 128106, true }, - { 128120, true }, - { 128131, true }, - { 128148, true }, - { 128158, true }, - { 128171, true }, + { 128037, true }, + { 128050, true }, + { 128063, true }, + { 128076, true }, + { 128096, true }, + { 128118, true }, + { 128132, true }, + { 128147, false }, + { 128160, true }, + { 128175, true }, { 128186, true }, - { 128207, true }, - { 128231, true }, - { 128245, true }, - { 128256, true }, - { 128270, true }, - { 128285, true }, - { 128295, true }, - { 128308, true }, - { 128321, true }, - { 128334, true }, - { 128354, true }, - { 128376, true }, - { 128390, true }, - { 128405, false }, - { 128418, true }, - { 128433, true }, - { 128444, true }, - { 128464, true }, - { 128477, false }, - { 128496, true }, - { 128507, true }, - { 128526, true }, - { 128534, true }, - { 128551, true }, - { 128567, true }, - { 128576, true }, - { 128587, true }, - { 128597, true }, - { 128608, true }, - { 128618, true }, - { 128630, true }, - { 128637, true }, - { 128655, true }, - { 128667, true }, - { 128678, true }, - { 128700, true }, - { 128714, true }, - { 128733, true }, - { 128741, true }, - { 128760, true }, - { 128769, true }, - { 128781, true }, - { 128799, true }, - { 128813, true }, - { 128832, true }, - { 128841, true }, - { 128857, true }, - { 128865, true }, - { 128877, true }, - { 128892, true }, + { 128206, true }, + { 128219, false }, + { 128238, true }, + { 128249, true }, + { 128268, true }, + { 128276, true }, + { 128293, true }, + { 128309, true }, + { 128318, true }, + { 128329, true }, + { 128339, true }, + { 128350, true }, + { 128360, true }, + { 128372, true }, + { 128379, true }, + { 128397, true }, + { 128409, true }, + { 128420, true }, + { 128442, true }, + { 128456, true }, + { 128475, true }, + { 128483, true }, + { 128502, true }, + { 128511, true }, + { 128523, true }, + { 128541, true }, + { 128555, true }, + { 128574, true }, + { 128583, true }, + { 128599, true }, + { 128607, true }, + { 128619, true }, + { 128634, true }, + { 128654, true }, + { 128662, true }, + { 128675, true }, + { 128693, true }, + { 128705, true }, + { 128724, true }, + { 128738, true }, + { 128751, true }, + { 128763, true }, + { 128787, true }, + { 128803, true }, + { 128817, true }, + { 128834, true }, + { 128850, true }, + { 128867, true }, + { 128886, true }, + { 128894, true }, { 128912, true }, - { 128920, true }, - { 128933, true }, - { 128951, true }, + { 128921, false }, + { 128930, true }, + { 128944, true }, + { 128954, true }, { 128963, true }, - { 128982, true }, - { 128995, true }, - { 129007, true }, - { 129031, true }, - { 129047, true }, - { 129061, true }, + { 128986, true }, + { 128998, true }, + { 129008, false }, + { 129017, true }, + { 129024, true }, + { 129033, true }, + { 129041, true }, + { 129050, false }, + { 129064, true }, { 129078, true }, - { 129094, true }, - { 129111, true }, - { 129119, true }, - { 129137, true }, - { 129146, false }, - { 129155, true }, - { 129169, true }, - { 129179, true }, - { 129188, true }, - { 129211, true }, - { 129223, true }, - { 129233, false }, - { 129242, true }, - { 129249, true }, - { 129258, true }, - { 129266, true }, - { 129275, false }, - { 129289, true }, - { 129303, true }, - { 129313, true }, - { 129323, true }, - { 129333, true }, - { 129351, false }, - { 129364, true }, - { 129382, true }, - { 129392, true }, - { 129403, true }, - { 129416, true }, - { 129430, true }, - { 129443, true }, - { 129453, true }, - { 129464, true }, - { 129473, true }, - { 129490, true }, - { 129499, true }, - { 129512, true }, - { 129523, true }, - { 129541, true }, - { 129551, true }, - { 129563, true }, - { 129574, true }, - { 129591, true }, - { 129604, true }, - { 129618, true }, - { 129627, true }, - { 129640, false }, - { 129649, false }, - { 129660, true }, - { 129672, false }, - { 129687, false }, - { 129698, false }, - { 129705, true }, - { 129721, true }, - { 129739, true }, - { 129758, true }, - { 129773, true }, + { 129088, true }, + { 129098, true }, + { 129108, true }, + { 129126, false }, + { 129139, true }, + { 129157, true }, + { 129167, true }, + { 129178, true }, + { 129191, true }, + { 129205, true }, + { 129218, true }, + { 129228, true }, + { 129239, true }, + { 129248, true }, + { 129265, true }, + { 129274, true }, + { 129287, true }, + { 129298, true }, + { 129316, true }, + { 129326, true }, + { 129338, true }, + { 129349, true }, + { 129366, true }, + { 129379, true }, + { 129393, true }, + { 129402, true }, + { 129415, false }, + { 129424, false }, + { 129435, true }, + { 129447, false }, + { 129462, false }, + { 129473, false }, + { 129480, true }, + { 129496, true }, + { 129514, true }, + { 129533, true }, + { 129548, true }, + { 129565, true }, + { 129579, true }, + { 129595, true }, + { 129609, true }, + { 129626, true }, + { 129645, true }, + { 129660, false }, + { 129674, true }, + { 129688, true }, + { 129701, true }, + { 129722, true }, + { 129734, true }, + { 129747, true }, + { 129757, true }, + { 129777, true }, { 129790, true }, - { 129804, true }, - { 129820, true }, - { 129834, true }, + { 129809, true }, + { 129827, true }, + { 129841, true }, { 129851, true }, - { 129870, false }, - { 129884, true }, - { 129898, true }, - { 129911, true }, - { 129932, true }, - { 129944, true }, - { 129957, true }, - { 129967, true }, - { 129987, true }, - { 130000, true }, - { 130019, true }, - { 130037, true }, - { 130051, true }, + { 129865, true }, + { 129875, true }, + { 129891, true }, + { 129904, true }, + { 129919, true }, + { 129935, true }, + { 129959, true }, + { 129975, true }, + { 129989, true }, + { 130001, true }, + { 130013, false }, + { 130031, true }, + { 130044, true }, { 130063, true }, - { 130073, true }, - { 130087, true }, - { 130097, true }, - { 130113, true }, - { 130126, true }, - { 130141, true }, - { 130157, true }, - { 130181, true }, - { 130197, true }, - { 130211, true }, - { 130223, true }, - { 130235, false }, - { 130253, true }, - { 130266, true }, + { 130081, true }, + { 130096, true }, + { 130119, true }, + { 130136, true }, + { 130155, true }, + { 130175, true }, + { 130198, true }, + { 130217, true }, + { 130236, true }, + { 130255, true }, + { 130274, true }, { 130285, true }, - { 130303, true }, - { 130318, true }, - { 130341, true }, - { 130358, true }, - { 130377, true }, - { 130397, true }, - { 130420, true }, - { 130439, true }, - { 130458, true }, - { 130477, true }, - { 130496, true }, + { 130295, true }, + { 130310, true }, + { 130331, true }, + { 130351, true }, + { 130370, true }, + { 130384, true }, + { 130396, true }, + { 130406, true }, + { 130418, true }, + { 130436, true }, + { 130452, true }, + { 130473, true }, + { 130485, true }, + { 130495, false }, { 130507, true }, - { 130517, true }, - { 130532, true }, - { 130553, true }, - { 130573, true }, - { 130592, true }, - { 130606, true }, - { 130618, true }, - { 130628, true }, - { 130640, true }, - { 130658, true }, - { 130674, true }, - { 130695, true }, - { 130707, true }, - { 130717, false }, - { 130729, true }, - { 130746, true }, - { 130764, true }, - { 130784, true }, + { 130524, true }, + { 130542, true }, + { 130562, true }, + { 130577, true }, + { 130586, true }, + { 130598, true }, + { 130609, true }, + { 130621, true }, + { 130633, false }, + { 130650, true }, + { 130663, true }, + { 130681, true }, + { 130696, true }, + { 130711, true }, + { 130723, true }, + { 130735, true }, + { 130755, true }, + { 130767, true }, + { 130781, true }, { 130799, true }, - { 130808, true }, - { 130820, true }, - { 130831, true }, + { 130812, true }, + { 130828, true }, { 130843, true }, - { 130855, false }, - { 130872, true }, - { 130885, true }, + { 130855, true }, + { 130871, true }, + { 130881, true }, + { 130888, true }, { 130903, true }, - { 130918, true }, - { 130933, true }, - { 130945, true }, - { 130965, true }, - { 130977, true }, - { 130991, true }, + { 130923, true }, + { 130936, true }, + { 130947, true }, + { 130960, true }, + { 130969, true }, + { 130989, true }, { 131009, true }, - { 131022, true }, - { 131038, true }, - { 131053, true }, - { 131065, true }, - { 131081, true }, - { 131091, true }, - { 131098, true }, - { 131113, true }, - { 131133, true }, - { 131146, true }, - { 131157, true }, - { 131170, true }, - { 131179, true }, + { 131032, true }, + { 131052, true }, + { 131064, true }, + { 131075, true }, + { 131086, false }, + { 131097, true }, + { 131108, false }, + { 131118, false }, + { 131135, true }, + { 131147, true }, + { 131163, true }, + { 131176, true }, + { 131185, true }, { 131199, true }, - { 131219, true }, - { 131242, true }, - { 131262, true }, - { 131274, true }, - { 131285, true }, - { 131296, false }, - { 131307, true }, - { 131318, false }, - { 131328, false }, - { 131345, true }, - { 131357, true }, - { 131373, true }, - { 131386, true }, - { 131395, true }, - { 131409, true }, - { 131420, true }, - { 131432, true }, - { 131450, true }, - { 131464, true }, - { 131477, true }, - { 131486, true }, - { 131501, true }, - { 131512, true }, - { 131532, true }, - { 131544, true }, - { 131554, true }, - { 131565, true }, - { 131598, true }, - { 131610, true }, - { 131629, true }, - { 131643, true }, - { 131657, false }, - { 131677, true }, + { 131210, true }, + { 131222, true }, + { 131240, true }, + { 131254, true }, + { 131267, true }, + { 131276, true }, + { 131291, true }, + { 131302, true }, + { 131322, true }, + { 131334, true }, + { 131344, true }, + { 131355, true }, + { 131388, true }, + { 131400, true }, + { 131419, true }, + { 131433, true }, + { 131447, false }, + { 131467, true }, + { 131484, true }, + { 131495, true }, + { 131508, true }, + { 131523, true }, + { 131539, true }, + { 131557, true }, + { 131573, true }, + { 131590, true }, + { 131602, true }, + { 131616, true }, + { 131632, true }, + { 131645, true }, + { 131657, true }, + { 131668, true }, + { 131685, true }, { 131694, true }, - { 131705, true }, - { 131718, true }, - { 131733, true }, - { 131749, true }, - { 131767, true }, - { 131783, true }, - { 131800, true }, - { 131812, true }, - { 131826, true }, - { 131842, true }, - { 131855, true }, - { 131867, true }, - { 131878, true }, + { 131703, true }, + { 131716, true }, + { 131729, true }, + { 131742, true }, + { 131755, true }, + { 131766, true }, + { 131775, true }, + { 131790, true }, + { 131802, true }, + { 131818, true }, + { 131839, true }, + { 131856, false }, + { 131869, true }, + { 131883, true }, { 131895, true }, - { 131904, true }, - { 131913, true }, - { 131926, true }, - { 131939, true }, - { 131952, true }, - { 131965, true }, - { 131976, true }, - { 131985, true }, - { 132000, true }, - { 132012, true }, - { 132028, true }, - { 132049, true }, - { 132066, false }, - { 132079, true }, - { 132093, true }, - { 132105, true }, - { 132116, true }, - { 132133, true }, - { 132144, true }, - { 132163, true }, - { 132181, true }, - { 132217, true }, - { 132230, true }, - { 132244, true }, - { 132253, true }, - { 132263, true }, - { 132275, true }, + { 131906, true }, + { 131923, true }, + { 131934, true }, + { 131953, true }, + { 131971, true }, + { 132007, true }, + { 132020, true }, + { 132034, true }, + { 132043, true }, + { 132053, true }, + { 132065, true }, + { 132083, true }, + { 132097, true }, + { 132115, true }, + { 132136, true }, + { 132156, true }, + { 132179, true }, + { 132195, true }, + { 132209, true }, + { 132225, true }, + { 132239, true }, + { 132252, true }, + { 132273, true }, { 132293, true }, - { 132307, true }, - { 132325, true }, - { 132346, true }, - { 132366, true }, - { 132389, true }, - { 132405, true }, - { 132419, true }, - { 132435, true }, - { 132449, true }, - { 132462, true }, - { 132483, true }, - { 132503, true }, - { 132512, true }, - { 132529, true }, - { 132540, true }, - { 132551, true }, - { 132562, true }, + { 132302, true }, + { 132319, true }, + { 132330, true }, + { 132341, true }, + { 132352, true }, + { 132371, true }, + { 132383, true }, + { 132396, true }, + { 132412, true }, + { 132431, true }, + { 132446, true }, + { 132463, false }, + { 132478, true }, + { 132498, true }, + { 132509, true }, + { 132520, true }, + { 132540, false }, + { 132549, true }, + { 132558, true }, + { 132569, true }, { 132581, true }, - { 132593, true }, - { 132606, true }, - { 132622, true }, - { 132641, true }, - { 132656, true }, - { 132673, false }, - { 132688, true }, - { 132708, true }, - { 132719, true }, - { 132730, true }, - { 132750, false }, - { 132759, true }, - { 132768, true }, - { 132779, true }, - { 132791, true }, - { 132805, true }, - { 132823, true }, - { 132837, true }, - { 132849, true }, - { 132864, true }, - { 132877, true }, - { 132894, true }, - { 132904, true }, - { 132925, true }, - { 132953, false }, - { 132964, true }, - { 132971, true }, - { 132982, true }, - { 132992, true }, - { 133002, true }, - { 133016, true }, - { 133030, true }, - { 133041, false }, + { 132595, true }, + { 132613, true }, + { 132627, true }, + { 132639, true }, + { 132654, true }, + { 132667, true }, + { 132684, true }, + { 132694, true }, + { 132715, true }, + { 132743, false }, + { 132754, true }, + { 132761, true }, + { 132772, true }, + { 132782, true }, + { 132792, true }, + { 132806, true }, + { 132820, true }, + { 132831, false }, + { 132842, true }, + { 132850, false }, + { 132870, true }, + { 132885, true }, + { 132898, true }, + { 132914, true }, + { 132929, true }, + { 132942, true }, + { 132958, true }, + { 132978, true }, + { 132991, true }, + { 133010, true }, + { 133028, true }, + { 133038, true }, { 133052, true }, - { 133060, false }, - { 133080, true }, - { 133095, true }, - { 133108, true }, - { 133124, true }, - { 133139, true }, - { 133152, true }, - { 133168, true }, - { 133188, true }, - { 133201, true }, - { 133220, true }, - { 133238, true }, - { 133248, true }, - { 133262, true }, + { 133070, true }, + { 133090, true }, + { 133122, true }, + { 133137, true }, + { 133156, true }, + { 133171, true }, + { 133186, true }, + { 133207, true }, + { 133228, true }, + { 133242, true }, + { 133264, true }, { 133280, true }, - { 133300, true }, - { 133332, true }, - { 133347, true }, - { 133366, true }, - { 133381, true }, + { 133305, true }, + { 133317, true }, + { 133330, true }, + { 133341, true }, + { 133358, true }, + { 133382, true }, { 133396, true }, - { 133417, true }, - { 133438, true }, + { 133409, true }, + { 133421, true }, + { 133434, true }, { 133452, true }, - { 133474, true }, - { 133490, true }, - { 133515, true }, - { 133527, true }, - { 133540, true }, - { 133551, true }, - { 133568, true }, - { 133592, true }, - { 133606, true }, - { 133619, true }, - { 133631, true }, - { 133644, true }, - { 133662, true }, - { 133679, true }, - { 133704, true }, - { 133718, true }, - { 133732, true }, + { 133469, true }, + { 133494, true }, + { 133508, true }, + { 133522, true }, + { 133539, true }, + { 133559, true }, + { 133575, true }, + { 133593, true }, + { 133608, true }, + { 133621, true }, + { 133636, true }, + { 133644, false }, + { 133657, true }, + { 133669, true }, + { 133683, true }, + { 133691, true }, + { 133713, true }, + { 133727, true }, + { 133741, true }, { 133749, true }, - { 133769, true }, - { 133785, true }, - { 133803, true }, - { 133818, true }, - { 133831, true }, - { 133846, true }, - { 133854, false }, - { 133867, true }, - { 133879, true }, - { 133893, true }, - { 133901, true }, - { 133923, true }, - { 133937, true }, + { 133760, true }, + { 133776, true }, + { 133786, true }, + { 133799, true }, + { 133812, true }, + { 133826, true }, + { 133842, true }, + { 133855, true }, + { 133869, true }, + { 133880, true }, + { 133890, true }, + { 133910, true }, + { 133924, true }, + { 133939, true }, { 133951, true }, { 133959, true }, - { 133970, true }, - { 133986, true }, - { 133996, true }, - { 134009, true }, + { 133971, true }, + { 133982, true }, + { 134003, true }, { 134022, true }, - { 134036, true }, - { 134052, true }, - { 134065, true }, - { 134079, true }, - { 134090, true }, - { 134100, true }, - { 134120, true }, - { 134134, true }, - { 134149, true }, - { 134161, true }, - { 134169, true }, - { 134181, true }, - { 134192, true }, + { 134040, true }, + { 134058, true }, + { 134078, true }, + { 134087, true }, + { 134105, true }, + { 134118, true }, + { 134132, true }, + { 134151, true }, + { 134164, true }, + { 134176, true }, + { 134188, true }, + { 134199, true }, { 134213, true }, - { 134232, true }, - { 134250, true }, - { 134268, true }, - { 134288, true }, - { 134297, true }, - { 134315, true }, - { 134328, true }, - { 134342, true }, - { 134361, true }, - { 134374, true }, - { 134386, true }, - { 134398, true }, - { 134409, true }, - { 134423, true }, - { 134437, false }, - { 134452, true }, - { 134469, true }, - { 134480, true }, - { 134491, true }, - { 134505, true }, - { 134526, true }, - { 134542, true }, - { 134561, true }, - { 134577, true }, - { 134595, true }, - { 134618, true }, - { 134630, true }, - { 134639, true }, - { 134652, true }, - { 134670, true }, - { 134685, true }, - { 134700, true }, - { 134716, true }, - { 134731, true }, - { 134746, true }, - { 134761, true }, - { 134777, true }, - { 134792, true }, - { 134807, true }, - { 134823, true }, - { 134833, true }, - { 134846, true }, - { 134859, true }, - { 134869, true }, - { 134881, false }, - { 134892, true }, - { 134906, true }, - { 134918, true }, - { 134927, false }, - { 134946, true }, - { 134963, true }, + { 134227, false }, + { 134242, true }, + { 134259, true }, + { 134270, true }, + { 134281, true }, + { 134295, true }, + { 134316, true }, + { 134332, true }, + { 134351, true }, + { 134367, true }, + { 134385, true }, + { 134408, true }, + { 134420, true }, + { 134429, true }, + { 134442, true }, + { 134460, true }, + { 134475, true }, + { 134490, true }, + { 134506, true }, + { 134521, true }, + { 134536, true }, + { 134551, true }, + { 134567, true }, + { 134582, true }, + { 134597, true }, + { 134613, true }, + { 134623, true }, + { 134636, true }, + { 134649, true }, + { 134659, true }, + { 134671, false }, + { 134682, true }, + { 134696, true }, + { 134708, true }, + { 134717, false }, + { 134736, true }, + { 134753, true }, + { 134766, true }, + { 134782, false }, + { 134795, false }, + { 134805, true }, + { 134818, true }, + { 134828, true }, + { 134838, false }, + { 134847, false }, + { 134855, false }, + { 134875, true }, + { 134888, true }, + { 134900, false }, + { 134912, true }, + { 134929, true }, + { 134943, true }, + { 134960, true }, { 134976, true }, - { 134992, false }, - { 135005, false }, - { 135015, true }, + { 134995, true }, + { 135011, false }, { 135028, true }, - { 135038, true }, - { 135048, false }, - { 135057, false }, - { 135065, false }, - { 135085, true }, - { 135098, true }, - { 135110, false }, - { 135122, true }, - { 135139, true }, - { 135153, true }, - { 135170, true }, - { 135186, true }, - { 135205, true }, - { 135221, false }, - { 135238, true }, - { 135252, true }, - { 135266, true }, - { 135287, true }, - { 135301, true }, - { 135317, true }, - { 135330, false }, - { 135344, true }, - { 135358, true }, - { 135377, true }, - { 135399, true }, - { 135414, true }, - { 135431, true }, - { 135439, true }, - { 135451, true }, - { 135464, true }, - { 135477, true }, - { 135490, false }, - { 135499, false }, - { 135510, true }, - { 135521, true }, - { 135530, true }, - { 135539, false }, - { 135553, true }, - { 135571, true }, - { 135589, true }, - { 135606, true }, - { 135618, false }, - { 135634, false }, - { 135658, true }, - { 135685, true }, - { 135704, true }, - { 135712, true }, - { 135721, true }, - { 135733, true }, - { 135745, true }, + { 135042, true }, + { 135056, true }, + { 135077, true }, + { 135091, true }, + { 135107, true }, + { 135120, false }, + { 135134, true }, + { 135148, true }, + { 135167, true }, + { 135189, true }, + { 135204, true }, + { 135221, true }, + { 135229, true }, + { 135241, true }, + { 135254, true }, + { 135267, true }, + { 135280, false }, + { 135289, false }, + { 135300, true }, + { 135311, true }, + { 135320, true }, + { 135329, false }, + { 135343, true }, + { 135361, true }, + { 135379, true }, + { 135396, true }, + { 135408, false }, + { 135424, false }, + { 135448, true }, + { 135475, true }, + { 135494, true }, + { 135502, true }, + { 135511, true }, + { 135523, true }, + { 135535, true }, + { 135560, true }, + { 135577, true }, + { 135594, true }, + { 135609, true }, + { 135621, true }, + { 135634, true }, + { 135652, true }, + { 135661, false }, + { 135669, true }, + { 135690, true }, + { 135703, true }, + { 135716, true }, + { 135728, true }, + { 135741, false }, + { 135754, true }, { 135770, true }, - { 135787, true }, - { 135804, true }, - { 135819, true }, - { 135831, true }, - { 135844, true }, - { 135862, true }, - { 135871, false }, - { 135879, true }, - { 135900, true }, - { 135913, true }, - { 135926, true }, - { 135938, true }, - { 135951, false }, - { 135964, true }, - { 135980, true }, - { 135994, true }, - { 136015, true }, - { 136027, true }, + { 135784, true }, + { 135805, true }, + { 135817, true }, + { 135838, true }, + { 135857, true }, + { 135882, true }, + { 135894, true }, + { 135907, true }, + { 135920, true }, + { 135932, true }, + { 135944, true }, + { 135956, true }, + { 135973, true }, + { 135991, true }, + { 136003, false }, + { 136012, true }, + { 136034, true }, { 136048, true }, - { 136067, true }, - { 136092, true }, - { 136104, true }, - { 136117, true }, - { 136130, true }, - { 136142, true }, - { 136154, true }, + { 136061, true }, + { 136083, true }, + { 136098, true }, + { 136113, true }, + { 136124, true }, + { 136149, true }, { 136166, true }, - { 136183, true }, - { 136201, true }, - { 136213, false }, - { 136222, true }, - { 136244, true }, - { 136258, true }, - { 136271, true }, - { 136293, true }, - { 136308, true }, - { 136323, true }, - { 136334, true }, - { 136359, true }, - { 136376, true }, - { 136388, true }, - { 136404, false }, - { 136419, false }, - { 136443, true }, - { 136451, false }, - { 136464, true }, - { 136476, true }, - { 136489, true }, - { 136501, true }, - { 136517, true }, - { 136532, true }, - { 136551, true }, - { 136565, true }, - { 136585, true }, - { 136601, true }, - { 136620, true }, - { 136640, true }, - { 136652, true }, - { 136682, true }, - { 136694, true }, - { 136705, true }, - { 136715, true }, - { 136729, true }, - { 136742, true }, - { 136760, false }, - { 136770, true }, - { 136784, true }, - { 136799, true }, - { 136817, true }, - { 136826, true }, - { 136839, false }, - { 136856, true }, - { 136872, true }, - { 136883, true }, - { 136894, true }, - { 136904, true }, - { 136913, true }, - { 136927, true }, - { 136948, true }, - { 136959, true }, - { 136981, true }, - { 136996, true }, - { 137018, true }, - { 137028, true }, - { 137050, true }, - { 137072, true }, - { 137089, true }, - { 137103, true }, - { 137116, true }, + { 136178, true }, + { 136194, false }, + { 136209, false }, + { 136233, true }, + { 136241, false }, + { 136254, true }, + { 136266, true }, + { 136279, true }, + { 136291, true }, + { 136307, true }, + { 136322, true }, + { 136341, true }, + { 136355, true }, + { 136369, true }, + { 136389, true }, + { 136405, true }, + { 136424, true }, + { 136444, true }, + { 136456, true }, + { 136486, true }, + { 136498, true }, + { 136509, true }, + { 136519, true }, + { 136533, true }, + { 136546, true }, + { 136564, false }, + { 136574, true }, + { 136588, true }, + { 136603, true }, + { 136621, true }, + { 136630, true }, + { 136643, false }, + { 136660, true }, + { 136676, true }, + { 136687, true }, + { 136698, true }, + { 136708, true }, + { 136717, true }, + { 136731, true }, + { 136752, true }, + { 136763, true }, + { 136785, true }, + { 136800, true }, + { 136822, true }, + { 136832, true }, + { 136854, true }, + { 136876, true }, + { 136893, true }, + { 136907, true }, + { 136920, true }, + { 136937, true }, + { 136962, true }, + { 136978, true }, + { 136988, true }, + { 136999, true }, + { 137008, false }, + { 137017, true }, + { 137027, true }, + { 137041, true }, + { 137059, true }, + { 137068, true }, + { 137092, true }, + { 137113, true }, { 137133, true }, - { 137158, true }, - { 137174, true }, - { 137184, true }, - { 137195, true }, - { 137204, false }, - { 137213, true }, - { 137223, true }, - { 137237, true }, - { 137255, true }, - { 137264, true }, - { 137288, true }, - { 137309, true }, - { 137329, true }, - { 137347, true }, - { 137360, true }, - { 137381, true }, - { 137399, true }, - { 137411, true }, - { 137433, false }, - { 137452, true }, - { 137463, true }, - { 137476, true }, - { 137497, true }, - { 137508, true }, - { 137523, true }, - { 137535, true }, - { 137552, true }, - { 137578, true }, - { 137595, false }, - { 137613, true }, - { 137632, false }, - { 137651, true }, - { 137663, true }, - { 137683, true }, - { 137705, true }, - { 137718, true }, - { 137740, true }, - { 137753, true }, - { 137767, true }, - { 137790, true }, - { 137800, true }, - { 137810, true }, - { 137829, true }, - { 137842, true }, - { 137862, true }, + { 137151, true }, + { 137164, true }, + { 137185, true }, + { 137203, true }, + { 137215, true }, + { 137237, false }, + { 137256, true }, + { 137267, true }, + { 137280, true }, + { 137301, true }, + { 137312, true }, + { 137327, true }, + { 137339, true }, + { 137356, true }, + { 137382, true }, + { 137399, false }, + { 137417, true }, + { 137436, false }, + { 137455, true }, + { 137467, true }, + { 137487, true }, + { 137509, true }, + { 137522, true }, + { 137544, true }, + { 137557, true }, + { 137571, true }, + { 137594, true }, + { 137604, true }, + { 137614, true }, + { 137633, true }, + { 137646, true }, + { 137666, true }, + { 137676, true }, + { 137695, true }, + { 137707, true }, + { 137728, true }, + { 137754, true }, + { 137775, true }, + { 137795, true }, + { 137807, true }, + { 137821, true }, + { 137833, true }, + { 137856, true }, { 137872, true }, - { 137891, true }, - { 137903, true }, + { 137884, true }, + { 137909, true }, { 137924, true }, - { 137950, true }, - { 137971, true }, - { 137991, true }, - { 138003, true }, - { 138017, true }, - { 138029, true }, - { 138052, true }, - { 138068, true }, - { 138080, true }, - { 138105, true }, - { 138120, true }, - { 138141, true }, - { 138158, true }, - { 138179, false }, - { 138196, false }, + { 137945, true }, + { 137962, true }, + { 137983, false }, + { 138000, false }, + { 138018, true }, + { 138028, true }, + { 138042, true }, + { 138056, true }, + { 138066, true }, + { 138078, true }, + { 138090, true }, + { 138100, true }, + { 138114, true }, + { 138126, true }, + { 138155, true }, + { 138170, true }, + { 138184, true }, + { 138198, true }, { 138214, true }, - { 138224, true }, - { 138238, true }, - { 138252, true }, - { 138262, true }, - { 138274, true }, - { 138286, true }, - { 138296, true }, - { 138310, true }, - { 138322, true }, - { 138351, true }, - { 138366, true }, - { 138380, true }, - { 138394, true }, - { 138410, true }, - { 138425, true }, + { 138229, true }, + { 138241, true }, + { 138261, true }, + { 138275, true }, + { 138288, true }, + { 138300, true }, + { 138313, true }, + { 138325, true }, + { 138344, true }, + { 138368, true }, + { 138391, true }, + { 138403, true }, + { 138421, true }, { 138437, true }, { 138457, true }, - { 138471, true }, - { 138484, true }, - { 138496, true }, - { 138509, true }, - { 138521, true }, - { 138540, true }, - { 138564, true }, - { 138587, true }, - { 138599, true }, - { 138617, true }, - { 138633, true }, - { 138653, true }, - { 138671, true }, - { 138691, true }, - { 138712, true }, - { 138725, true }, - { 138745, true }, - { 138753, true }, - { 138772, true }, - { 138791, true }, - { 138805, true }, - { 138823, true }, - { 138839, false }, - { 138858, true }, - { 138879, true }, - { 138893, true }, - { 138902, true }, - { 138920, true }, - { 138937, true }, - { 138953, true }, - { 138975, true }, - { 138992, true }, - { 139010, true }, - { 139029, true }, - { 139046, true }, - { 139059, true }, - { 139069, true }, - { 139077, true }, - { 139105, true }, - { 139122, true }, - { 139136, true }, - { 139151, false }, - { 139164, true }, - { 139176, false }, - { 139186, false }, - { 139199, false }, - { 139214, true }, - { 139226, true }, - { 139238, true }, - { 139250, true }, + { 138475, true }, + { 138495, true }, + { 138516, true }, + { 138529, true }, + { 138549, true }, + { 138557, true }, + { 138576, true }, + { 138595, true }, + { 138609, true }, + { 138627, true }, + { 138643, false }, + { 138662, true }, + { 138683, true }, + { 138697, true }, + { 138706, true }, + { 138724, true }, + { 138741, true }, + { 138757, true }, + { 138779, true }, + { 138796, true }, + { 138814, true }, + { 138833, true }, + { 138850, true }, + { 138863, true }, + { 138873, true }, + { 138881, true }, + { 138909, true }, + { 138926, true }, + { 138940, true }, + { 138955, false }, + { 138968, true }, + { 138980, false }, + { 138990, false }, + { 139003, false }, + { 139018, true }, + { 139030, true }, + { 139042, true }, + { 139054, true }, + { 139066, true }, + { 139079, true }, + { 139092, true }, + { 139104, true }, + { 139120, true }, + { 139132, true }, + { 139145, true }, + { 139155, true }, + { 139165, true }, + { 139180, true }, + { 139191, true }, + { 139202, true }, + { 139220, true }, + { 139228, true }, + { 139236, true }, + { 139248, true }, { 139262, true }, - { 139275, true }, - { 139288, true }, - { 139300, true }, - { 139316, true }, - { 139328, true }, - { 139341, true }, - { 139351, true }, - { 139361, true }, - { 139376, true }, - { 139387, true }, - { 139398, true }, - { 139416, true }, - { 139424, true }, - { 139432, true }, - { 139444, true }, - { 139458, true }, - { 139475, true }, - { 139490, true }, - { 139506, true }, - { 139521, true }, - { 139536, true }, - { 139551, true }, - { 139559, true }, - { 139574, true }, - { 139587, true }, - { 139595, true }, + { 139279, true }, + { 139294, true }, + { 139310, true }, + { 139325, true }, + { 139340, true }, + { 139355, true }, + { 139363, true }, + { 139378, true }, + { 139391, true }, + { 139399, true }, + { 139409, true }, + { 139430, true }, + { 139443, true }, + { 139455, true }, + { 139463, true }, + { 139480, true }, + { 139496, true }, + { 139503, true }, + { 139514, true }, + { 139522, false }, + { 139546, true }, + { 139578, true }, { 139605, true }, - { 139626, true }, - { 139639, true }, - { 139651, true }, - { 139659, true }, - { 139676, true }, - { 139692, true }, - { 139699, true }, - { 139710, true }, - { 139718, false }, - { 139742, true }, - { 139774, true }, - { 139801, true }, - { 139821, true }, - { 139845, true }, - { 139862, false }, + { 139625, true }, + { 139649, true }, + { 139666, false }, + { 139679, true }, + { 139694, true }, + { 139705, true }, + { 139716, true }, + { 139726, true }, + { 139738, true }, + { 139750, false }, + { 139762, false }, + { 139770, false }, + { 139795, true }, + { 139808, true }, + { 139823, true }, + { 139837, true }, + { 139850, true }, + { 139862, true }, { 139875, true }, - { 139890, true }, - { 139901, true }, - { 139912, true }, - { 139922, true }, - { 139934, true }, - { 139946, false }, - { 139958, false }, - { 139966, false }, - { 139991, true }, - { 140004, true }, - { 140019, true }, - { 140033, true }, - { 140046, true }, - { 140058, true }, - { 140071, true }, - { 140088, true }, - { 140102, true }, - { 140119, true }, - { 140133, true }, - { 140148, true }, - { 140163, true }, - { 140174, true }, - { 140181, true }, - { 140195, true }, - { 140203, true }, - { 140211, false }, - { 140226, true }, - { 140238, true }, - { 140252, true }, - { 140262, true }, - { 140272, true }, - { 140279, true }, - { 140292, true }, - { 140305, true }, - { 140313, true }, - { 140330, true }, - { 140338, true }, - { 140347, true }, - { 140363, true }, - { 140374, true }, - { 140386, true }, - { 140396, true }, - { 140413, false }, - { 140424, true }, - { 140432, true }, - { 140442, true }, - { 140451, true }, - { 140472, true }, - { 140497, false }, - { 140513, true }, - { 140525, true }, + { 139892, true }, + { 139906, true }, + { 139923, true }, + { 139937, true }, + { 139952, true }, + { 139967, true }, + { 139978, true }, + { 139985, true }, + { 139999, true }, + { 140007, true }, + { 140015, false }, + { 140030, true }, + { 140042, true }, + { 140056, true }, + { 140066, true }, + { 140076, true }, + { 140083, true }, + { 140096, true }, + { 140109, true }, + { 140117, true }, + { 140134, true }, + { 140142, true }, + { 140151, true }, + { 140167, true }, + { 140178, true }, + { 140190, true }, + { 140200, true }, + { 140217, false }, + { 140228, true }, + { 140236, true }, + { 140246, true }, + { 140255, true }, + { 140276, true }, + { 140301, false }, + { 140317, true }, + { 140329, true }, + { 140341, true }, + { 140354, true }, + { 140362, true }, + { 140370, false }, + { 140390, false }, + { 140409, false }, + { 140428, false }, + { 140448, false }, + { 140468, false }, + { 140488, false }, + { 140507, false }, + { 140526, true }, { 140537, true }, - { 140550, true }, - { 140558, true }, - { 140566, false }, - { 140586, false }, - { 140605, false }, - { 140624, false }, - { 140644, false }, - { 140664, false }, - { 140684, false }, - { 140703, false }, - { 140722, true }, - { 140733, true }, - { 140743, true }, - { 140752, true }, - { 140765, true }, - { 140780, true }, + { 140547, true }, + { 140556, true }, + { 140569, true }, + { 140584, true }, + { 140594, true }, + { 140606, false }, + { 140617, true }, + { 140628, true }, + { 140637, true }, + { 140645, true }, + { 140658, true }, + { 140666, true }, + { 140676, true }, + { 140685, true }, + { 140708, true }, + { 140727, false }, + { 140738, true }, + { 140760, true }, + { 140774, true }, + { 140783, true }, { 140790, true }, - { 140802, false }, - { 140813, true }, - { 140824, true }, - { 140833, true }, - { 140841, true }, - { 140854, true }, - { 140862, true }, - { 140872, true }, - { 140881, true }, - { 140904, true }, - { 140923, false }, - { 140934, true }, - { 140956, true }, - { 140970, true }, + { 140799, true }, + { 140806, true }, + { 140818, true }, + { 140835, true }, + { 140842, true }, + { 140850, true }, + { 140861, true }, + { 140875, true }, + { 140887, true }, + { 140899, true }, + { 140908, true }, + { 140917, true }, + { 140929, false }, + { 140940, true }, + { 140953, true }, { 140979, true }, - { 140986, true }, - { 140995, true }, - { 141002, true }, - { 141014, true }, - { 141031, true }, - { 141038, true }, - { 141046, true }, - { 141057, true }, - { 141071, true }, - { 141083, true }, - { 141095, true }, - { 141104, true }, - { 141113, true }, - { 141125, false }, - { 141136, true }, - { 141149, true }, - { 141175, true }, - { 141198, false }, - { 141218, true }, - { 141235, true }, - { 141250, true }, - { 141264, true }, - { 141283, true }, - { 141296, true }, - { 141307, true }, - { 141325, true }, - { 141340, true }, - { 141360, true }, - { 141375, true }, - { 141384, true }, - { 141405, true }, - { 141425, true }, - { 141440, true }, - { 141455, true }, - { 141470, true }, + { 141002, false }, + { 141022, true }, + { 141039, true }, + { 141054, true }, + { 141068, true }, + { 141087, true }, + { 141100, true }, + { 141111, true }, + { 141129, true }, + { 141144, true }, + { 141164, true }, + { 141179, true }, + { 141188, true }, + { 141209, true }, + { 141229, true }, + { 141244, true }, + { 141259, true }, + { 141274, true }, + { 141288, true }, + { 141302, true }, + { 141311, true }, + { 141322, true }, + { 141337, true }, + { 141346, true }, + { 141354, true }, + { 141372, true }, + { 141383, true }, + { 141393, true }, + { 141402, true }, + { 141413, true }, + { 141423, true }, + { 141432, true }, + { 141445, true }, + { 141456, true }, + { 141466, true }, + { 141473, true }, { 141484, true }, - { 141498, true }, - { 141507, true }, - { 141518, true }, - { 141533, true }, - { 141542, true }, - { 141550, true }, - { 141568, true }, - { 141579, true }, - { 141589, true }, - { 141598, true }, - { 141609, true }, - { 141619, true }, - { 141628, true }, + { 141495, true }, + { 141509, true }, + { 141516, true }, + { 141527, true }, + { 141535, true }, + { 141553, true }, + { 141566, true }, + { 141578, true }, + { 141586, true }, + { 141606, false }, + { 141622, true }, { 141641, true }, - { 141652, true }, - { 141662, true }, - { 141669, true }, - { 141680, true }, - { 141691, true }, - { 141705, true }, - { 141712, true }, - { 141723, true }, - { 141731, true }, - { 141749, true }, - { 141762, true }, - { 141774, true }, - { 141782, true }, - { 141802, false }, - { 141818, true }, - { 141837, true }, - { 141860, true }, - { 141879, true }, - { 141890, true }, - { 141912, true }, - { 141925, true }, - { 141934, true }, - { 141957, true }, - { 141991, true }, - { 142007, true }, - { 142023, true }, - { 142045, true }, - { 142058, true }, - { 142085, true }, - { 142099, true }, - { 142109, true }, - { 142127, true }, - { 142137, true }, - { 142156, true }, + { 141664, true }, + { 141683, true }, + { 141694, true }, + { 141716, true }, + { 141729, true }, + { 141738, true }, + { 141761, true }, + { 141795, true }, + { 141811, true }, + { 141827, true }, + { 141849, true }, + { 141862, true }, + { 141889, true }, + { 141903, true }, + { 141913, true }, + { 141931, true }, + { 141941, true }, + { 141960, true }, + { 141974, true }, + { 141988, true }, + { 142004, true }, + { 142015, true }, + { 142026, true }, + { 142049, true }, + { 142072, true }, + { 142090, true }, + { 142107, true }, + { 142117, true }, + { 142142, true }, + { 142160, true }, { 142170, true }, - { 142184, true }, - { 142200, true }, - { 142211, true }, + { 142182, true }, + { 142195, true }, + { 142212, true }, { 142222, true }, - { 142245, true }, - { 142268, true }, - { 142286, true }, - { 142303, true }, - { 142313, true }, - { 142338, true }, + { 142243, true }, + { 142265, true }, + { 142283, true }, + { 142294, true }, + { 142307, true }, + { 142318, true }, + { 142332, true }, + { 142345, true }, { 142356, true }, { 142366, true }, - { 142378, true }, - { 142391, true }, - { 142408, true }, - { 142418, true }, - { 142439, true }, + { 142380, true }, + { 142390, true }, + { 142401, true }, + { 142414, false }, + { 142432, true }, + { 142441, true }, { 142457, true }, - { 142468, true }, - { 142481, true }, - { 142492, true }, - { 142506, true }, - { 142519, true }, - { 142530, true }, - { 142540, true }, + { 142473, false }, + { 142486, false }, + { 142499, false }, + { 142511, true }, + { 142528, true }, + { 142539, true }, { 142554, true }, - { 142564, true }, - { 142575, true }, - { 142588, false }, - { 142606, true }, - { 142615, true }, - { 142631, true }, - { 142647, false }, - { 142660, false }, - { 142673, false }, - { 142685, true }, + { 142566, true }, + { 142583, true }, + { 142597, true }, + { 142610, true }, + { 142619, true }, + { 142630, true }, + { 142641, true }, + { 142653, true }, + { 142666, true }, + { 142675, true }, + { 142686, true }, { 142702, true }, - { 142713, true }, - { 142728, true }, - { 142740, true }, - { 142757, true }, - { 142771, true }, - { 142784, true }, - { 142793, true }, + { 142714, true }, + { 142726, true }, + { 142738, true }, + { 142755, true }, + { 142767, true }, + { 142781, true }, + { 142791, true }, { 142804, true }, - { 142815, true }, - { 142827, true }, - { 142840, true }, - { 142849, true }, - { 142860, true }, - { 142876, true }, - { 142888, true }, - { 142900, true }, - { 142912, true }, - { 142929, true }, - { 142941, true }, - { 142955, true }, - { 142965, true }, - { 142978, true }, - { 142995, true }, - { 143009, true }, + { 142821, true }, + { 142835, true }, + { 142850, true }, + { 142866, true }, + { 142882, true }, + { 142891, true }, + { 142898, true }, + { 142909, true }, + { 142926, true }, + { 142939, true }, + { 142954, true }, + { 142964, true }, + { 142975, true }, + { 142998, true }, + { 143010, false }, { 143024, true }, { 143040, true }, - { 143056, true }, - { 143065, true }, - { 143072, true }, - { 143083, true }, - { 143100, true }, - { 143113, true }, - { 143128, true }, - { 143138, true }, - { 143149, true }, - { 143172, true }, - { 143184, false }, - { 143198, true }, - { 143214, true }, + { 143051, true }, + { 143067, false }, + { 143086, true }, + { 143105, true }, + { 143116, true }, + { 143137, true }, + { 143153, true }, + { 143165, true }, + { 143179, true }, + { 143193, true }, + { 143204, true }, { 143225, true }, - { 143241, false }, - { 143260, true }, - { 143279, true }, - { 143290, true }, + { 143238, true }, + { 143248, true }, + { 143259, true }, + { 143276, true }, + { 143296, true }, { 143311, true }, - { 143327, true }, - { 143339, true }, - { 143353, true }, - { 143367, true }, - { 143378, true }, - { 143399, true }, - { 143412, true }, - { 143422, true }, - { 143433, true }, - { 143450, true }, - { 143470, true }, - { 143485, true }, - { 143504, false }, - { 143521, true }, - { 143537, true }, - { 143560, true }, + { 143330, false }, + { 143347, true }, + { 143363, true }, + { 143386, true }, + { 143401, true }, + { 143417, true }, + { 143428, true }, + { 143436, true }, + { 143459, true }, + { 143471, true }, + { 143479, true }, + { 143505, true }, + { 143523, true }, + { 143536, true }, + { 143548, true }, { 143575, true }, - { 143591, true }, - { 143602, true }, - { 143610, true }, - { 143633, true }, - { 143645, true }, + { 143606, true }, + { 143617, true }, + { 143627, true }, + { 143642, true }, { 143653, true }, - { 143679, true }, - { 143697, true }, - { 143710, true }, - { 143722, true }, - { 143749, true }, - { 143780, true }, - { 143791, true }, + { 143664, false }, + { 143677, true }, + { 143686, true }, + { 143699, true }, + { 143727, true }, + { 143748, true }, + { 143762, true }, + { 143784, true }, { 143801, true }, - { 143816, true }, - { 143827, true }, - { 143838, false }, - { 143851, true }, - { 143860, true }, - { 143873, true }, - { 143901, true }, - { 143922, true }, - { 143936, true }, - { 143958, true }, - { 143975, true }, - { 143985, true }, - { 143997, true }, - { 144013, true }, + { 143811, true }, + { 143823, true }, + { 143839, true }, + { 143853, true }, + { 143864, true }, + { 143878, true }, + { 143896, true }, + { 143913, true }, + { 143933, true }, + { 143944, true }, + { 143955, false }, + { 143962, true }, + { 143989, true }, + { 144009, true }, { 144027, true }, - { 144038, true }, - { 144052, true }, - { 144070, true }, - { 144087, true }, - { 144107, true }, - { 144118, true }, - { 144129, false }, - { 144136, true }, - { 144163, true }, - { 144183, true }, - { 144201, true }, - { 144216, false }, - { 144227, true }, - { 144243, true }, - { 144260, true }, - { 144277, true }, - { 144299, true }, - { 144313, true }, - { 144329, false }, - { 144346, true }, - { 144362, true }, - { 144372, true }, - { 144393, true }, - { 144411, true }, - { 144429, true }, - { 144443, true }, - { 144453, true }, - { 144464, true }, - { 144486, true }, - { 144503, true }, - { 144523, true }, - { 144537, true }, - { 144554, true }, - { 144571, true }, - { 144592, true }, - { 144615, true }, - { 144633, true }, - { 144643, true }, - { 144659, true }, - { 144670, false }, - { 144690, true }, - { 144703, true }, + { 144042, false }, + { 144053, true }, + { 144069, true }, + { 144086, true }, + { 144103, true }, + { 144125, true }, + { 144139, true }, + { 144155, false }, + { 144172, true }, + { 144188, true }, + { 144198, true }, + { 144219, true }, + { 144237, true }, + { 144255, true }, + { 144269, true }, + { 144279, true }, + { 144290, true }, + { 144312, true }, + { 144329, true }, + { 144349, true }, + { 144363, true }, + { 144380, true }, + { 144397, true }, + { 144418, true }, + { 144441, true }, + { 144459, true }, + { 144469, true }, + { 144485, true }, + { 144496, false }, + { 144516, true }, + { 144529, true }, + { 144539, true }, + { 144556, true }, + { 144576, true }, + { 144591, true }, + { 144605, true }, + { 144623, true }, + { 144637, true }, + { 144658, true }, + { 144669, true }, + { 144683, true }, + { 144699, false }, { 144713, true }, - { 144730, true }, - { 144750, true }, - { 144765, true }, + { 144729, true }, + { 144746, true }, + { 144763, true }, { 144779, true }, - { 144797, true }, - { 144811, true }, - { 144832, true }, - { 144843, true }, - { 144857, true }, - { 144873, false }, - { 144887, true }, - { 144903, true }, - { 144920, true }, - { 144937, true }, - { 144953, true }, - { 144973, true }, - { 144996, true }, - { 145005, false }, - { 145013, true }, - { 145025, false }, - { 145047, true }, - { 145062, true }, - { 145076, true }, - { 145090, true }, - { 145103, true }, + { 144799, true }, + { 144822, true }, + { 144831, false }, + { 144839, true }, + { 144851, false }, + { 144873, true }, + { 144888, true }, + { 144902, true }, + { 144916, true }, + { 144929, true }, + { 144944, true }, + { 144958, true }, + { 144979, true }, + { 144990, true }, + { 145000, true }, + { 145008, true }, + { 145020, true }, + { 145045, true }, + { 145055, true }, + { 145080, true }, + { 145093, false }, { 145118, true }, - { 145132, true }, - { 145153, true }, - { 145164, true }, - { 145174, true }, - { 145182, true }, - { 145194, true }, - { 145219, true }, + { 145135, true }, + { 145148, true }, + { 145156, true }, + { 145165, true }, + { 145179, true }, + { 145192, true }, + { 145208, true }, + { 145218, true }, { 145229, true }, - { 145254, true }, - { 145267, false }, - { 145292, true }, - { 145309, true }, - { 145322, true }, + { 145240, true }, + { 145256, true }, + { 145266, false }, + { 145278, true }, + { 145290, true }, + { 145308, true }, + { 145320, true }, { 145330, true }, - { 145339, true }, - { 145353, true }, - { 145366, true }, - { 145382, true }, - { 145392, true }, - { 145403, true }, - { 145414, true }, - { 145430, true }, - { 145440, false }, - { 145452, true }, - { 145464, true }, + { 145346, true }, + { 145370, true }, + { 145383, true }, + { 145390, true }, + { 145397, true }, + { 145411, true }, + { 145423, true }, + { 145435, true }, + { 145447, true }, + { 145461, true }, { 145482, true }, - { 145494, true }, - { 145504, true }, - { 145520, true }, - { 145544, true }, - { 145557, true }, - { 145564, true }, - { 145571, true }, - { 145585, true }, - { 145597, true }, - { 145609, true }, - { 145621, true }, - { 145635, true }, - { 145656, true }, - { 145669, true }, - { 145680, true }, - { 145697, true }, + { 145495, true }, + { 145506, true }, + { 145523, true }, + { 145538, true }, + { 145563, true }, + { 145578, true }, + { 145589, true }, + { 145598, true }, + { 145620, true }, + { 145629, true }, + { 145644, true }, + { 145654, true }, + { 145670, true }, + { 145683, true }, + { 145695, true }, { 145712, true }, - { 145737, true }, - { 145752, true }, - { 145763, true }, - { 145772, true }, - { 145794, true }, - { 145803, true }, - { 145818, true }, + { 145733, true }, + { 145754, true }, + { 145771, true }, + { 145783, true }, + { 145798, true }, + { 145814, true }, { 145828, true }, - { 145844, true }, - { 145857, true }, - { 145869, true }, - { 145886, true }, - { 145907, true }, - { 145928, true }, - { 145945, true }, - { 145957, true }, - { 145972, true }, - { 145988, true }, - { 146002, true }, - { 146014, true }, - { 146028, true }, - { 146040, true }, - { 146059, true }, - { 146075, true }, - { 146091, true }, + { 145840, true }, + { 145854, true }, + { 145866, true }, + { 145885, true }, + { 145901, true }, + { 145917, true }, + { 145933, true }, + { 145951, true }, + { 145968, true }, + { 145982, true }, + { 146000, true }, + { 146017, true }, + { 146036, true }, + { 146056, true }, + { 146073, true }, + { 146089, true }, { 146107, true }, - { 146125, true }, - { 146142, true }, - { 146156, true }, - { 146174, true }, - { 146191, true }, - { 146210, true }, - { 146230, true }, - { 146247, true }, - { 146263, true }, - { 146281, true }, - { 146294, true }, - { 146311, false }, - { 146328, false }, - { 146349, true }, - { 146366, true }, - { 146385, true }, - { 146399, true }, - { 146412, true }, - { 146427, true }, - { 146440, true }, + { 146120, true }, + { 146137, false }, + { 146154, false }, + { 146175, true }, + { 146192, true }, + { 146211, true }, + { 146225, true }, + { 146238, true }, + { 146253, true }, + { 146266, true }, + { 146277, true }, + { 146295, true }, + { 146307, true }, + { 146320, true }, + { 146344, true }, + { 146353, true }, + { 146380, true }, + { 146398, true }, + { 146407, true }, + { 146417, true }, + { 146428, true }, + { 146438, true }, { 146451, true }, - { 146469, true }, - { 146481, true }, - { 146494, true }, - { 146518, true }, - { 146527, true }, - { 146542, true }, - { 146569, true }, - { 146587, true }, - { 146596, true }, - { 146606, true }, - { 146617, true }, - { 146627, true }, - { 146640, true }, - { 146648, true }, - { 146655, true }, - { 146674, true }, - { 146681, true }, - { 146696, true }, - { 146705, true }, - { 146717, false }, - { 146737, true }, + { 146459, true }, + { 146466, true }, + { 146485, true }, + { 146492, true }, + { 146507, true }, + { 146516, true }, + { 146528, false }, + { 146548, true }, + { 146562, true }, + { 146572, true }, + { 146589, true }, + { 146607, true }, + { 146624, true }, + { 146646, true }, + { 146665, true }, + { 146677, true }, + { 146688, true }, + { 146701, true }, + { 146720, true }, + { 146735, true }, { 146751, true }, - { 146761, true }, - { 146778, true }, - { 146796, true }, - { 146813, true }, - { 146835, true }, - { 146854, true }, - { 146866, true }, - { 146877, true }, - { 146890, true }, - { 146909, true }, - { 146924, true }, - { 146940, true }, - { 146963, true }, - { 146983, true }, - { 146996, true }, - { 147010, true }, - { 147022, true }, - { 147033, true }, - { 147052, true }, - { 147064, true }, - { 147081, true }, - { 147093, true }, - { 147110, true }, - { 147121, true }, - { 147145, true }, - { 147155, true }, - { 147167, true }, - { 147177, true }, - { 147193, true }, - { 147224, true }, - { 147233, true }, - { 147250, true }, - { 147262, true }, + { 146774, true }, + { 146794, true }, + { 146807, true }, + { 146821, true }, + { 146833, true }, + { 146844, true }, + { 146863, true }, + { 146875, true }, + { 146892, true }, + { 146904, true }, + { 146921, true }, + { 146932, true }, + { 146956, true }, + { 146966, true }, + { 146978, true }, + { 146988, true }, + { 147004, true }, + { 147035, true }, + { 147044, true }, + { 147061, true }, + { 147073, true }, + { 147092, true }, + { 147108, true }, + { 147125, true }, + { 147138, true }, + { 147151, true }, + { 147165, true }, + { 147174, true }, + { 147184, true }, + { 147199, true }, + { 147209, true }, + { 147223, true }, + { 147236, true }, + { 147246, true }, + { 147264, true }, { 147281, true }, { 147297, true }, { 147314, true }, - { 147327, true }, - { 147340, true }, - { 147350, true }, - { 147364, true }, - { 147373, true }, - { 147383, true }, - { 147398, true }, + { 147336, true }, + { 147348, true }, + { 147366, true }, + { 147380, false }, + { 147395, true }, { 147408, true }, - { 147422, true }, - { 147438, true }, - { 147451, true }, - { 147461, true }, - { 147479, true }, - { 147496, true }, - { 147512, true }, - { 147529, true }, - { 147551, true }, - { 147563, true }, - { 147581, true }, - { 147595, false }, - { 147610, true }, - { 147623, true }, - { 147636, true }, - { 147648, true }, - { 147660, true }, - { 147671, true }, - { 147688, true }, - { 147700, true }, - { 147719, true }, - { 147745, true }, - { 147754, true }, - { 147769, false }, - { 147776, true }, - { 147792, true }, - { 147807, true }, - { 147829, true }, - { 147854, true }, - { 147870, true }, - { 147888, true }, - { 147902, true }, - { 147912, true }, - { 147922, true }, - { 147933, true }, - { 147948, true }, - { 147958, true }, - { 147970, true }, - { 147988, true }, - { 148004, true }, - { 148019, true }, - { 148034, false }, - { 148057, true }, - { 148073, true }, + { 147421, true }, + { 147433, true }, + { 147445, true }, + { 147456, true }, + { 147473, true }, + { 147485, true }, + { 147504, true }, + { 147530, true }, + { 147539, true }, + { 147554, false }, + { 147561, true }, + { 147577, true }, + { 147592, true }, + { 147614, true }, + { 147639, true }, + { 147655, true }, + { 147673, true }, + { 147687, true }, + { 147697, true }, + { 147707, true }, + { 147718, true }, + { 147733, true }, + { 147743, true }, + { 147755, true }, + { 147773, true }, + { 147789, true }, + { 147804, true }, + { 147819, false }, + { 147842, true }, + { 147858, true }, + { 147871, true }, + { 147882, true }, + { 147899, true }, + { 147919, true }, + { 147950, true }, + { 147971, true }, + { 147984, true }, + { 148005, true }, + { 148016, true }, + { 148033, true }, + { 148045, true }, + { 148058, true }, + { 148066, true }, + { 148077, true }, { 148086, true }, - { 148097, true }, - { 148114, true }, - { 148134, true }, + { 148095, true }, + { 148109, true }, + { 148121, false }, + { 148128, true }, + { 148136, true }, + { 148145, true }, + { 148154, true }, { 148165, true }, - { 148186, true }, - { 148199, true }, - { 148220, true }, - { 148231, true }, - { 148248, true }, - { 148260, true }, - { 148273, true }, - { 148281, true }, - { 148292, true }, - { 148301, true }, - { 148310, true }, - { 148324, true }, - { 148336, false }, - { 148343, true }, - { 148351, true }, - { 148360, true }, + { 148172, true }, + { 148189, true }, + { 148197, true }, + { 148211, true }, + { 148219, true }, + { 148238, false }, + { 148258, true }, + { 148268, true }, + { 148289, true }, + { 148300, false }, + { 148312, true }, + { 148329, true }, + { 148340, true }, { 148369, true }, - { 148380, true }, - { 148387, true }, - { 148404, true }, - { 148412, true }, + { 148383, true }, + { 148397, true }, + { 148414, true }, { 148426, true }, - { 148434, true }, - { 148453, false }, - { 148473, true }, - { 148483, true }, - { 148504, true }, - { 148515, false }, - { 148527, true }, - { 148544, true }, - { 148555, true }, - { 148584, true }, - { 148598, true }, - { 148612, true }, - { 148629, true }, - { 148641, true }, - { 148656, true }, - { 148664, true }, - { 148672, true }, - { 148686, true }, - { 148703, true }, - { 148721, true }, - { 148734, true }, - { 148743, false }, - { 148761, true }, - { 148773, true }, - { 148786, true }, - { 148795, true }, - { 148818, true }, - { 148832, true }, + { 148441, true }, + { 148449, true }, + { 148457, true }, + { 148471, true }, + { 148488, true }, + { 148506, true }, + { 148519, true }, + { 148528, false }, + { 148546, true }, + { 148558, true }, + { 148571, true }, + { 148580, true }, + { 148603, true }, + { 148617, true }, + { 148630, true }, + { 148646, true }, + { 148663, true }, + { 148676, true }, + { 148694, true }, + { 148706, true }, + { 148725, true }, + { 148747, true }, + { 148769, true }, + { 148789, false }, + { 148805, true }, + { 148828, true }, + { 148837, true }, { 148845, true }, - { 148861, true }, - { 148878, true }, - { 148891, true }, + { 148860, true }, + { 148879, true }, + { 148895, true }, { 148909, true }, - { 148921, true }, - { 148940, true }, - { 148962, true }, - { 148984, true }, - { 149004, false }, - { 149020, true }, - { 149043, true }, - { 149052, true }, - { 149060, true }, - { 149075, true }, - { 149094, true }, - { 149110, true }, - { 149124, true }, - { 149140, true }, - { 149160, true }, - { 149170, true }, - { 149188, true }, - { 149195, true }, - { 149207, true }, + { 148925, true }, + { 148945, true }, + { 148955, true }, + { 148973, true }, + { 148980, true }, + { 148992, true }, + { 149005, true }, + { 149015, true }, + { 149023, true }, + { 149031, true }, + { 149039, false }, + { 149062, true }, + { 149081, true }, + { 149106, true }, + { 149123, true }, + { 149135, true }, + { 149147, true }, + { 149162, true }, + { 149171, true }, + { 149185, true }, + { 149198, true }, { 149220, true }, { 149230, true }, - { 149238, true }, - { 149246, true }, - { 149254, false }, - { 149277, true }, - { 149296, true }, - { 149321, true }, - { 149338, true }, - { 149350, true }, - { 149362, true }, - { 149377, true }, - { 149386, true }, + { 149251, true }, + { 149272, true }, + { 149289, true }, + { 149310, true }, + { 149324, true }, + { 149340, true }, + { 149353, true }, + { 149363, true }, + { 149376, true }, { 149400, true }, - { 149413, true }, - { 149435, true }, - { 149445, true }, - { 149466, true }, - { 149487, true }, - { 149504, true }, - { 149525, true }, - { 149539, true }, - { 149555, true }, - { 149568, true }, - { 149578, true }, - { 149591, true }, - { 149615, true }, - { 149634, true }, - { 149646, true }, - { 149664, true }, - { 149673, true }, - { 149690, true }, - { 149708, true }, - { 149721, true }, - { 149734, false }, - { 149755, true }, - { 149765, true }, - { 149784, true }, - { 149797, true }, - { 149817, true }, - { 149828, true }, - { 149840, true }, - { 149855, true }, - { 149868, true }, - { 149883, true }, - { 149898, true }, - { 149911, false }, - { 149920, true }, - { 149939, true }, - { 149956, false }, - { 149971, true }, - { 149985, true }, - { 149995, true }, - { 150008, true }, - { 150024, true }, - { 150042, true }, - { 150052, true }, - { 150064, true }, - { 150077, true }, - { 150090, true }, - { 150099, true }, - { 150123, true }, - { 150147, false }, - { 150160, true }, - { 150171, true }, - { 150187, true }, - { 150199, true }, - { 150215, true }, - { 150232, false }, - { 150244, true }, - { 150261, true }, - { 150280, false }, - { 150289, true }, - { 150311, true }, - { 150325, true }, - { 150338, false }, + { 149419, true }, + { 149431, true }, + { 149449, true }, + { 149458, true }, + { 149475, true }, + { 149493, true }, + { 149506, true }, + { 149519, false }, + { 149540, true }, + { 149550, true }, + { 149569, true }, + { 149582, true }, + { 149602, true }, + { 149613, true }, + { 149625, true }, + { 149640, true }, + { 149653, true }, + { 149668, true }, + { 149683, true }, + { 149696, false }, + { 149705, true }, + { 149724, true }, + { 149741, false }, + { 149756, true }, + { 149770, true }, + { 149780, true }, + { 149793, true }, + { 149809, true }, + { 149827, true }, + { 149837, true }, + { 149849, true }, + { 149862, true }, + { 149875, true }, + { 149884, true }, + { 149908, true }, + { 149932, false }, + { 149945, true }, + { 149956, true }, + { 149972, true }, + { 149984, true }, + { 150000, true }, + { 150017, false }, + { 150029, true }, + { 150046, true }, + { 150065, false }, + { 150074, true }, + { 150096, true }, + { 150110, true }, + { 150123, false }, + { 150138, true }, + { 150153, true }, + { 150165, true }, + { 150184, false }, + { 150207, true }, + { 150223, true }, + { 150239, false }, + { 150259, true }, + { 150272, true }, + { 150288, true }, + { 150299, true }, + { 150318, true }, + { 150332, true }, + { 150343, true }, { 150353, true }, - { 150368, true }, - { 150380, true }, - { 150399, false }, - { 150422, true }, - { 150438, true }, - { 150454, false }, - { 150474, true }, - { 150487, true }, - { 150503, true }, - { 150514, true }, - { 150533, true }, - { 150547, true }, - { 150558, true }, - { 150568, true }, - { 150585, true }, - { 150597, true }, + { 150370, true }, + { 150382, true }, + { 150401, true }, + { 150413, true }, + { 150424, true }, + { 150443, true }, + { 150464, true }, + { 150477, true }, + { 150485, true }, + { 150501, true }, + { 150525, false }, + { 150543, true }, + { 150561, false }, + { 150581, true }, + { 150600, true }, { 150616, true }, - { 150628, true }, - { 150639, true }, - { 150658, true }, - { 150679, true }, - { 150692, true }, - { 150700, true }, - { 150716, true }, - { 150740, false }, + { 150634, true }, + { 150646, true }, + { 150663, true }, + { 150686, true }, + { 150705, true }, + { 150725, true }, + { 150738, true }, + { 150750, true }, { 150758, true }, - { 150776, false }, - { 150796, true }, - { 150815, true }, - { 150831, true }, - { 150849, true }, - { 150861, true }, - { 150878, true }, - { 150901, true }, - { 150920, true }, - { 150940, true }, - { 150953, true }, - { 150965, true }, - { 150973, true }, - { 150993, true }, - { 151001, true }, - { 151017, true }, - { 151031, true }, - { 151040, true }, - { 151052, true }, - { 151062, true }, - { 151071, true }, - { 151088, true }, - { 151100, true }, - { 151111, true }, + { 150778, true }, + { 150786, true }, + { 150802, true }, + { 150816, true }, + { 150825, true }, + { 150837, true }, + { 150847, true }, + { 150856, true }, + { 150873, true }, + { 150885, true }, + { 150896, true }, + { 150906, true }, + { 150923, true }, + { 150934, true }, + { 150944, true }, + { 150961, true }, + { 150970, true }, + { 150984, true }, + { 150996, true }, + { 151015, true }, + { 151025, true }, + { 151042, true }, + { 151064, true }, + { 151078, true }, + { 151092, true }, + { 151107, true }, { 151121, true }, - { 151138, true }, - { 151149, true }, - { 151159, true }, - { 151176, true }, - { 151185, true }, - { 151199, true }, - { 151211, true }, - { 151230, true }, - { 151240, true }, - { 151257, true }, - { 151279, true }, - { 151293, true }, - { 151307, true }, - { 151322, true }, - { 151336, true }, - { 151345, true }, - { 151357, true }, - { 151363, true }, - { 151369, true }, - { 151377, true }, - { 151389, true }, - { 151410, true }, - { 151420, true }, - { 151431, true }, - { 151449, true }, - { 151462, true }, - { 151481, true }, - { 151497, true }, - { 151510, true }, - { 151521, true }, - { 151534, true }, - { 151548, false }, - { 151562, true }, - { 151581, true }, + { 151130, true }, + { 151142, true }, + { 151148, true }, + { 151154, true }, + { 151162, true }, + { 151174, true }, + { 151195, true }, + { 151205, true }, + { 151216, true }, + { 151234, true }, + { 151247, true }, + { 151266, true }, + { 151282, true }, + { 151295, true }, + { 151306, true }, + { 151319, true }, + { 151333, false }, + { 151347, true }, + { 151366, true }, + { 151376, true }, + { 151384, true }, + { 151401, true }, + { 151415, true }, + { 151427, true }, + { 151444, true }, + { 151458, true }, + { 151472, false }, + { 151485, true }, + { 151503, true }, + { 151515, true }, + { 151527, true }, + { 151546, true }, + { 151565, true }, + { 151579, true }, { 151591, true }, - { 151599, true }, - { 151616, true }, - { 151630, true }, - { 151642, true }, - { 151659, true }, - { 151673, true }, - { 151687, false }, + { 151604, true }, + { 151620, true }, + { 151633, true }, + { 151646, true }, + { 151661, true }, + { 151689, true }, { 151700, true }, - { 151718, true }, - { 151730, true }, - { 151742, true }, - { 151761, true }, - { 151780, true }, - { 151794, true }, - { 151806, true }, - { 151819, true }, - { 151835, true }, - { 151848, true }, - { 151861, true }, - { 151876, true }, - { 151904, true }, - { 151915, true }, - { 151928, true }, - { 151947, true }, - { 151960, true }, - { 151985, true }, - { 151997, true }, - { 152011, true }, - { 152025, true }, - { 152040, true }, - { 152054, true }, + { 151713, true }, + { 151732, true }, + { 151745, true }, + { 151770, true }, + { 151782, true }, + { 151796, true }, + { 151810, true }, + { 151825, true }, + { 151839, true }, + { 151853, true }, + { 151867, true }, + { 151881, true }, + { 151897, true }, + { 151920, true }, + { 151936, true }, + { 151951, true }, + { 151975, true }, + { 151994, true }, + { 152007, true }, + { 152018, true }, + { 152038, true }, + { 152050, true }, { 152068, true }, - { 152082, true }, - { 152096, true }, - { 152112, true }, - { 152135, true }, - { 152151, true }, - { 152166, true }, - { 152190, true }, - { 152209, true }, - { 152222, true }, - { 152233, true }, - { 152253, true }, - { 152265, true }, - { 152283, true }, - { 152298, true }, - { 152317, true }, - { 152330, true }, - { 152354, true }, - { 152370, true }, - { 152383, true }, - { 152403, true }, - { 152416, true }, - { 152433, true }, - { 152448, true }, - { 152468, true }, - { 152481, true }, - { 152496, true }, - { 152508, true }, - { 152526, true }, - { 152545, true }, - { 152564, true }, - { 152578, true }, - { 152593, true }, - { 152605, true }, + { 152083, true }, + { 152102, true }, + { 152115, true }, + { 152133, true }, + { 152157, true }, + { 152173, true }, + { 152186, true }, + { 152206, true }, + { 152219, true }, + { 152236, true }, + { 152251, true }, + { 152271, true }, + { 152284, true }, + { 152299, true }, + { 152311, true }, + { 152329, true }, + { 152348, true }, + { 152367, true }, + { 152381, true }, + { 152396, true }, + { 152408, true }, + { 152425, true }, + { 152440, true }, + { 152458, true }, + { 152470, true }, + { 152484, true }, + { 152495, true }, + { 152517, true }, + { 152529, true }, + { 152538, true }, + { 152550, true }, + { 152565, true }, + { 152588, true }, + { 152606, true }, { 152622, true }, - { 152637, true }, + { 152638, true }, { 152655, true }, - { 152667, true }, - { 152681, true }, + { 152674, true }, { 152692, true }, - { 152714, true }, - { 152726, true }, - { 152735, true }, - { 152747, true }, - { 152762, true }, - { 152785, true }, - { 152803, true }, - { 152819, true }, - { 152835, true }, - { 152852, true }, - { 152871, true }, - { 152889, true }, - { 152895, true }, - { 152913, false }, - { 152933, true }, - { 152950, true }, - { 152964, true }, - { 152976, true }, - { 152995, false }, - { 153012, true }, - { 153031, true }, - { 153042, true }, - { 153061, true }, - { 153084, true }, - { 153095, true }, - { 153113, true }, - { 153133, true }, - { 153150, true }, - { 153169, true }, - { 153187, true }, - { 153196, true }, - { 153203, true }, - { 153210, true }, - { 153222, false }, - { 153242, true }, - { 153250, true }, + { 152698, true }, + { 152716, false }, + { 152736, true }, + { 152753, true }, + { 152767, true }, + { 152779, true }, + { 152798, false }, + { 152815, true }, + { 152834, true }, + { 152845, true }, + { 152864, true }, + { 152887, true }, + { 152898, true }, + { 152916, true }, + { 152936, true }, + { 152953, true }, + { 152972, true }, + { 152990, true }, + { 152999, true }, + { 153006, true }, + { 153013, true }, + { 153025, false }, + { 153045, true }, + { 153053, true }, + { 153064, true }, + { 153087, true }, + { 153111, true }, + { 153134, true }, + { 153157, true }, + { 153185, true }, + { 153214, true }, + { 153229, true }, + { 153248, true }, { 153261, true }, - { 153284, true }, - { 153308, true }, - { 153331, true }, - { 153354, true }, - { 153382, true }, - { 153411, true }, - { 153424, true }, - { 153439, true }, - { 153458, true }, - { 153471, true }, - { 153489, true }, - { 153512, true }, - { 153523, true }, + { 153279, true }, + { 153302, true }, + { 153313, true }, + { 153330, true }, + { 153341, true }, + { 153352, true }, + { 153370, true }, + { 153396, true }, + { 153425, true }, + { 153437, true }, + { 153450, false }, + { 153470, true }, + { 153488, false }, + { 153503, true }, + { 153524, false }, { 153540, true }, - { 153551, true }, - { 153562, true }, - { 153580, true }, - { 153606, true }, - { 153635, true }, - { 153647, true }, - { 153660, false }, - { 153680, true }, - { 153698, false }, - { 153713, true }, - { 153734, false }, - { 153750, true }, - { 153768, true }, - { 153784, true }, - { 153802, true }, - { 153818, true }, - { 153830, true }, - { 153852, true }, - { 153872, true }, - { 153892, true }, - { 153911, true }, - { 153928, false }, - { 153946, true }, - { 153966, true }, - { 153985, true }, - { 154012, true }, - { 154024, true }, + { 153558, true }, + { 153574, true }, + { 153592, true }, + { 153608, true }, + { 153620, true }, + { 153642, true }, + { 153662, true }, + { 153682, true }, + { 153701, true }, + { 153718, true }, + { 153736, false }, + { 153754, true }, + { 153774, true }, + { 153793, true }, + { 153820, true }, + { 153832, true }, + { 153844, true }, + { 153855, true }, + { 153874, true }, + { 153888, true }, + { 153903, true }, + { 153912, true }, + { 153927, true }, + { 153937, true }, + { 153950, true }, + { 153970, true }, + { 153979, true }, + { 153989, true }, + { 154010, false }, + { 154027, true }, { 154036, true }, - { 154047, true }, - { 154061, true }, - { 154076, true }, - { 154085, true }, - { 154100, true }, - { 154110, true }, + { 154049, true }, + { 154066, true }, + { 154080, true }, + { 154094, true }, + { 154106, true }, { 154123, true }, - { 154143, true }, - { 154152, true }, - { 154162, true }, - { 154183, false }, - { 154200, true }, - { 154209, true }, - { 154222, true }, - { 154239, true }, - { 154253, true }, - { 154267, true }, - { 154279, true }, - { 154296, true }, - { 154312, true }, - { 154324, true }, - { 154335, false }, - { 154351, true }, - { 154362, true }, - { 154378, true }, - { 154391, true }, - { 154400, true }, - { 154413, true }, - { 154430, true }, - { 154442, true }, - { 154454, true }, - { 154466, true }, - { 154475, true }, - { 154487, true }, - { 154502, true }, - { 154516, true }, - { 154526, true }, - { 154547, true }, - { 154565, true }, - { 154577, true }, - { 154587, true }, - { 154602, true }, - { 154614, true }, - { 154626, true }, - { 154641, true }, - { 154652, true }, - { 154663, true }, - { 154671, true }, - { 154684, true }, - { 154697, true }, + { 154139, true }, + { 154151, true }, + { 154162, false }, + { 154178, true }, + { 154189, true }, + { 154205, true }, + { 154218, true }, + { 154227, true }, + { 154240, true }, + { 154257, true }, + { 154269, true }, + { 154281, true }, + { 154293, true }, + { 154302, true }, + { 154314, true }, + { 154329, true }, + { 154343, true }, + { 154353, true }, + { 154374, true }, + { 154392, true }, + { 154404, true }, + { 154414, true }, + { 154429, true }, + { 154441, true }, + { 154453, true }, + { 154468, true }, + { 154479, true }, + { 154490, true }, + { 154498, true }, + { 154511, true }, + { 154524, true }, + { 154541, true }, + { 154551, true }, + { 154564, true }, + { 154581, true }, + { 154595, true }, + { 154604, true }, + { 154619, true }, + { 154633, true }, + { 154646, true }, + { 154660, true }, + { 154674, true }, + { 154682, true }, + { 154699, true }, { 154714, true }, - { 154724, true }, - { 154737, true }, - { 154754, true }, - { 154768, true }, - { 154777, true }, - { 154792, true }, - { 154806, true }, - { 154819, true }, - { 154833, true }, - { 154847, true }, - { 154855, true }, - { 154872, true }, - { 154887, true }, - { 154902, true }, - { 154916, true }, - { 154932, true }, - { 154948, true }, - { 154962, true }, - { 154978, true }, - { 154995, true }, - { 155008, true }, - { 155022, false }, - { 155040, true }, - { 155055, true }, - { 155072, true }, - { 155089, false }, - { 155115, true }, - { 155130, true }, - { 155148, true }, - { 155161, true }, - { 155174, true }, - { 155186, true }, - { 155205, true }, - { 155215, true }, - { 155227, true }, - { 155240, true }, - { 155251, true }, - { 155268, true }, - { 155299, true }, - { 155309, true }, - { 155320, true }, - { 155331, true }, - { 155343, true }, - { 155357, true }, - { 155369, true }, - { 155377, true }, - { 155385, true }, - { 155396, false }, - { 155416, true }, - { 155434, true }, - { 155449, false }, - { 155463, true }, - { 155483, true }, + { 154729, true }, + { 154743, true }, + { 154759, true }, + { 154775, true }, + { 154789, true }, + { 154805, true }, + { 154822, true }, + { 154835, true }, + { 154849, false }, + { 154867, true }, + { 154882, true }, + { 154899, true }, + { 154916, false }, + { 154942, true }, + { 154957, true }, + { 154975, true }, + { 154988, true }, + { 155001, true }, + { 155013, true }, + { 155032, true }, + { 155042, true }, + { 155054, true }, + { 155067, true }, + { 155078, true }, + { 155095, true }, + { 155126, true }, + { 155136, true }, + { 155147, true }, + { 155158, true }, + { 155170, true }, + { 155184, true }, + { 155196, true }, + { 155204, true }, + { 155212, true }, + { 155223, false }, + { 155243, true }, + { 155261, true }, + { 155276, false }, + { 155290, true }, + { 155310, true }, + { 155321, true }, + { 155346, true }, + { 155364, true }, + { 155379, true }, + { 155396, true }, + { 155412, true }, + { 155437, true }, + { 155448, true }, + { 155461, true }, + { 155473, true }, + { 155486, false }, { 155494, true }, + { 155504, true }, { 155519, true }, - { 155537, true }, - { 155552, true }, - { 155569, true }, - { 155585, true }, - { 155610, true }, - { 155621, true }, - { 155634, true }, - { 155646, true }, - { 155659, false }, - { 155667, true }, - { 155677, true }, - { 155692, true }, - { 155711, true }, - { 155724, true }, - { 155737, true }, - { 155752, true }, - { 155765, true }, - { 155778, true }, - { 155792, true }, - { 155805, true }, - { 155825, true }, - { 155843, true }, - { 155857, true }, - { 155868, true }, - { 155879, true }, - { 155892, true }, - { 155909, true }, - { 155917, true }, - { 155932, true }, - { 155945, true }, - { 155959, true }, - { 155974, true }, - { 155999, true }, - { 156035, true }, - { 156048, true }, - { 156058, true }, - { 156073, true }, + { 155538, true }, + { 155551, true }, + { 155564, true }, + { 155579, true }, + { 155592, true }, + { 155605, true }, + { 155619, true }, + { 155632, true }, + { 155652, true }, + { 155670, true }, + { 155684, true }, + { 155698, true }, + { 155709, true }, + { 155720, true }, + { 155733, true }, + { 155750, true }, + { 155758, true }, + { 155773, true }, + { 155786, true }, + { 155800, true }, + { 155815, true }, + { 155840, true }, + { 155876, true }, + { 155889, true }, + { 155899, true }, + { 155914, true }, + { 155927, true }, + { 155949, true }, + { 155967, true }, + { 155980, true }, + { 155991, true }, + { 156003, true }, + { 156021, true }, + { 156029, true }, + { 156062, true }, + { 156069, true }, { 156086, true }, - { 156108, true }, - { 156126, true }, - { 156139, true }, - { 156150, true }, - { 156162, true }, - { 156180, true }, - { 156188, true }, - { 156221, true }, - { 156228, true }, - { 156245, true }, - { 156263, false }, - { 156281, true }, - { 156299, true }, - { 156311, true }, - { 156323, true }, - { 156336, true }, - { 156352, true }, - { 156366, true }, + { 156104, false }, + { 156122, true }, + { 156140, true }, + { 156152, true }, + { 156164, true }, + { 156177, true }, + { 156193, true }, + { 156207, true }, + { 156227, true }, + { 156247, true }, + { 156258, true }, + { 156268, true }, + { 156277, true }, + { 156288, true }, + { 156307, true }, + { 156321, true }, + { 156335, true }, + { 156358, true }, + { 156372, true }, { 156386, true }, - { 156406, true }, - { 156417, true }, - { 156427, true }, + { 156398, true }, + { 156412, false }, + { 156422, true }, { 156436, true }, - { 156447, true }, - { 156466, true }, + { 156445, true }, + { 156457, true }, + { 156469, true }, { 156480, true }, - { 156494, true }, - { 156517, true }, - { 156531, true }, - { 156545, true }, - { 156557, true }, - { 156571, false }, - { 156581, true }, - { 156595, true }, - { 156604, true }, - { 156616, true }, + { 156489, true }, + { 156498, true }, + { 156512, true }, + { 156518, true }, + { 156530, true }, + { 156545, false }, + { 156572, true }, + { 156592, true }, + { 156602, true }, + { 156615, true }, { 156628, true }, - { 156639, true }, - { 156648, true }, - { 156657, true }, - { 156671, true }, - { 156677, true }, - { 156689, true }, - { 156704, false }, - { 156731, true }, - { 156751, true }, - { 156761, true }, - { 156774, true }, - { 156787, true }, - { 156803, true }, - { 156824, true }, - { 156843, true }, + { 156644, true }, + { 156665, true }, + { 156684, true }, + { 156694, true }, + { 156706, true }, + { 156717, false }, + { 156725, true }, + { 156740, true }, + { 156754, true }, + { 156766, true }, + { 156779, true }, + { 156789, true }, + { 156810, true }, + { 156822, true }, + { 156833, true }, { 156853, true }, - { 156865, true }, - { 156876, false }, - { 156884, true }, - { 156899, true }, - { 156913, true }, - { 156925, true }, - { 156938, true }, - { 156948, true }, - { 156969, true }, - { 156981, true }, - { 156992, true }, - { 157012, true }, - { 157031, true }, - { 157042, true }, - { 157057, true }, - { 157082, false }, - { 157110, false }, - { 157122, true }, - { 157133, true }, - { 157144, true }, - { 157159, true }, - { 157174, true }, - { 157191, true }, - { 157203, false }, - { 157220, true }, - { 157236, true }, - { 157250, true }, - { 157265, true }, - { 157280, true }, - { 157296, true }, - { 157313, true }, - { 157336, true }, - { 157355, true }, - { 157369, true }, - { 157390, true }, - { 157410, true }, - { 157428, true }, - { 157447, true }, - { 157465, true }, - { 157483, true }, - { 157498, false }, - { 157513, false }, - { 157527, true }, - { 157538, true }, - { 157549, true }, - { 157561, true }, - { 157576, true }, - { 157594, true }, - { 157616, true }, - { 157630, true }, - { 157647, true }, - { 157666, true }, - { 157684, true }, - { 157705, true }, - { 157719, true }, - { 157734, true }, - { 157750, true }, - { 157768, true }, - { 157778, true }, - { 157790, false }, - { 157801, true }, - { 157820, false }, - { 157839, true }, - { 157854, true }, - { 157867, false }, - { 157886, true }, - { 157897, true }, - { 157915, true }, - { 157929, true }, - { 157954, true }, - { 157969, true }, - { 157987, true }, + { 156872, true }, + { 156883, true }, + { 156898, true }, + { 156923, false }, + { 156951, false }, + { 156963, true }, + { 156974, true }, + { 156985, true }, + { 157000, true }, + { 157015, true }, + { 157032, true }, + { 157044, false }, + { 157061, true }, + { 157077, true }, + { 157091, true }, + { 157106, true }, + { 157121, true }, + { 157137, true }, + { 157154, true }, + { 157177, true }, + { 157196, true }, + { 157210, true }, + { 157231, true }, + { 157251, true }, + { 157269, true }, + { 157288, true }, + { 157306, true }, + { 157324, false }, + { 157341, true }, + { 157356, false }, + { 157371, false }, + { 157385, true }, + { 157396, true }, + { 157407, true }, + { 157419, true }, + { 157434, true }, + { 157452, true }, + { 157474, true }, + { 157488, true }, + { 157505, true }, + { 157524, true }, + { 157542, true }, + { 157563, true }, + { 157577, true }, + { 157592, true }, + { 157608, true }, + { 157626, true }, + { 157636, true }, + { 157648, false }, + { 157659, true }, + { 157678, false }, + { 157697, true }, + { 157712, true }, + { 157725, false }, + { 157744, true }, + { 157755, true }, + { 157773, true }, + { 157787, true }, + { 157812, true }, + { 157827, true }, + { 157845, true }, + { 157860, true }, + { 157875, true }, + { 157892, true }, + { 157903, true }, + { 157913, true }, + { 157928, true }, + { 157937, true }, + { 157947, true }, + { 157957, true }, + { 157974, true }, + { 157989, false }, { 158002, true }, - { 158017, true }, - { 158034, true }, - { 158045, true }, - { 158055, true }, - { 158070, true }, - { 158079, true }, - { 158089, true }, - { 158099, true }, - { 158116, true }, - { 158131, false }, - { 158144, true }, - { 158160, true }, - { 158181, true }, - { 158201, true }, - { 158220, true }, - { 158232, true }, - { 158243, true }, - { 158253, false }, - { 158265, true }, - { 158280, true }, + { 158018, true }, + { 158039, true }, + { 158059, true }, + { 158078, true }, + { 158090, true }, + { 158101, true }, + { 158111, false }, + { 158123, true }, + { 158138, true }, + { 158152, true }, + { 158172, true }, + { 158195, true }, + { 158208, true }, + { 158226, true }, + { 158234, true }, + { 158242, true }, + { 158254, true }, + { 158266, true }, + { 158283, true }, { 158294, true }, - { 158314, true }, - { 158337, true }, - { 158350, true }, - { 158368, true }, - { 158376, true }, - { 158384, true }, - { 158396, true }, - { 158408, true }, - { 158425, true }, - { 158436, true }, - { 158453, false }, - { 158470, true }, - { 158483, true }, - { 158494, false }, - { 158507, true }, - { 158522, false }, - { 158546, false }, + { 158311, false }, + { 158328, true }, + { 158341, true }, + { 158352, false }, + { 158365, true }, + { 158380, false }, + { 158404, false }, + { 158416, true }, + { 158441, true }, + { 158450, true }, + { 158462, true }, + { 158482, true }, + { 158499, true }, + { 158509, true }, + { 158530, true }, + { 158539, true }, { 158558, true }, - { 158583, true }, + { 158576, true }, { 158592, true }, - { 158604, true }, - { 158624, true }, - { 158641, true }, - { 158651, true }, - { 158672, true }, - { 158681, true }, - { 158700, true }, - { 158718, true }, - { 158734, true }, - { 158749, true }, - { 158764, true }, - { 158779, true }, - { 158799, true }, - { 158812, true }, - { 158825, true }, - { 158834, true }, - { 158848, true }, - { 158871, true }, - { 158893, true }, - { 158919, true }, - { 158934, true }, - { 158949, true }, - { 158963, true }, - { 158975, true }, - { 158998, true }, - { 159008, true }, - { 159016, true }, - { 159032, true }, + { 158607, true }, + { 158622, true }, + { 158637, true }, + { 158657, true }, + { 158670, true }, + { 158683, true }, + { 158692, true }, + { 158706, true }, + { 158729, true }, + { 158751, true }, + { 158777, true }, + { 158792, true }, + { 158807, true }, + { 158821, true }, + { 158833, true }, + { 158856, true }, + { 158866, true }, + { 158874, true }, + { 158890, true }, + { 158904, true }, + { 158917, false }, + { 158935, true }, + { 158948, true }, + { 158959, true }, + { 158972, true }, + { 158982, true }, + { 158997, true }, + { 159010, true }, + { 159026, true }, + { 159036, false }, { 159046, true }, - { 159059, false }, - { 159077, true }, - { 159090, true }, - { 159101, true }, - { 159114, true }, - { 159124, true }, - { 159139, true }, - { 159152, true }, - { 159168, true }, - { 159178, false }, - { 159188, true }, + { 159059, true }, + { 159074, true }, + { 159084, true }, + { 159100, true }, + { 159112, true }, + { 159121, true }, + { 159136, true }, + { 159147, true }, + { 159165, true }, + { 159185, true }, { 159201, true }, - { 159216, true }, - { 159226, true }, - { 159242, true }, - { 159254, true }, - { 159263, true }, - { 159278, true }, - { 159289, true }, + { 159218, true }, + { 159231, true }, + { 159241, true }, + { 159251, true }, + { 159265, true }, + { 159277, true }, + { 159290, true }, { 159307, true }, - { 159327, true }, - { 159343, true }, - { 159360, true }, - { 159373, true }, - { 159383, true }, - { 159393, true }, - { 159407, true }, - { 159419, true }, - { 159432, true }, - { 159449, true }, - { 159464, true }, - { 159481, true }, + { 159322, true }, + { 159339, true }, + { 159351, true }, + { 159368, true }, + { 159382, true }, + { 159398, true }, + { 159411, true }, + { 159426, false }, + { 159438, true }, + { 159448, true }, + { 159457, true }, + { 159469, true }, + { 159477, true }, + { 159485, true }, { 159493, true }, - { 159510, true }, - { 159524, true }, - { 159540, true }, - { 159553, true }, - { 159568, false }, - { 159580, true }, - { 159590, true }, - { 159599, true }, - { 159607, true }, - { 159615, true }, - { 159623, true }, - { 159629, true }, - { 159644, true }, - { 159657, true }, - { 159672, true }, - { 159691, true }, - { 159715, true }, + { 159499, true }, + { 159514, true }, + { 159527, true }, + { 159542, true }, + { 159561, true }, + { 159585, true }, + { 159598, true }, + { 159613, true }, + { 159637, true }, + { 159647, true }, + { 159663, true }, + { 159684, false }, + { 159707, true }, { 159728, true }, - { 159743, true }, - { 159767, true }, - { 159777, true }, - { 159793, true }, - { 159814, false }, - { 159837, true }, - { 159858, true }, - { 159871, true }, - { 159884, true }, - { 159901, true }, - { 159915, true }, - { 159927, false }, - { 159940, true }, - { 159959, true }, - { 159983, false }, - { 160010, true }, + { 159741, true }, + { 159754, true }, + { 159771, true }, + { 159785, true }, + { 159797, false }, + { 159810, true }, + { 159829, true }, + { 159853, false }, + { 159880, true }, + { 159906, true }, + { 159921, true }, + { 159938, true }, + { 159954, true }, + { 159971, true }, + { 159984, true }, + { 159995, true }, + { 160006, true }, + { 160017, true }, + { 160027, true }, { 160036, true }, - { 160051, true }, - { 160068, true }, - { 160084, true }, - { 160101, true }, - { 160114, true }, - { 160125, true }, + { 160049, true }, + { 160067, true }, + { 160080, true }, + { 160094, true }, + { 160104, true }, + { 160115, true }, { 160136, true }, - { 160147, true }, - { 160157, true }, + { 160150, true }, + { 160159, true }, { 160166, true }, - { 160179, true }, - { 160197, true }, - { 160210, true }, - { 160224, true }, - { 160234, true }, - { 160245, true }, - { 160266, true }, - { 160280, true }, + { 160173, true }, + { 160181, true }, + { 160204, true }, + { 160217, true }, + { 160231, true }, + { 160244, true }, + { 160259, true }, + { 160268, true }, + { 160276, true }, { 160289, true }, - { 160296, true }, - { 160303, true }, - { 160311, true }, - { 160334, true }, - { 160347, true }, - { 160361, true }, - { 160374, true }, - { 160389, true }, - { 160398, true }, - { 160406, true }, + { 160297, true }, + { 160315, false }, + { 160331, true }, + { 160352, true }, + { 160368, true }, + { 160381, true }, + { 160392, true }, + { 160404, true }, { 160419, true }, - { 160427, true }, - { 160445, true }, - { 160456, false }, - { 160472, true }, - { 160493, true }, - { 160509, true }, - { 160522, true }, - { 160533, true }, - { 160545, true }, + { 160428, true }, + { 160440, true }, + { 160451, true }, + { 160463, true }, + { 160476, true }, + { 160491, true }, + { 160511, true }, + { 160523, true }, + { 160540, true }, + { 160550, true }, { 160560, true }, - { 160569, true }, - { 160581, true }, - { 160592, true }, - { 160604, true }, - { 160617, true }, - { 160632, true }, - { 160652, true }, - { 160664, true }, - { 160681, true }, - { 160691, true }, - { 160701, true }, - { 160708, true }, - { 160718, true }, + { 160567, true }, + { 160577, true }, + { 160589, true }, + { 160605, true }, + { 160620, true }, + { 160629, true }, + { 160643, true }, + { 160663, true }, + { 160675, true }, + { 160688, true }, + { 160706, true }, + { 160713, true }, { 160730, true }, - { 160746, true }, - { 160761, true }, - { 160770, true }, - { 160784, true }, - { 160804, true }, - { 160816, true }, - { 160829, true }, + { 160747, true }, + { 160767, true }, + { 160786, true }, + { 160802, false }, + { 160820, true }, { 160847, true }, - { 160854, true }, - { 160871, true }, - { 160888, true }, - { 160908, true }, - { 160927, true }, - { 160943, false }, - { 160961, true }, - { 160988, true }, - { 161005, true }, - { 161019, true }, - { 161033, true }, - { 161048, false }, - { 161067, true }, - { 161085, true }, - { 161103, true }, + { 160864, true }, + { 160878, true }, + { 160892, true }, + { 160907, false }, + { 160926, true }, + { 160944, true }, + { 160962, true }, + { 160980, true }, + { 160997, true }, + { 161018, true }, + { 161037, true }, + { 161051, true }, + { 161062, true }, + { 161070, true }, + { 161080, true }, + { 161095, true }, + { 161110, true }, { 161121, true }, - { 161138, true }, - { 161159, true }, - { 161178, true }, - { 161192, true }, - { 161203, true }, - { 161211, true }, - { 161221, true }, - { 161236, true }, - { 161251, true }, - { 161262, true }, - { 161284, true }, + { 161143, true }, + { 161156, true }, + { 161175, true }, + { 161201, true }, + { 161217, true }, + { 161235, true }, + { 161253, true }, + { 161268, true }, + { 161276, true }, + { 161289, true }, { 161297, true }, - { 161316, true }, - { 161342, true }, - { 161358, true }, - { 161376, true }, - { 161394, true }, + { 161308, true }, + { 161322, true }, + { 161338, true }, + { 161355, true }, + { 161365, true }, + { 161378, true }, + { 161396, true }, { 161409, true }, - { 161417, true }, - { 161430, true }, + { 161428, false }, { 161438, true }, - { 161449, true }, - { 161463, true }, - { 161479, true }, - { 161496, true }, - { 161506, true }, + { 161455, true }, + { 161471, true }, + { 161494, true }, { 161519, true }, - { 161537, true }, - { 161550, true }, - { 161569, false }, - { 161579, true }, - { 161596, true }, - { 161612, true }, - { 161635, true }, - { 161660, true }, - { 161674, true }, - { 161687, true }, - { 161698, true }, - { 161713, true }, - { 161725, true }, - { 161743, true }, - { 161768, true }, - { 161780, true }, - { 161792, true }, - { 161804, true }, - { 161822, true }, - { 161843, true }, - { 161859, true }, - { 161871, true }, - { 161885, true }, - { 161900, true }, - { 161913, true }, - { 161929, true }, - { 161947, true }, - { 161961, true }, - { 161971, false }, - { 161982, true }, - { 161990, false }, - { 162002, true }, - { 162019, true }, - { 162029, true }, + { 161533, true }, + { 161546, true }, + { 161557, true }, + { 161572, true }, + { 161584, true }, + { 161602, true }, + { 161627, true }, + { 161639, true }, + { 161651, true }, + { 161663, true }, + { 161681, true }, + { 161702, true }, + { 161718, true }, + { 161730, true }, + { 161744, true }, + { 161759, true }, + { 161772, true }, + { 161788, true }, + { 161806, true }, + { 161820, true }, + { 161830, false }, + { 161841, true }, + { 161849, false }, + { 161861, true }, + { 161878, true }, + { 161888, true }, + { 161899, true }, + { 161906, true }, + { 161917, true }, + { 161934, true }, + { 161954, true }, + { 161969, true }, + { 161978, true }, + { 161985, true }, + { 161995, true }, + { 162006, true }, + { 162015, true }, + { 162030, true }, { 162040, true }, - { 162047, true }, - { 162058, true }, - { 162075, true }, - { 162095, true }, - { 162110, true }, - { 162119, true }, - { 162126, true }, - { 162136, true }, - { 162147, true }, - { 162156, true }, - { 162171, true }, - { 162181, true }, + { 162061, true }, + { 162070, true }, + { 162086, false }, + { 162099, true }, + { 162115, true }, + { 162135, true }, + { 162149, true }, + { 162165, true }, + { 162179, true }, + { 162194, true }, { 162202, true }, - { 162211, true }, - { 162227, false }, - { 162240, true }, - { 162256, true }, - { 162276, true }, - { 162290, true }, - { 162306, true }, - { 162320, true }, - { 162335, true }, - { 162343, true }, - { 162356, true }, - { 162372, true }, - { 162385, true }, - { 162398, true }, - { 162412, true }, - { 162434, true }, - { 162455, true }, - { 162474, true }, - { 162502, true }, - { 162523, true }, - { 162542, true }, - { 162566, true }, - { 162576, true }, - { 162585, true }, - { 162598, true }, - { 162604, true }, - { 162616, true }, - { 162630, true }, - { 162644, true }, - { 162658, false }, - { 162671, true }, - { 162684, false }, - { 162695, true }, - { 162708, true }, - { 162718, true }, - { 162731, true }, - { 162750, true }, - { 162769, true }, - { 162789, true }, + { 162215, true }, + { 162231, true }, + { 162244, true }, + { 162257, true }, + { 162271, true }, + { 162293, true }, + { 162314, true }, + { 162333, true }, + { 162361, true }, + { 162380, true }, + { 162404, true }, + { 162414, true }, + { 162423, true }, + { 162436, true }, + { 162442, true }, + { 162454, true }, + { 162468, true }, + { 162482, true }, + { 162496, false }, + { 162509, true }, + { 162522, false }, + { 162533, true }, + { 162546, true }, + { 162556, true }, + { 162569, true }, + { 162588, true }, + { 162607, true }, + { 162627, true }, + { 162636, true }, + { 162647, true }, + { 162656, true }, + { 162675, false }, + { 162691, false }, + { 162704, false }, + { 162717, true }, + { 162728, true }, + { 162743, true }, + { 162754, true }, + { 162773, true }, + { 162786, true }, { 162798, true }, - { 162809, true }, - { 162818, true }, - { 162837, false }, - { 162853, false }, - { 162866, false }, + { 162811, true }, + { 162826, true }, + { 162835, true }, + { 162848, true }, + { 162863, true }, { 162879, true }, - { 162890, true }, - { 162905, true }, - { 162916, true }, - { 162935, true }, - { 162948, true }, - { 162960, true }, - { 162973, true }, + { 162893, true }, + { 162910, true }, + { 162919, true }, + { 162933, true }, + { 162957, true }, + { 162972, true }, { 162988, true }, - { 162997, true }, - { 163010, true }, - { 163025, true }, - { 163041, true }, - { 163055, true }, - { 163072, true }, - { 163081, true }, - { 163095, true }, - { 163119, true }, - { 163134, true }, + { 163003, true }, + { 163021, true }, + { 163034, true }, + { 163047, true }, + { 163056, true }, + { 163069, true }, + { 163089, true }, + { 163100, true }, + { 163114, true }, + { 163123, true }, + { 163132, true }, { 163150, true }, - { 163165, true }, - { 163183, true }, - { 163196, true }, - { 163209, true }, - { 163218, true }, - { 163231, true }, - { 163251, true }, - { 163262, true }, - { 163276, true }, - { 163285, true }, - { 163294, true }, - { 163312, true }, - { 163330, true }, - { 163344, true }, - { 163361, true }, - { 163378, true }, - { 163394, true }, - { 163406, true }, - { 163420, true }, - { 163441, true }, - { 163466, false }, - { 163482, true }, - { 163501, true }, - { 163516, true }, - { 163526, true }, - { 163550, true }, - { 163562, true }, - { 163575, true }, - { 163589, true }, - { 163598, true }, - { 163627, true }, - { 163652, true }, - { 163677, true }, + { 163168, true }, + { 163182, true }, + { 163199, true }, + { 163216, true }, + { 163232, true }, + { 163244, true }, + { 163258, true }, + { 163279, true }, + { 163304, false }, + { 163320, true }, + { 163339, true }, + { 163354, true }, + { 163364, true }, + { 163388, true }, + { 163400, true }, + { 163413, true }, + { 163427, true }, + { 163436, true }, + { 163465, true }, + { 163490, true }, + { 163515, true }, + { 163544, true }, + { 163556, true }, + { 163572, true }, + { 163581, true }, + { 163593, true }, + { 163607, true }, + { 163621, true }, + { 163635, true }, + { 163648, true }, + { 163667, true }, + { 163680, true }, + { 163697, true }, { 163706, true }, - { 163718, true }, - { 163734, true }, - { 163743, true }, - { 163755, true }, - { 163769, true }, - { 163783, true }, - { 163797, true }, - { 163810, true }, - { 163829, true }, - { 163842, true }, - { 163859, true }, - { 163868, true }, - { 163886, true }, - { 163900, false }, - { 163911, true }, - { 163931, false }, - { 163944, true }, - { 163954, true }, - { 163973, true }, - { 163995, true }, + { 163724, true }, + { 163738, false }, + { 163749, true }, + { 163769, false }, + { 163782, true }, + { 163792, true }, + { 163811, true }, + { 163833, true }, + { 163844, true }, + { 163855, true }, + { 163866, true }, + { 163876, true }, + { 163885, true }, + { 163893, true }, + { 163899, false }, + { 163907, true }, + { 163916, true }, + { 163924, true }, + { 163934, true }, + { 163942, true }, + { 163961, true }, + { 163986, true }, + { 163993, true }, { 164006, true }, - { 164017, true }, - { 164028, true }, - { 164038, true }, - { 164047, true }, - { 164055, true }, - { 164061, false }, - { 164069, true }, - { 164078, true }, + { 164020, true }, + { 164030, true }, + { 164040, true }, + { 164059, true }, + { 164071, true }, { 164086, true }, - { 164096, true }, - { 164104, true }, + { 164098, true }, + { 164111, true }, { 164123, true }, - { 164148, true }, - { 164155, true }, - { 164168, true }, - { 164182, true }, - { 164192, true }, - { 164202, true }, - { 164221, true }, - { 164233, true }, - { 164248, true }, - { 164260, true }, - { 164273, true }, - { 164285, true }, - { 164304, true }, - { 164315, false }, - { 164326, true }, - { 164341, true }, - { 164357, true }, - { 164379, true }, - { 164393, true }, - { 164406, true }, - { 164419, true }, - { 164438, true }, - { 164454, true }, - { 164467, true }, - { 164487, false }, - { 164514, false }, - { 164530, true }, - { 164546, true }, - { 164561, true }, - { 164577, true }, - { 164595, true }, - { 164614, true }, - { 164623, true }, - { 164636, true }, - { 164653, true }, - { 164672, true }, - { 164685, true }, - { 164701, true }, - { 164714, true }, - { 164733, true }, - { 164750, true }, - { 164764, true }, - { 164782, true }, - { 164800, true }, - { 164818, true }, + { 164142, true }, + { 164153, false }, + { 164164, true }, + { 164179, true }, + { 164195, true }, + { 164217, true }, + { 164231, true }, + { 164244, true }, + { 164257, true }, + { 164276, true }, + { 164292, true }, + { 164305, true }, + { 164325, false }, + { 164352, false }, + { 164368, true }, + { 164384, true }, + { 164399, true }, + { 164415, true }, + { 164433, true }, + { 164452, true }, + { 164461, true }, + { 164474, true }, + { 164491, true }, + { 164510, true }, + { 164523, true }, + { 164539, true }, + { 164552, true }, + { 164571, true }, + { 164588, true }, + { 164602, true }, + { 164620, true }, + { 164638, true }, + { 164656, true }, + { 164674, true }, + { 164687, true }, + { 164703, true }, + { 164724, true }, + { 164734, true }, + { 164747, true }, + { 164756, true }, + { 164767, true }, + { 164780, true }, + { 164793, true }, + { 164809, true }, + { 164822, true }, { 164836, true }, - { 164849, true }, + { 164851, true }, { 164865, true }, - { 164886, true }, - { 164896, true }, + { 164880, true }, + { 164892, true }, { 164909, true }, - { 164918, true }, - { 164929, true }, - { 164942, true }, - { 164955, true }, - { 164971, true }, - { 164984, true }, - { 164998, true }, - { 165013, true }, - { 165027, true }, - { 165042, true }, - { 165054, true }, - { 165071, true }, - { 165087, true }, - { 165106, true }, - { 165122, true }, - { 165135, true }, + { 164925, true }, + { 164944, true }, + { 164960, true }, + { 164973, true }, + { 164988, true }, + { 164997, true }, + { 165007, true }, + { 165034, false }, + { 165051, true }, + { 165069, true }, + { 165093, true }, + { 165117, true }, + { 165136, true }, { 165150, true }, - { 165159, true }, + { 165158, true }, { 165169, true }, - { 165196, false }, - { 165213, true }, - { 165231, true }, - { 165255, true }, - { 165279, true }, - { 165298, true }, - { 165312, true }, - { 165320, true }, - { 165331, true }, - { 165359, true }, - { 165373, true }, - { 165385, true }, - { 165394, true }, - { 165404, true }, - { 165424, true }, - { 165438, true }, - { 165451, true }, - { 165471, true }, - { 165489, true }, - { 165501, true }, - { 165516, true }, - { 165531, true }, - { 165546, false }, - { 165563, true }, - { 165575, false }, - { 165598, true }, - { 165615, true }, - { 165628, true }, - { 165639, true }, - { 165662, true }, - { 165680, true }, - { 165701, true }, - { 165723, true }, - { 165744, true }, - { 165765, true }, - { 165775, false }, - { 165789, true }, - { 165806, true }, - { 165823, true }, - { 165833, true }, + { 165197, true }, + { 165211, true }, + { 165223, true }, + { 165232, true }, + { 165242, true }, + { 165262, true }, + { 165276, true }, + { 165289, true }, + { 165309, true }, + { 165327, true }, + { 165339, true }, + { 165354, true }, + { 165369, true }, + { 165380, true }, + { 165395, false }, + { 165412, true }, + { 165424, false }, + { 165447, true }, + { 165464, true }, + { 165477, true }, + { 165488, true }, + { 165511, true }, + { 165529, true }, + { 165550, true }, + { 165572, true }, + { 165593, true }, + { 165614, true }, + { 165624, false }, + { 165638, true }, + { 165655, true }, + { 165672, true }, + { 165682, true }, + { 165695, true }, + { 165710, true }, + { 165728, true }, + { 165745, true }, + { 165761, true }, + { 165798, true }, + { 165817, true }, + { 165831, true }, { 165846, true }, - { 165861, true }, - { 165879, true }, - { 165896, true }, - { 165912, true }, - { 165949, true }, - { 165968, true }, - { 165982, true }, - { 165997, true }, - { 166012, false }, - { 166024, true }, - { 166041, false }, - { 166058, false }, - { 166073, true }, - { 166086, true }, - { 166107, false }, - { 166119, false }, - { 166136, true }, - { 166153, true }, - { 166170, true }, - { 166183, true }, - { 166199, true }, - { 166215, true }, - { 166228, true }, - { 166246, true }, - { 166256, true }, - { 166267, true }, - { 166283, true }, - { 166293, true }, - { 166312, true }, - { 166325, true }, - { 166339, true }, - { 166354, true }, - { 166365, true }, - { 166385, true }, - { 166398, true }, - { 166411, true }, - { 166423, true }, - { 166442, true }, - { 166455, true }, - { 166466, true }, - { 166477, true }, - { 166487, true }, - { 166497, true }, - { 166519, true }, - { 166539, true }, - { 166557, true }, - { 166570, true }, - { 166579, true }, - { 166590, true }, + { 165861, false }, + { 165873, true }, + { 165890, false }, + { 165907, false }, + { 165922, true }, + { 165935, true }, + { 165956, false }, + { 165968, false }, + { 165985, true }, + { 166002, true }, + { 166019, true }, + { 166032, true }, + { 166048, true }, + { 166064, true }, + { 166077, true }, + { 166095, true }, + { 166105, true }, + { 166116, true }, + { 166132, true }, + { 166142, true }, + { 166161, true }, + { 166174, true }, + { 166188, true }, + { 166203, true }, + { 166214, true }, + { 166234, true }, + { 166247, true }, + { 166260, true }, + { 166272, true }, + { 166291, true }, + { 166304, true }, + { 166315, true }, + { 166326, true }, + { 166336, true }, + { 166346, true }, + { 166368, true }, + { 166388, true }, + { 166406, true }, + { 166419, true }, + { 166428, true }, + { 166439, true }, + { 166454, true }, + { 166470, true }, + { 166492, true }, + { 166508, true }, + { 166524, true }, + { 166548, true }, + { 166563, true }, + { 166576, true }, + { 166595, true }, { 166605, true }, - { 166621, true }, - { 166643, true }, - { 166659, true }, - { 166675, true }, - { 166699, true }, - { 166714, true }, - { 166727, true }, - { 166746, true }, - { 166756, true }, - { 166770, true }, - { 166781, true }, - { 166799, true }, - { 166816, true }, - { 166828, true }, + { 166619, true }, + { 166630, true }, + { 166648, true }, + { 166665, true }, + { 166677, true }, + { 166690, true }, + { 166707, true }, + { 166719, true }, + { 166736, true }, + { 166745, true }, + { 166765, true }, + { 166785, true }, + { 166802, true }, + { 166812, true }, + { 166829, true }, { 166841, true }, { 166858, true }, - { 166870, true }, - { 166887, true }, - { 166896, true }, - { 166916, true }, - { 166936, true }, - { 166953, true }, - { 166963, true }, - { 166980, true }, - { 166992, true }, - { 167009, true }, - { 167024, true }, - { 167043, true }, - { 167060, true }, - { 167077, true }, - { 167094, true }, - { 167105, true }, - { 167117, true }, - { 167129, true }, - { 167139, true }, - { 167148, true }, - { 167161, true }, - { 167176, true }, - { 167186, true }, - { 167198, true }, - { 167212, false }, - { 167221, true }, - { 167233, true }, - { 167244, true }, - { 167261, true }, - { 167271, true }, - { 167281, true }, - { 167292, true }, + { 166873, true }, + { 166892, true }, + { 166909, true }, + { 166926, true }, + { 166943, true }, + { 166954, true }, + { 166966, true }, + { 166978, true }, + { 166988, true }, + { 166997, true }, + { 167010, true }, + { 167025, true }, + { 167035, true }, + { 167047, true }, + { 167061, false }, + { 167070, true }, + { 167082, true }, + { 167093, true }, + { 167110, true }, + { 167120, true }, + { 167130, true }, + { 167141, true }, + { 167150, true }, + { 167162, false }, + { 167175, true }, + { 167191, true }, + { 167202, true }, + { 167216, false }, + { 167227, true }, + { 167250, true }, + { 167258, true }, + { 167268, true }, + { 167280, true }, + { 167293, true }, { 167301, true }, - { 167313, false }, - { 167326, true }, - { 167342, true }, - { 167353, true }, - { 167367, false }, - { 167378, true }, - { 167401, true }, - { 167409, true }, - { 167419, true }, - { 167431, true }, - { 167444, true }, - { 167452, true }, - { 167460, true }, - { 167475, true }, - { 167485, true }, - { 167498, true }, - { 167507, true }, - { 167522, true }, - { 167531, true }, - { 167540, true }, - { 167559, true }, - { 167574, true }, - { 167596, true }, - { 167612, false }, - { 167624, true }, - { 167637, true }, - { 167648, true }, - { 167660, true }, - { 167674, true }, - { 167685, true }, - { 167702, true }, - { 167715, true }, - { 167731, true }, - { 167752, true }, - { 167769, true }, - { 167785, true }, - { 167798, true }, - { 167809, true }, - { 167823, true }, - { 167847, true }, - { 167870, true }, - { 167892, true }, - { 167905, false }, - { 167918, true }, - { 167932, true }, - { 167946, false }, - { 167967, true }, - { 167977, true }, - { 167989, true }, - { 168015, true }, - { 168028, true }, - { 168042, true }, - { 168059, true }, - { 168078, true }, - { 168095, true }, - { 168113, true }, - { 168134, true }, - { 168148, true }, - { 168170, true }, - { 168189, true }, - { 168201, true }, - { 168225, true }, - { 168235, true }, - { 168248, true }, - { 168263, true }, - { 168280, true }, + { 167309, true }, + { 167324, true }, + { 167334, true }, + { 167347, true }, + { 167356, true }, + { 167371, true }, + { 167380, true }, + { 167389, true }, + { 167408, true }, + { 167423, true }, + { 167445, true }, + { 167461, false }, + { 167473, true }, + { 167486, true }, + { 167497, true }, + { 167509, true }, + { 167523, true }, + { 167534, true }, + { 167551, true }, + { 167564, true }, + { 167580, true }, + { 167601, true }, + { 167618, true }, + { 167634, true }, + { 167647, true }, + { 167658, true }, + { 167672, true }, + { 167696, true }, + { 167719, true }, + { 167741, true }, + { 167754, false }, + { 167767, true }, + { 167781, true }, + { 167795, false }, + { 167816, true }, + { 167826, true }, + { 167838, true }, + { 167864, true }, + { 167877, true }, + { 167891, true }, + { 167908, true }, + { 167927, true }, + { 167944, true }, + { 167962, true }, + { 167983, true }, + { 167997, true }, + { 168019, true }, + { 168038, true }, + { 168050, true }, + { 168074, true }, + { 168084, true }, + { 168097, true }, + { 168112, true }, + { 168129, true }, + { 168145, true }, + { 168163, true }, + { 168180, true }, + { 168195, true }, + { 168211, true }, + { 168238, true }, + { 168252, true }, + { 168268, true }, + { 168283, true }, { 168296, true }, - { 168314, true }, - { 168331, true }, - { 168346, true }, - { 168362, true }, + { 168305, true }, + { 168321, true }, + { 168336, true }, + { 168349, true }, + { 168360, true }, + { 168372, true }, { 168389, true }, - { 168403, true }, - { 168419, true }, - { 168434, true }, + { 168400, true }, + { 168423, true }, + { 168433, true }, { 168447, true }, { 168456, true }, - { 168472, true }, - { 168487, true }, - { 168500, true }, - { 168511, true }, - { 168523, true }, - { 168540, true }, - { 168551, true }, - { 168574, true }, - { 168584, true }, - { 168598, true }, - { 168607, true }, - { 168614, false }, - { 168634, true }, - { 168645, true }, - { 168659, true }, - { 168672, false }, - { 168686, true }, + { 168463, false }, + { 168483, true }, + { 168494, true }, + { 168508, true }, + { 168521, false }, + { 168535, true }, + { 168543, true }, + { 168554, true }, + { 168572, true }, + { 168582, true }, + { 168592, true }, + { 168603, true }, + { 168628, true }, + { 168642, true }, + { 168653, true }, + { 168664, true }, + { 168679, true }, { 168694, true }, - { 168705, true }, - { 168723, true }, - { 168733, true }, - { 168743, true }, - { 168754, true }, - { 168779, true }, - { 168793, true }, - { 168804, true }, - { 168815, true }, - { 168830, true }, - { 168845, true }, - { 168861, false }, - { 168872, true }, - { 168887, true }, - { 168902, false }, - { 168921, true }, - { 168932, true }, - { 168942, true }, - { 168962, true }, - { 168976, true }, - { 168990, true }, - { 169001, true }, - { 169008, true }, - { 169021, true }, - { 169034, false }, - { 169044, true }, - { 169053, true }, - { 169063, true }, - { 169074, true }, - { 169086, true }, - { 169094, true }, - { 169104, true }, - { 169121, true }, - { 169138, false }, - { 169147, true }, - { 169166, true }, - { 169177, true }, - { 169196, false }, - { 169207, true }, - { 169224, true }, - { 169241, true }, - { 169254, true }, - { 169270, true }, - { 169281, true }, - { 169292, true }, - { 169309, true }, - { 169326, false }, - { 169334, true }, - { 169343, false }, - { 169356, true }, - { 169367, true }, - { 169374, true }, - { 169388, true }, - { 169402, true }, - { 169422, false }, - { 169434, false }, - { 169450, true }, - { 169462, true }, - { 169481, true }, - { 169505, true }, - { 169513, true }, - { 169530, true }, - { 169546, true }, - { 169562, true }, - { 169571, true }, - { 169583, true }, - { 169596, true }, - { 169610, true }, - { 169626, false }, - { 169641, true }, + { 168710, false }, + { 168721, true }, + { 168736, true }, + { 168751, false }, + { 168770, true }, + { 168781, true }, + { 168791, true }, + { 168811, true }, + { 168825, true }, + { 168839, true }, + { 168850, true }, + { 168857, true }, + { 168870, true }, + { 168883, false }, + { 168893, true }, + { 168902, true }, + { 168912, true }, + { 168923, true }, + { 168935, true }, + { 168943, true }, + { 168953, true }, + { 168970, true }, + { 168987, false }, + { 168996, true }, + { 169015, true }, + { 169026, true }, + { 169045, false }, + { 169056, true }, + { 169073, true }, + { 169090, true }, + { 169103, true }, + { 169119, true }, + { 169130, true }, + { 169141, true }, + { 169158, true }, + { 169175, false }, + { 169183, true }, + { 169192, false }, + { 169205, true }, + { 169216, true }, + { 169223, true }, + { 169237, true }, + { 169251, true }, + { 169271, false }, + { 169283, false }, + { 169299, true }, + { 169311, true }, + { 169330, true }, + { 169354, true }, + { 169362, true }, + { 169379, true }, + { 169395, true }, + { 169411, true }, + { 169420, true }, + { 169432, true }, + { 169445, true }, + { 169459, true }, + { 169475, false }, + { 169490, true }, + { 169499, true }, + { 169519, true }, + { 169527, true }, + { 169541, true }, + { 169554, true }, + { 169565, true }, + { 169575, false }, + { 169585, true }, + { 169599, true }, + { 169611, true }, + { 169621, false }, + { 169634, true }, { 169650, true }, - { 169670, true }, - { 169678, true }, - { 169692, true }, - { 169705, true }, - { 169716, true }, - { 169726, false }, + { 169672, true }, + { 169689, true }, + { 169698, true }, + { 169707, true }, + { 169722, true }, { 169736, true }, - { 169750, true }, - { 169762, true }, - { 169772, false }, - { 169785, true }, - { 169801, true }, - { 169823, true }, - { 169840, true }, - { 169849, true }, - { 169858, true }, - { 169873, true }, - { 169887, true }, - { 169897, true }, - { 169907, true }, - { 169928, true }, - { 169943, true }, - { 169957, true }, - { 169977, true }, - { 169989, false }, - { 170005, true }, - { 170020, true }, - { 170035, true }, - { 170049, true }, - { 170062, true }, - { 170073, true }, - { 170083, false }, - { 170102, false }, - { 170114, true }, - { 170130, true }, - { 170158, true }, - { 170190, true }, - { 170205, true }, - { 170217, true }, - { 170226, true }, - { 170240, false }, - { 170253, true }, - { 170271, true }, - { 170279, true }, - { 170293, true }, - { 170307, true }, + { 169746, true }, + { 169756, true }, + { 169777, true }, + { 169792, true }, + { 169806, true }, + { 169826, true }, + { 169838, false }, + { 169854, true }, + { 169869, true }, + { 169884, true }, + { 169898, true }, + { 169911, true }, + { 169922, true }, + { 169932, false }, + { 169951, false }, + { 169963, true }, + { 169979, true }, + { 170007, true }, + { 170039, true }, + { 170054, true }, + { 170066, true }, + { 170075, true }, + { 170089, false }, + { 170102, true }, + { 170120, true }, + { 170128, true }, + { 170142, true }, + { 170156, true }, + { 170168, true }, + { 170189, true }, + { 170204, true }, + { 170220, false }, + { 170228, false }, + { 170240, true }, + { 170249, true }, + { 170259, true }, + { 170270, true }, + { 170282, true }, + { 170298, true }, + { 170308, true }, { 170319, true }, - { 170340, true }, - { 170355, true }, - { 170371, false }, - { 170379, false }, - { 170391, true }, - { 170400, true }, - { 170410, true }, - { 170421, true }, - { 170433, true }, - { 170449, true }, - { 170459, true }, - { 170470, true }, - { 170481, true }, - { 170493, true }, - { 170503, true }, - { 170512, true }, - { 170531, true }, - { 170559, true }, - { 170575, true }, - { 170586, true }, - { 170601, true }, - { 170614, false }, - { 170630, true }, - { 170646, true }, - { 170659, true }, - { 170677, true }, - { 170695, true }, - { 170709, true }, - { 170721, true }, - { 170736, true }, - { 170756, true }, - { 170775, true }, + { 170330, true }, + { 170342, true }, + { 170352, true }, + { 170361, true }, + { 170380, true }, + { 170408, true }, + { 170424, true }, + { 170435, true }, + { 170450, true }, + { 170463, false }, + { 170479, true }, + { 170495, true }, + { 170508, true }, + { 170526, true }, + { 170544, true }, + { 170558, true }, + { 170570, true }, + { 170585, true }, + { 170605, true }, + { 170624, true }, + { 170643, true }, + { 170656, true }, + { 170672, true }, + { 170685, true }, + { 170700, true }, + { 170716, true }, + { 170733, true }, + { 170749, true }, + { 170766, true }, + { 170779, true }, { 170794, true }, - { 170807, true }, - { 170823, true }, - { 170836, true }, - { 170851, true }, - { 170867, true }, - { 170884, true }, - { 170900, true }, - { 170917, true }, - { 170930, true }, - { 170945, true }, - { 170964, true }, - { 170977, true }, - { 170993, true }, - { 171004, true }, - { 171017, true }, - { 171031, true }, - { 171045, false }, - { 171061, true }, - { 171080, true }, - { 171100, true }, - { 171120, false }, - { 171136, true }, - { 171152, true }, - { 171167, true }, - { 171188, true }, - { 171206, false }, - { 171225, true }, - { 171236, true }, - { 171252, true }, - { 171266, true }, - { 171279, true }, - { 171292, true }, - { 171305, true }, - { 171321, true }, - { 171332, true }, - { 171341, true }, - { 171351, true }, - { 171362, true }, - { 171374, true }, - { 171388, true }, - { 171397, true }, - { 171410, true }, - { 171429, true }, - { 171446, false }, - { 171461, false }, - { 171477, false }, - { 171489, true }, + { 170813, true }, + { 170826, true }, + { 170842, true }, + { 170853, true }, + { 170866, true }, + { 170880, true }, + { 170894, false }, + { 170910, true }, + { 170929, true }, + { 170949, true }, + { 170969, false }, + { 170985, true }, + { 171001, true }, + { 171016, true }, + { 171037, true }, + { 171055, false }, + { 171074, true }, + { 171085, true }, + { 171101, true }, + { 171115, true }, + { 171128, true }, + { 171141, true }, + { 171154, true }, + { 171170, true }, + { 171181, true }, + { 171190, true }, + { 171200, true }, + { 171211, true }, + { 171223, true }, + { 171237, true }, + { 171246, true }, + { 171259, true }, + { 171278, true }, + { 171295, false }, + { 171310, false }, + { 171326, false }, + { 171338, true }, + { 171358, true }, + { 171371, true }, + { 171391, true }, + { 171413, true }, + { 171436, true }, + { 171454, true }, + { 171470, true }, + { 171483, true }, + { 171495, true }, { 171509, true }, - { 171522, true }, - { 171542, true }, - { 171564, true }, - { 171587, true }, + { 171518, true }, + { 171532, true }, + { 171540, true }, + { 171558, true }, + { 171568, true }, + { 171588, true }, { 171605, true }, - { 171621, true }, - { 171634, true }, - { 171646, true }, - { 171660, true }, - { 171669, true }, - { 171683, true }, - { 171691, true }, - { 171709, true }, - { 171719, true }, - { 171739, true }, - { 171756, true }, - { 171776, true }, - { 171787, true }, - { 171800, true }, - { 171815, true }, - { 171827, true }, - { 171843, true }, - { 171856, true }, - { 171873, true }, - { 171894, true }, - { 171902, true }, - { 171912, true }, - { 171935, true }, - { 171944, true }, - { 171954, true }, - { 171967, true }, - { 171977, true }, - { 171990, true }, - { 172011, false }, - { 172021, true }, - { 172035, true }, - { 172055, true }, - { 172068, true }, - { 172088, false }, - { 172111, true }, - { 172124, true }, - { 172135, true }, - { 172146, true }, - { 172156, true }, - { 172181, true }, - { 172191, true }, - { 172205, true }, - { 172219, false }, + { 171625, true }, + { 171636, true }, + { 171649, true }, + { 171664, true }, + { 171676, true }, + { 171692, true }, + { 171705, true }, + { 171722, true }, + { 171743, true }, + { 171751, true }, + { 171761, true }, + { 171784, true }, + { 171793, true }, + { 171803, true }, + { 171816, true }, + { 171826, true }, + { 171839, true }, + { 171860, false }, + { 171870, true }, + { 171884, true }, + { 171904, true }, + { 171917, true }, + { 171937, false }, + { 171960, true }, + { 171973, true }, + { 171984, true }, + { 171995, true }, + { 172005, true }, + { 172030, true }, + { 172040, true }, + { 172054, true }, + { 172068, false }, + { 172083, true }, + { 172097, true }, + { 172122, true }, + { 172136, true }, + { 172148, true }, + { 172162, true }, + { 172172, false }, + { 172192, true }, + { 172206, true }, + { 172219, true }, { 172234, true }, - { 172248, true }, - { 172273, true }, - { 172287, true }, - { 172299, true }, - { 172313, true }, - { 172323, false }, - { 172343, true }, + { 172244, true }, + { 172258, true }, + { 172267, true }, + { 172278, true }, + { 172289, true }, + { 172300, true }, + { 172310, false }, + { 172330, true }, + { 172345, true }, { 172357, true }, - { 172370, true }, - { 172385, true }, - { 172395, true }, - { 172409, true }, + { 172369, true }, + { 172388, true }, + { 172408, true }, { 172418, true }, - { 172429, true }, - { 172440, true }, - { 172451, true }, - { 172461, false }, - { 172481, true }, - { 172496, true }, - { 172508, true }, - { 172520, true }, + { 172432, true }, + { 172449, true }, + { 172464, true }, + { 172472, true }, + { 172493, false }, + { 172511, true }, + { 172523, true }, { 172539, true }, - { 172559, true }, - { 172569, true }, - { 172583, true }, - { 172600, true }, - { 172615, true }, - { 172623, true }, - { 172644, false }, - { 172662, true }, - { 172674, true }, - { 172690, true }, - { 172705, true }, - { 172716, true }, - { 172738, true }, - { 172753, true }, - { 172767, true }, - { 172788, true }, + { 172554, true }, + { 172565, true }, + { 172587, true }, + { 172602, true }, + { 172616, true }, + { 172637, true }, + { 172651, true }, + { 172668, true }, + { 172687, true }, + { 172706, true }, + { 172719, true }, + { 172739, true }, + { 172755, true }, + { 172781, true }, { 172802, true }, - { 172819, true }, - { 172838, true }, - { 172857, true }, - { 172870, true }, - { 172890, true }, - { 172906, true }, - { 172932, true }, - { 172953, true }, - { 172971, true }, - { 172990, true }, - { 173014, true }, - { 173030, true }, - { 173055, true }, - { 173081, true }, - { 173092, true }, - { 173116, true }, - { 173142, true }, - { 173164, true }, - { 173185, false }, - { 173202, true }, - { 173219, true }, + { 172820, true }, + { 172839, true }, + { 172863, true }, + { 172879, true }, + { 172904, true }, + { 172930, true }, + { 172941, true }, + { 172965, true }, + { 172991, true }, + { 173013, true }, + { 173034, true }, + { 173051, true }, + { 173069, true }, + { 173079, true }, + { 173095, false }, + { 173113, false }, + { 173132, true }, + { 173154, true }, + { 173177, true }, + { 173196, true }, + { 173214, true }, { 173237, true }, - { 173247, true }, - { 173263, false }, - { 173281, false }, + { 173250, true }, + { 173266, true }, + { 173284, true }, { 173300, true }, - { 173322, true }, - { 173345, true }, + { 173314, true }, + { 173332, true }, + { 173347, true }, { 173364, true }, - { 173382, true }, - { 173405, true }, - { 173418, true }, - { 173434, true }, - { 173452, true }, - { 173468, true }, - { 173482, true }, - { 173500, true }, - { 173515, true }, - { 173532, true }, - { 173546, true }, - { 173560, false }, - { 173577, true }, - { 173595, true }, - { 173611, true }, - { 173627, true }, - { 173640, true }, - { 173660, true }, - { 173678, true }, - { 173697, true }, - { 173710, true }, - { 173746, true }, - { 173769, true }, + { 173378, true }, + { 173392, false }, + { 173409, true }, + { 173427, true }, + { 173443, true }, + { 173459, true }, + { 173472, true }, + { 173492, true }, + { 173510, true }, + { 173529, true }, + { 173542, true }, + { 173578, true }, + { 173601, true }, + { 173616, true }, + { 173632, true }, + { 173643, true }, + { 173661, true }, + { 173691, true }, + { 173707, true }, + { 173722, true }, + { 173737, true }, + { 173748, true }, + { 173762, true }, { 173784, true }, - { 173800, true }, - { 173811, true }, - { 173829, true }, - { 173859, true }, - { 173875, true }, - { 173890, true }, - { 173905, true }, - { 173916, true }, - { 173930, true }, - { 173952, true }, - { 173967, true }, - { 173980, true }, - { 174003, true }, - { 174012, true }, - { 174034, true }, + { 173799, true }, + { 173812, true }, + { 173835, true }, + { 173844, true }, + { 173866, true }, + { 173885, true }, + { 173909, true }, + { 173935, true }, + { 173946, true }, + { 173963, true }, + { 173981, true }, + { 173994, true }, + { 174010, true }, + { 174029, true }, { 174053, true }, - { 174077, true }, - { 174103, true }, - { 174114, true }, + { 174066, true }, + { 174083, true }, + { 174094, true }, + { 174109, true }, { 174131, true }, - { 174149, true }, - { 174162, true }, - { 174178, true }, - { 174197, true }, - { 174221, true }, - { 174234, true }, - { 174251, true }, + { 174150, true }, + { 174167, false }, + { 174182, true }, + { 174200, true }, + { 174222, true }, + { 174238, true }, + { 174250, true }, { 174262, true }, - { 174277, true }, - { 174299, true }, - { 174318, true }, - { 174335, false }, - { 174350, true }, - { 174368, true }, - { 174390, true }, - { 174406, true }, - { 174418, true }, - { 174430, true }, - { 174442, true }, - { 174458, true }, - { 174477, true }, - { 174493, true }, - { 174512, true }, - { 174542, false }, - { 174556, true }, - { 174573, true }, - { 174594, true }, - { 174614, true }, - { 174628, true }, - { 174646, true }, - { 174662, true }, - { 174672, true }, - { 174683, true }, - { 174695, true }, + { 174274, true }, + { 174290, true }, + { 174309, true }, + { 174325, true }, + { 174344, true }, + { 174374, false }, + { 174388, true }, + { 174405, true }, + { 174426, true }, + { 174446, true }, + { 174460, true }, + { 174478, true }, + { 174494, true }, + { 174504, true }, + { 174515, true }, + { 174527, true }, + { 174546, true }, + { 174562, true }, + { 174582, true }, + { 174596, true }, + { 174609, true }, + { 174625, true }, + { 174636, true }, + { 174657, true }, + { 174685, true }, + { 174701, true }, { 174714, true }, - { 174730, true }, - { 174750, true }, - { 174764, true }, - { 174777, true }, - { 174793, true }, - { 174804, true }, - { 174825, true }, - { 174853, true }, - { 174869, true }, - { 174882, true }, - { 174907, true }, - { 174924, false }, - { 174939, true }, + { 174739, true }, + { 174756, false }, + { 174771, true }, + { 174796, true }, + { 174805, true }, + { 174815, true }, + { 174827, true }, + { 174846, true }, + { 174863, true }, + { 174880, true }, + { 174896, false }, + { 174914, false }, + { 174934, true }, + { 174951, true }, { 174964, true }, - { 174973, true }, - { 174983, true }, - { 174995, true }, - { 175012, true }, - { 175029, true }, - { 175045, false }, - { 175063, false }, - { 175083, true }, - { 175100, true }, - { 175113, true }, - { 175133, true }, - { 175157, true }, - { 175175, true }, - { 175196, true }, - { 175211, true }, - { 175226, true }, - { 175238, true }, - { 175263, true }, - { 175276, true }, + { 174984, true }, + { 175008, true }, + { 175026, true }, + { 175047, true }, + { 175062, true }, + { 175077, true }, + { 175089, true }, + { 175114, true }, + { 175127, true }, + { 175149, true }, + { 175159, true }, + { 175176, true }, + { 175189, true }, + { 175203, true }, + { 175236, true }, + { 175251, true }, + { 175265, true }, + { 175274, true }, + { 175288, true }, { 175298, true }, - { 175308, true }, - { 175325, true }, - { 175338, true }, - { 175352, true }, - { 175385, true }, + { 175309, false }, + { 175323, true }, + { 175332, true }, + { 175343, true }, + { 175354, true }, + { 175372, true }, + { 175387, true }, { 175400, true }, - { 175414, true }, + { 175410, true }, { 175423, true }, - { 175437, true }, - { 175447, true }, - { 175458, false }, - { 175472, true }, - { 175481, true }, - { 175492, true }, - { 175510, true }, - { 175525, true }, - { 175538, true }, + { 175442, true }, + { 175462, true }, + { 175477, true }, + { 175484, true }, + { 175500, true }, + { 175518, true }, + { 175539, true }, { 175551, true }, - { 175570, true }, - { 175590, true }, - { 175605, true }, - { 175612, true }, - { 175628, true }, - { 175646, true }, - { 175667, true }, - { 175679, true }, - { 175709, true }, - { 175722, true }, - { 175732, true }, - { 175744, true }, - { 175758, true }, - { 175772, true }, - { 175783, true }, - { 175797, true }, - { 175816, true }, - { 175831, true }, - { 175843, true }, - { 175854, true }, - { 175869, true }, - { 175881, true }, - { 175897, true }, + { 175581, true }, + { 175594, true }, + { 175604, true }, + { 175616, true }, + { 175630, true }, + { 175644, true }, + { 175655, true }, + { 175669, true }, + { 175688, true }, + { 175703, true }, + { 175715, true }, + { 175726, true }, + { 175741, true }, + { 175753, true }, + { 175769, true }, + { 175784, true }, + { 175800, true }, + { 175809, true }, + { 175823, true }, + { 175834, false }, + { 175849, true }, + { 175863, true }, + { 175879, true }, + { 175892, true }, { 175912, true }, - { 175928, true }, - { 175937, true }, - { 175951, true }, - { 175962, false }, - { 175977, true }, - { 175991, true }, - { 176007, true }, - { 176020, true }, - { 176040, true }, - { 176053, false }, - { 176073, true }, - { 176087, true }, + { 175925, false }, + { 175945, true }, + { 175959, true }, + { 175970, true }, + { 175987, true }, + { 176001, true }, + { 176013, true }, + { 176027, true }, + { 176039, true }, + { 176051, true }, + { 176063, true }, + { 176075, true }, + { 176085, true }, { 176098, true }, { 176115, true }, - { 176129, true }, - { 176141, true }, + { 176142, true }, { 176155, true }, - { 176167, true }, - { 176179, true }, - { 176191, true }, - { 176203, true }, - { 176213, true }, - { 176226, true }, - { 176243, true }, - { 176270, true }, - { 176283, true }, - { 176301, true }, - { 176309, true }, - { 176321, true }, - { 176334, true }, - { 176361, true }, - { 176379, true }, - { 176386, true }, - { 176394, true }, - { 176404, true }, + { 176173, true }, + { 176181, true }, + { 176193, true }, + { 176206, true }, + { 176233, true }, + { 176251, true }, + { 176258, true }, + { 176266, true }, + { 176276, true }, + { 176285, true }, + { 176293, true }, + { 176306, true }, + { 176315, true }, + { 176322, true }, + { 176338, true }, + { 176355, true }, + { 176362, true }, + { 176376, true }, + { 176393, true }, + { 176405, true }, { 176413, true }, - { 176422, true }, - { 176430, true }, - { 176443, true }, + { 176420, true }, + { 176429, true }, + { 176438, true }, { 176452, true }, - { 176459, true }, - { 176475, true }, - { 176492, true }, - { 176499, true }, - { 176513, true }, - { 176530, true }, - { 176542, true }, - { 176550, true }, - { 176557, true }, - { 176566, true }, - { 176575, true }, - { 176589, true }, - { 176605, true }, - { 176621, true }, - { 176640, true }, - { 176658, true }, - { 176673, true }, - { 176691, true }, - { 176701, true }, - { 176713, true }, - { 176732, true }, - { 176747, true }, - { 176759, true }, - { 176767, false }, - { 176792, true }, - { 176802, true }, - { 176817, true }, - { 176829, true }, - { 176843, true }, - { 176852, false }, + { 176468, true }, + { 176484, true }, + { 176503, true }, + { 176521, true }, + { 176536, true }, + { 176554, true }, + { 176564, true }, + { 176576, true }, + { 176595, true }, + { 176610, true }, + { 176625, true }, + { 176637, true }, + { 176645, false }, + { 176670, true }, + { 176680, true }, + { 176695, true }, + { 176707, true }, + { 176721, true }, + { 176730, false }, + { 176742, true }, + { 176755, false }, + { 176788, true }, + { 176803, true }, + { 176826, true }, + { 176839, true }, + { 176850, true }, { 176864, true }, - { 176877, false }, - { 176910, true }, - { 176925, true }, - { 176948, true }, - { 176961, true }, - { 176972, true }, - { 176986, true }, - { 177006, true }, - { 177019, true }, - { 177033, true }, - { 177051, true }, + { 176884, true }, + { 176897, true }, + { 176911, true }, + { 176929, true }, + { 176943, true }, + { 176955, true }, + { 176970, true }, + { 176992, true }, + { 177002, true }, + { 177014, true }, + { 177030, true }, + { 177042, true }, + { 177052, true }, { 177065, true }, - { 177077, true }, - { 177092, true }, - { 177114, true }, - { 177124, true }, - { 177136, true }, - { 177152, true }, - { 177164, true }, - { 177174, true }, - { 177187, true }, - { 177196, true }, - { 177204, false }, - { 177212, true }, - { 177223, true }, - { 177239, true }, - { 177250, true }, - { 177263, true }, - { 177275, false }, - { 177289, true }, - { 177302, true }, - { 177313, true }, - { 177323, true }, - { 177337, true }, - { 177356, true }, - { 177367, true }, - { 177381, true }, - { 177392, true }, - { 177403, true }, - { 177414, true }, - { 177425, true }, - { 177436, true }, - { 177450, true }, - { 177462, true }, - { 177477, true }, - { 177491, true }, - { 177506, true }, - { 177519, true }, + { 177074, true }, + { 177082, false }, + { 177090, true }, + { 177101, true }, + { 177117, true }, + { 177128, true }, + { 177141, true }, + { 177153, false }, + { 177167, true }, + { 177180, true }, + { 177191, true }, + { 177201, true }, + { 177215, true }, + { 177234, true }, + { 177245, true }, + { 177259, true }, + { 177270, true }, + { 177281, true }, + { 177292, true }, + { 177303, true }, + { 177314, true }, + { 177328, true }, + { 177340, true }, + { 177355, true }, + { 177369, true }, + { 177384, true }, + { 177397, true }, + { 177413, true }, + { 177422, true }, + { 177431, true }, + { 177445, true }, + { 177456, true }, + { 177467, false }, + { 177483, true }, + { 177494, true }, + { 177505, true }, + { 177521, false }, { 177535, true }, { 177544, true }, - { 177553, true }, + { 177557, true }, { 177567, true }, - { 177578, true }, - { 177589, false }, - { 177605, true }, - { 177616, true }, - { 177627, true }, - { 177643, false }, - { 177657, true }, - { 177666, true }, + { 177581, true }, + { 177591, true }, + { 177604, true }, + { 177618, true }, + { 177632, true }, + { 177653, true }, + { 177667, true }, { 177679, true }, - { 177689, true }, - { 177703, true }, + { 177694, false }, { 177713, true }, - { 177726, true }, - { 177740, true }, + { 177723, true }, + { 177735, true }, { 177754, true }, - { 177775, true }, - { 177789, true }, - { 177801, true }, - { 177816, false }, - { 177835, true }, - { 177845, true }, - { 177857, true }, - { 177876, true }, - { 177885, false }, - { 177900, true }, - { 177916, false }, - { 177928, true }, - { 177954, true }, - { 177965, true }, - { 177986, true }, - { 178001, true }, - { 178019, true }, - { 178036, true }, - { 178051, true }, - { 178071, true }, - { 178082, true }, - { 178094, true }, - { 178105, true }, - { 178118, true }, - { 178136, true }, - { 178156, true }, - { 178175, true }, + { 177763, false }, + { 177778, true }, + { 177794, false }, + { 177806, true }, + { 177832, true }, + { 177843, true }, + { 177864, true }, + { 177879, true }, + { 177897, true }, + { 177914, true }, + { 177929, true }, + { 177949, true }, + { 177960, true }, + { 177972, true }, + { 177983, true }, + { 177996, true }, + { 178014, true }, + { 178034, true }, + { 178053, true }, + { 178072, true }, + { 178093, true }, + { 178102, true }, + { 178126, false }, + { 178145, true }, + { 178159, true }, + { 178177, true }, { 178194, true }, - { 178215, true }, - { 178224, true }, - { 178248, false }, - { 178267, true }, - { 178281, true }, - { 178299, true }, - { 178316, true }, - { 178336, true }, + { 178214, true }, + { 178228, true }, + { 178238, true }, + { 178251, true }, + { 178272, true }, + { 178284, true }, + { 178295, true }, + { 178310, true }, + { 178331, true }, { 178350, true }, - { 178360, true }, - { 178373, true }, - { 178394, true }, - { 178406, true }, - { 178417, true }, - { 178432, true }, - { 178453, true }, - { 178472, true }, - { 178501, true }, - { 178508, true }, - { 178520, true }, - { 178535, true }, - { 178551, true }, - { 178568, true }, - { 178590, true }, - { 178600, true }, - { 178612, true }, - { 178624, true }, - { 178641, false }, - { 178654, false }, - { 178674, true }, - { 178684, true }, - { 178696, true }, - { 178713, true }, - { 178729, true }, - { 178744, true }, - { 178757, true }, - { 178772, true }, - { 178785, true }, - { 178801, true }, - { 178819, true }, - { 178831, true }, - { 178845, true }, - { 178858, true }, - { 178869, false }, - { 178889, true }, - { 178908, true }, + { 178379, true }, + { 178386, true }, + { 178398, true }, + { 178413, true }, + { 178429, true }, + { 178446, true }, + { 178468, true }, + { 178478, true }, + { 178490, true }, + { 178502, true }, + { 178519, false }, + { 178532, false }, + { 178552, true }, + { 178562, true }, + { 178574, true }, + { 178591, true }, + { 178607, true }, + { 178622, true }, + { 178635, true }, + { 178650, true }, + { 178663, true }, + { 178679, true }, + { 178697, true }, + { 178709, true }, + { 178723, true }, + { 178736, true }, + { 178747, false }, + { 178767, true }, + { 178786, true }, + { 178805, true }, + { 178815, true }, + { 178827, true }, + { 178847, true }, + { 178860, true }, + { 178873, true }, + { 178886, true }, + { 178899, true }, + { 178912, true }, { 178927, true }, { 178937, true }, - { 178949, true }, - { 178969, true }, - { 178982, true }, - { 178995, true }, - { 179008, true }, - { 179021, true }, - { 179034, true }, - { 179049, true }, - { 179059, true }, - { 179072, true }, - { 179090, true }, + { 178950, true }, + { 178968, true }, + { 178986, true }, + { 179005, true }, + { 179018, true }, + { 179036, true }, + { 179058, true }, + { 179071, true }, + { 179088, true }, { 179108, true }, - { 179127, true }, - { 179140, true }, - { 179158, true }, - { 179180, true }, - { 179193, true }, - { 179210, true }, - { 179230, true }, - { 179246, true }, - { 179274, true }, - { 179299, true }, - { 179331, true }, - { 179350, true }, - { 179365, true }, - { 179385, true }, - { 179398, true }, - { 179414, true }, - { 179431, true }, - { 179448, true }, - { 179460, true }, - { 179473, true }, - { 179486, true }, - { 179508, true }, - { 179526, true }, - { 179540, true }, - { 179561, true }, - { 179573, true }, - { 179588, true }, - { 179605, true }, - { 179617, true }, - { 179632, true }, - { 179643, true }, - { 179657, true }, - { 179676, true }, - { 179693, true }, - { 179703, true }, - { 179715, true }, - { 179735, true }, - { 179749, true }, + { 179124, true }, + { 179152, true }, + { 179177, true }, + { 179209, true }, + { 179228, true }, + { 179243, true }, + { 179263, true }, + { 179276, true }, + { 179292, true }, + { 179309, true }, + { 179326, true }, + { 179338, true }, + { 179351, true }, + { 179364, true }, + { 179386, true }, + { 179404, true }, + { 179418, true }, + { 179439, true }, + { 179451, true }, + { 179466, true }, + { 179483, true }, + { 179495, true }, + { 179510, true }, + { 179521, true }, + { 179535, true }, + { 179554, true }, + { 179571, true }, + { 179581, true }, + { 179593, true }, + { 179613, true }, + { 179627, true }, + { 179637, true }, + { 179650, true }, + { 179669, true }, + { 179683, true }, + { 179697, true }, + { 179711, true }, + { 179721, true }, + { 179733, true }, + { 179751, false }, { 179759, true }, - { 179772, true }, - { 179791, true }, - { 179805, true }, - { 179819, true }, - { 179833, true }, - { 179843, true }, + { 179775, true }, + { 179787, true }, + { 179799, true }, + { 179810, true }, + { 179822, true }, + { 179831, true }, + { 179841, true }, { 179855, true }, - { 179873, true }, - { 179889, true }, - { 179901, true }, - { 179913, true }, - { 179924, true }, + { 179869, true }, + { 179883, true }, + { 179894, true }, + { 179902, true }, + { 179918, true }, { 179936, true }, - { 179945, true }, - { 179955, true }, + { 179956, true }, { 179969, true }, - { 179983, true }, - { 179997, true }, - { 180008, true }, - { 180016, true }, - { 180032, true }, - { 180050, true }, - { 180070, true }, - { 180083, true }, - { 180104, true }, - { 180115, true }, - { 180130, false }, - { 180148, false }, - { 180169, true }, - { 180178, true }, - { 180201, true }, - { 180224, true }, - { 180241, true }, - { 180253, true }, + { 179990, true }, + { 180001, true }, + { 180016, false }, + { 180034, false }, + { 180055, true }, + { 180064, true }, + { 180087, true }, + { 180110, true }, + { 180127, true }, + { 180139, true }, + { 180160, true }, + { 180177, true }, + { 180197, true }, + { 180210, true }, + { 180223, true }, + { 180237, true }, + { 180259, true }, { 180274, true }, { 180291, true }, - { 180311, true }, - { 180324, true }, - { 180337, true }, - { 180351, true }, - { 180373, true }, - { 180388, true }, - { 180405, true }, - { 180422, true }, - { 180442, true }, - { 180467, true }, - { 180492, true }, - { 180518, true }, - { 180534, true }, + { 180308, true }, + { 180328, true }, + { 180353, true }, + { 180378, true }, + { 180404, true }, + { 180420, true }, + { 180431, true }, + { 180446, true }, + { 180455, true }, + { 180466, true }, + { 180480, true }, + { 180489, true }, + { 180511, true }, + { 180523, true }, + { 180531, true }, { 180545, true }, - { 180560, true }, - { 180569, true }, + { 180553, true }, + { 180563, true }, + { 180570, true }, { 180580, true }, - { 180594, true }, - { 180603, true }, - { 180625, true }, - { 180637, true }, - { 180645, true }, - { 180659, true }, - { 180667, true }, - { 180677, true }, - { 180684, true }, - { 180694, true }, - { 180701, true }, - { 180713, true }, - { 180723, true }, - { 180736, true }, - { 180746, true }, - { 180757, true }, + { 180587, true }, + { 180599, true }, + { 180609, true }, + { 180622, true }, + { 180632, true }, + { 180643, true }, + { 180654, true }, + { 180662, true }, + { 180674, true }, + { 180685, true }, + { 180699, true }, + { 180712, true }, + { 180738, false }, + { 180752, true }, { 180768, true }, - { 180776, true }, - { 180788, true }, - { 180799, true }, - { 180813, true }, - { 180826, true }, - { 180852, false }, - { 180866, true }, - { 180882, true }, - { 180898, true }, - { 180911, true }, - { 180923, true }, - { 180935, true }, - { 180956, true }, - { 180968, true }, - { 180978, true }, - { 181000, true }, - { 181017, true }, - { 181030, true }, - { 181041, false }, - { 181052, true }, - { 181062, true }, - { 181074, true }, - { 181088, true }, - { 181099, false }, - { 181112, false }, - { 181132, true }, - { 181142, true }, - { 181150, false }, - { 181159, true }, - { 181172, true }, - { 181218, true }, - { 181265, true }, - { 181278, true }, - { 181291, true }, - { 181314, true }, - { 181330, true }, - { 181343, true }, - { 181359, true }, - { 181369, false }, - { 181381, true }, - { 181398, true }, - { 181416, true }, + { 180784, true }, + { 180797, true }, + { 180809, true }, + { 180821, true }, + { 180842, true }, + { 180854, true }, + { 180864, true }, + { 180886, true }, + { 180903, true }, + { 180916, true }, + { 180927, false }, + { 180938, true }, + { 180948, true }, + { 180960, true }, + { 180974, true }, + { 180985, false }, + { 180998, false }, + { 181018, true }, + { 181028, true }, + { 181036, false }, + { 181045, true }, + { 181058, true }, + { 181104, true }, + { 181151, true }, + { 181164, true }, + { 181177, true }, + { 181200, true }, + { 181216, true }, + { 181229, true }, + { 181245, true }, + { 181255, false }, + { 181267, true }, + { 181284, true }, + { 181302, true }, + { 181318, true }, + { 181329, true }, + { 181337, true }, + { 181347, true }, + { 181354, true }, + { 181363, true }, + { 181370, true }, + { 181379, true }, + { 181397, true }, + { 181413, true }, { 181432, true }, - { 181443, true }, - { 181451, true }, - { 181461, true }, - { 181468, true }, - { 181477, true }, - { 181484, true }, - { 181493, true }, - { 181511, true }, - { 181527, true }, - { 181546, true }, - { 181559, true }, - { 181573, true }, - { 181585, true }, - { 181599, true }, - { 181614, true }, - { 181626, true }, - { 181639, true }, - { 181650, true }, - { 181671, true }, - { 181681, true }, - { 181690, true }, - { 181697, true }, + { 181445, true }, + { 181459, true }, + { 181471, true }, + { 181485, true }, + { 181500, true }, + { 181512, true }, + { 181525, true }, + { 181536, true }, + { 181557, true }, + { 181567, true }, + { 181576, true }, + { 181583, true }, + { 181590, true }, + { 181598, true }, + { 181622, true }, + { 181636, true }, + { 181646, true }, + { 181663, false }, + { 181678, true }, + { 181692, true }, { 181704, true }, - { 181712, true }, - { 181736, true }, - { 181750, true }, - { 181760, true }, - { 181777, false }, - { 181792, true }, - { 181806, true }, - { 181818, true }, + { 181718, true }, + { 181735, true }, + { 181746, true }, + { 181758, true }, + { 181770, true }, + { 181780, true }, + { 181791, true }, + { 181801, true }, + { 181820, true }, { 181832, true }, - { 181849, true }, - { 181860, true }, - { 181872, true }, - { 181884, true }, - { 181894, true }, - { 181905, true }, - { 181915, true }, - { 181934, true }, - { 181946, true }, - { 181962, true }, - { 181977, true }, - { 182000, true }, - { 182007, true }, + { 181848, true }, + { 181863, true }, + { 181886, true }, + { 181893, true }, + { 181904, true }, + { 181911, true }, + { 181918, true }, + { 181930, true }, + { 181941, true }, + { 181951, false }, + { 181971, true }, + { 181994, true }, { 182018, true }, - { 182025, true }, - { 182032, true }, - { 182044, true }, - { 182055, true }, - { 182065, false }, - { 182085, true }, - { 182108, true }, - { 182132, true }, - { 182142, false }, - { 182149, true }, - { 182162, true }, - { 182176, true }, - { 182190, true }, - { 182203, true }, - { 182214, true }, - { 182225, true }, - { 182235, true }, - { 182251, true }, - { 182272, true }, - { 182282, true }, - { 182293, true }, - { 182308, true }, - { 182322, true }, - { 182333, true }, - { 182347, true }, - { 182367, true }, - { 182381, true }, - { 182390, true }, - { 182401, true }, - { 182416, true }, - { 182429, true }, - { 182444, true }, - { 182460, true }, + { 182028, false }, + { 182035, true }, + { 182048, true }, + { 182062, true }, + { 182076, true }, + { 182089, true }, + { 182100, true }, + { 182111, true }, + { 182121, true }, + { 182137, true }, + { 182158, true }, + { 182168, true }, + { 182179, true }, + { 182194, true }, + { 182208, true }, + { 182219, true }, + { 182233, true }, + { 182253, true }, + { 182267, true }, + { 182276, true }, + { 182287, true }, + { 182302, true }, + { 182315, true }, + { 182330, true }, + { 182346, true }, + { 182361, true }, + { 182375, true }, + { 182391, true }, + { 182405, true }, + { 182419, true }, + { 182437, true }, + { 182455, true }, { 182475, true }, - { 182489, true }, - { 182505, true }, - { 182519, true }, - { 182533, true }, - { 182551, true }, - { 182569, true }, - { 182589, true }, - { 182608, true }, - { 182624, true }, - { 182639, true }, - { 182653, true }, - { 182673, true }, - { 182689, true }, - { 182704, true }, - { 182718, true }, - { 182749, true }, - { 182765, true }, + { 182494, true }, + { 182510, true }, + { 182525, true }, + { 182539, true }, + { 182559, true }, + { 182575, true }, + { 182590, true }, + { 182604, true }, + { 182635, true }, + { 182651, true }, + { 182662, true }, + { 182672, false }, + { 182696, true }, + { 182710, true }, + { 182722, true }, + { 182736, true }, + { 182746, true }, + { 182763, true }, { 182776, true }, - { 182786, false }, - { 182810, true }, - { 182824, true }, - { 182836, true }, - { 182850, true }, - { 182860, true }, - { 182877, true }, - { 182890, true }, - { 182903, true }, - { 182920, true }, - { 182937, false }, - { 182954, true }, - { 182967, true }, - { 182984, true }, - { 183005, true }, - { 183018, true }, - { 183031, true }, - { 183051, true }, - { 183069, true }, - { 183079, true }, - { 183092, true }, - { 183111, true }, - { 183125, true }, - { 183139, false }, - { 183150, true }, - { 183167, true }, - { 183181, true }, - { 183204, true }, - { 183232, true }, - { 183248, true }, - { 183260, true }, - { 183274, false }, - { 183287, true }, - { 183299, true }, - { 183312, true }, - { 183328, true }, - { 183338, true }, - { 183353, true }, - { 183361, true }, - { 183376, true }, - { 183393, true }, - { 183400, true }, - { 183410, true }, - { 183420, true }, - { 183441, true }, - { 183457, true }, - { 183476, true }, - { 183496, true }, - { 183511, true }, - { 183519, true }, - { 183538, true }, - { 183554, false }, - { 183562, true }, - { 183577, true }, - { 183585, true }, - { 183596, true }, - { 183609, true }, - { 183620, true }, - { 183635, false }, - { 183655, true }, - { 183670, true }, - { 183685, true }, - { 183695, true }, - { 183707, true }, - { 183731, true }, - { 183744, true }, - { 183757, true }, + { 182789, true }, + { 182806, true }, + { 182823, false }, + { 182840, true }, + { 182853, true }, + { 182870, true }, + { 182891, true }, + { 182904, true }, + { 182917, true }, + { 182937, true }, + { 182955, true }, + { 182965, true }, + { 182978, true }, + { 182997, true }, + { 183011, true }, + { 183025, false }, + { 183036, true }, + { 183053, true }, + { 183067, true }, + { 183090, true }, + { 183118, true }, + { 183134, true }, + { 183146, true }, + { 183160, false }, + { 183173, true }, + { 183185, true }, + { 183198, true }, + { 183214, true }, + { 183224, true }, + { 183239, true }, + { 183247, true }, + { 183262, true }, + { 183279, true }, + { 183286, true }, + { 183296, true }, + { 183306, true }, + { 183327, true }, + { 183343, true }, + { 183362, true }, + { 183382, true }, + { 183397, true }, + { 183405, true }, + { 183424, true }, + { 183440, false }, + { 183448, true }, + { 183463, true }, + { 183471, true }, + { 183482, true }, + { 183495, true }, + { 183506, true }, + { 183521, false }, + { 183541, true }, + { 183556, true }, + { 183571, true }, + { 183582, true }, + { 183592, true }, + { 183604, true }, + { 183628, true }, + { 183641, true }, + { 183654, true }, + { 183666, true }, + { 183679, true }, + { 183693, true }, + { 183709, true }, + { 183728, true }, + { 183748, true }, + { 183759, true }, { 183769, true }, - { 183782, true }, - { 183796, true }, - { 183812, true }, - { 183831, true }, - { 183851, true }, - { 183862, true }, - { 183872, true }, - { 183883, true }, - { 183891, true }, - { 183904, true }, - { 183918, true }, - { 183928, true }, - { 183946, true }, - { 183973, false }, - { 183982, true }, - { 183995, false }, - { 184018, true }, - { 184040, true }, - { 184051, true }, - { 184064, true }, - { 184079, true }, - { 184086, true }, - { 184093, true }, - { 184104, true }, - { 184120, true }, + { 183780, true }, + { 183788, true }, + { 183801, true }, + { 183815, true }, + { 183825, true }, + { 183843, true }, + { 183870, false }, + { 183879, true }, + { 183892, false }, + { 183915, true }, + { 183937, true }, + { 183948, true }, + { 183961, true }, + { 183968, true }, + { 183975, true }, + { 183986, true }, + { 184002, true }, + { 184015, true }, + { 184027, true }, + { 184037, true }, + { 184054, true }, + { 184069, true }, + { 184078, true }, + { 184089, true }, + { 184107, true }, + { 184121, true }, { 184133, true }, - { 184145, true }, - { 184155, true }, - { 184172, true }, - { 184187, true }, - { 184196, true }, - { 184207, true }, - { 184225, true }, - { 184239, true }, - { 184251, true }, - { 184260, true }, - { 184270, true }, - { 184282, true }, - { 184294, true }, - { 184307, true }, - { 184323, true }, - { 184342, true }, - { 184361, true }, - { 184376, true }, - { 184386, true }, - { 184404, true }, - { 184416, false }, - { 184431, true }, - { 184445, true }, - { 184460, true }, - { 184471, false }, - { 184481, true }, - { 184487, true }, - { 184496, true }, - { 184504, true }, - { 184523, true }, + { 184142, true }, + { 184152, true }, + { 184164, true }, + { 184177, true }, + { 184193, true }, + { 184212, true }, + { 184231, true }, + { 184246, true }, + { 184256, true }, + { 184274, true }, + { 184286, false }, + { 184301, true }, + { 184315, true }, + { 184330, true }, + { 184341, false }, + { 184351, true }, + { 184357, true }, + { 184366, true }, + { 184374, true }, + { 184393, true }, + { 184402, true }, + { 184416, true }, + { 184434, true }, + { 184446, true }, + { 184456, true }, + { 184480, true }, + { 184503, true }, + { 184516, true }, { 184532, true }, - { 184546, true }, - { 184564, true }, - { 184576, true }, - { 184586, true }, - { 184610, true }, - { 184633, true }, - { 184646, true }, - { 184662, true }, - { 184674, true }, - { 184688, true }, - { 184707, true }, - { 184717, true }, - { 184739, true }, - { 184748, true }, - { 184759, true }, - { 184772, true }, - { 184785, true }, - { 184796, true }, - { 184810, true }, - { 184825, true }, - { 184840, true }, - { 184863, false }, - { 184876, true }, - { 184891, true }, - { 184903, true }, - { 184913, true }, - { 184927, true }, - { 184940, true }, - { 184953, false }, - { 184967, true }, - { 184979, true }, - { 184991, true }, - { 185007, true }, - { 185033, true }, - { 185051, false }, + { 184544, true }, + { 184558, true }, + { 184577, true }, + { 184587, true }, + { 184609, true }, + { 184622, true }, + { 184631, true }, + { 184642, true }, + { 184655, true }, + { 184668, true }, + { 184679, true }, + { 184693, true }, + { 184708, true }, + { 184723, false }, + { 184736, true }, + { 184751, true }, + { 184763, true }, + { 184773, true }, + { 184787, true }, + { 184800, true }, + { 184813, false }, + { 184827, true }, + { 184839, true }, + { 184851, true }, + { 184867, true }, + { 184893, true }, + { 184911, false }, + { 184924, true }, + { 184942, true }, + { 184952, true }, + { 184962, true }, + { 184973, true }, + { 184988, true }, + { 185000, true }, + { 185016, true }, + { 185024, true }, + { 185034, true }, + { 185044, true }, + { 185054, true }, { 185064, true }, - { 185082, true }, - { 185092, true }, - { 185102, true }, - { 185113, true }, - { 185128, true }, - { 185140, true }, - { 185156, true }, - { 185164, true }, - { 185174, true }, - { 185184, true }, - { 185194, true }, - { 185204, true }, - { 185215, true }, - { 185235, true }, - { 185243, false }, - { 185264, true }, - { 185277, true }, - { 185286, true }, - { 185300, true }, - { 185310, true }, - { 185323, true }, + { 185075, true }, + { 185095, true }, + { 185103, false }, + { 185124, true }, + { 185137, true }, + { 185146, true }, + { 185160, true }, + { 185170, true }, + { 185183, true }, + { 185192, true }, + { 185208, true }, + { 185219, false }, + { 185239, true }, + { 185249, true }, + { 185259, true }, + { 185274, true }, + { 185288, true }, + { 185305, true }, + { 185321, true }, { 185332, true }, - { 185348, true }, - { 185359, false }, - { 185379, true }, - { 185389, true }, - { 185399, true }, - { 185414, true }, - { 185428, true }, - { 185445, true }, - { 185461, true }, - { 185472, true }, - { 185502, true }, - { 185528, true }, - { 185536, true }, - { 185555, true }, - { 185569, true }, - { 185578, true }, - { 185597, true }, - { 185607, true }, - { 185622, true }, - { 185638, true }, - { 185655, true }, - { 185666, true }, - { 185683, true }, - { 185699, true }, - { 185719, true }, - { 185741, true }, - { 185754, true }, - { 185764, true }, - { 185786, true }, - { 185807, true }, - { 185828, true }, - { 185841, true }, - { 185865, true }, - { 185876, true }, - { 185888, true }, - { 185900, true }, - { 185918, false }, - { 185935, true }, - { 185967, true }, - { 185978, true }, - { 185988, true }, - { 186001, true }, - { 186010, true }, - { 186023, true }, - { 186034, true }, - { 186045, true }, - { 186055, true }, - { 186062, true }, - { 186074, true }, - { 186087, false }, - { 186099, true }, - { 186119, true }, - { 186129, true }, - { 186150, true }, - { 186167, true }, - { 186184, true }, - { 186202, true }, - { 186220, false }, - { 186238, false }, - { 186256, false }, - { 186273, true }, - { 186295, true }, + { 185362, true }, + { 185388, true }, + { 185396, true }, + { 185415, true }, + { 185429, true }, + { 185438, true }, + { 185457, true }, + { 185467, true }, + { 185482, true }, + { 185498, true }, + { 185515, true }, + { 185526, true }, + { 185543, true }, + { 185559, true }, + { 185579, true }, + { 185601, true }, + { 185614, true }, + { 185624, true }, + { 185646, true }, + { 185667, true }, + { 185688, true }, + { 185701, true }, + { 185725, true }, + { 185736, true }, + { 185748, true }, + { 185760, true }, + { 185770, true }, + { 185788, false }, + { 185805, true }, + { 185837, true }, + { 185848, true }, + { 185858, true }, + { 185871, true }, + { 185880, true }, + { 185893, true }, + { 185904, true }, + { 185915, true }, + { 185925, true }, + { 185932, true }, + { 185944, true }, + { 185957, false }, + { 185969, true }, + { 185989, true }, + { 185999, true }, + { 186020, true }, + { 186037, true }, + { 186054, true }, + { 186072, true }, + { 186090, false }, + { 186108, false }, + { 186126, false }, + { 186143, true }, + { 186165, true }, + { 186178, true }, + { 186191, false }, + { 186206, false }, + { 186216, false }, + { 186230, true }, + { 186245, true }, + { 186257, true }, + { 186275, true }, + { 186290, true }, { 186308, true }, - { 186321, false }, - { 186336, false }, - { 186346, false }, - { 186360, true }, - { 186375, true }, - { 186387, true }, - { 186405, true }, - { 186420, true }, - { 186438, true }, - { 186454, true }, - { 186464, true }, - { 186492, true }, - { 186507, true }, - { 186518, true }, - { 186528, false }, - { 186546, true }, - { 186561, true }, - { 186573, true }, - { 186586, true }, - { 186604, true }, - { 186621, true }, - { 186631, true }, - { 186642, false }, + { 186324, true }, + { 186334, true }, + { 186362, true }, + { 186377, true }, + { 186388, true }, + { 186398, false }, + { 186416, true }, + { 186431, true }, + { 186443, true }, + { 186456, true }, + { 186474, true }, + { 186491, true }, + { 186501, true }, + { 186512, false }, + { 186527, true }, + { 186545, true }, + { 186560, true }, + { 186578, true }, + { 186590, true }, + { 186613, true }, + { 186627, true }, + { 186643, true }, { 186657, true }, { 186675, true }, - { 186690, true }, - { 186708, true }, - { 186720, true }, - { 186743, true }, - { 186757, true }, - { 186773, true }, - { 186787, true }, - { 186805, true }, - { 186829, true }, - { 186862, false }, - { 186885, true }, - { 186905, true }, - { 186922, true }, - { 186940, true }, - { 186950, true }, - { 186963, true }, - { 186976, true }, - { 186993, true }, - { 187004, true }, - { 187026, true }, - { 187044, false }, - { 187058, true }, - { 187072, true }, - { 187090, true }, - { 187110, true }, - { 187124, true }, - { 187133, true }, - { 187146, true }, - { 187164, true }, - { 187176, true }, + { 186699, true }, + { 186732, false }, + { 186755, true }, + { 186775, true }, + { 186792, true }, + { 186810, true }, + { 186820, true }, + { 186833, true }, + { 186846, true }, + { 186863, true }, + { 186874, true }, + { 186896, true }, + { 186914, false }, + { 186928, true }, + { 186942, true }, + { 186960, true }, + { 186980, true }, + { 186994, true }, + { 187003, true }, + { 187016, true }, + { 187034, true }, + { 187046, true }, + { 187061, true }, + { 187074, true }, + { 187086, true }, + { 187098, true }, + { 187109, true }, + { 187120, true }, + { 187129, true }, + { 187142, true }, + { 187156, true }, + { 187167, true }, + { 187178, true }, { 187191, true }, - { 187204, true }, - { 187216, true }, - { 187228, true }, - { 187239, true }, + { 187205, false }, + { 187218, true }, + { 187227, true }, + { 187237, true }, { 187250, true }, { 187259, true }, - { 187272, true }, - { 187286, true }, - { 187297, true }, - { 187308, true }, - { 187321, true }, - { 187335, false }, - { 187348, true }, - { 187357, true }, - { 187367, true }, - { 187380, true }, - { 187389, true }, - { 187399, true }, - { 187409, true }, - { 187417, true }, - { 187425, false }, - { 187439, false }, - { 187459, true }, - { 187469, true }, - { 187483, true }, - { 187493, true }, - { 187504, true }, - { 187516, true }, - { 187527, true }, + { 187269, true }, + { 187280, true }, + { 187290, true }, + { 187298, true }, + { 187306, false }, + { 187320, false }, + { 187340, true }, + { 187350, true }, + { 187364, true }, + { 187374, true }, + { 187385, true }, + { 187397, true }, + { 187408, true }, + { 187420, true }, + { 187430, true }, + { 187439, true }, + { 187451, true }, + { 187463, true }, + { 187474, true }, + { 187486, true }, + { 187502, true }, + { 187517, true }, + { 187529, true }, { 187539, true }, - { 187549, true }, - { 187558, true }, - { 187570, true }, - { 187582, true }, - { 187593, true }, - { 187605, true }, - { 187621, true }, - { 187636, true }, - { 187648, true }, - { 187658, true }, - { 187673, true }, - { 187688, true }, - { 187700, true }, - { 187707, true }, - { 187718, true }, - { 187728, true }, - { 187743, true }, - { 187754, true }, - { 187768, true }, - { 187782, true }, - { 187793, true }, - { 187806, true }, - { 187817, false }, - { 187832, true }, - { 187841, true }, - { 187851, true }, - { 187858, true }, - { 187869, true }, - { 187881, true }, - { 187903, true }, - { 187917, true }, - { 187940, true }, - { 187975, true }, - { 188018, true }, - { 188031, true }, - { 188041, true }, - { 188051, true }, - { 188078, true }, - { 188087, true }, - { 188096, true }, - { 188113, true }, - { 188125, true }, - { 188138, true }, - { 188165, true }, - { 188172, true }, - { 188183, true }, - { 188200, true }, - { 188216, true }, - { 188227, true }, - { 188240, true }, + { 187554, true }, + { 187569, true }, + { 187581, true }, + { 187588, true }, + { 187599, true }, + { 187609, true }, + { 187624, true }, + { 187635, true }, + { 187649, true }, + { 187663, true }, + { 187674, true }, + { 187687, true }, + { 187698, false }, + { 187713, true }, + { 187722, true }, + { 187732, true }, + { 187739, true }, + { 187750, true }, + { 187762, true }, + { 187784, true }, + { 187798, true }, + { 187821, true }, + { 187856, true }, + { 187899, true }, + { 187912, true }, + { 187922, true }, + { 187932, true }, + { 187959, true }, + { 187968, true }, + { 187977, true }, + { 187994, true }, + { 188006, true }, + { 188019, true }, + { 188046, true }, + { 188053, true }, + { 188064, true }, + { 188081, true }, + { 188097, true }, + { 188108, true }, + { 188121, true }, + { 188145, true }, + { 188152, true }, + { 188162, true }, + { 188169, true }, + { 188189, true }, + { 188201, true }, + { 188222, true }, + { 188233, true }, + { 188245, true }, + { 188255, true }, { 188264, true }, - { 188271, true }, + { 188272, true }, { 188281, true }, - { 188288, true }, - { 188308, true }, - { 188320, true }, - { 188341, true }, - { 188352, true }, - { 188364, true }, - { 188374, true }, - { 188383, true }, - { 188391, true }, - { 188400, true }, - { 188409, true }, - { 188428, true }, - { 188442, true }, - { 188463, true }, - { 188476, true }, - { 188488, true }, - { 188512, true }, - { 188530, false }, - { 188544, true }, - { 188559, true }, - { 188574, true }, - { 188583, false }, - { 188600, false }, - { 188610, true }, - { 188620, true }, - { 188634, true }, - { 188649, true }, - { 188665, true }, - { 188688, true }, - { 188698, true }, - { 188709, true }, - { 188719, true }, - { 188735, true }, - { 188746, true }, - { 188757, true }, - { 188769, true }, - { 188780, true }, - { 188794, true }, - { 188808, true }, - { 188825, true }, - { 188841, true }, - { 188853, false }, - { 188872, true }, - { 188887, true }, - { 188897, true }, - { 188915, true }, - { 188938, true }, - { 188949, true }, - { 188969, true }, - { 188986, true }, - { 189002, true }, - { 189021, true }, - { 189036, true }, - { 189052, true }, - { 189069, true }, - { 189089, true }, - { 189101, true }, - { 189116, true }, - { 189135, true }, - { 189144, true }, - { 189161, true }, - { 189173, true }, - { 189185, true }, - { 189197, true }, - { 189206, true }, - { 189216, true }, - { 189233, true }, - { 189251, true }, - { 189262, true }, - { 189272, true }, - { 189287, true }, - { 189297, true }, - { 189307, false }, - { 189314, true }, - { 189324, true }, - { 189345, true }, - { 189365, true }, - { 189388, true }, - { 189408, true }, - { 189423, true }, - { 189441, true }, - { 189452, false }, - { 189476, true }, - { 189495, true }, - { 189508, true }, - { 189524, false }, + { 188290, true }, + { 188309, true }, + { 188323, true }, + { 188344, true }, + { 188357, true }, + { 188369, true }, + { 188393, true }, + { 188411, false }, + { 188425, true }, + { 188440, true }, + { 188455, true }, + { 188464, false }, + { 188481, false }, + { 188491, true }, + { 188501, true }, + { 188515, true }, + { 188530, true }, + { 188546, true }, + { 188569, true }, + { 188579, true }, + { 188590, true }, + { 188600, true }, + { 188616, true }, + { 188627, true }, + { 188638, true }, + { 188650, true }, + { 188661, true }, + { 188675, true }, + { 188689, true }, + { 188706, true }, + { 188722, true }, + { 188734, false }, + { 188753, true }, + { 188768, true }, + { 188778, true }, + { 188796, true }, + { 188819, true }, + { 188830, true }, + { 188850, true }, + { 188867, true }, + { 188883, true }, + { 188902, true }, + { 188917, true }, + { 188933, true }, + { 188950, true }, + { 188970, true }, + { 188982, true }, + { 188997, true }, + { 189016, true }, + { 189025, true }, + { 189042, true }, + { 189054, true }, + { 189066, true }, + { 189078, true }, + { 189087, true }, + { 189097, true }, + { 189114, true }, + { 189132, true }, + { 189143, true }, + { 189153, true }, + { 189168, true }, + { 189178, true }, + { 189188, false }, + { 189195, true }, + { 189205, true }, + { 189226, true }, + { 189246, true }, + { 189269, true }, + { 189289, true }, + { 189304, true }, + { 189322, true }, + { 189333, false }, + { 189357, true }, + { 189376, true }, + { 189389, true }, + { 189405, false }, + { 189421, true }, + { 189435, true }, + { 189447, false }, + { 189461, true }, + { 189479, false }, + { 189492, true }, + { 189506, false }, + { 189522, true }, { 189540, true }, - { 189554, true }, - { 189566, false }, - { 189580, true }, - { 189598, false }, - { 189611, true }, - { 189625, false }, - { 189641, true }, - { 189659, true }, - { 189682, true }, - { 189695, true }, - { 189707, true }, - { 189718, true }, - { 189729, true }, - { 189744, true }, - { 189769, true }, - { 189802, true }, - { 189828, true }, - { 189862, true }, - { 189885, true }, - { 189898, true }, - { 189914, true }, - { 189926, true }, - { 189938, true }, - { 189954, false }, - { 189974, true }, - { 189987, false }, - { 190005, false }, - { 190028, true }, - { 190048, true }, - { 190064, true }, - { 190078, true }, - { 190099, true }, - { 190114, false }, - { 190127, true }, - { 190141, true }, - { 190153, true }, - { 190165, true }, - { 190181, false }, - { 190203, true }, - { 190223, true }, - { 190235, true }, - { 190251, false }, - { 190263, true }, - { 190279, true }, - { 190297, true }, - { 190309, true }, - { 190323, true }, - { 190343, true }, - { 190357, true }, - { 190374, true }, + { 189563, true }, + { 189576, true }, + { 189588, true }, + { 189599, true }, + { 189610, true }, + { 189625, true }, + { 189650, true }, + { 189683, true }, + { 189709, true }, + { 189743, true }, + { 189766, true }, + { 189779, true }, + { 189795, true }, + { 189807, true }, + { 189819, true }, + { 189835, false }, + { 189855, true }, + { 189868, false }, + { 189886, false }, + { 189909, true }, + { 189929, true }, + { 189945, true }, + { 189959, true }, + { 189980, true }, + { 189995, false }, + { 190008, true }, + { 190022, true }, + { 190034, true }, + { 190046, true }, + { 190062, false }, + { 190084, true }, + { 190104, true }, + { 190116, true }, + { 190132, false }, + { 190144, true }, + { 190160, true }, + { 190178, true }, + { 190190, true }, + { 190204, true }, + { 190224, true }, + { 190238, true }, + { 190255, true }, + { 190272, true }, + { 190286, true }, + { 190296, false }, + { 190310, true }, + { 190320, true }, + { 190341, true }, + { 190354, true }, + { 190367, true }, + { 190378, true }, { 190391, true }, - { 190405, true }, - { 190415, false }, - { 190429, true }, - { 190439, true }, - { 190460, true }, - { 190473, true }, - { 190486, true }, - { 190497, true }, + { 190412, true }, + { 190432, true }, + { 190449, true }, + { 190461, true }, + { 190475, true }, + { 190485, true }, + { 190502, true }, { 190510, true }, - { 190531, true }, - { 190551, true }, - { 190568, true }, - { 190580, true }, - { 190594, true }, - { 190604, true }, - { 190621, true }, - { 190629, true }, - { 190645, true }, - { 190661, true }, + { 190526, true }, + { 190542, true }, + { 190558, true }, + { 190579, true }, + { 190590, true }, + { 190603, true }, + { 190628, true }, + { 190643, true }, + { 190663, true }, { 190677, true }, - { 190698, true }, - { 190709, true }, - { 190722, true }, - { 190747, true }, - { 190762, true }, - { 190782, true }, - { 190796, true }, - { 190810, true }, - { 190825, true }, - { 190847, true }, - { 190867, true }, - { 190882, true }, - { 190892, true }, - { 190910, true }, - { 190925, true }, - { 190941, true }, - { 190962, true }, - { 190978, true }, - { 190987, false }, - { 190997, true }, - { 191009, true }, - { 191026, true }, - { 191038, true }, - { 191054, true }, - { 191070, true }, - { 191091, true }, - { 191103, true }, - { 191122, false }, - { 191134, true }, - { 191144, true }, - { 191159, true }, - { 191171, true }, - { 191185, true }, - { 191209, true }, - { 191221, true }, - { 191242, true }, - { 191273, true }, - { 191298, true }, - { 191321, true }, - { 191332, true }, - { 191344, true }, - { 191359, true }, - { 191372, true }, - { 191385, true }, - { 191414, true }, - { 191437, true }, - { 191461, true }, - { 191488, true }, - { 191502, true }, - { 191525, true }, + { 190691, true }, + { 190706, true }, + { 190728, true }, + { 190748, true }, + { 190763, true }, + { 190773, true }, + { 190791, true }, + { 190806, true }, + { 190822, true }, + { 190843, true }, + { 190859, true }, + { 190868, false }, + { 190878, true }, + { 190890, true }, + { 190907, true }, + { 190919, true }, + { 190935, true }, + { 190951, true }, + { 190972, true }, + { 190984, true }, + { 191003, false }, + { 191015, true }, + { 191025, true }, + { 191040, true }, + { 191052, true }, + { 191066, true }, + { 191090, true }, + { 191102, true }, + { 191123, true }, + { 191154, true }, + { 191179, true }, + { 191202, true }, + { 191213, true }, + { 191225, true }, + { 191240, true }, + { 191253, true }, + { 191266, true }, + { 191295, true }, + { 191318, true }, + { 191342, true }, + { 191369, true }, + { 191383, true }, + { 191406, true }, + { 191432, true }, + { 191460, true }, + { 191491, true }, + { 191516, true }, + { 191524, true }, + { 191531, true }, + { 191543, true }, { 191551, true }, - { 191579, true }, + { 191563, true }, + { 191576, true }, + { 191597, true }, { 191610, true }, - { 191635, true }, - { 191643, true }, + { 191631, true }, { 191650, true }, - { 191658, true }, - { 191670, true }, - { 191683, true }, - { 191704, true }, - { 191717, true }, - { 191738, true }, - { 191757, true }, - { 191776, true }, - { 191787, true }, - { 191800, true }, - { 191816, false }, - { 191832, true }, - { 191840, true }, - { 191855, true }, - { 191872, false }, - { 191887, true }, - { 191903, true }, + { 191669, true }, + { 191680, true }, + { 191693, true }, + { 191709, false }, + { 191725, true }, + { 191733, true }, + { 191748, true }, + { 191765, false }, + { 191780, true }, + { 191796, true }, + { 191806, true }, + { 191818, true }, + { 191834, true }, + { 191853, true }, + { 191867, false }, + { 191876, true }, + { 191888, true }, + { 191901, false }, { 191913, true }, - { 191925, true }, - { 191941, true }, - { 191955, false }, - { 191964, true }, - { 191976, true }, - { 191989, false }, - { 192001, true }, - { 192016, true }, - { 192038, true }, - { 192055, true }, - { 192077, true }, - { 192091, true }, - { 192098, true }, + { 191928, true }, + { 191950, true }, + { 191967, true }, + { 191989, true }, + { 192003, true }, + { 192010, true }, + { 192023, true }, + { 192036, true }, + { 192062, true }, + { 192074, true }, + { 192085, true }, { 192111, true }, - { 192124, true }, + { 192121, false }, + { 192138, true }, { 192150, true }, - { 192162, true }, - { 192173, true }, - { 192199, true }, - { 192209, false }, - { 192226, true }, - { 192238, true }, - { 192253, true }, - { 192263, true }, - { 192280, true }, - { 192293, true }, - { 192305, true }, - { 192315, true }, - { 192328, false }, - { 192344, true }, - { 192360, true }, - { 192374, false }, - { 192389, true }, - { 192402, false }, - { 192419, true }, - { 192433, true }, - { 192447, true }, - { 192461, true }, - { 192485, true }, - { 192498, true }, + { 192165, true }, + { 192175, true }, + { 192192, true }, + { 192205, true }, + { 192217, true }, + { 192227, true }, + { 192240, false }, + { 192256, true }, + { 192272, true }, + { 192286, false }, + { 192301, true }, + { 192314, false }, + { 192331, true }, + { 192345, true }, + { 192359, true }, + { 192373, true }, + { 192397, true }, + { 192410, true }, + { 192423, true }, + { 192437, true }, + { 192451, true }, + { 192466, true }, + { 192480, true }, + { 192496, true }, { 192511, true }, - { 192525, true }, - { 192539, true }, - { 192554, true }, + { 192526, true }, + { 192544, true }, + { 192556, true }, { 192568, true }, { 192584, true }, - { 192599, true }, - { 192614, true }, - { 192632, true }, - { 192644, true }, - { 192656, true }, - { 192672, true }, - { 192689, true }, - { 192713, true }, - { 192730, true }, - { 192748, true }, - { 192767, true }, - { 192787, true }, - { 192802, true }, - { 192814, true }, - { 192828, true }, - { 192845, true }, - { 192854, true }, - { 192867, true }, - { 192881, true }, - { 192896, true }, - { 192908, true }, - { 192918, false }, - { 192931, true }, - { 192945, true }, - { 192958, true }, - { 192970, false }, - { 192989, true }, + { 192601, true }, + { 192625, true }, + { 192642, true }, + { 192660, true }, + { 192679, true }, + { 192699, true }, + { 192714, true }, + { 192726, true }, + { 192740, true }, + { 192757, true }, + { 192766, true }, + { 192779, true }, + { 192793, true }, + { 192808, true }, + { 192820, true }, + { 192830, false }, + { 192843, true }, + { 192857, true }, + { 192870, true }, + { 192882, false }, + { 192901, true }, + { 192923, true }, + { 192938, true }, + { 192957, true }, + { 192971, false }, + { 192982, true }, + { 192997, true }, { 193011, true }, - { 193026, true }, - { 193045, true }, - { 193059, false }, - { 193070, true }, - { 193085, true }, - { 193099, true }, - { 193111, true }, - { 193128, true }, - { 193146, true }, - { 193157, true }, - { 193164, true }, - { 193177, true }, - { 193189, true }, - { 193197, true }, - { 193207, true }, - { 193217, true }, - { 193232, true }, + { 193023, true }, + { 193040, true }, + { 193058, true }, + { 193069, true }, + { 193076, true }, + { 193089, true }, + { 193101, true }, + { 193109, true }, + { 193119, true }, + { 193129, true }, + { 193144, true }, + { 193163, true }, + { 193179, false }, + { 193189, false }, + { 193201, true }, + { 193210, true }, + { 193224, true }, + { 193236, true }, + { 193244, true }, { 193251, true }, - { 193267, false }, - { 193277, false }, - { 193289, true }, - { 193298, true }, + { 193261, true }, + { 193273, true }, + { 193292, true }, + { 193300, false }, { 193312, true }, - { 193324, true }, - { 193332, true }, - { 193339, true }, - { 193349, true }, - { 193361, true }, - { 193380, true }, - { 193388, false }, - { 193400, true }, - { 193413, true }, - { 193428, true }, - { 193450, true }, - { 193461, true }, - { 193473, true }, - { 193491, true }, - { 193507, true }, - { 193516, false }, - { 193533, true }, - { 193554, true }, - { 193575, true }, + { 193325, true }, + { 193340, true }, + { 193362, true }, + { 193373, true }, + { 193385, true }, + { 193403, true }, + { 193419, true }, + { 193428, false }, + { 193445, true }, + { 193466, true }, + { 193487, true }, + { 193499, true }, + { 193524, true }, + { 193550, true }, + { 193576, true }, { 193587, true }, + { 193599, true }, { 193612, true }, - { 193638, true }, - { 193664, true }, - { 193675, true }, - { 193687, true }, - { 193700, true }, - { 193713, true }, - { 193723, true }, - { 193732, true }, - { 193746, true }, - { 193766, true }, - { 193781, true }, - { 193797, true }, - { 193807, true }, - { 193819, true }, - { 193839, true }, - { 193861, true }, - { 193878, true }, - { 193891, true }, - { 193910, true }, - { 193924, true }, - { 193936, true }, - { 193960, true }, - { 193977, false }, - { 193991, true }, - { 194004, true }, - { 194017, true }, - { 194036, true }, + { 193625, true }, + { 193635, true }, + { 193644, true }, + { 193658, true }, + { 193678, true }, + { 193693, true }, + { 193709, true }, + { 193719, true }, + { 193731, true }, + { 193751, true }, + { 193773, true }, + { 193790, true }, + { 193803, true }, + { 193822, true }, + { 193836, true }, + { 193848, true }, + { 193872, true }, + { 193889, false }, + { 193903, true }, + { 193916, true }, + { 193929, true }, + { 193948, true }, + { 193970, true }, + { 193982, true }, + { 193997, true }, + { 194012, true }, + { 194033, true }, { 194058, true }, - { 194070, true }, - { 194085, true }, + { 194074, true }, { 194100, true }, - { 194121, true }, - { 194146, true }, + { 194120, true }, + { 194133, true }, + { 194149, true }, { 194162, true }, - { 194188, true }, - { 194208, true }, - { 194221, true }, - { 194237, true }, - { 194250, true }, - { 194262, true }, - { 194280, true }, - { 194294, true }, - { 194313, true }, + { 194174, true }, + { 194192, true }, + { 194206, true }, + { 194225, true }, + { 194236, true }, + { 194248, true }, + { 194258, true }, + { 194267, true }, + { 194281, true }, + { 194292, true }, + { 194303, true }, + { 194311, true }, { 194324, true }, - { 194336, true }, - { 194346, true }, + { 194338, true }, { 194355, true }, - { 194369, true }, - { 194380, true }, - { 194391, true }, - { 194399, true }, - { 194412, true }, - { 194426, true }, - { 194443, true }, - { 194454, false }, - { 194466, true }, - { 194485, true }, - { 194498, true }, - { 194509, true }, - { 194520, true }, - { 194533, true }, - { 194543, true }, - { 194553, true }, - { 194573, true }, + { 194366, false }, + { 194378, true }, + { 194397, true }, + { 194410, true }, + { 194421, true }, + { 194432, true }, + { 194445, true }, + { 194457, true }, + { 194467, true }, + { 194477, true }, + { 194497, true }, + { 194507, true }, + { 194530, true }, + { 194542, true }, + { 194561, true }, + { 194569, true }, { 194583, true }, - { 194606, true }, - { 194618, true }, - { 194637, true }, - { 194645, true }, - { 194659, true }, - { 194671, true }, - { 194686, false }, - { 194699, true }, - { 194712, true }, - { 194723, true }, - { 194734, true }, - { 194750, true }, - { 194760, true }, - { 194774, true }, + { 194595, true }, + { 194610, false }, + { 194623, true }, + { 194636, true }, + { 194647, true }, + { 194658, true }, + { 194674, true }, + { 194684, true }, + { 194698, true }, + { 194705, true }, + { 194718, true }, + { 194735, true }, + { 194745, true }, + { 194753, true }, + { 194765, true }, { 194781, true }, - { 194794, true }, - { 194811, true }, - { 194821, true }, - { 194829, true }, - { 194841, true }, - { 194857, true }, - { 194872, true }, - { 194882, true }, - { 194907, true }, - { 194915, true }, - { 194927, false }, - { 194938, false }, - { 194956, false }, - { 194969, true }, - { 194984, true }, - { 194998, true }, - { 195012, true }, - { 195029, true }, - { 195046, true }, - { 195061, true }, - { 195079, true }, - { 195097, true }, - { 195115, true }, - { 195129, true }, - { 195143, true }, - { 195157, true }, - { 195171, true }, - { 195185, false }, - { 195203, false }, - { 195226, false }, - { 195247, false }, - { 195266, true }, - { 195282, false }, - { 195298, false }, - { 195314, true }, - { 195336, true }, - { 195349, false }, - { 195366, false }, - { 195383, true }, - { 195400, false }, - { 195417, false }, - { 195431, false }, - { 195450, false }, - { 195461, false }, - { 195473, false }, - { 195485, false }, - { 195504, true }, - { 195522, false }, - { 195536, true }, - { 195552, false }, - { 195569, false }, - { 195586, false }, - { 195601, false }, - { 195617, true }, - { 195638, false }, - { 195657, false }, - { 195675, false }, - { 195695, true }, - { 195711, false }, - { 195726, true }, - { 195741, false }, - { 195765, true }, - { 195772, true }, - { 195791, false }, - { 195809, false }, - { 195824, true }, - { 195845, false }, - { 195869, false }, - { 195888, false }, - { 195904, false }, - { 195919, false }, - { 195932, true }, - { 195948, false }, - { 195963, false }, - { 195977, false }, - { 195995, true }, - { 196006, true }, - { 196017, true }, - { 196025, true }, - { 196040, true }, - { 196050, true }, - { 196063, true }, - { 196080, true }, - { 196092, true }, - { 196100, true }, - { 196111, true }, - { 196121, true }, - { 196137, true }, + { 194796, true }, + { 194806, true }, + { 194831, true }, + { 194839, true }, + { 194851, false }, + { 194862, false }, + { 194880, false }, + { 194893, true }, + { 194908, true }, + { 194922, true }, + { 194936, true }, + { 194953, true }, + { 194970, true }, + { 194985, true }, + { 195003, true }, + { 195021, true }, + { 195039, true }, + { 195053, true }, + { 195067, true }, + { 195081, true }, + { 195095, true }, + { 195109, false }, + { 195127, false }, + { 195150, false }, + { 195171, false }, + { 195190, true }, + { 195206, false }, + { 195222, false }, + { 195238, true }, + { 195260, true }, + { 195273, false }, + { 195290, false }, + { 195307, true }, + { 195324, false }, + { 195341, false }, + { 195355, false }, + { 195374, false }, + { 195385, false }, + { 195397, false }, + { 195409, false }, + { 195428, true }, + { 195446, false }, + { 195460, true }, + { 195476, false }, + { 195493, false }, + { 195510, false }, + { 195525, false }, + { 195541, true }, + { 195562, false }, + { 195581, false }, + { 195599, false }, + { 195619, true }, + { 195635, false }, + { 195650, true }, + { 195665, false }, + { 195689, true }, + { 195696, true }, + { 195715, false }, + { 195733, false }, + { 195748, true }, + { 195769, false }, + { 195793, false }, + { 195812, false }, + { 195828, false }, + { 195843, false }, + { 195856, true }, + { 195872, false }, + { 195887, false }, + { 195901, false }, + { 195919, true }, + { 195930, true }, + { 195941, true }, + { 195949, true }, + { 195964, true }, + { 195974, true }, + { 195987, true }, + { 196004, true }, + { 196016, true }, + { 196024, true }, + { 196035, true }, + { 196045, true }, + { 196061, true }, + { 196066, true }, + { 196071, true }, + { 196081, true }, + { 196089, true }, + { 196109, true }, + { 196116, true }, + { 196135, true }, { 196142, true }, - { 196147, true }, - { 196157, true }, + { 196149, true }, + { 196156, true }, { 196165, true }, - { 196185, true }, - { 196192, true }, - { 196211, true }, - { 196218, true }, - { 196225, true }, - { 196232, true }, - { 196241, true }, - { 196262, true }, - { 196282, true }, - { 196306, true }, - { 196313, true }, - { 196323, true }, - { 196340, true }, - { 196360, true }, - { 196366, true }, - { 196373, true }, - { 196385, true }, - { 196398, true }, - { 196413, false }, - { 196424, true }, - { 196435, true }, - { 196443, false }, - { 196462, true }, + { 196186, true }, + { 196206, true }, + { 196230, true }, + { 196237, true }, + { 196247, true }, + { 196264, true }, + { 196284, true }, + { 196290, true }, + { 196297, true }, + { 196309, true }, + { 196322, true }, + { 196337, false }, + { 196348, true }, + { 196359, true }, + { 196367, false }, + { 196386, true }, + { 196397, true }, + { 196408, true }, + { 196415, true }, + { 196426, true }, + { 196438, true }, + { 196457, true }, { 196473, true }, - { 196484, true }, - { 196491, true }, - { 196502, true }, - { 196514, true }, - { 196533, true }, - { 196549, true }, - { 196561, true }, - { 196572, true }, - { 196585, true }, - { 196599, true }, - { 196614, true }, - { 196629, true }, - { 196639, true }, - { 196649, true }, - { 196660, false }, - { 196670, true }, - { 196680, true }, - { 196689, false }, - { 196703, true }, - { 196713, true }, - { 196721, true }, - { 196733, true }, - { 196744, true }, + { 196485, true }, + { 196496, true }, + { 196509, true }, + { 196523, true }, + { 196538, true }, + { 196553, true }, + { 196563, true }, + { 196573, true }, + { 196584, false }, + { 196594, true }, + { 196604, true }, + { 196613, false }, + { 196627, true }, + { 196637, true }, + { 196645, true }, + { 196657, true }, + { 196668, true }, + { 196679, true }, + { 196691, true }, + { 196701, true }, + { 196709, true }, + { 196723, true }, + { 196730, true }, + { 196737, true }, { 196755, true }, - { 196767, true }, - { 196775, true }, - { 196789, true }, - { 196796, true }, - { 196803, true }, - { 196821, true }, - { 196847, true }, - { 196873, true }, - { 196896, true }, - { 196927, true }, - { 196938, true }, - { 196954, true }, - { 196966, true }, - { 196985, true }, - { 197018, true }, - { 197042, true }, - { 197068, true }, - { 197093, true }, - { 197118, true }, - { 197142, true }, - { 197172, true }, - { 197183, true }, - { 197202, true }, - { 197233, true }, - { 197244, false }, - { 197265, true }, - { 197283, true }, + { 196781, true }, + { 196807, true }, + { 196830, true }, + { 196861, true }, + { 196872, true }, + { 196888, true }, + { 196900, true }, + { 196919, true }, + { 196952, true }, + { 196976, true }, + { 197002, true }, + { 197027, true }, + { 197052, true }, + { 197076, true }, + { 197106, true }, + { 197117, true }, + { 197136, true }, + { 197167, true }, + { 197178, false }, + { 197199, true }, + { 197217, true }, + { 197254, true }, + { 197277, true }, + { 197305, true }, { 197320, true }, - { 197343, true }, - { 197371, true }, - { 197386, true }, - { 197400, true }, - { 197422, true }, - { 197464, true }, - { 197487, true }, - { 197503, true }, - { 197537, true }, - { 197561, true }, - { 197588, false }, - { 197595, true }, - { 197601, true }, - { 197612, true }, - { 197622, true }, - { 197632, true }, - { 197639, true }, - { 197646, true }, - { 197659, true }, - { 197666, true }, - { 197680, true }, - { 197689, true }, - { 197703, true }, - { 197713, true }, - { 197723, true }, - { 197736, true }, - { 197743, true }, - { 197750, true }, - { 197761, true }, - { 197770, true }, - { 197779, true }, - { 197792, true }, - { 197799, true }, - { 197809, true }, - { 197817, true }, + { 197334, true }, + { 197356, true }, + { 197398, true }, + { 197421, true }, + { 197437, true }, + { 197471, true }, + { 197495, true }, + { 197522, false }, + { 197529, true }, + { 197535, true }, + { 197546, true }, + { 197556, true }, + { 197566, true }, + { 197573, true }, + { 197580, true }, + { 197593, true }, + { 197600, true }, + { 197614, true }, + { 197623, true }, + { 197637, true }, + { 197647, true }, + { 197657, true }, + { 197670, true }, + { 197677, true }, + { 197684, true }, + { 197695, true }, + { 197704, true }, + { 197720, true }, + { 197729, true }, + { 197742, true }, + { 197749, true }, + { 197759, true }, + { 197767, true }, + { 197778, true }, + { 197787, true }, + { 197802, true }, + { 197812, true }, + { 197821, true }, { 197828, true }, - { 197837, true }, - { 197852, true }, - { 197862, true }, - { 197871, true }, - { 197878, true }, - { 197898, true }, - { 197909, true }, - { 197920, true }, - { 197934, true }, - { 197950, true }, - { 197957, true }, - { 197969, true }, - { 197979, true }, - { 197986, true }, - { 197997, true }, - { 198009, false }, - { 198021, true }, - { 198035, true }, - { 198048, true }, + { 197848, true }, + { 197859, true }, + { 197870, true }, + { 197884, true }, + { 197900, true }, + { 197907, true }, + { 197919, true }, + { 197929, true }, + { 197936, true }, + { 197947, true }, + { 197959, false }, + { 197971, true }, + { 197985, true }, + { 197998, true }, + { 198014, true }, + { 198029, true }, + { 198041, false }, + { 198051, true }, { 198064, true }, - { 198079, true }, - { 198091, false }, - { 198101, true }, - { 198114, true }, - { 198126, true }, - { 198136, true }, - { 198144, true }, - { 198153, true }, - { 198165, true }, - { 198175, false }, - { 198183, true }, - { 198193, true }, - { 198202, true }, - { 198222, true }, - { 198237, true }, - { 198253, false }, - { 198268, false }, - { 198281, true }, - { 198295, true }, - { 198305, false }, - { 198314, true }, - { 198330, true }, + { 198076, true }, + { 198086, true }, + { 198094, true }, + { 198103, true }, + { 198115, true }, + { 198125, false }, + { 198133, true }, + { 198143, true }, + { 198152, true }, + { 198172, true }, + { 198187, true }, + { 198203, false }, + { 198218, false }, + { 198231, true }, + { 198245, true }, + { 198255, false }, + { 198264, true }, + { 198280, true }, + { 198287, true }, + { 198297, true }, + { 198306, true }, + { 198315, true }, + { 198326, true }, { 198337, true }, - { 198347, true }, - { 198356, true }, - { 198365, true }, - { 198376, true }, - { 198387, true }, - { 198409, true }, - { 198424, true }, - { 198431, true }, - { 198442, true }, - { 198450, true }, - { 198460, true }, - { 198473, false }, - { 198482, true }, - { 198496, true }, - { 198512, true }, - { 198536, true }, - { 198554, true }, - { 198565, true }, - { 198577, false }, - { 198592, true }, - { 198602, true }, - { 198614, true }, - { 198634, true }, - { 198644, true }, + { 198359, true }, + { 198374, true }, + { 198381, true }, + { 198392, true }, + { 198400, true }, + { 198410, true }, + { 198423, false }, + { 198432, true }, + { 198446, true }, + { 198462, true }, + { 198486, true }, + { 198504, true }, + { 198515, true }, + { 198527, false }, + { 198542, true }, + { 198552, true }, + { 198564, true }, + { 198584, true }, + { 198594, true }, + { 198605, true }, + { 198615, true }, + { 198627, true }, + { 198640, true }, { 198655, true }, - { 198665, true }, - { 198677, true }, - { 198690, true }, - { 198705, true }, - { 198719, true }, + { 198669, true }, + { 198684, true }, + { 198699, true }, + { 198711, true }, + { 198723, true }, { 198734, true }, - { 198749, true }, - { 198761, true }, - { 198773, true }, - { 198784, true }, - { 198794, true }, - { 198806, true }, - { 198819, true }, - { 198832, true }, - { 198847, true }, - { 198862, true }, - { 198874, true }, - { 198883, true }, - { 198894, true }, - { 198916, true }, - { 198932, true }, + { 198744, true }, + { 198756, true }, + { 198769, true }, + { 198782, true }, + { 198797, true }, + { 198812, true }, + { 198824, true }, + { 198833, true }, + { 198844, true }, + { 198866, true }, + { 198882, true }, + { 198902, true }, + { 198911, true }, + { 198919, true }, + { 198927, false }, + { 198939, true }, { 198952, true }, - { 198961, true }, - { 198969, true }, - { 198977, false }, - { 198989, true }, - { 199002, true }, - { 199014, true }, - { 199026, true }, - { 199041, true }, - { 199051, true }, - { 199062, true }, - { 199078, true }, - { 199087, true }, - { 199096, true }, - { 199105, true }, - { 199120, true }, - { 199133, true }, + { 198964, true }, + { 198976, true }, + { 198991, true }, + { 199001, true }, + { 199012, true }, + { 199028, true }, + { 199037, true }, + { 199046, true }, + { 199055, true }, + { 199070, true }, + { 199083, true }, + { 199092, true }, + { 199103, true }, + { 199117, true }, + { 199129, true }, { 199142, true }, - { 199153, true }, - { 199167, true }, - { 199179, true }, - { 199192, true }, - { 199200, true }, - { 199214, true }, - { 199226, true }, - { 199233, true }, - { 199241, true }, - { 199249, true }, - { 199259, true }, - { 199268, true }, - { 199281, true }, - { 199286, true }, - { 199296, true }, - { 199303, true }, - { 199310, true }, - { 199322, false }, - { 199341, true }, - { 199357, true }, - { 199372, true }, - { 199387, true }, - { 199400, true }, - { 199413, true }, - { 199421, true }, - { 199431, true }, - { 199441, true }, - { 199454, true }, - { 199467, true }, - { 199484, true }, - { 199492, true }, - { 199501, true }, - { 199514, true }, - { 199526, true }, - { 199556, true }, + { 199150, true }, + { 199164, true }, + { 199176, true }, + { 199183, true }, + { 199191, true }, + { 199199, true }, + { 199209, true }, + { 199218, true }, + { 199231, true }, + { 199236, true }, + { 199246, true }, + { 199253, true }, + { 199260, true }, + { 199272, false }, + { 199291, true }, + { 199307, true }, + { 199322, true }, + { 199337, true }, + { 199350, true }, + { 199363, true }, + { 199371, true }, + { 199381, true }, + { 199391, true }, + { 199404, true }, + { 199417, true }, + { 199434, true }, + { 199442, true }, + { 199451, true }, + { 199464, true }, + { 199476, true }, + { 199506, true }, + { 199517, true }, + { 199535, true }, + { 199543, true }, { 199567, true }, - { 199585, true }, - { 199593, true }, - { 199617, true }, - { 199627, true }, + { 199577, true }, + { 199589, true }, + { 199600, true }, + { 199612, true }, + { 199630, true }, { 199639, true }, { 199650, true }, { 199662, true }, - { 199680, true }, - { 199689, true }, - { 199700, true }, - { 199712, true }, - { 199720, true }, + { 199670, true }, + { 199677, true }, + { 199685, true }, + { 199696, true }, + { 199706, true }, + { 199715, true }, { 199727, true }, - { 199735, true }, - { 199746, true }, - { 199756, true }, - { 199765, true }, - { 199774, true }, - { 199799, true }, - { 199811, true }, - { 199831, true }, - { 199853, true }, - { 199864, true }, - { 199875, true }, - { 199888, true }, - { 199903, true }, - { 199921, true }, - { 199934, true }, - { 199950, true }, - { 199968, true }, - { 199982, true }, - { 199992, true }, - { 200004, true }, - { 200016, true }, - { 200028, true }, + { 199736, true }, + { 199761, true }, + { 199773, true }, + { 199793, true }, + { 199815, true }, + { 199826, true }, + { 199837, true }, + { 199850, true }, + { 199865, true }, + { 199883, true }, + { 199896, true }, + { 199912, true }, + { 199930, true }, + { 199944, true }, + { 199954, true }, + { 199966, true }, + { 199978, true }, + { 199990, true }, + { 200001, true }, + { 200013, true }, + { 200026, true }, { 200039, true }, { 200051, true }, - { 200064, true }, - { 200077, true }, - { 200089, true }, - { 200101, true }, - { 200112, false }, - { 200122, true }, - { 200133, true }, - { 200148, true }, - { 200161, true }, - { 200172, true }, - { 200182, true }, - { 200196, true }, - { 200208, true }, - { 200224, true }, + { 200063, true }, + { 200074, false }, + { 200084, true }, + { 200095, true }, + { 200110, true }, + { 200123, true }, + { 200134, true }, + { 200144, true }, + { 200158, true }, + { 200170, true }, + { 200186, true }, + { 200201, true }, + { 200214, true }, + { 200226, true }, { 200239, true }, - { 200252, true }, - { 200264, true }, - { 200277, true }, - { 200292, true }, - { 200299, true }, - { 200314, true }, - { 200326, true }, - { 200335, true }, - { 200347, true }, - { 200355, true }, - { 200370, true }, - { 200379, false }, - { 200387, true }, - { 200398, true }, - { 200406, true }, - { 200417, true }, - { 200428, true }, - { 200443, true }, - { 200460, false }, - { 200472, true }, + { 200254, true }, + { 200261, true }, + { 200276, true }, + { 200288, true }, + { 200297, true }, + { 200309, true }, + { 200317, true }, + { 200332, true }, + { 200341, false }, + { 200349, true }, + { 200360, true }, + { 200368, true }, + { 200379, true }, + { 200390, true }, + { 200405, true }, + { 200422, false }, + { 200434, true }, + { 200453, true }, + { 200471, true }, { 200491, true }, - { 200509, true }, - { 200529, true }, + { 200503, true }, + { 200513, true }, + { 200520, true }, + { 200531, true }, { 200541, true }, - { 200551, true }, - { 200558, true }, - { 200569, true }, - { 200579, true }, - { 200585, true }, - { 200595, true }, - { 200610, true }, - { 200622, true }, - { 200634, true }, - { 200645, true }, - { 200658, true }, - { 200682, true }, - { 200689, true }, - { 200700, true }, - { 200711, true }, - { 200729, true }, - { 200742, true }, - { 200757, true }, - { 200773, true }, - { 200784, true }, - { 200800, true }, - { 200824, true }, - { 200839, true }, + { 200547, true }, + { 200557, true }, + { 200572, true }, + { 200584, true }, + { 200596, true }, + { 200607, true }, + { 200620, true }, + { 200644, true }, + { 200651, true }, + { 200662, true }, + { 200673, true }, + { 200691, true }, + { 200704, true }, + { 200719, true }, + { 200735, true }, + { 200746, true }, + { 200762, true }, + { 200786, true }, + { 200801, true }, + { 200811, true }, + { 200819, true }, + { 200838, true }, { 200849, true }, - { 200857, true }, - { 200876, true }, - { 200887, true }, - { 200897, true }, - { 200907, true }, - { 200918, true }, - { 200926, true }, - { 200940, false }, - { 200947, true }, - { 200959, true }, - { 200968, true }, - { 200977, true }, - { 200991, true }, - { 200999, true }, - { 201009, true }, - { 201022, true }, + { 200859, true }, + { 200869, true }, + { 200880, true }, + { 200888, true }, + { 200902, false }, + { 200909, true }, + { 200921, true }, + { 200930, true }, + { 200939, true }, + { 200953, true }, + { 200961, true }, + { 200971, true }, + { 200984, true }, + { 200998, true }, + { 201019, true }, + { 201029, true }, { 201036, true }, + { 201047, true }, { 201057, true }, - { 201067, true }, - { 201074, true }, - { 201085, true }, - { 201095, true }, - { 201108, true }, - { 201116, true }, - { 201125, true }, - { 201138, true }, - { 201151, true }, - { 201162, true }, - { 201172, true }, - { 201181, true }, - { 201191, true }, + { 201070, true }, + { 201078, true }, + { 201087, true }, + { 201100, true }, + { 201113, true }, + { 201124, true }, + { 201134, true }, + { 201143, true }, + { 201153, true }, }; diff --git a/taskcluster/ci/build/linux.yml b/taskcluster/ci/build/linux.yml index cd64413cbc1a..62e60e6ebf59 100644 --- a/taskcluster/ci/build/linux.yml +++ b/taskcluster/ci/build/linux.yml @@ -105,7 +105,7 @@ linux/debug: treeherder: platform: linux32/debug symbol: tc(B) - tier: 2 + tier: 1 worker-type: aws-provisioner-v1/gecko-{level}-b-linux worker: implementation: docker-worker diff --git a/taskcluster/ci/static-analysis/kind.yml b/taskcluster/ci/static-analysis/kind.yml index 806409807dc1..2356bc6342d0 100644 --- a/taskcluster/ci/static-analysis/kind.yml +++ b/taskcluster/ci/static-analysis/kind.yml @@ -73,7 +73,7 @@ jobs: treeherder: platform: windows2012-32/debug symbol: tc(S) - tier: 2 + tier: 1 worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 worker: implementation: generic-worker @@ -92,7 +92,7 @@ jobs: treeherder: platform: windows2012-32/opt symbol: tc(S) - tier: 2 + tier: 1 worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 worker: implementation: generic-worker @@ -111,7 +111,7 @@ jobs: treeherder: platform: windows2012-64/debug symbol: tc(S) - tier: 2 + tier: 1 worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 worker: implementation: generic-worker @@ -130,7 +130,7 @@ jobs: treeherder: platform: windows2012-64/opt symbol: tc(S) - tier: 2 + tier: 1 worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 worker: implementation: generic-worker diff --git a/taskcluster/docker/recipes/ubuntu1604-test-system-setup.sh b/taskcluster/docker/recipes/ubuntu1604-test-system-setup.sh index ac9997051728..97b89d530fdf 100644 --- a/taskcluster/docker/recipes/ubuntu1604-test-system-setup.sh +++ b/taskcluster/docker/recipes/ubuntu1604-test-system-setup.sh @@ -52,6 +52,7 @@ apt_packages+=('llvm') apt_packages+=('llvm-dev') apt_packages+=('llvm-runtime') apt_packages+=('nano') +apt_packages+=('net-tools') apt_packages+=('pulseaudio') apt_packages+=('pulseaudio-module-bluetooth') apt_packages+=('pulseaudio-module-gconf') diff --git a/taskcluster/taskgraph/transforms/task.py b/taskcluster/taskgraph/transforms/task.py index 3bd08aaa5726..d20dcaf765ba 100644 --- a/taskcluster/taskgraph/transforms/task.py +++ b/taskcluster/taskgraph/transforms/task.py @@ -546,8 +546,6 @@ def build_balrog_payload(config, task, task_def): worker = task['worker'] task_def['payload'] = { - # signing cert is unused, but required by balrogworker (Bug 1282187 c#7) - 'signing_cert': "dep", 'upstreamArtifacts': worker['upstream-artifacts'] } diff --git a/testing/web-platform/tests/XMLHttpRequest/resources/corsenabled.py b/testing/web-platform/tests/XMLHttpRequest/resources/corsenabled.py index d61f85d9a1f1..1f0f878f40e0 100644 --- a/testing/web-platform/tests/XMLHttpRequest/resources/corsenabled.py +++ b/testing/web-platform/tests/XMLHttpRequest/resources/corsenabled.py @@ -5,7 +5,7 @@ def main(request, response): ("Access-Control-Allow-Credentials", "true"), ("Access-Control-Allow-Methods", "GET, POST, PUT, FOO"), ("Access-Control-Allow-Headers", "x-test, x-foo"), - ("Access-Control-Expose-Headers", "x-request-method, x-request-content-type, x-request-query, x-request-content-length")] + ("Access-Control-Expose-Headers", "x-request-method, x-request-content-type, x-request-query, x-request-content-length, x-request-data")] if "delay" in request.GET: delay = int(request.GET.first("delay")) @@ -15,5 +15,6 @@ def main(request, response): headers.append(("X-Request-Query", request.url_parts.query if request.url_parts.query else "NO")) headers.append(("X-Request-Content-Length", request.headers.get("Content-Length", "NO"))) headers.append(("X-Request-Content-Type", request.headers.get("Content-Type", "NO"))) + headers.append(("X-Request-Data", request.body)) return headers, "Test" diff --git a/testing/web-platform/tests/XMLHttpRequest/send-redirect-to-cors.htm b/testing/web-platform/tests/XMLHttpRequest/send-redirect-to-cors.htm index f90a01b71f8c..b879ec66aa8f 100644 --- a/testing/web-platform/tests/XMLHttpRequest/send-redirect-to-cors.htm +++ b/testing/web-platform/tests/XMLHttpRequest/send-redirect-to-cors.htm @@ -9,28 +9,60 @@
diff --git a/toolkit/components/browser/nsIWebBrowserChrome3.idl b/toolkit/components/browser/nsIWebBrowserChrome3.idl index d4796187b3f2..fc700dc50411 100644 --- a/toolkit/components/browser/nsIWebBrowserChrome3.idl +++ b/toolkit/components/browser/nsIWebBrowserChrome3.idl @@ -9,6 +9,7 @@ interface nsIDocShell; interface nsIInputStream; interface nsIRunnable; +interface nsIPrincipal; /** * nsIWebBrowserChrome3 is an extension to nsIWebBrowserChrome2. @@ -44,10 +45,13 @@ interface nsIWebBrowserChrome3 : nsIWebBrowserChrome2 * The URI being loaded. * @param aReferrer * The referrer of the load. + * @param aTriggeringPrincipal + * The principal that initiated the load of aURI. */ bool shouldLoadURI(in nsIDocShell aDocShell, in nsIURI aURI, - in nsIURI aReferrer); + in nsIURI aReferrer, + in nsIPrincipal aTriggeringPrincipal); bool shouldLoadURIInThisProcess(in nsIURI aURI); @@ -60,7 +64,8 @@ interface nsIWebBrowserChrome3 : nsIWebBrowserChrome2 */ bool reloadInFreshProcess(in nsIDocShell aDocShell, in nsIURI aURI, - in nsIURI aReferrer); + in nsIURI aReferrer, + in nsIPrincipal aTriggeringPrincipal); /** * Tell the browser to start prerendering the given document. This prerendering diff --git a/toolkit/components/browser/nsWebBrowser.cpp b/toolkit/components/browser/nsWebBrowser.cpp index cae518df204e..cef78d1268c1 100644 --- a/toolkit/components/browser/nsWebBrowser.cpp +++ b/toolkit/components/browser/nsWebBrowser.cpp @@ -653,13 +653,14 @@ nsWebBrowser::LoadURIWithOptions(const char16_t* aURI, uint32_t aLoadFlags, uint32_t aReferrerPolicy, nsIInputStream* aPostDataStream, nsIInputStream* aExtraHeaderStream, - nsIURI* aBaseURI) + nsIURI* aBaseURI, + nsIPrincipal* aTriggeringPrincipal) { NS_ENSURE_STATE(mDocShell); return mDocShellAsNav->LoadURIWithOptions( aURI, aLoadFlags, aReferringURI, aReferrerPolicy, aPostDataStream, - aExtraHeaderStream, aBaseURI); + aExtraHeaderStream, aBaseURI, aTriggeringPrincipal); } NS_IMETHODIMP diff --git a/toolkit/components/remotebrowserutils/RemoteWebNavigation.js b/toolkit/components/remotebrowserutils/RemoteWebNavigation.js index aa7706fee004..e6226db0d8d7 100644 --- a/toolkit/components/remotebrowserutils/RemoteWebNavigation.js +++ b/toolkit/components/remotebrowserutils/RemoteWebNavigation.js @@ -11,6 +11,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Utils", + "resource://gre/modules/sessionstore/Utils.jsm"); function makeURI(url) { return Services.io.newURI(url); @@ -73,7 +75,7 @@ RemoteWebNavigation.prototype = { aPostData, aHeaders, null); }, loadURIWithOptions(aURI, aLoadFlags, aReferrer, aReferrerPolicy, - aPostData, aHeaders, aBaseURI) { + aPostData, aHeaders, aBaseURI, aTriggeringPrincipal) { this._sendMessage("WebNavigation:LoadURI", { uri: aURI, flags: aLoadFlags, @@ -82,6 +84,9 @@ RemoteWebNavigation.prototype = { postData: aPostData ? readInputStreamToString(aPostData) : null, headers: aHeaders ? readInputStreamToString(aHeaders) : null, baseURI: aBaseURI ? aBaseURI.spec : null, + triggeringPrincipal: aTriggeringPrincipal + ? Utils.serializePrincipal(aTriggeringPrincipal) + : null, }); }, setOriginAttributesBeforeLoading(aOriginAttributes) { diff --git a/toolkit/content/browser-child.js b/toolkit/content/browser-child.js index 88c73f4d1151..78d30a21a24b 100644 --- a/toolkit/content/browser-child.js +++ b/toolkit/content/browser-child.js @@ -17,6 +17,9 @@ Cu.import("resource://gre/modules/Timer.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "PageThumbUtils", "resource://gre/modules/PageThumbUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Utils", + "resource://gre/modules/sessionstore/Utils.jsm"); + if (AppConstants.MOZ_CRASHREPORTER) { XPCOMUtils.defineLazyServiceGetter(this, "CrashReporter", "@mozilla.org/xre/app-info;1", @@ -269,7 +272,7 @@ var WebNavigation = { this.loadURI(message.data.uri, message.data.flags, message.data.referrer, message.data.referrerPolicy, message.data.postData, message.data.headers, - message.data.baseURI); + message.data.baseURI, message.data.triggeringPrincipal); break; case "WebNavigation:SetOriginAttributes": this.setOriginAttributes(message.data.originAttributes); @@ -309,7 +312,7 @@ var WebNavigation = { this._wrapURIChangeCall(() => this.webNavigation.gotoIndex(index)); }, - loadURI(uri, flags, referrer, referrerPolicy, postData, headers, baseURI) { + loadURI(uri, flags, referrer, referrerPolicy, postData, headers, baseURI, triggeringPrincipal) { if (AppConstants.MOZ_CRASHREPORTER && CrashReporter.enabled) { let annotation = uri; try { @@ -329,9 +332,11 @@ var WebNavigation = { headers = makeInputStream(headers); if (baseURI) baseURI = Services.io.newURI(baseURI); + if (triggeringPrincipal) + triggeringPrincipal = Utils.deserializePrincipal(triggeringPrincipal) this._wrapURIChangeCall(() => { return this.webNavigation.loadURIWithOptions(uri, flags, referrer, referrerPolicy, - postData, headers, baseURI); + postData, headers, baseURI, triggeringPrincipal); }); }, diff --git a/toolkit/library/xulrunner.rc b/toolkit/library/xulrunner.rc index 5dbb8de8a3d9..c3ea6a4d54e8 100755 --- a/toolkit/library/xulrunner.rc +++ b/toolkit/library/xulrunner.rc @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "mozilla-config.h" #include "widget.rc" #ifdef ACCESSIBILITY 1 typelib IGeckoCustom.tlb diff --git a/widget/android/AndroidUiThread.cpp b/widget/android/AndroidUiThread.cpp index 8d218fdb6c98..cba59064940c 100644 --- a/widget/android/AndroidUiThread.cpp +++ b/widget/android/AndroidUiThread.cpp @@ -5,6 +5,7 @@ #include "AndroidBridge.h" #include "base/message_loop.h" +#include "mozilla/Atomics.h" #include "mozilla/Monitor.h" #include "mozilla/RefPtr.h" #include "mozilla/StaticPtr.h" @@ -20,8 +21,7 @@ class AndroidUiThread; StaticRefPtr sThread; static MessageLoop* sMessageLoop; -static Monitor* sMessageLoopAccessMonitor; -static bool sInitialized = false; +static Atomic sMessageLoopAccessMonitor; /* * The AndroidUiThread is derived from nsThread so that nsIRunnable objects that get @@ -120,7 +120,6 @@ public: NS_IMETHOD Run() override { MOZ_ASSERT(sMessageLoopAccessMonitor); MonitorAutoLock lock(*sMessageLoopAccessMonitor); - sThread = new AndroidUiThread(); sThread->InitCurrentThread(); sThread->SetObserver(new ThreadObserver()); @@ -169,23 +168,19 @@ namespace mozilla { void CreateAndroidUiThread() { - MOZ_ASSERT(!sInitialized); MOZ_ASSERT(!sThread); MOZ_ASSERT(!sMessageLoopAccessMonitor); sMessageLoopAccessMonitor = new Monitor("AndroidUiThreadMessageLoopAccessMonitor"); RefPtr runnable = new CreateOnUiThread; AndroidBridge::Bridge()->PostTaskToUiThread(do_AddRef(runnable), 0); - sInitialized = true; } void DestroyAndroidUiThread() { - MOZ_ASSERT(sInitialized); MOZ_ASSERT(sThread); // Insure the Android bridge has not already been deconstructed. MOZ_ASSERT(AndroidBridge::Bridge() != nullptr); - sInitialized = false; RefPtr runnable = new DestroyOnUiThread; AndroidBridge::Bridge()->PostTaskToUiThread(do_AddRef(runnable), 0); runnable->WaitForDestruction(); @@ -196,16 +191,13 @@ DestroyAndroidUiThread() MessageLoop* GetAndroidUiThreadMessageLoop() { - if (!sInitialized) { + if (!sMessageLoopAccessMonitor) { return nullptr; } - if (!sMessageLoop) { - MOZ_ASSERT(sMessageLoopAccessMonitor); - MonitorAutoLock lock(*sMessageLoopAccessMonitor); - while (!sMessageLoop) { - lock.Wait(); - } + MonitorAutoLock lock(*sMessageLoopAccessMonitor); + while (!sMessageLoop) { + lock.Wait(); } return sMessageLoop; @@ -214,16 +206,13 @@ GetAndroidUiThreadMessageLoop() RefPtr GetAndroidUiThread() { - if (!sInitialized) { + if (!sMessageLoopAccessMonitor) { return nullptr; } - if (!sThread) { - MOZ_ASSERT(sMessageLoopAccessMonitor); - MonitorAutoLock lock(*sMessageLoopAccessMonitor); - while (!sThread) { - lock.Wait(); - } + MonitorAutoLock lock(*sMessageLoopAccessMonitor); + while (!sThread) { + lock.Wait(); } return sThread; diff --git a/widget/android/GeneratedJNIWrappers.cpp b/widget/android/GeneratedJNIWrappers.cpp index 738bbc1f2ec6..da8ca04ac45d 100644 --- a/widget/android/GeneratedJNIWrappers.cpp +++ b/widget/android/GeneratedJNIWrappers.cpp @@ -1310,77 +1310,6 @@ auto NativePanZoomController::UpdateOverscrollVelocity(float a0, float a1) const return mozilla::jni::Method::Call(NativePanZoomController::mCtx, nullptr, a0, a1); } -const char ProgressiveUpdateData::name[] = - "org/mozilla/gecko/gfx/ProgressiveUpdateData"; - -constexpr char ProgressiveUpdateData::New_t::name[]; -constexpr char ProgressiveUpdateData::New_t::signature[]; - -auto ProgressiveUpdateData::New() -> ProgressiveUpdateData::LocalRef -{ - return mozilla::jni::Constructor::Call(ProgressiveUpdateData::Context(), nullptr); -} - -constexpr char ProgressiveUpdateData::SetViewport_t::name[]; -constexpr char ProgressiveUpdateData::SetViewport_t::signature[]; - -auto ProgressiveUpdateData::SetViewport(mozilla::jni::Object::Param a0) const -> void -{ - return mozilla::jni::Method::Call(ProgressiveUpdateData::mCtx, nullptr, a0); -} - -constexpr char ProgressiveUpdateData::Abort_t::name[]; -constexpr char ProgressiveUpdateData::Abort_t::signature[]; - -auto ProgressiveUpdateData::Abort() const -> bool -{ - return mozilla::jni::Field::Get(ProgressiveUpdateData::mCtx, nullptr); -} - -auto ProgressiveUpdateData::Abort(bool a0) const -> void -{ - return mozilla::jni::Field::Set(ProgressiveUpdateData::mCtx, nullptr, a0); -} - -constexpr char ProgressiveUpdateData::Scale_t::name[]; -constexpr char ProgressiveUpdateData::Scale_t::signature[]; - -auto ProgressiveUpdateData::Scale() const -> float -{ - return mozilla::jni::Field::Get(ProgressiveUpdateData::mCtx, nullptr); -} - -auto ProgressiveUpdateData::Scale(float a0) const -> void -{ - return mozilla::jni::Field::Set(ProgressiveUpdateData::mCtx, nullptr, a0); -} - -constexpr char ProgressiveUpdateData::X_t::name[]; -constexpr char ProgressiveUpdateData::X_t::signature[]; - -auto ProgressiveUpdateData::X() const -> float -{ - return mozilla::jni::Field::Get(ProgressiveUpdateData::mCtx, nullptr); -} - -auto ProgressiveUpdateData::X(float a0) const -> void -{ - return mozilla::jni::Field::Set(ProgressiveUpdateData::mCtx, nullptr, a0); -} - -constexpr char ProgressiveUpdateData::Y_t::name[]; -constexpr char ProgressiveUpdateData::Y_t::signature[]; - -auto ProgressiveUpdateData::Y() const -> float -{ - return mozilla::jni::Field::Get(ProgressiveUpdateData::mCtx, nullptr); -} - -auto ProgressiveUpdateData::Y(float a0) const -> void -{ - return mozilla::jni::Field::Set(ProgressiveUpdateData::mCtx, nullptr, a0); -} - const char StackScroller::name[] = "org/mozilla/gecko/gfx/StackScroller"; diff --git a/widget/android/GeneratedJNIWrappers.h b/widget/android/GeneratedJNIWrappers.h index 8fe56900d2d3..4058ee67895e 100644 --- a/widget/android/GeneratedJNIWrappers.h +++ b/widget/android/GeneratedJNIWrappers.h @@ -4172,141 +4172,6 @@ public: template class Natives; }; -class ProgressiveUpdateData : public mozilla::jni::ObjectBase -{ -public: - static const char name[]; - - explicit ProgressiveUpdateData(const Context& ctx) : ObjectBase(ctx) {} - - struct New_t { - typedef ProgressiveUpdateData Owner; - typedef ProgressiveUpdateData::LocalRef ReturnType; - typedef ProgressiveUpdateData::Param SetterType; - typedef mozilla::jni::Args<> Args; - static constexpr char name[] = ""; - static constexpr char signature[] = - "()V"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - static auto New() -> ProgressiveUpdateData::LocalRef; - - struct SetViewport_t { - typedef ProgressiveUpdateData Owner; - typedef void ReturnType; - typedef void SetterType; - typedef mozilla::jni::Args< - mozilla::jni::Object::Param> Args; - static constexpr char name[] = "setViewport"; - static constexpr char signature[] = - "(Lorg/mozilla/gecko/gfx/ImmutableViewportMetrics;)V"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto SetViewport(mozilla::jni::Object::Param) const -> void; - - struct Abort_t { - typedef ProgressiveUpdateData Owner; - typedef bool ReturnType; - typedef bool SetterType; - typedef mozilla::jni::Args<> Args; - static constexpr char name[] = "abort"; - static constexpr char signature[] = - "Z"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto Abort() const -> bool; - - auto Abort(bool) const -> void; - - struct Scale_t { - typedef ProgressiveUpdateData Owner; - typedef float ReturnType; - typedef float SetterType; - typedef mozilla::jni::Args<> Args; - static constexpr char name[] = "scale"; - static constexpr char signature[] = - "F"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto Scale() const -> float; - - auto Scale(float) const -> void; - - struct X_t { - typedef ProgressiveUpdateData Owner; - typedef float ReturnType; - typedef float SetterType; - typedef mozilla::jni::Args<> Args; - static constexpr char name[] = "x"; - static constexpr char signature[] = - "F"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto X() const -> float; - - auto X(float) const -> void; - - struct Y_t { - typedef ProgressiveUpdateData Owner; - typedef float ReturnType; - typedef float SetterType; - typedef mozilla::jni::Args<> Args; - static constexpr char name[] = "y"; - static constexpr char signature[] = - "F"; - static const bool isStatic = false; - static const mozilla::jni::ExceptionMode exceptionMode = - mozilla::jni::ExceptionMode::ABORT; - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - static const mozilla::jni::DispatchTarget dispatchTarget = - mozilla::jni::DispatchTarget::CURRENT; - }; - - auto Y() const -> float; - - auto Y(float) const -> void; - - static const mozilla::jni::CallingThread callingThread = - mozilla::jni::CallingThread::ANY; - -}; - class StackScroller : public mozilla::jni::ObjectBase { public: diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp index af666c7094f4..8e2868dd4459 100644 --- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -2210,7 +2210,7 @@ nsBaseWidget::CreateScrollCaptureContainer() return ImageContainer::sInvalidAsyncContainerId; } - return mScrollCaptureContainer->GetAsyncContainerID(); + return mScrollCaptureContainer->GetAsyncContainerHandle().Value(); } void diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index 8950dcf90f67..e4224e127464 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -1118,7 +1118,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType, case NS_THEME_MENULIST: { nsIContent* content = aFrame->GetContent(); bool isHTML = content && content->IsHTMLElement(); - bool useDropBorder = isHTML || IsMenuListEditable(aFrame); + bool isChrome = aFrame->GetContent()->IsInChromeDocument(); + bool useDropBorder = isHTML || (isChrome && IsMenuListEditable(aFrame)); EventStates eventState = GetContentState(aFrame, aWidgetType); /* On Vista/Win7, we use CBP_DROPBORDER instead of DROPFRAME for HTML @@ -1179,7 +1180,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType, else isOpen = IsOpenButton(aFrame); - if (isHTML || IsMenuListEditable(aFrame)) { + bool isChrome = aFrame->GetContent()->IsInChromeDocument(); + if (isHTML || (isChrome && IsMenuListEditable(aFrame))) { if (isOpen) { /* Hover is propagated, but we need to know whether we're hovering * just the combobox frame, not the dropdown frame. But, we can't get diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 07e5e0d62654..561322d23a19 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -1424,12 +1424,12 @@ nsWindow::CreateScrollSnapshot() } HDC windowDC = ::GetDC(mWnd); - auto releaseDC = MakeScopeExit([&] { - ::ReleaseDC(mWnd, windowDC); - }); if (!windowDC) { return GetFallbackScrollSnapshot(clip); } + auto releaseDC = MakeScopeExit([&] { + ::ReleaseDC(mWnd, windowDC); + }); gfx::IntSize snapshotSize(mBounds.width, mBounds.height); ScrollSnapshot* snapshot; diff --git a/xpfe/appshell/nsContentTreeOwner.cpp b/xpfe/appshell/nsContentTreeOwner.cpp index 832d3e2a542e..bacb5f52a703 100644 --- a/xpfe/appshell/nsContentTreeOwner.cpp +++ b/xpfe/appshell/nsContentTreeOwner.cpp @@ -391,6 +391,7 @@ NS_IMETHODIMP nsContentTreeOwner::OnBeforeLinkTraversal(const nsAString &origina NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell, nsIURI *aURI, nsIURI *aReferrer, + nsIPrincipal* aTriggeringPrincipal, bool *_retval) { NS_ENSURE_STATE(mXULWindow); @@ -399,7 +400,8 @@ NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell, mXULWindow->GetXULBrowserWindow(getter_AddRefs(xulBrowserWindow)); if (xulBrowserWindow) - return xulBrowserWindow->ShouldLoadURI(aDocShell, aURI, aReferrer, _retval); + return xulBrowserWindow->ShouldLoadURI(aDocShell, aURI, aReferrer, + aTriggeringPrincipal, _retval); *_retval = true; return NS_OK; @@ -416,6 +418,7 @@ NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURIInThisProcess(nsIURI* aURI, NS_IMETHODIMP nsContentTreeOwner::ReloadInFreshProcess(nsIDocShell* aDocShell, nsIURI* aURI, nsIURI* aReferrer, + nsIPrincipal* aTriggeringPrincipal, bool* aRetVal) { NS_WARNING("Cannot reload in fresh process from a nsContentTreeOwner!"); diff --git a/xpfe/appshell/nsIXULBrowserWindow.idl b/xpfe/appshell/nsIXULBrowserWindow.idl index 155634b1038f..64bfe001160f 100644 --- a/xpfe/appshell/nsIXULBrowserWindow.idl +++ b/xpfe/appshell/nsIXULBrowserWindow.idl @@ -14,6 +14,7 @@ interface nsIDOMElement; interface nsIInputStream; interface nsIDocShell; interface nsITabParent; +interface nsIPrincipal; interface mozIDOMWindowProxy; /** @@ -60,10 +61,13 @@ interface nsIXULBrowserWindow : nsISupports * The URI being loaded. * @param aReferrer * The referrer of the load. + * @param aTriggeringPrincipal + * The principal that initiated the load of aURI. */ bool shouldLoadURI(in nsIDocShell aDocShell, in nsIURI aURI, - in nsIURI aReferrer); + in nsIURI aReferrer, + in nsIPrincipal aTriggeringPrincipal); /** * Show/hide a tooltip (when the user mouses over a link, say). */