diff --git a/addon-sdk/source/app-extension/bootstrap.js b/addon-sdk/source/app-extension/bootstrap.js index e31c75f84c4f..49d0f97373e7 100644 --- a/addon-sdk/source/app-extension/bootstrap.js +++ b/addon-sdk/source/app-extension/bootstrap.js @@ -50,7 +50,15 @@ function setResourceSubstitution(domain, uri) { function readURI(uri) { let ioservice = Cc['@mozilla.org/network/io-service;1']. getService(Ci.nsIIOService); - let channel = ioservice.newChannel(uri, 'UTF-8', null); + + let channel = ioservice.newChannel2(uri, + 'UTF-8', + null, + null, // aLoadingNode + systemPrincipal, + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let stream = channel.open(); let cstream = Cc['@mozilla.org/intl/converter-input-stream;1']. diff --git a/addon-sdk/source/lib/sdk/io/data.js b/addon-sdk/source/lib/sdk/io/data.js index fcb8b5cfa578..57e80f2ce77f 100644 --- a/addon-sdk/source/lib/sdk/io/data.js +++ b/addon-sdk/source/lib/sdk/io/data.js @@ -15,6 +15,7 @@ const IOService = Cc["@mozilla.org/network/io-service;1"]. const { deprecateFunction } = require('../util/deprecate'); const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm"); +const { Services } = Cu.import("resource://gre/modules/Services.jsm"); const FaviconService = Cc["@mozilla.org/browser/favicon-service;1"]. getService(Ci.nsIFaviconService); @@ -51,7 +52,14 @@ exports.getFaviconURIForLocation = getFaviconURIForLocation; * @returns {String} */ function getChromeURIContent(chromeURI) { - let channel = IOService.newChannel(chromeURI, null, null); + let channel = IOService.newChannel2(chromeURI, + null, + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let input = channel.open(); let stream = Cc["@mozilla.org/binaryinputstream;1"]. createInstance(Ci.nsIBinaryInputStream); diff --git a/addon-sdk/source/lib/sdk/net/url.js b/addon-sdk/source/lib/sdk/net/url.js index 9ee6f47909b7..84f19c6d5f47 100644 --- a/addon-sdk/source/lib/sdk/net/url.js +++ b/addon-sdk/source/lib/sdk/net/url.js @@ -8,11 +8,13 @@ module.metadata = { "stability": "experimental" }; -const { Cu, components } = require("chrome"); +const { Ci, Cu, components } = require("chrome"); + const { defer } = require("../core/promise"); const { merge } = require("../util/object"); const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {}); +const { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); /** * Reads a URI and returns a promise. @@ -33,12 +35,19 @@ function readURI(uri, options) { options = options || {}; let charset = options.charset || 'UTF-8'; - let channel = NetUtil.newChannel(uri, charset, null); + let channel = NetUtil.newChannel2(uri, + charset, + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let { promise, resolve, reject } = defer(); try { - NetUtil.asyncFetch(channel, function (stream, result) { + NetUtil.asyncFetch2(channel, function (stream, result) { if (components.isSuccessCode(result)) { let count = stream.available(); let data = NetUtil.readInputStreamToString(stream, count, { charset : charset }); @@ -74,7 +83,14 @@ exports.readURI = readURI; function readURISync(uri, charset) { charset = typeof charset === "string" ? charset : "UTF-8"; - let channel = NetUtil.newChannel(uri, charset, null); + let channel = NetUtil.newChannel2(uri, + charset, + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let stream = channel.open(); let count = stream.available(); diff --git a/addon-sdk/source/lib/sdk/test/tmp-file.js b/addon-sdk/source/lib/sdk/test/tmp-file.js index 634d2f1bf317..a055c661bf5d 100644 --- a/addon-sdk/source/lib/sdk/test/tmp-file.js +++ b/addon-sdk/source/lib/sdk/test/tmp-file.js @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -const { Cc, Ci } = require("chrome"); +const { Cc, Ci, Cu } = require("chrome"); const system = require("sdk/system"); const file = require("sdk/io/file"); @@ -12,6 +12,8 @@ const unload = require("sdk/system/unload"); // Retrieve the path to the OS temporary directory: const tmpDir = require("sdk/system").pathFor("TmpD"); +const { Services } = Cu.import("resource://gre/modules/Services.jsm"); + // List of all tmp file created let files = []; @@ -33,7 +35,14 @@ unload.when(function () { // `uri` and returns content string. Read in binary mode. function readBinaryURI(uri) { let ioservice = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); - let channel = ioservice.newChannel(uri, "UTF-8", null); + let channel = ioservice.newChannel2(uri, + "UTF-8", + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let stream = Cc["@mozilla.org/binaryinputstream;1"]. createInstance(Ci.nsIBinaryInputStream); stream.setInputStream(channel.open()); diff --git a/addon-sdk/source/lib/sdk/url.js b/addon-sdk/source/lib/sdk/url.js index 9cbc3a0cd725..7bcf00e549d4 100644 --- a/addon-sdk/source/lib/sdk/url.js +++ b/addon-sdk/source/lib/sdk/url.js @@ -7,7 +7,7 @@ module.metadata = { "stability": "experimental" }; -const { Cc, Ci, Cr } = require("chrome"); +const { Cc, Ci, Cr, Cu } = require("chrome"); const { Class } = require("./core/heritage"); const base64 = require("./base64"); @@ -23,6 +23,8 @@ var resProt = ios.getProtocolHandler("resource") var URLParser = Cc["@mozilla.org/network/url-parser;1?auth=no"] .getService(Ci.nsIURLParser); +const { Services } = Cu.import("resource://gre/modules/Services.jsm"); + function newURI(uriStr, base) { try { let baseURI = base ? ios.newURI(base, null, null) : null; @@ -64,7 +66,12 @@ let toFilename = exports.toFilename = function toFilename(url) { if (uri.scheme == "resource") uri = newURI(resolveResourceURI(uri)); if (uri.scheme == "chrome") { - var channel = ios.newChannelFromURI(uri); + var channel = ios.newChannelFromURI2(uri, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); try { channel = channel.QueryInterface(Ci.nsIFileChannel); return channel.file.path; diff --git a/addon-sdk/source/lib/toolkit/loader.js b/addon-sdk/source/lib/toolkit/loader.js index 049aa8d230f2..70a89b1c46f4 100644 --- a/addon-sdk/source/lib/toolkit/loader.js +++ b/addon-sdk/source/lib/toolkit/loader.js @@ -172,7 +172,14 @@ function serializeStack(frames) { exports.serializeStack = serializeStack; function readURI(uri) { - let stream = NetUtil.newChannel(uri, 'UTF-8', null).open(); + let stream = NetUtil.newChannel2(uri, + 'UTF-8', + null, + null, // aLoadingNode + systemPrincipal, + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER).open(); let count = stream.available(); let data = NetUtil.readInputStreamToString(stream, count, { charset: 'UTF-8' diff --git a/addon-sdk/source/test/addons/l10n-properties/app-extension/bootstrap.js b/addon-sdk/source/test/addons/l10n-properties/app-extension/bootstrap.js index 6bb014a13970..7ed453f031ee 100644 --- a/addon-sdk/source/test/addons/l10n-properties/app-extension/bootstrap.js +++ b/addon-sdk/source/test/addons/l10n-properties/app-extension/bootstrap.js @@ -26,6 +26,7 @@ const appInfo = Cc["@mozilla.org/xre/app-info;1"]. const vc = Cc["@mozilla.org/xpcom/version-comparator;1"]. getService(Ci.nsIVersionComparator); +const { Services } = Cu.import("resource://gre/modules/Services.jsm"); const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'disable', 'install', 'uninstall', 'upgrade', 'downgrade' ]; @@ -42,7 +43,14 @@ let nukeTimer = null; function readURI(uri) { let ioservice = Cc['@mozilla.org/network/io-service;1']. getService(Ci.nsIIOService); - let channel = ioservice.newChannel(uri, 'UTF-8', null); + let channel = ioservice.newChannel2(uri, + 'UTF-8', + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let stream = channel.open(); let cstream = Cc['@mozilla.org/intl/converter-input-stream;1']. diff --git a/addon-sdk/source/test/addons/simple-prefs-regression/app-extension/bootstrap.js b/addon-sdk/source/test/addons/simple-prefs-regression/app-extension/bootstrap.js index 6bb014a13970..7ed453f031ee 100644 --- a/addon-sdk/source/test/addons/simple-prefs-regression/app-extension/bootstrap.js +++ b/addon-sdk/source/test/addons/simple-prefs-regression/app-extension/bootstrap.js @@ -26,6 +26,7 @@ const appInfo = Cc["@mozilla.org/xre/app-info;1"]. const vc = Cc["@mozilla.org/xpcom/version-comparator;1"]. getService(Ci.nsIVersionComparator); +const { Services } = Cu.import("resource://gre/modules/Services.jsm"); const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'disable', 'install', 'uninstall', 'upgrade', 'downgrade' ]; @@ -42,7 +43,14 @@ let nukeTimer = null; function readURI(uri) { let ioservice = Cc['@mozilla.org/network/io-service;1']. getService(Ci.nsIIOService); - let channel = ioservice.newChannel(uri, 'UTF-8', null); + let channel = ioservice.newChannel2(uri, + 'UTF-8', + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); let stream = channel.open(); let cstream = Cc['@mozilla.org/intl/converter-input-stream;1']. diff --git a/addon-sdk/source/test/test-private-browsing.js b/addon-sdk/source/test/test-private-browsing.js index c1d192605145..0e5754ef87b4 100644 --- a/addon-sdk/source/test/test-private-browsing.js +++ b/addon-sdk/source/test/test-private-browsing.js @@ -66,7 +66,14 @@ exports.testIsPrivateBrowsingFalseDefault = function(assert) { }; exports.testNSIPrivateBrowsingChannel = function(assert) { - let channel = Services.io.newChannel("about:blank", null, null); + let channel = Services.io.newChannel2("about:blank", + null, + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); channel.QueryInterface(Ci.nsIPrivateBrowsingChannel); assert.equal(isPrivate(channel), false, 'isPrivate detects non-private channels'); channel.setPrivate(true); diff --git a/addon-sdk/source/test/test-xpcom.js b/addon-sdk/source/test/test-xpcom.js index 17c7f1cd3781..38e42a4283c9 100644 --- a/addon-sdk/source/test/test-xpcom.js +++ b/addon-sdk/source/test/test-xpcom.js @@ -132,10 +132,15 @@ function testRegister(assert, text) { var ios = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService); - var channel = ios.newChannel( + var channel = ios.newChannel2( "data:text/plain;charset=utf-8," + text, null, - null + null, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER ); channel.originalURI = aURI; @@ -162,7 +167,12 @@ function testRegister(assert, text) { ); var aboutURI = ios.newURI("about:boop", null, null); - var channel = ios.newChannelFromURI(aboutURI); + var channel = ios.newChannelFromURI2(aboutURI, + null, // aLoadingNode + Services.scriptSecurityManager.getSystemPrincipal(), + null, // aTriggeringPrincipal + Ci.nsILoadInfo.SEC_NORMAL, + Ci.nsIContentPolicy.TYPE_OTHER); var iStream = channel.open(); var siStream = Cc['@mozilla.org/scriptableinputstream;1'] .createInstance(Ci.nsIScriptableInputStream); diff --git a/b2g/config/dolphin/sources.xml b/b2g/config/dolphin/sources.xml index a6a898ff452d..85eb0d4fc0fd 100644 --- a/b2g/config/dolphin/sources.xml +++ b/b2g/config/dolphin/sources.xml @@ -15,7 +15,7 @@ - + @@ -116,10 +116,10 @@ - + - + diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index e9efaa2d0f81..614d379cd3c1 100644 --- a/b2g/config/emulator-ics/sources.xml +++ b/b2g/config/emulator-ics/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/emulator-jb/sources.xml b/b2g/config/emulator-jb/sources.xml index 113e1ce03a18..b3222e173a39 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + @@ -118,10 +118,10 @@ - + - + diff --git a/b2g/config/emulator-kk/sources.xml b/b2g/config/emulator-kk/sources.xml index a8ab6ca8e9b7..1c0a91f94305 100644 --- a/b2g/config/emulator-kk/sources.xml +++ b/b2g/config/emulator-kk/sources.xml @@ -15,7 +15,7 @@ - + @@ -116,10 +116,10 @@ - + - + @@ -130,9 +130,9 @@ - + - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index e9efaa2d0f81..614d379cd3c1 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/flame-kk/sources.xml b/b2g/config/flame-kk/sources.xml index 362354ee3442..a596005808d1 100644 --- a/b2g/config/flame-kk/sources.xml +++ b/b2g/config/flame-kk/sources.xml @@ -15,7 +15,7 @@ - + @@ -111,9 +111,9 @@ - + - + diff --git a/b2g/config/flame/sources.xml b/b2g/config/flame/sources.xml index bf2a145ee857..6580ceb85654 100644 --- a/b2g/config/flame/sources.xml +++ b/b2g/config/flame/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index ff7dcdf1b2d1..cf56aaaae702 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,9 +1,9 @@ { "git": { - "git_revision": "cba2f0bf49b882e0044c3cc583de8fcf83d2ffa4", + "git_revision": "2535321f1bd55e68fd52291b193693a8995f8e62", "remote": "https://git.mozilla.org/releases/gaia.git", "branch": "" }, - "revision": "23474274d441d400d43cdec6eaef41ff23443d80", + "revision": "885e5176711ceb1401648c571a1a9290325582e7", "repo_path": "integration/gaia-central" } diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index e2c8c5601bb8..336a07b86e9d 100644 --- a/b2g/config/hamachi/sources.xml +++ b/b2g/config/hamachi/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/helix/sources.xml b/b2g/config/helix/sources.xml index 97326eeebf7e..dcd9fcc1db4b 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/nexus-4/sources.xml b/b2g/config/nexus-4/sources.xml index 45973d8ab854..ea5656317402 100644 --- a/b2g/config/nexus-4/sources.xml +++ b/b2g/config/nexus-4/sources.xml @@ -17,7 +17,7 @@ - + @@ -118,10 +118,10 @@ - + - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 5740f927786b..cdaf68da438b 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index a39795297dca..f6395019d68d 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1182,6 +1182,12 @@ pref("browser.tabs.remote.desktopbehavior", true); // This will require a restart. pref("security.sandbox.windows.log", false); +// Controls whether the Windows NPAPI plugin process is sandboxed by default. +// To get a different setting for a particular plugin replace "default", with +// the plugin's nice file name, see: nsPluginTag::GetNiceFileName. +pref("dom.ipc.plugins.sandbox.default", false); +pref("dom.ipc.plugins.sandbox.flash", false); + #if defined(MOZ_CONTENT_SANDBOX) // This controls whether the Windows content process sandbox is using a more // strict sandboxing policy. This will require a restart. @@ -1803,7 +1809,14 @@ pref("dom.ipc.cpow.timeout", 500); // Enable e10s hang monitoring (slow script checking and plugin hang // detection). pref("dom.ipc.processHangMonitor", true); + +#ifdef DEBUG +// Don't report hangs in DEBUG builds. They're too slow and often a +// debugger is attached. +pref("dom.ipc.reportProcessHangs", false); +#else pref("dom.ipc.reportProcessHangs", true); +#endif // Disable reader mode by default. pref("reader.parse-on-load.enabled", false); diff --git a/browser/base/content/test/general/test_contextmenu.html b/browser/base/content/test/general/test_contextmenu.html index fe121736378b..5af25c22acd9 100644 --- a/browser/base/content/test/general/test_contextmenu.html +++ b/browser/base/content/test/general/test_contextmenu.html @@ -653,7 +653,7 @@ function runTest(testNum) { "context-cut", false, "context-copy", false, "context-paste", null, // ignore clipboard state - "context-delete", false, + "context-delete", true, "---", null, "context-selectall", true, "---", null, diff --git a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js index 3da766b71586..eecb9e9556d8 100644 --- a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js +++ b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js @@ -9,7 +9,7 @@ Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); var stringBundle = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService) .createBundle("chrome://browser/locale/aboutPrivateBrowsing.properties"); -if (!PrivateBrowsingUtils.isWindowPrivate(window)) { +if (!PrivateBrowsingUtils.isContentWindowPrivate(window)) { document.title = stringBundle.GetStringFromName("title.normal"); setFavIcon("chrome://global/skin/icons/question-16.png"); } else { @@ -34,7 +34,7 @@ function setFavIcon(url) { } document.addEventListener("DOMContentLoaded", function () { - if (!PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!PrivateBrowsingUtils.isContentWindowPrivate(window)) { document.body.setAttribute("class", "normal"); } diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js index 0d28704a934b..0d30f024663b 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js @@ -23,7 +23,7 @@ add_task(function*() { let {toolbox, inspector, view} = yield openRuleView(); let value = getRuleViewProperty(view, "body", "background").valueSpan; - let swatch = value.querySelector(".ruleview-colorswatch"); + let swatch = value.querySelectorAll(".ruleview-colorswatch")[1]; let url = value.querySelector(".theme-link"); yield testImageTooltipAfterColorChange(swatch, url, view); }); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_pseudo-element_01.js b/browser/devtools/styleinspector/test/browser_ruleview_pseudo-element_01.js index 64ae322ff19a..6050f76f10a3 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_pseudo-element_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_pseudo-element_01.js @@ -167,7 +167,7 @@ function* testParagraph(inspector, view) { is ( convertTextPropsToString(elementFirstLineRule.textProps), - "background: none repeat scroll 0% 0% blue", + "background: blue none repeat scroll 0% 0%", "Paragraph first-line properties are correct" ); @@ -191,7 +191,7 @@ function* testParagraph(inspector, view) { is ( convertTextPropsToString(elementSelectionRule.textProps), - "color: white; background: none repeat scroll 0% 0% black", + "color: white; background: black none repeat scroll 0% 0%", "Paragraph first-letter properties are correct" ); } @@ -244,4 +244,4 @@ function assertGutters(view) { is (gutters[2].textContent, "Inherited from body", "Gutter heading is correct"); return gutters; -} \ No newline at end of file +} diff --git a/browser/devtools/styleinspector/test/browser_ruleview_refresh-on-attribute-change_02.js b/browser/devtools/styleinspector/test/browser_ruleview_refresh-on-attribute-change_02.js index 1b9c1311ea4a..26017aac438b 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_refresh-on-attribute-change_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_refresh-on-attribute-change_02.js @@ -96,14 +96,14 @@ function* testPropertyChange5(inspector, ruleView, testElement) { function* testPropertyChange6(inspector, ruleView, testElement) { info("Add an entirely new property again"); - yield changeElementStyle(testElement, "background: url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0% red", inspector); + yield changeElementStyle(testElement, "background: red url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0%", inspector); let rule = ruleView._elementStyle.rules[0]; is(rule.editor.element.querySelectorAll(".ruleview-property").length, 5, "Added a property"); validateTextProp(rule.textProps[4], true, "background", - "url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0% red", + "red url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0%", "shortcut property correctly set", - "url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0% #F00"); + "#F00 url(\"chrome://branding/content/about-logo.png\") repeat scroll 0% 0%"); } function* changeElementStyle(testElement, style, inspector) { diff --git a/build/clang-plugin/clang-plugin.cpp b/build/clang-plugin/clang-plugin.cpp index c6e1e7ec1e05..455d3e2d06f7 100644 --- a/build/clang-plugin/clang-plugin.cpp +++ b/build/clang-plugin/clang-plugin.cpp @@ -74,12 +74,18 @@ private: virtual void run(const MatchFinder::MatchResult &Result); }; + class NoAddRefReleaseOnReturnChecker : public MatchFinder::MatchCallback { + public: + virtual void run(const MatchFinder::MatchResult &Result); + }; + ScopeChecker stackClassChecker; ScopeChecker globalClassChecker; NonHeapClassChecker nonheapClassChecker; ArithmeticArgChecker arithmeticArgChecker; TrivialCtorDtorChecker trivialCtorDtorChecker; NaNExprChecker nanExprChecker; + NoAddRefReleaseOnReturnChecker noAddRefReleaseOnReturnChecker; MatchFinder astMatcher; }; @@ -389,6 +395,12 @@ AST_MATCHER(CXXRecordDecl, hasTrivialCtorDtor) { return MozChecker::hasCustomAnnotation(&Node, "moz_trivial_ctor_dtor"); } +/// This matcher will match any function declaration that is marked to prohibit +/// calling AddRef or Release on its return value. +AST_MATCHER(FunctionDecl, hasNoAddRefReleaseOnReturnAttr) { + return MozChecker::hasCustomAnnotation(&Node, "moz_no_addref_release_on_return"); +} + /// This matcher will match all arithmetic binary operators. AST_MATCHER(BinaryOperator, binaryArithmeticOperator) { BinaryOperatorKind opcode = Node.getOpcode(); @@ -458,6 +470,17 @@ AST_MATCHER(BinaryOperator, isInSkScalarDotH) { return llvm::sys::path::rbegin(FileName)->equals("SkScalar.h"); } +/// This matcher will match all accesses to AddRef or Release methods. +AST_MATCHER(MemberExpr, isAddRefOrRelease) { + ValueDecl *Member = Node.getMemberDecl(); + CXXMethodDecl *Method = dyn_cast(Member); + if (Method) { + std::string Name = Method->getNameAsString(); + return Name == "AddRef" || Name == "Release"; + } + return false; +} + } } @@ -548,6 +571,12 @@ DiagnosticsMatcher::DiagnosticsMatcher() unless(anyOf(isInSystemHeader(), isInSkScalarDotH())) )).bind("node"), &nanExprChecker); + + astMatcher.addMatcher(callExpr(callee(functionDecl(hasNoAddRefReleaseOnReturnAttr()).bind("func")), + hasParent(memberExpr(isAddRefOrRelease(), + hasParent(callExpr())).bind("member") + )).bind("node"), + &noAddRefReleaseOnReturnChecker); } void DiagnosticsMatcher::ScopeChecker::run( @@ -733,6 +762,19 @@ void DiagnosticsMatcher::NaNExprChecker::run( } } +void DiagnosticsMatcher::NoAddRefReleaseOnReturnChecker::run( + const MatchFinder::MatchResult &Result) { + DiagnosticsEngine &Diag = Result.Context->getDiagnostics(); + unsigned errorID = Diag.getDiagnosticIDs()->getCustomDiagID( + DiagnosticIDs::Error, "%1 cannot be called on the return value of %0"); + const Stmt *node = Result.Nodes.getNodeAs("node"); + const FunctionDecl *func = Result.Nodes.getNodeAs("func"); + const MemberExpr *member = Result.Nodes.getNodeAs("member"); + const CXXMethodDecl *method = dyn_cast(member->getMemberDecl()); + + Diag.Report(node->getLocStart(), errorID) << func << method; +} + class MozCheckAction : public PluginASTAction { public: ASTConsumerPtr CreateASTConsumer(CompilerInstance &CI, StringRef fileName) override { diff --git a/build/clang-plugin/tests/Makefile.in b/build/clang-plugin/tests/Makefile.in index 7d67f8be67fe..47393978c728 100644 --- a/build/clang-plugin/tests/Makefile.in +++ b/build/clang-plugin/tests/Makefile.in @@ -3,9 +3,9 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Build without any warning flags, and with clang verify flag for a -# syntax-only build (no codegen). -OS_CFLAGS := $(filter-out -W%,$(OS_CFLAGS)) -fsyntax-only -Xclang -verify -OS_CXXFLAGS := $(filter-out -W%,$(OS_CXXFLAGS)) -fsyntax-only -Xclang -verify +# syntax-only build (no codegen), without a limit on the number of errors. +OS_CFLAGS := $(filter-out -W%,$(OS_CFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0 +OS_CXXFLAGS := $(filter-out -W%,$(OS_CXXFLAGS)) -fsyntax-only -Xclang -verify -ferror-limit=0 include $(topsrcdir)/config/rules.mk diff --git a/build/clang-plugin/tests/TestNoAddRefReleaseOnReturn.cpp b/build/clang-plugin/tests/TestNoAddRefReleaseOnReturn.cpp new file mode 100644 index 000000000000..8283a72583ee --- /dev/null +++ b/build/clang-plugin/tests/TestNoAddRefReleaseOnReturn.cpp @@ -0,0 +1,65 @@ +#define MOZ_NO_ADDREF_RELEASE_ON_RETURN __attribute__((annotate("moz_no_addref_release_on_return"))) + +struct Test { + void AddRef(); + void Release(); + void foo(); +}; + +struct S { + Test* f() MOZ_NO_ADDREF_RELEASE_ON_RETURN; + Test& g() MOZ_NO_ADDREF_RELEASE_ON_RETURN; + Test h() MOZ_NO_ADDREF_RELEASE_ON_RETURN; +}; + +template +struct X { + T* f() MOZ_NO_ADDREF_RELEASE_ON_RETURN; + T& g() MOZ_NO_ADDREF_RELEASE_ON_RETURN; + T h() MOZ_NO_ADDREF_RELEASE_ON_RETURN; +}; + +template +struct SP { + T* operator->() MOZ_NO_ADDREF_RELEASE_ON_RETURN; +}; + +Test* f() MOZ_NO_ADDREF_RELEASE_ON_RETURN; +Test& g() MOZ_NO_ADDREF_RELEASE_ON_RETURN; +Test h() MOZ_NO_ADDREF_RELEASE_ON_RETURN; + +void test() { + S s; + s.f()->AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'f'}} + s.f()->Release(); // expected-error{{'Release' cannot be called on the return value of 'f'}} + s.f()->foo(); + s.g().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'g'}} + s.g().Release(); // expected-error{{'Release' cannot be called on the return value of 'g'}} + s.g().foo(); + s.h().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'h'}} + s.h().Release(); // expected-error{{'Release' cannot be called on the return value of 'h'}} + s.h().foo(); + X x; + x.f()->AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'f'}} + x.f()->Release(); // expected-error{{'Release' cannot be called on the return value of 'f'}} + x.f()->foo(); + x.g().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'g'}} + x.g().Release(); // expected-error{{'Release' cannot be called on the return value of 'g'}} + x.g().foo(); + x.h().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'h'}} + x.h().Release(); // expected-error{{'Release' cannot be called on the return value of 'h'}} + x.h().foo(); + SP sp; + sp->AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'operator->'}} + sp->Release(); // expected-error{{'Release' cannot be called on the return value of 'operator->'}} + sp->foo(); + f()->AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'f'}} + f()->Release(); // expected-error{{'Release' cannot be called on the return value of 'f'}} + f()->foo(); + g().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'g'}} + g().Release(); // expected-error{{'Release' cannot be called on the return value of 'g'}} + g().foo(); + h().AddRef(); // expected-error{{'AddRef' cannot be called on the return value of 'h'}} + h().Release(); // expected-error{{'Release' cannot be called on the return value of 'h'}} + h().foo(); +} diff --git a/build/clang-plugin/tests/moz.build b/build/clang-plugin/tests/moz.build index 0d7f35b6a6d3..2b5bf2a277a4 100644 --- a/build/clang-plugin/tests/moz.build +++ b/build/clang-plugin/tests/moz.build @@ -11,6 +11,7 @@ SOURCES += [ 'TestMustOverride.cpp', 'TestNANTestingExpr.cpp', 'TestNANTestingExprC.c', + 'TestNoAddRefReleaseOnReturn.cpp', 'TestNoArithmeticExprInArgument.cpp', 'TestNonHeapClass.cpp', 'TestStackClass.cpp', diff --git a/configure.in b/configure.in index 4a2d2498de2f..467000059be3 100644 --- a/configure.in +++ b/configure.in @@ -3595,7 +3595,7 @@ MOZ_ARG_WITH_BOOL(system-nss, _USE_SYSTEM_NSS=1 ) if test -n "$_USE_SYSTEM_NSS"; then - AM_PATH_NSS(3.17.3, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) + AM_PATH_NSS(3.17.4, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) fi if test -n "$MOZ_NATIVE_NSS"; then diff --git a/docshell/base/TimelineMarker.h b/docshell/base/TimelineMarker.h index 522e7ecaf0dd..11cfe76d71d2 100644 --- a/docshell/base/TimelineMarker.h +++ b/docshell/base/TimelineMarker.h @@ -75,8 +75,8 @@ public: JSObject* GetStack() { - if (mStackTrace) { - return mStackTrace->get(); + if (mStackTrace.initialized()) { + return mStackTrace; } return nullptr; } @@ -89,7 +89,7 @@ protected: if (ctx) { JS::RootedObject stack(ctx); if (JS::CaptureCurrentStack(ctx, &stack)) { - mStackTrace.emplace(ctx, stack.get()); + mStackTrace.init(ctx, stack.get()); } else { JS_ClearPendingException(ctx); } @@ -107,7 +107,7 @@ private: // in this case changing nsDocShell to participate in cycle // collection was deemed too invasive, and the markers are only held // here temporarily to boot. - mozilla::Maybe> mStackTrace; + JS::PersistentRooted mStackTrace; }; #endif /* TimelineMarker_h__ */ diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 5ae9f9c30278..c2cf7426e591 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -8216,14 +8216,6 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, bool *aRestoring) SetHistoryEntry(&mLSHE, aSHEntry); - // Add the request to our load group. We do this before swapping out - // the content viewers so that consumers of STATE_START can access - // the old document. We only deal with the toplevel load at this time -- - // to be consistent with normal document loading, subframes cannot start - // loading until after data arrives, which is after STATE_START completes. - - BeginRestore(viewer, true); - // Post an event that will remove the request after we've returned // to the event loop. This mimics the way it is called by nsIChannel // implementations. @@ -8245,10 +8237,40 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, bool *aRestoring) return rv; } +namespace { +class MOZ_STACK_CLASS PresentationEventForgetter +{ +public: + explicit PresentationEventForgetter( + nsRevocableEventPtr& aRestorePresentationEvent) + : mRestorePresentationEvent(aRestorePresentationEvent) + , mEvent(aRestorePresentationEvent.get()) + { + } + + ~PresentationEventForgetter() + { + Forget(); + } + + void Forget() + { + if (mRestorePresentationEvent.get() == mEvent) { + mRestorePresentationEvent.Forget(); + mEvent = nullptr; + } + } +private: + nsRevocableEventPtr& mRestorePresentationEvent; + nsRefPtr mEvent; +}; +} + nsresult nsDocShell::RestoreFromHistory() { - mRestorePresentationEvent.Forget(); + MOZ_ASSERT(mRestorePresentationEvent.IsPending()); + PresentationEventForgetter forgetter(mRestorePresentationEvent); // This section of code follows the same ordering as CreateContentViewer. if (!mLSHE) @@ -8302,6 +8324,24 @@ nsDocShell::RestoreFromHistory() if (mLSHE != origLSHE) return NS_OK; + // Add the request to our load group. We do this before swapping out + // the content viewers so that consumers of STATE_START can access + // the old document. We only deal with the toplevel load at this time -- + // to be consistent with normal document loading, subframes cannot start + // loading until after data arrives, which is after STATE_START completes. + + nsRefPtr currentPresentationRestoration = + mRestorePresentationEvent.get(); + Stop(); + // Make sure we're still restoring the same presentation. + // If we aren't, docshell is in process doing another load already. + NS_ENSURE_STATE(currentPresentationRestoration == + mRestorePresentationEvent.get()); + BeginRestore(viewer, true); + NS_ENSURE_STATE(currentPresentationRestoration == + mRestorePresentationEvent.get()); + forgetter.Forget(); + // Set mFiredUnloadEvent = false so that the unload handler for the // *new* document will fire. mFiredUnloadEvent = false; diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index b3f1c219a8e5..86e7c1bb1fde 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -693,6 +693,7 @@ protected: */ void MaybeInitTiming(); +public: // Event type dispatched by RestorePresentation class RestorePresentationEvent : public nsRunnable { public: @@ -702,6 +703,7 @@ protected: private: nsRefPtr mDocShell; }; +protected: bool JustStartedNetworkLoad(); diff --git a/docshell/test/mochitest.ini b/docshell/test/mochitest.ini index 8a86a27fa4c6..3668c58caf79 100644 --- a/docshell/test/mochitest.ini +++ b/docshell/test/mochitest.ini @@ -105,3 +105,5 @@ support-files = file_framedhistoryframes.html [test_pushState_after_document_open.html] [test_windowedhistoryframes.html] skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage +[test_bug1121701.html] +skip-if = (buildapp == 'b2g' || buildapp == 'mulet') diff --git a/docshell/test/test_bug1121701.html b/docshell/test/test_bug1121701.html new file mode 100644 index 000000000000..8beb2d8d06ef --- /dev/null +++ b/docshell/test/test_bug1121701.html @@ -0,0 +1,71 @@ + + + + + + Test for Bug 1121701 + + + + + +Mozilla Bug 1121701 +

+ +
+
+ + diff --git a/dom/apps/PermissionsTable.jsm b/dom/apps/PermissionsTable.jsm index e56039295775..47b2e2d8b6e1 100644 --- a/dom/apps/PermissionsTable.jsm +++ b/dom/apps/PermissionsTable.jsm @@ -509,6 +509,7 @@ this.PermissionsTable = { geolocation: { }, "tv": { app: DENY_ACTION, + trusted: DENY_ACTION, privileged: DENY_ACTION, certified: ALLOW_ACTION }, diff --git a/dom/base/Console.cpp b/dom/base/Console.cpp index 0ca30f4491c0..8e32ce44b558 100644 --- a/dom/base/Console.cpp +++ b/dom/base/Console.cpp @@ -1268,7 +1268,7 @@ Console::ProcessCallData(ConsoleCallData* aData) innerID.AppendInt(aData->mInnerIDNumber); } - if (NS_FAILED(mStorage->RecordPendingEvent(innerID, outerID, eventValue))) { + if (NS_FAILED(mStorage->RecordEvent(innerID, outerID, eventValue))) { NS_WARNING("Failed to record a console event."); } } diff --git a/dom/base/ConsoleAPIStorage.js b/dom/base/ConsoleAPIStorage.js index ebd7889bceec..e3a982fa9347 100644 --- a/dom/base/ConsoleAPIStorage.js +++ b/dom/base/ConsoleAPIStorage.js @@ -11,18 +11,12 @@ let Cc = Components.classes; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); -// The console API events have to be scheduled when stored using -// |recordPendingEvent|. -const CALL_DELAY = 15 // milliseconds - // This constant tells how many messages to process in a single timer execution. const MESSAGES_IN_INTERVAL = 1500 const STORAGE_MAX_EVENTS = 200; var _consoleStorage = new Map(); -var _consolePendingStorage = new Map(); -var _timer; const CONSOLEAPISTORAGE_CID = Components.ID('{96cf7855-dfa9-4c6d-8276-f9705b4890f2}'); @@ -141,51 +135,6 @@ ConsoleAPIStorageService.prototype = { Services.obs.notifyObservers(aEvent, "console-storage-cache-event", aId); }, - /** - * Similar to recordEvent, but these events are scheduled and stored any - * CALL_DELAY millisecs. - */ - recordPendingEvent: function CS_recordPendingEvent(aId, aOuterId, aEvent) - { - if (!_consolePendingStorage.has(aId)) { - _consolePendingStorage.set(aId, []); - } - - let storage = _consolePendingStorage.get(aId); - storage.push({ outerId: aOuterId, event: aEvent }); - - if (!_timer) { - _timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - } - - let self = this; - _timer.initWithCallback(function() { self.flushPendingEvents(); }, - CALL_DELAY, Ci.nsITimer.TYPE_REPEATING_SLACK); - }, - - /** - * Processes the pending event queue. - */ - flushPendingEvents: function CS_flushPendingEvents() - { - for (let [id, objs] of _consolePendingStorage) { - for (let i = 0; i < objs.length && i < MESSAGES_IN_INTERVAL; ++i) { - this.recordEvent(id, objs[i].outerId, objs[i].event); - } - - if (objs.length <= MESSAGES_IN_INTERVAL) { - _consolePendingStorage.delete(id); - } else { - _consolePendingStorage.set(id, objs.splice(MESSAGES_IN_INTERVAL)); - } - } - - if (_timer && _consolePendingStorage.size == 0) { - _timer.cancel(); - _timer = null; - } - }, - /** * Clear storage data for the given window. * diff --git a/dom/base/FragmentOrElement.cpp b/dom/base/FragmentOrElement.cpp index 06162b0e3aeb..de0734441086 100644 --- a/dom/base/FragmentOrElement.cpp +++ b/dom/base/FragmentOrElement.cpp @@ -2553,7 +2553,7 @@ IsVoidTag(nsIAtom* aTag) static const nsIAtom* voidElements[] = { nsGkAtoms::area, nsGkAtoms::base, nsGkAtoms::basefont, nsGkAtoms::bgsound, nsGkAtoms::br, nsGkAtoms::col, - nsGkAtoms::command, nsGkAtoms::embed, nsGkAtoms::frame, + nsGkAtoms::embed, nsGkAtoms::frame, nsGkAtoms::hr, nsGkAtoms::img, nsGkAtoms::input, nsGkAtoms::keygen, nsGkAtoms::link, nsGkAtoms::meta, nsGkAtoms::param, nsGkAtoms::source, nsGkAtoms::track, diff --git a/dom/base/nsDocumentEncoder.cpp b/dom/base/nsDocumentEncoder.cpp index 04b94be09847..f3d83af6dcef 100644 --- a/dom/base/nsDocumentEncoder.cpp +++ b/dom/base/nsDocumentEncoder.cpp @@ -47,9 +47,6 @@ #include "nsStringBuffer.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/ShadowRoot.h" -#include "nsIEditor.h" -#include "nsIHTMLEditor.h" -#include "nsIDocShell.h" #include "mozilla/dom/EncodingUtils.h" #include "nsComputedDOMStyle.h" @@ -324,34 +321,19 @@ nsDocumentEncoder::IncludeInContext(nsINode *aNode) static bool IsInvisibleBreak(nsINode *aNode) { - // xxxehsan: we should probably figure out a way to determine - // if a BR node is visible without using the editor. - Element* elt = aNode->AsElement(); - if (!elt->IsHTML(nsGkAtoms::br) || - !aNode->IsEditable()) { + if (!aNode->IsElement() || !aNode->IsEditable()) { + return false; + } + nsIFrame* frame = aNode->AsElement()->GetPrimaryFrame(); + if (!frame || frame->GetType() != nsGkAtoms::brFrame) { return false; } - // Grab the editor associated with the document - nsIDocument *doc = aNode->GetComposedDoc(); - if (doc) { - nsPIDOMWindow *window = doc->GetWindow(); - if (window) { - nsIDocShell *docShell = window->GetDocShell(); - if (docShell) { - nsCOMPtr editor; - docShell->GetEditor(getter_AddRefs(editor)); - nsCOMPtr htmlEditor = do_QueryInterface(editor); - if (htmlEditor) { - bool isVisible = false; - nsCOMPtr domNode = do_QueryInterface(aNode); - htmlEditor->BreakIsVisible(domNode, &isVisible); - return !isVisible; - } - } - } - } - return false; + // If the BRFrame has caused a visible line break, it should have a next + // sibling, or otherwise no siblings and a non-zero height. + bool visible = frame->GetNextSibling() || + (!frame->GetPrevSibling() && frame->GetRect().Height() != 0); + return !visible; } nsresult diff --git a/dom/base/nsIConsoleAPIStorage.idl b/dom/base/nsIConsoleAPIStorage.idl index 262ae76b498b..6ee218af23bb 100644 --- a/dom/base/nsIConsoleAPIStorage.idl +++ b/dom/base/nsIConsoleAPIStorage.idl @@ -5,7 +5,7 @@ #include "nsISupports.idl" -[scriptable, uuid(cce39123-585e-411b-9edd-2513f7cf7e47)] +[scriptable, uuid(9e32a7b6-c4d1-4d9a-87b9-1ef6b75c27a9)] interface nsIConsoleAPIStorage : nsISupports { /** @@ -35,22 +35,6 @@ interface nsIConsoleAPIStorage : nsISupports */ void recordEvent(in DOMString aId, in DOMString aOuterId, in jsval aEvent); - /** - * Similar to recordEvent() but these events will be collected - * and dispatched with a timer in order to avoid flooding the devtools - * webconsole. - * - * @param string aId - * The ID of the inner window for which the event occurred or "jsm" for - * messages logged from JavaScript modules.. - * @param string aOuterId - * This ID is used as 3rd parameters for the console-api-log-event - * notification. - * @param object aEvent - * A JavaScript object you want to store. - */ - void recordPendingEvent(in DOMString aId, in DOMString aOuterId, in jsval aEvent); - /** * Clear storage data for the given window. * diff --git a/dom/base/nsPlainTextSerializer.h b/dom/base/nsPlainTextSerializer.h index 5688fed5d99c..479272a76ad0 100644 --- a/dom/base/nsPlainTextSerializer.h +++ b/dom/base/nsPlainTextSerializer.h @@ -32,7 +32,7 @@ class Element; } // namespace dom } // namespace mozilla -class nsPlainTextSerializer : public nsIContentSerializer +class nsPlainTextSerializer MOZ_FINAL : public nsIContentSerializer { public: nsPlainTextSerializer(); @@ -67,8 +67,8 @@ public: NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument, nsAString& aStr) MOZ_OVERRIDE; -protected: - virtual ~nsPlainTextSerializer(); +private: + ~nsPlainTextSerializer(); nsresult GetAttributeValue(nsIAtom* aName, nsString& aValueRet); void AddToLine(const char16_t* aStringToAdd, int32_t aLength); @@ -114,10 +114,9 @@ protected: bool ShouldReplaceContainerWithPlaceholder(nsIAtom* aTag); -private: bool IsElementPreformatted(mozilla::dom::Element* aElement); -protected: +private: nsString mCurrentLine; uint32_t mHeadLevel; bool mAtFirstColumn; diff --git a/dom/base/nsTreeSanitizer.cpp b/dom/base/nsTreeSanitizer.cpp index ede76e9f654c..88f038da0990 100644 --- a/dom/base/nsTreeSanitizer.cpp +++ b/dom/base/nsTreeSanitizer.cpp @@ -53,7 +53,6 @@ nsIAtom** const kElementsHTML[] = { &nsGkAtoms::code, &nsGkAtoms::col, &nsGkAtoms::colgroup, - &nsGkAtoms::command, &nsGkAtoms::datalist, &nsGkAtoms::dd, &nsGkAtoms::del, diff --git a/dom/base/test/test_XHR_timeout.html b/dom/base/test/test_XHR_timeout.html index ed47db0a32ee..14422d9f4aba 100644 --- a/dom/base/test/test_XHR_timeout.html +++ b/dom/base/test/test_XHR_timeout.html @@ -48,7 +48,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=525816 (function() { SimpleTest.waitForExplicitFinish(); SimpleTest.requestLongerTimeout(TestRequests.length); - SimpleTest.requestFlakyTimeout("untriaged"); + SimpleTest.requestFlakyTimeout("This is testing XHR timeouts."); var msg = "This test will take approximately " + (TestRequests.length * 10) msg += " seconds to complete, at most."; document.getElementById("content").firstChild.nodeValue = msg; diff --git a/dom/events/DOMEventTargetHelper.cpp b/dom/events/DOMEventTargetHelper.cpp index 0b8efa355842..0d64c2f1a0ce 100644 --- a/dom/events/DOMEventTargetHelper.cpp +++ b/dom/events/DOMEventTargetHelper.cpp @@ -99,7 +99,8 @@ DOMEventTargetHelper::BindToOwner(nsPIDOMWindow* aOwner) void DOMEventTargetHelper::BindToOwner(nsIGlobalObject* aOwner) { - if (mParentObject) { + nsCOMPtr parentObject = do_QueryReferent(mParentObject); + if (parentObject) { if (mOwnerWindow) { static_cast(mOwnerWindow)->RemoveEventTargetObject(this); mOwnerWindow = nullptr; @@ -108,7 +109,8 @@ DOMEventTargetHelper::BindToOwner(nsIGlobalObject* aOwner) mHasOrHasHadOwnerWindow = false; } if (aOwner) { - mParentObject = aOwner; + mParentObject = do_GetWeakReference(aOwner); + MOZ_ASSERT(mParentObject, "All nsIGlobalObjects must support nsISupportsWeakReference"); // Let's cache the result of this QI for fast access and off main thread usage mOwnerWindow = nsCOMPtr(do_QueryInterface(aOwner)).get(); if (mOwnerWindow) { @@ -131,9 +133,10 @@ DOMEventTargetHelper::BindToOwner(DOMEventTargetHelper* aOther) if (aOther) { mHasOrHasHadOwnerWindow = aOther->HasOrHasHadOwner(); if (aOther->GetParentObject()) { - mParentObject = aOther->GetParentObject(); + mParentObject = do_GetWeakReference(aOther->GetParentObject()); + MOZ_ASSERT(mParentObject, "All nsIGlobalObjects must support nsISupportsWeakReference"); // Let's cache the result of this QI for fast access and off main thread usage - mOwnerWindow = nsCOMPtr(do_QueryInterface(mParentObject)).get(); + mOwnerWindow = nsCOMPtr(do_QueryInterface(aOther->GetParentObject())).get(); if (mOwnerWindow) { MOZ_ASSERT(mOwnerWindow->IsInnerWindow()); mHasOrHasHadOwnerWindow = true; diff --git a/dom/events/DOMEventTargetHelper.h b/dom/events/DOMEventTargetHelper.h index 15277cae175a..7e92c0c2ef7d 100644 --- a/dom/events/DOMEventTargetHelper.h +++ b/dom/events/DOMEventTargetHelper.h @@ -12,6 +12,7 @@ #include "nsPIDOMWindow.h" #include "nsIScriptGlobalObject.h" #include "nsIScriptContext.h" +#include "nsIWeakReferenceUtils.h" #include "MainThreadUtils.h" #include "mozilla/Attributes.h" #include "mozilla/EventListenerManager.h" @@ -138,7 +139,10 @@ public: void BindToOwner(nsPIDOMWindow* aOwner); void BindToOwner(DOMEventTargetHelper* aOther); virtual void DisconnectFromOwner(); - nsIGlobalObject* GetParentObject() const { return mParentObject; } + nsIGlobalObject* GetParentObject() const { + nsCOMPtr parentObject = do_QueryReferent(mParentObject); + return parentObject; + } bool HasOrHasHadOwner() { return mHasOrHasHadOwnerWindow; } virtual void EventListenerAdded(nsIAtom* aType) MOZ_OVERRIDE; @@ -164,10 +168,11 @@ protected: virtual void LastRelease() {} private: // Inner window or sandbox. - nsIGlobalObject* mParentObject; + nsWeakPtr mParentObject; // mParentObject pre QI-ed and cached (inner window) // (it is needed for off main thread access) - nsPIDOMWindow* mOwnerWindow; + // It is obtained in BindToOwner and reset in DisconnectFromOwner. + nsPIDOMWindow* MOZ_NON_OWNING_REF mOwnerWindow; bool mHasOrHasHadOwnerWindow; }; diff --git a/dom/events/Event.cpp b/dom/events/Event.cpp index c4d140225d10..eedf5a69fb4b 100644 --- a/dom/events/Event.cpp +++ b/dom/events/Event.cpp @@ -362,6 +362,20 @@ Event::GetOriginalTarget(nsIDOMEventTarget** aOriginalTarget) return NS_OK; } +EventTarget* +Event::GetComposedTarget() const +{ + EventTarget* et = GetOriginalTarget(); + nsCOMPtr content = do_QueryInterface(et); + if (!content) { + return et; + } + nsIContent* nonChrome = content->FindFirstNonChromeOnlyAccessContent(); + return nonChrome ? + static_cast(nonChrome) : + static_cast(content->GetComposedDoc()); +} + NS_IMETHODIMP_(void) Event::SetTrusted(bool aTrusted) { diff --git a/dom/events/Event.h b/dom/events/Event.h index b0b7a0232f25..a1cb30bcf6c0 100644 --- a/dom/events/Event.h +++ b/dom/events/Event.h @@ -205,6 +205,7 @@ public: EventTarget* GetOriginalTarget() const; EventTarget* GetExplicitOriginalTarget() const; + EventTarget* GetComposedTarget() const; bool GetPreventDefault() const; diff --git a/dom/events/test/mochitest.ini b/dom/events/test/mochitest.ini index 3f95187153dc..f2195f91c2d7 100644 --- a/dom/events/test/mochitest.ini +++ b/dom/events/test/mochitest.ini @@ -138,6 +138,7 @@ skip-if = toolkit == "gonk" || e10s support-files = bug1017086_inner.html [test_bug1017086_enable.html] support-files = bug1017086_inner.html +[test_bug1079236.html] [test_clickevent_on_input.html] skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM [test_continuous_wheel_events.html] diff --git a/dom/events/test/test_bug1079236.html b/dom/events/test/test_bug1079236.html new file mode 100644 index 000000000000..7957823e604a --- /dev/null +++ b/dom/events/test/test_bug1079236.html @@ -0,0 +1,60 @@ + + + + + + Test for Bug 1079236 + + + + + + +Mozilla Bug 1079236 +

+
+ +
+
+
+ + diff --git a/dom/geolocation/moz.build b/dom/geolocation/moz.build index b05857bd0ce6..ba34983a4c20 100644 --- a/dom/geolocation/moz.build +++ b/dom/geolocation/moz.build @@ -10,9 +10,12 @@ EXPORTS += [ 'nsGeoPositionIPCSerialiser.h', ] +SOURCES += [ + 'nsGeolocation.cpp', +] + UNIFIED_SOURCES += [ 'nsGeoGridFuzzer.cpp', - 'nsGeolocation.cpp', 'nsGeolocationSettings.cpp', 'nsGeoPosition.cpp', ] @@ -45,4 +48,7 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': LOCAL_INCLUDES += [ '/dom/system/mac', ] - +elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': + LOCAL_INCLUDES += [ + '/dom/system/windows', + ] diff --git a/dom/geolocation/nsGeolocation.cpp b/dom/geolocation/nsGeolocation.cpp index efb12caa3a9e..15206e805220 100644 --- a/dom/geolocation/nsGeolocation.cpp +++ b/dom/geolocation/nsGeolocation.cpp @@ -49,6 +49,10 @@ class nsIPrincipal; #include "CoreLocationLocationProvider.h" #endif +#ifdef XP_WIN +#include "WindowsLocationProvider.h" +#endif + // Some limit to the number of get or watch geolocation requests // that a window can make. #define MAX_GEO_REQUESTS_PER_WINDOW 1500 @@ -810,6 +814,12 @@ nsresult nsGeolocationService::Init() } #endif +#ifdef XP_WIN + if (Preferences::GetBool("geo.provider.ms-windows-location", false)) { + mProvider = new WindowsLocationProvider(); + } +#endif + if (Preferences::GetBool("geo.provider.use_mls", false)) { mProvider = do_CreateInstance("@mozilla.org/geolocation/mls-provider;1"); } diff --git a/dom/html/HTMLAnchorElement.cpp b/dom/html/HTMLAnchorElement.cpp index 0672b45aeaa6..139ad2e8dfc4 100644 --- a/dom/html/HTMLAnchorElement.cpp +++ b/dom/html/HTMLAnchorElement.cpp @@ -193,6 +193,18 @@ HTMLAnchorElement::UnbindFromTree(bool aDeep, bool aNullParent) nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent); } +static bool +IsNodeInEditableRegion(nsINode* aNode) +{ + while (aNode) { + if (aNode->IsEditable()) { + return true; + } + aNode = aNode->GetParent(); + } + return false; +} + bool HTMLAnchorElement::IsHTMLFocusable(bool aWithMouse, bool *aIsFocusable, int32_t *aTabIndex) @@ -214,7 +226,9 @@ HTMLAnchorElement::IsHTMLFocusable(bool aWithMouse, } } - if (IsEditable()) { + // Links that are in an editable region should never be focusable, even if + // they are in a contenteditable="false" region. + if (IsNodeInEditableRegion(this)) { if (aTabIndex) { *aTabIndex = -1; } diff --git a/dom/html/nsTextEditorState.cpp b/dom/html/nsTextEditorState.cpp index 5f4a3c8f06ec..92f748c46b83 100644 --- a/dom/html/nsTextEditorState.cpp +++ b/dom/html/nsTextEditorState.cpp @@ -979,7 +979,6 @@ nsTextEditorState::nsTextEditorState(nsITextControlElement* aOwningElement) : mTextCtrlElement(aOwningElement), mRestoringSelection(nullptr), mBoundFrame(nullptr), - mTextListener(nullptr), mEverInited(false), mEditorInitialized(false), mInitializing(false), @@ -1012,7 +1011,7 @@ nsTextEditorState::Clear() // for us. DestroyEditor(); } - NS_IF_RELEASE(mTextListener); + mTextListener = nullptr; } void nsTextEditorState::Unlink() @@ -1125,8 +1124,8 @@ nsTextEditorState::BindToFrame(nsTextControlFrame* aFrame) // Create a SelectionController mSelCon = new nsTextInputSelectionImpl(frameSel, shell, rootNode); + MOZ_ASSERT(!mTextListener, "Should not overwrite the object"); mTextListener = new nsTextInputListener(mTextCtrlElement); - NS_ADDREF(mTextListener); mTextListener->SetFrame(mBoundFrame); mSelCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); @@ -1647,7 +1646,6 @@ nsTextEditorState::UnbindFromFrame(nsTextControlFrame* aFrame) TrustedEventsAtSystemGroupBubble()); } - NS_RELEASE(mTextListener); mTextListener = nullptr; } diff --git a/dom/html/nsTextEditorState.h b/dom/html/nsTextEditorState.h index ab1d37171dce..bf43a7831ca7 100644 --- a/dom/html/nsTextEditorState.h +++ b/dom/html/nsTextEditorState.h @@ -276,7 +276,7 @@ private: nsCOMPtr mRootNode; nsCOMPtr mPlaceholderDiv; nsTextControlFrame* mBoundFrame; - nsTextInputListener* mTextListener; + nsRefPtr mTextListener; nsAutoPtr mValue; nsRefPtr mMutationObserver; mutable nsString mCachedValue; // Caches non-hard-wrapped value on a multiline control. diff --git a/dom/inputmethod/forms.js b/dom/inputmethod/forms.js index 089c9ba1e077..e8346324087c 100644 --- a/dom/inputmethod/forms.js +++ b/dom/inputmethod/forms.js @@ -355,7 +355,7 @@ let FormAssistant = { }, handleEvent: function fa_handleEvent(evt) { - let target = evt.target; + let target = evt.composedTarget; let range = null; switch (evt.type) { diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl index 241d1e7b5c12..11c86b480567 100644 --- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -664,8 +664,8 @@ interface nsIDOMWindowUtils : nsISupports { * drag - msg1-n:TOUCH_CONTACT (moving), msgn+1:TOUCH_REMOVE * hover drag - msg1-n:TOUCH_HOVER (moving), msgn+1:TOUCH_REMOVE * - * Widget support: Windows 8.0+, Winrt/Win32. Other widgets will - * throw. + * Widget support: Windows 8.0+, Winrt/Win32. Gonk supports CONTACT, REMOVE, + * and CANCEL but no HOVER. Other widgets will throw. * * @param aPointerId The touch point id to create or update. * @param aTouchState one or more of the touch states listed above diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl index 9edd374ba779..5da05d2a2fb9 100644 --- a/dom/ipc/PBrowser.ipdl +++ b/dom/ipc/PBrowser.ipdl @@ -132,7 +132,7 @@ parent: nsString aName, nsString aFeatures, nsString aBaseURI) - returns (bool windowOpened, FrameScriptInfo[] frameScripts); + returns (bool windowOpened, FrameScriptInfo[] frameScripts, nsCString urlToLoad); sync SyncMessage(nsString aMessage, ClonedMessageData aData, CpowEntry[] aCpows, Principal aPrincipal) diff --git a/dom/ipc/ProcessHangMonitor.cpp b/dom/ipc/ProcessHangMonitor.cpp index 75a5df9d3cc7..ca3a6de15601 100644 --- a/dom/ipc/ProcessHangMonitor.cpp +++ b/dom/ipc/ProcessHangMonitor.cpp @@ -25,6 +25,11 @@ #include "base/task.h" #include "base/thread.h" +#ifdef XP_WIN +// For IsDebuggerPresent() +#include +#endif + using namespace mozilla; using namespace mozilla::dom; @@ -527,6 +532,14 @@ HangMonitorParent::RecvHangEvidence(const HangData& aHangData) return true; } +#ifdef XP_WIN + // Don't report hangs if we're debugging the process. You can comment this + // line out for testing purposes. + if (IsDebuggerPresent()) { + return true; + } +#endif + mHangMonitor->InitiateCPOWTimeout(); MonitorAutoLock lock(mMonitor); diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index 069007b5c570..6fc26e3eff86 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -1520,6 +1520,7 @@ TabChild::ProvideWindowCommon(nsIDOMWindow* aOpener, nsString name(aName); nsAutoCString features(aFeatures); nsTArray frameScripts; + nsCString urlToLoad; if (aIframeMoz) { newChild->SendBrowserFrameOpenWindow(this, url, name, @@ -1559,7 +1560,8 @@ TabChild::ProvideWindowCommon(nsIDOMWindow* aOpener, name, NS_ConvertUTF8toUTF16(features), NS_ConvertUTF8toUTF16(baseURIString), aWindowIsNew, - &frameScripts)) { + &frameScripts, + &urlToLoad)) { return NS_ERROR_NOT_AVAILABLE; } } @@ -1592,6 +1594,10 @@ TabChild::ProvideWindowCommon(nsIDOMWindow* aOpener, } } + if (!urlToLoad.IsEmpty()) { + newChild->RecvLoadURL(urlToLoad); + } + nsCOMPtr win = do_GetInterface(newChild->WebNavigation()); win.forget(aReturn); return NS_OK; @@ -3567,6 +3573,7 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TabChildGlobal) NS_INTERFACE_MAP_ENTRY(nsIContentFrameMessageManager) NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal) NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(ContentFrameMessageManager) NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) diff --git a/dom/ipc/TabChild.h b/dom/ipc/TabChild.h index 8a3eaf206a88..4c703f5778fe 100644 --- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -65,7 +65,8 @@ class TabChildBase; class TabChildGlobal : public DOMEventTargetHelper, public nsIContentFrameMessageManager, public nsIScriptObjectPrincipal, - public nsIGlobalObject + public nsIGlobalObject, + public nsSupportsWeakReference { public: explicit TabChildGlobal(TabChildBase* aTabChild); diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 1e1cbbd74379..def22ab56c43 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -273,7 +273,7 @@ TabParent::TabParent(nsIContentParent* aManager, , mChromeFlags(aChromeFlags) , mInitedByParent(false) , mTabId(aTabId) - , mSkipLoad(false) + , mCreatingWindow(false) { MOZ_ASSERT(aManager); } @@ -454,17 +454,21 @@ TabParent::RecvEvent(const RemoteDOMEvent& aEvent) struct MOZ_STACK_CLASS TabParent::AutoUseNewTab MOZ_FINAL { public: - AutoUseNewTab(TabParent* aNewTab, bool* aWindowIsNew) - : mNewTab(aNewTab), mWindowIsNew(aWindowIsNew) + AutoUseNewTab(TabParent* aNewTab, bool* aWindowIsNew, nsCString* aURLToLoad) + : mNewTab(aNewTab), mWindowIsNew(aWindowIsNew), mURLToLoad(aURLToLoad) { MOZ_ASSERT(!TabParent::sNextTabParent); + MOZ_ASSERT(!aNewTab->mCreatingWindow); + TabParent::sNextTabParent = aNewTab; - aNewTab->mSkipLoad = true; + aNewTab->mCreatingWindow = true; + aNewTab->mDelayedURL.Truncate(); } ~AutoUseNewTab() { - mNewTab->mSkipLoad = false; + mNewTab->mCreatingWindow = false; + *mURLToLoad = mNewTab->mDelayedURL; if (TabParent::sNextTabParent) { MOZ_ASSERT(TabParent::sNextTabParent == mNewTab); @@ -476,6 +480,7 @@ public: private: TabParent* mNewTab; bool* mWindowIsNew; + nsCString* mURLToLoad; }; bool @@ -489,7 +494,8 @@ TabParent::RecvCreateWindow(PBrowserParent* aNewTab, const nsString& aFeatures, const nsString& aBaseURI, bool* aWindowIsNew, - InfallibleTArray* aFrameScripts) + InfallibleTArray* aFrameScripts, + nsCString* aURLToLoad) { // We always expect to open a new window here. If we don't, it's an error. *aWindowIsNew = true; @@ -530,7 +536,7 @@ TabParent::RecvCreateWindow(PBrowserParent* aNewTab, params->SetReferrer(aBaseURI); params->SetIsPrivate(isPrivate); - AutoUseNewTab aunt(newTab, aWindowIsNew); + AutoUseNewTab aunt(newTab, aWindowIsNew, aURLToLoad); nsCOMPtr frameLoaderOwner; mBrowserDOMWindow->OpenURIInFrame(nullptr, params, @@ -564,7 +570,7 @@ TabParent::RecvCreateWindow(PBrowserParent* aNewTab, nsCOMPtr window; - AutoUseNewTab aunt(newTab, aWindowIsNew); + AutoUseNewTab aunt(newTab, aWindowIsNew, aURLToLoad); rv = pwwatch->OpenWindow2(parent, finalURIString.get(), NS_ConvertUTF16toUTF8(aName).get(), @@ -601,7 +607,7 @@ bool TabParent::SendLoadRemoteScript(const nsString& aURL, const bool& aRunInGlobalScope) { - if (mSkipLoad) { + if (mCreatingWindow) { mDelayedFrameScripts.AppendElement(FrameScriptInfo(aURL, aRunInGlobalScope)); return true; } @@ -615,11 +621,6 @@ TabParent::LoadURL(nsIURI* aURI) { MOZ_ASSERT(aURI); - if (mSkipLoad) { - // Don't send the message if the child wants to load its own URL. - return; - } - if (mIsDestroyed) { return; } @@ -627,6 +628,13 @@ TabParent::LoadURL(nsIURI* aURI) nsCString spec; aURI->GetSpec(spec); + if (mCreatingWindow) { + // Don't send the message if the child wants to load its own URL. + MOZ_ASSERT(mDelayedURL.IsEmpty()); + mDelayedURL = spec; + return; + } + if (!mShown) { NS_WARNING(nsPrintfCString("TabParent::LoadURL(%s) called before " "Show(). Ignoring LoadURL.\n", diff --git a/dom/ipc/TabParent.h b/dom/ipc/TabParent.h index f6908b99bd18..b516291dbe41 100644 --- a/dom/ipc/TabParent.h +++ b/dom/ipc/TabParent.h @@ -144,7 +144,8 @@ public: const nsString& aFeatures, const nsString& aBaseURI, bool* aWindowIsNew, - InfallibleTArray* aFrameScripts) MOZ_OVERRIDE; + InfallibleTArray* aFrameScripts, + nsCString* aURLToLoad) MOZ_OVERRIDE; virtual bool RecvSyncMessage(const nsString& aMessage, const ClonedMessageData& aData, InfallibleTArray&& aCpows, @@ -489,14 +490,23 @@ private: static TabParent* sNextTabParent; // When loading a new tab or window via window.open, the child is - // responsible for loading the URL it wants into the new - // TabChild. Simultaneously, though, the parent sends a LoadURL message to - // every new PBrowser (usually for about:blank). This message usually - // arrives after the child has started to load the URL it wants, and - // overrides it. To prevent this, we set mSkipLoad to true when creating the - // new tab. This flag prevents the unwanted LoadURL message from being sent - // by the parent. - bool mSkipLoad; + // responsible for loading the URL it wants into the new TabChild. When the + // parent receives the CreateWindow message, though, it sends a LoadURL + // message, usually for about:blank. It's important for the about:blank load + // to get processed because the Firefox frontend expects every new window to + // immediately start loading something (see bug 1123090). However, we want + // the child to process the LoadURL message before it returns from + // ProvideWindow so that the URL sent from the parent doesn't override the + // child's URL. This is not possible using our IPC mechanisms. To solve the + // problem, we skip sending the LoadURL message in the parent and instead + // return the URL as a result from CreateWindow. The child simulates + // receiving a LoadURL message before returning from ProvideWindow. + // + // The mCreatingWindow flag is set while dispatching CreateWindow. During + // that time, any LoadURL calls are skipped and the URL is stored in + // mSkippedURL. + bool mCreatingWindow; + nsCString mDelayedURL; // When loading a new tab or window via window.open, we want to ensure that // frame scripts for that tab are loaded before any scripts start to run in diff --git a/dom/ipc/preload.js b/dom/ipc/preload.js index 742bb2502166..a897c3f5edea 100644 --- a/dom/ipc/preload.js +++ b/dom/ipc/preload.js @@ -74,14 +74,9 @@ const BrowserElementIsPreloaded = true; Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci["nsIAppStartup"]); Cc["@mozilla.org/uriloader;1"].getService(Ci["nsIURILoader"]); Cc["@mozilla.org/cspcontext;1"].createInstance(Ci["nsIContentSecurityPolicy"]); + Cc["@mozilla.org/settingsManager;1"].createInstance(Ci["nsISupports"]); /* Applications Specific Helper */ - try { - // May throw if we don't have the settings permission - navigator.mozSettings; - } catch(e) { - } - try { if (Services.prefs.getBoolPref("dom.sysmsg.enabled")) { Cc["@mozilla.org/system-message-manager;1"].getService(Ci["nsIDOMNavigatorSystemMessages"]); diff --git a/dom/media/webaudio/OscillatorNode.cpp b/dom/media/webaudio/OscillatorNode.cpp index 9a39efc25f42..fe4ef4bef931 100644 --- a/dom/media/webaudio/OscillatorNode.cpp +++ b/dom/media/webaudio/OscillatorNode.cpp @@ -258,8 +258,8 @@ public: } // Bilinear interpolation between adjacent samples in each table. float floorPhase = floorf(mPhase); - uint32_t j1 = floorPhase; - j1 &= indexMask; + int j1Signed = static_cast(floorPhase); + uint32_t j1 = j1Signed & indexMask; uint32_t j2 = j1 + 1; j2 &= indexMask; diff --git a/dom/media/webaudio/test/mochitest.ini b/dom/media/webaudio/test/mochitest.ini index 83b47d29d1aa..be8856b47933 100644 --- a/dom/media/webaudio/test/mochitest.ini +++ b/dom/media/webaudio/test/mochitest.ini @@ -127,7 +127,6 @@ skip-if = (toolkit == 'gonk' && !debug) || android_version == '10' # Android: bu [test_oscillatorNode.html] [test_oscillatorNode2.html] [test_oscillatorNodeNegativeFrequency.html] -skip-if = (toolkit == 'gonk') || (toolkit == 'android') [test_oscillatorNodePassThrough.html] [test_oscillatorNodeStart.html] [test_oscillatorTypeChange.html] diff --git a/dom/plugins/ipc/PluginModuleParent.cpp b/dom/plugins/ipc/PluginModuleParent.cpp index 98acf02d893b..0f8d7511a7cb 100755 --- a/dom/plugins/ipc/PluginModuleParent.cpp +++ b/dom/plugins/ipc/PluginModuleParent.cpp @@ -391,11 +391,21 @@ PluginModuleChromeParent::LoadModule(const char* aFilePath, uint32_t aPluginId, { PLUGIN_LOG_DEBUG_FUNCTION; + bool enableSandbox = false; +#if defined(XP_WIN) && defined(MOZ_SANDBOX) + nsAutoCString sandboxPref("dom.ipc.plugins.sandbox."); + sandboxPref.Append(aPluginTag->GetNiceFileName()); + if (NS_FAILED(Preferences::GetBool(sandboxPref.get(), &enableSandbox))) { + enableSandbox = Preferences::GetBool("dom.ipc.plugins.sandbox.default"); + } +#endif + nsAutoPtr parent(new PluginModuleChromeParent(aFilePath, aPluginId)); UniquePtr onLaunchedRunnable(new LaunchedTask(parent)); parent->mSubprocess->SetCallRunnableImmediately(!parent->mIsStartingAsync); TimeStamp launchStart = TimeStamp::Now(); - bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable)); + bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable), + enableSandbox); if (!launched) { // We never reached open parent->mShutdown = true; diff --git a/dom/plugins/ipc/PluginProcessChild.cpp b/dom/plugins/ipc/PluginProcessChild.cpp index 3dc2610cd6ea..8075e695d982 100644 --- a/dom/plugins/ipc/PluginProcessChild.cpp +++ b/dom/plugins/ipc/PluginProcessChild.cpp @@ -12,6 +12,7 @@ #include "base/command_line.h" #include "base/string_util.h" #include "chrome/common/chrome_switches.h" +#include "nsDebugImpl.h" #if defined(XP_MACOSX) #include "nsCocoaFeatures.h" @@ -23,6 +24,10 @@ extern "C" CGError CGSSetDebugOptions(int options); #ifdef XP_WIN #include bool ShouldProtectPluginCurrentDirectory(char16ptr_t pluginFilePath); +#if defined(MOZ_SANDBOX) +#define TARGET_SANDBOX_EXPORTS +#include "mozilla/sandboxTarget.h" +#endif #endif using mozilla::ipc::IOThreadChild; @@ -49,6 +54,8 @@ namespace plugins { bool PluginProcessChild::Init() { + nsDebugImpl::SetMultiprocessMode("NPAPI"); + #if defined(XP_MACOSX) // Remove the trigger for "dyld interposing" that we added in // GeckoChildProcessHost::PerformAsyncLaunchInternal(), in the host @@ -117,6 +124,13 @@ PluginProcessChild::Init() } pluginFilename = WideToUTF8(values[0]); + +#if defined(MOZ_SANDBOX) + // This is probably the earliest we would want to start the sandbox. + // As we attempt to tighten the sandbox, we may need to consider moving this + // to later in the plugin initialization. + mozilla::SandboxTarget::Instance()->StartSandbox(); +#endif #else # error Sorry #endif diff --git a/dom/plugins/ipc/PluginProcessParent.cpp b/dom/plugins/ipc/PluginProcessParent.cpp index 66c2d3463844..c02c80ace568 100644 --- a/dom/plugins/ipc/PluginProcessParent.cpp +++ b/dom/plugins/ipc/PluginProcessParent.cpp @@ -43,8 +43,18 @@ PluginProcessParent::~PluginProcessParent() } bool -PluginProcessParent::Launch(mozilla::UniquePtr aLaunchCompleteTask) +PluginProcessParent::Launch(mozilla::UniquePtr aLaunchCompleteTask, + bool aEnableSandbox) { +#if defined(XP_WIN) && defined(MOZ_SANDBOX) + mEnableNPAPISandbox = aEnableSandbox; +#else + if (aEnableSandbox) { + MOZ_ASSERT(false, + "Can't enable an NPAPI process sandbox for platform/build."); + } +#endif + ProcessArchitecture currentArchitecture = base::GetCurrentProcessArchitecture(); uint32_t containerArchitectures = GetSupportedArchitecturesForProcessType(GeckoProcessType_Plugin); diff --git a/dom/plugins/ipc/PluginProcessParent.h b/dom/plugins/ipc/PluginProcessParent.h index 7ba631128822..003d7fc65720 100644 --- a/dom/plugins/ipc/PluginProcessParent.h +++ b/dom/plugins/ipc/PluginProcessParent.h @@ -50,8 +50,11 @@ public: * * @param aLaunchCompleteTask Task that is executed on the main * thread once the asynchonous launch has completed. + * @param aEnableSandbox Enables a process sandbox if one is available for + * this platform/build. Will assert if true passed and one is not available. */ - bool Launch(UniquePtr aLaunchCompleteTask = UniquePtr()); + bool Launch(UniquePtr aLaunchCompleteTask = UniquePtr(), + bool aEnableSandbox = false); void Delete(); diff --git a/dom/system/gonk/NetworkManager.js b/dom/system/gonk/NetworkManager.js index 6274e95e9dd3..c26d162ce33b 100644 --- a/dom/system/gonk/NetworkManager.js +++ b/dom/system/gonk/NetworkManager.js @@ -344,14 +344,16 @@ NetworkManager.prototype = { gNetworkService.removeHostRoutes(network.name); this.setHostRoutes(network); } + + // Remove pre-created default route and let setAndConfigureActive() + // to set default route only on preferred network + gNetworkService.removeDefaultRoute(network); + // Dun type is a special case where we add the default route to a // secondary table. if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { this.setSecondaryDefaultRoute(network); } - // Remove pre-created default route and let setAndConfigureActive() - // to set default route only on preferred network - gNetworkService.removeDefaultRoute(network); this._addSubnetRoutes(network); this.setAndConfigureActive(); diff --git a/dom/system/gonk/NetworkUtils.cpp b/dom/system/gonk/NetworkUtils.cpp index 4dab9a1de9de..64ced69ed1de 100644 --- a/dom/system/gonk/NetworkUtils.cpp +++ b/dom/system/gonk/NetworkUtils.cpp @@ -1185,6 +1185,57 @@ void NetworkUtils::setDefaultNetwork(CommandChain* aChain, doCommand(command, aChain, aCallback); } +void NetworkUtils::addRouteToSecondaryTable(CommandChain* aChain, + CommandCallback aCallback, + NetworkResultOptions& aResult) { + + char command[MAX_COMMAND_SIZE]; + + if (SDK_VERSION >= 20) { + snprintf(command, MAX_COMMAND_SIZE - 1, + "network route add %d %s %s/%s %s", + GET_FIELD(mNetId), + GET_CHAR(mIfname), + GET_CHAR(mIp), + GET_CHAR(mPrefix), + GET_CHAR(mGateway)); + } else { + snprintf(command, MAX_COMMAND_SIZE - 1, + "interface route add %s secondary %s %s %s", + GET_CHAR(mIfname), + GET_CHAR(mIp), + GET_CHAR(mPrefix), + GET_CHAR(mGateway)); + } + + doCommand(command, aChain, aCallback); +} + +void NetworkUtils::removeRouteFromSecondaryTable(CommandChain* aChain, + CommandCallback aCallback, + NetworkResultOptions& aResult) { + char command[MAX_COMMAND_SIZE]; + + if (SDK_VERSION >= 20) { + snprintf(command, MAX_COMMAND_SIZE - 1, + "network route remove %d %s %s/%s %s", + GET_FIELD(mNetId), + GET_CHAR(mIfname), + GET_CHAR(mIp), + GET_CHAR(mPrefix), + GET_CHAR(mGateway)); + } else { + snprintf(command, MAX_COMMAND_SIZE - 1, + "interface route remove %s secondary %s %s %s", + GET_CHAR(mIfname), + GET_CHAR(mIp), + GET_CHAR(mPrefix), + GET_CHAR(mGateway)); + } + + doCommand(command, aChain, aCallback); +} + void NetworkUtils::setIpv6Enabled(CommandChain* aChain, CommandCallback aCallback, NetworkResultOptions& aResult, @@ -2119,30 +2170,40 @@ CommandResult NetworkUtils::removeNetworkRouteLegacy(NetworkParams& aOptions) CommandResult NetworkUtils::addSecondaryRoute(NetworkParams& aOptions) { - char command[MAX_COMMAND_SIZE]; - snprintf(command, MAX_COMMAND_SIZE - 1, - "interface route add %s secondary %s %s %s", - GET_CHAR(mIfname), - GET_CHAR(mIp), - GET_CHAR(mPrefix), - GET_CHAR(mGateway)); + static CommandFunc COMMAND_CHAIN[] = { + addRouteToSecondaryTable, + defaultAsyncSuccessHandler + }; - doCommand(command, nullptr, nullptr); - return SUCCESS; + if (SDK_VERSION >= 20) { + NetIdManager::NetIdInfo netIdInfo; + if (!mNetIdManager.lookup(aOptions.mIfname, &netIdInfo)) { + return -1; + } + aOptions.mNetId = netIdInfo.mNetId; + } + + runChain(aOptions, COMMAND_CHAIN, defaultAsyncFailureHandler); + return CommandResult::Pending(); } CommandResult NetworkUtils::removeSecondaryRoute(NetworkParams& aOptions) { - char command[MAX_COMMAND_SIZE]; - snprintf(command, MAX_COMMAND_SIZE - 1, - "interface route remove %s secondary %s %s %s", - GET_CHAR(mIfname), - GET_CHAR(mIp), - GET_CHAR(mPrefix), - GET_CHAR(mGateway)); + static CommandFunc COMMAND_CHAIN[] = { + removeRouteFromSecondaryTable, + defaultAsyncSuccessHandler + }; - doCommand(command, nullptr, nullptr); - return SUCCESS; + if (SDK_VERSION >= 20) { + NetIdManager::NetIdInfo netIdInfo; + if (!mNetIdManager.lookup(aOptions.mIfname, &netIdInfo)) { + return -1; + } + aOptions.mNetId = netIdInfo.mNetId; + } + + runChain(aOptions, COMMAND_CHAIN, defaultAsyncFailureHandler); + return CommandResult::Pending(); } CommandResult NetworkUtils::setNetworkInterfaceAlarm(NetworkParams& aOptions) diff --git a/dom/system/gonk/NetworkUtils.h b/dom/system/gonk/NetworkUtils.h index cb63bc7dc583..7e88231522d1 100644 --- a/dom/system/gonk/NetworkUtils.h +++ b/dom/system/gonk/NetworkUtils.h @@ -392,6 +392,8 @@ private: static void enableIpv6(PARAMS); static void disableIpv6(PARAMS); static void setIpv6Enabled(PARAMS, bool aEnabled); + static void addRouteToSecondaryTable(PARAMS); + static void removeRouteFromSecondaryTable(PARAMS); static void defaultAsyncSuccessHandler(PARAMS); #undef PARAMS diff --git a/dom/system/windows/WindowsLocationProvider.cpp b/dom/system/windows/WindowsLocationProvider.cpp new file mode 100644 index 000000000000..041837302f6e --- /dev/null +++ b/dom/system/windows/WindowsLocationProvider.cpp @@ -0,0 +1,198 @@ +/* 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 "WindowsLocationProvider.h" +#include "nsGeoPosition.h" +#include "nsIDOMGeoPositionError.h" +#include "prtime.h" + +#include + +namespace mozilla { +namespace dom { + +class LocationEvent MOZ_FINAL : public ILocationEvents +{ +public: + LocationEvent(nsIGeolocationUpdate* aCallback) + : mCallback(aCallback), mCount(0) { + } + + // IUnknown interface + STDMETHODIMP_(ULONG) AddRef() MOZ_OVERRIDE; + STDMETHODIMP_(ULONG) Release() MOZ_OVERRIDE; + STDMETHODIMP QueryInterface(REFIID iid, void** ppv) MOZ_OVERRIDE; + + // ILocationEvents interface + STDMETHODIMP OnStatusChanged(REFIID aReportType, + LOCATION_REPORT_STATUS aStatus) MOZ_OVERRIDE; + STDMETHODIMP OnLocationChanged(REFIID aReportType, + ILocationReport *aReport) MOZ_OVERRIDE; + +private: + nsCOMPtr mCallback; + ULONG mCount; +}; + +STDMETHODIMP_(ULONG) +LocationEvent::AddRef() +{ + return InterlockedIncrement(&mCount); +} + +STDMETHODIMP_(ULONG) +LocationEvent::Release() +{ + ULONG count = InterlockedDecrement(&mCount); + if (!count) { + delete this; + return 0; + } + return count; +} + +STDMETHODIMP +LocationEvent::QueryInterface(REFIID iid, void** ppv) +{ + if (iid == IID_IUnknown) { + *ppv = static_cast(this); + } else if (iid == IID_ILocationEvents) { + *ppv = static_cast(this); + } else { + return E_NOINTERFACE; + } + AddRef(); + return S_OK; +} + + +STDMETHODIMP +LocationEvent::OnStatusChanged(REFIID aReportType, + LOCATION_REPORT_STATUS aStatus) +{ + if (aReportType != IID_ILatLongReport) { + return S_OK; + } + + uint16_t err; + switch (aStatus) { + case REPORT_ACCESS_DENIED: + err = nsIDOMGeoPositionError::PERMISSION_DENIED; + break; + case REPORT_ERROR: + err = nsIDOMGeoPositionError::POSITION_UNAVAILABLE; + break; + default: + return S_OK; + } + + mCallback->NotifyError(err); + return S_OK; +} + +STDMETHODIMP +LocationEvent::OnLocationChanged(REFIID aReportType, + ILocationReport *aReport) +{ + if (aReportType != IID_ILatLongReport) { + return S_OK; + } + + nsRefPtr latLongReport; + if (FAILED(aReport->QueryInterface(IID_ILatLongReport, + getter_AddRefs(latLongReport)))) { + return E_FAIL; + } + + DOUBLE latitude = 0.0; + latLongReport->GetLatitude(&latitude); + + DOUBLE longitude = 0.0; + latLongReport->GetLongitude(&longitude); + + DOUBLE alt = 0.0; + latLongReport->GetAltitude(&alt); + + DOUBLE herror = 0.0; + latLongReport->GetErrorRadius(&herror); + + DOUBLE verror = 0.0; + latLongReport->GetAltitudeError(&verror); + + nsRefPtr position = + new nsGeoPosition(latitude, longitude, alt, herror, verror, 0.0, 0.0, + PR_Now()); + mCallback->Update(position); + + return S_OK; +} + +NS_IMPL_ISUPPORTS(WindowsLocationProvider, nsIGeolocationProvider) + +WindowsLocationProvider::WindowsLocationProvider() +{ +} + +NS_IMETHODIMP +WindowsLocationProvider::Startup() +{ + nsRefPtr location; + if (FAILED(::CoCreateInstance(CLSID_Location, nullptr, CLSCTX_INPROC_SERVER, + IID_ILocation, + getter_AddRefs(location)))) { + return NS_ERROR_FAILURE; + } + + IID reportTypes[] = { IID_ILatLongReport }; + if (FAILED(location->RequestPermissions(nullptr, reportTypes, 1, FALSE))) { + return NS_ERROR_FAILURE; + } + + mLocation = location; + return NS_OK; +} + +NS_IMETHODIMP +WindowsLocationProvider::Watch(nsIGeolocationUpdate* aCallback) +{ + nsRefPtr event = new LocationEvent(aCallback); + if (FAILED(mLocation->RegisterForReport(event, IID_ILatLongReport, 0))) { + return NS_ERROR_FAILURE; + } + return NS_OK; +} + +NS_IMETHODIMP +WindowsLocationProvider::Shutdown() +{ + if (mLocation) { + mLocation->UnregisterForReport(IID_ILatLongReport); + mLocation = nullptr; + } + + return NS_OK; +} + +NS_IMETHODIMP +WindowsLocationProvider::SetHighAccuracy(bool enable) +{ + if (!mLocation) { + return NS_ERROR_FAILURE; + } + + LOCATION_DESIRED_ACCURACY desiredAccuracy; + if (enable) { + desiredAccuracy = LOCATION_DESIRED_ACCURACY_HIGH; + } else { + desiredAccuracy = LOCATION_DESIRED_ACCURACY_DEFAULT; + } + if (FAILED(mLocation->SetDesiredAccuracy(IID_ILatLongReport, + desiredAccuracy))) { + return NS_ERROR_FAILURE; + } + return NS_OK; +} + +} // namespace dom +} // namespace mozilla diff --git a/dom/system/windows/WindowsLocationProvider.h b/dom/system/windows/WindowsLocationProvider.h new file mode 100644 index 000000000000..3a9a9c85be7f --- /dev/null +++ b/dom/system/windows/WindowsLocationProvider.h @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_WindowsLocationProvider_h__ +#define mozilla_dom_WindowsLocationProvider_h__ + +#include "nsAutoPtr.h" +#include "nsIGeolocationProvider.h" + +#include + +namespace mozilla { +namespace dom { + +class WindowsLocationProvider MOZ_FINAL : public nsIGeolocationProvider +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIGEOLOCATIONPROVIDER + + WindowsLocationProvider(); + +private: + nsRefPtr mLocation; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_WindowsLocationProvider_h__ diff --git a/dom/system/windows/moz.build b/dom/system/windows/moz.build index 005959aa3fc4..178cd7a82667 100644 --- a/dom/system/windows/moz.build +++ b/dom/system/windows/moz.build @@ -6,6 +6,7 @@ SOURCES += [ 'nsHapticFeedback.cpp', + 'WindowsLocationProvider.cpp' ] FAIL_ON_WARNINGS = True diff --git a/dom/telephony/gonk/DialNumberUtils.jsm b/dom/telephony/gonk/DialNumberUtils.jsm new file mode 100644 index 000000000000..7fd15163da9f --- /dev/null +++ b/dom/telephony/gonk/DialNumberUtils.jsm @@ -0,0 +1,128 @@ +/* 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/. */ + +"use strict"; + +this.EXPORTED_SYMBOLS = ["DialNumberUtils"]; + +const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + +Cu.import("resource://gre/modules/systemlibs.js"); + +const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"]; + +const MMI_MATCH_GROUP_FULL_MMI = 1; +const MMI_MATCH_GROUP_PROCEDURE = 2; +const MMI_MATCH_GROUP_SERVICE_CODE = 3; +const MMI_MATCH_GROUP_SIA = 4; +const MMI_MATCH_GROUP_SIB = 5; +const MMI_MATCH_GROUP_SIC = 6; +const MMI_MATCH_GROUP_PWD_CONFIRM = 7; +const MMI_MATCH_GROUP_DIALING_NUMBER = 8; + +this.DialNumberUtils = { + /** + * Check a given number against the list of emergency numbers provided by the + * RIL. + */ + isEmergency: function(aNumber) { + // Check ril provided numbers first. + let numbers = libcutils.property_get("ril.ecclist") || + libcutils.property_get("ro.ril.ecclist"); + if (numbers) { + numbers = numbers.split(","); + } else { + // No ecclist system property, so use our own list. + numbers = DEFAULT_EMERGENCY_NUMBERS; + } + return numbers.indexOf(aNumber) != -1; + }, + + _mmiRegExp: (function() { + // Procedure, which could be *, #, *#, **, ## + let procedure = "(\\*[*#]?|##?)"; + + // Service code, which is a 2 or 3 digits that uniquely specifies the + // Supplementary Service associated with the MMI code. + let serviceCode = "(\\d{2,3})"; + + // Supplementary Information SIA, SIB and SIC. + // Where a particular service request does not require any SI, "*SI" is + // not entered. The use of SIA, SIB and SIC is optional and shall be + // entered in any of the following formats: + // - *SIA*SIB*SIC# + // - *SIA*SIB# + // - *SIA**SIC# + // - *SIA# + // - **SIB*SIC# + // - ***SIC# + // + // Also catch the additional NEW_PASSWORD for the case of a password + // registration procedure. Ex: + // - * 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # + // - ** 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # + // - * 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # + // - ** 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # + let si = "\\*([^*#]*)"; + let allSi = ""; + for (let i = 0; i < 4; ++i) { + allSi = "(?:" + si + allSi + ")?"; + } + + let fullmmi = "(" + procedure + serviceCode + allSi + "#)"; + + // Dial string after the #. + let optionalDialString = "([^#]+)?"; + + return new RegExp("^" + fullmmi + optionalDialString + "$"); + })(), + + _isPoundString: function(aString) { + return aString && aString[aString.length - 1] === "#"; + }, + + _isShortString: function(aString) { + if (!aString || this.isEmergency(aString) || aString.length > 2 || + (aString.length == 2 && aString[0] === "1")) { + return false; + } + return true; + }, + + /** + * Check parse the given string as an MMI code. + * + * An MMI code should be: + * - Activation (*SC*SI#). + * - Deactivation (#SC*SI#). + * - Interrogation (*#SC*SI#). + * - Registration (**SC*SI#). + * - Erasure (##SC*SI#). + * where SC = Service Code (2 or 3 digits) and SI = Supplementary Info + * (variable length). + */ + parseMMI: function(aString) { + let matches = this._mmiRegExp.exec(aString); + if (matches) { + return { + fullMMI: matches[MMI_MATCH_GROUP_FULL_MMI], + procedure: matches[MMI_MATCH_GROUP_PROCEDURE], + serviceCode: matches[MMI_MATCH_GROUP_SERVICE_CODE], + sia: matches[MMI_MATCH_GROUP_SIA], + sib: matches[MMI_MATCH_GROUP_SIB], + sic: matches[MMI_MATCH_GROUP_SIC], + pwd: matches[MMI_MATCH_GROUP_PWD_CONFIRM], + dialNumber: matches[MMI_MATCH_GROUP_DIALING_NUMBER] + }; + } + + if (this._isPoundString(aString) || this._isShortString(aString)) { + return { + fullMMI: aString + }; + } + + return null; + } +}; diff --git a/dom/telephony/gonk/TelephonyService.js b/dom/telephony/gonk/TelephonyService.js index 1e62af845a92..acc46231f024 100644 --- a/dom/telephony/gonk/TelephonyService.js +++ b/dom/telephony/gonk/TelephonyService.js @@ -10,7 +10,6 @@ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("resource://gre/modules/systemlibs.js"); XPCOMUtils.defineLazyGetter(this, "RIL", function () { let obj = {}; @@ -48,20 +47,9 @@ const DIAL_ERROR_INVALID_STATE_ERROR = "InvalidStateError"; const DIAL_ERROR_OTHER_CONNECTION_IN_USE = "OtherConnectionInUse"; const DIAL_ERROR_BAD_NUMBER = RIL.GECKO_CALL_ERROR_BAD_NUMBER; -const DEFAULT_EMERGENCY_NUMBERS = ["112", "911"]; const TONES_GAP_DURATION = 70; -// MMI match groups -const MMI_MATCH_GROUP_FULL_MMI = 1; -const MMI_MATCH_GROUP_PROCEDURE = 2; -const MMI_MATCH_GROUP_SERVICE_CODE = 3; -const MMI_MATCH_GROUP_SIA = 4; -const MMI_MATCH_GROUP_SIB = 5; -const MMI_MATCH_GROUP_SIC = 6; -const MMI_MATCH_GROUP_PWD_CONFIRM = 7; -const MMI_MATCH_GROUP_DIALING_NUMBER = 8; - let DEBUG; function debug(s) { dump("TelephonyService: " + s + "\n"); @@ -93,6 +81,12 @@ XPCOMUtils.defineLazyGetter(this, "gPhoneNumberUtils", function() { return ns.PhoneNumberUtils; }); +XPCOMUtils.defineLazyGetter(this, "gDialNumberUtils", function() { + let ns = {}; + Cu.import("resource://gre/modules/DialNumberUtils.jsm", ns); + return ns.DialNumberUtils; +}); + function MobileCallForwardingOptions(aOptions) { for (let key in aOptions) { this[key] = aOptions[key]; @@ -160,8 +154,6 @@ function TelephonyService() { this._numClients = gRadioInterfaceLayer.numRadioInterfaces; this._listeners = []; - this._mmiRegExp = null; - this._isDialing = false; this._cachedDialRequest = null; this._currentCalls = {}; @@ -343,26 +335,6 @@ TelephonyService.prototype = { }); }, - /** - * Check a given number against the list of emergency numbers provided by the - * RIL. - * - * @param aNumber - * The number to look up. - */ - _isEmergencyNumber: function(aNumber) { - // Check ril provided numbers first. - let numbers = libcutils.property_get("ril.ecclist") || - libcutils.property_get("ro.ril.ecclist"); - if (numbers) { - numbers = numbers.split(","); - } else { - // No ecclist system property, so use our own list. - numbers = DEFAULT_EMERGENCY_NUMBERS; - } - return numbers.indexOf(aNumber) != -1; - }, - /** * Checks whether to temporarily suppress caller id for the call. * @@ -553,7 +525,7 @@ TelephonyService.prototype = { isDialEmergency: aIsDialEmergency }, aCallback); } } else { - let mmi = this._parseMMI(aNumber); + let mmi = gDialNumberUtils.parseMMI(aNumber); if (!mmi) { this._dialCall(aClientId, { number: aNumber, @@ -602,7 +574,7 @@ TelephonyService.prototype = { return; } - aOptions.isEmergency = this._isEmergencyNumber(aOptions.number); + aOptions.isEmergency = gDialNumberUtils.isEmergency(aOptions.number); if (aOptions.isEmergency) { // Automatically select a proper clientId for emergency call. aClientId = gRadioInterfaceLayer.getClientIdForEmergencyCall() ; @@ -750,138 +722,6 @@ TelephonyService.prototype = { }); }, - /** - * Build the regex to parse MMI string. TS.22.030 - * - * The resulting groups after matching will be: - * 1 = full MMI string that might be used as a USSD request. - * 2 = MMI procedure. - * 3 = Service code. - * 4 = SIA. - * 5 = SIB. - * 6 = SIC. - * 7 = Password registration. - * 8 = Dialing number. - */ - _buildMMIRegExp: function() { - // The general structure of the codes is as follows: - // - Activation (*SC*SI#). - // - Deactivation (#SC*SI#). - // - Interrogation (*#SC*SI#). - // - Registration (**SC*SI#). - // - Erasure (##SC*SI#). - // - // where SC = Service Code (2 or 3 digits) and SI = Supplementary Info - // (variable length). - - // Procedure, which could be *, #, *#, **, ## - let procedure = "(\\*[*#]?|##?)"; - - // Service code, which is a 2 or 3 digits that uniquely specifies the - // Supplementary Service associated with the MMI code. - let serviceCode = "(\\d{2,3})"; - - // Supplementary Information SIA, SIB and SIC. SIA may comprise e.g. a PIN - // code or Directory Number, SIB may be used to specify the tele or bearer - // service and SIC to specify the value of the "No Reply Condition Timer". - // Where a particular service request does not require any SI, "*SI" is - // not entered. The use of SIA, SIB and SIC is optional and shall be - // entered in any of the following formats: - // - *SIA*SIB*SIC# - // - *SIA*SIB# - // - *SIA**SIC# - // - *SIA# - // - **SIB*SIC# - // - ***SIC# - // - // Also catch the additional NEW_PASSWORD for the case of a password - // registration procedure. Ex: - // - * 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # - // - ** 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # - // - * 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # - // - ** 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD # - let si = "\\*([^*#]*)"; - let allSi = ""; - for (let i = 0; i < 4; ++i) { - allSi = "(?:" + si + allSi + ")?"; - } - - let fullmmi = "(" + procedure + serviceCode + allSi + "#)"; - - // Dial string after the #. - let optionalDialString = "([^#]+)?"; - - return new RegExp("^" + fullmmi + optionalDialString + "$"); - }, - - /** - * Provide the regex to parse MMI string. - */ - _getMMIRegExp: function() { - if (!this._mmiRegExp) { - this._mmiRegExp = this._buildMMIRegExp(); - } - - return this._mmiRegExp; - }, - - /** - * Helper to parse # string. TS.22.030 Figure 3.5.3.2. - */ - _isPoundString: function(aMmiString) { - return (aMmiString.charAt(aMmiString.length - 1) === "#"); - }, - - /** - * Helper to parse short string. TS.22.030 Figure 3.5.3.2. - */ - _isShortString: function(aMmiString) { - if (aMmiString.length > 2) { - return false; - } - - // Input string is - // - emergency number or - // - 2 digits starting with a "1" - if (this._isEmergencyNumber(aMmiString) || - (aMmiString.length == 2) && (aMmiString.charAt(0) === '1')) { - return false; - } - - return true; - }, - - /** - * Helper to parse MMI/USSD string. TS.22.030 Figure 3.5.3.2. - */ - _parseMMI: function(aMmiString) { - if (!aMmiString) { - return null; - } - - let matches = this._getMMIRegExp().exec(aMmiString); - if (matches) { - return { - fullMMI: matches[MMI_MATCH_GROUP_FULL_MMI], - procedure: matches[MMI_MATCH_GROUP_PROCEDURE], - serviceCode: matches[MMI_MATCH_GROUP_SERVICE_CODE], - sia: matches[MMI_MATCH_GROUP_SIA], - sib: matches[MMI_MATCH_GROUP_SIB], - sic: matches[MMI_MATCH_GROUP_SIC], - pwd: matches[MMI_MATCH_GROUP_PWD_CONFIRM], - dialNumber: matches[MMI_MATCH_GROUP_DIALING_NUMBER] - }; - } - - if (this._isPoundString(aMmiString) || this._isShortString(aMmiString)) { - return { - fullMMI: aMmiString - }; - } - - return null; - }, - _serviceCodeToKeyString: function(aServiceCode) { switch (aServiceCode) { case RIL.MMI_SC_CFU: @@ -1178,7 +1018,7 @@ TelephonyService.prototype = { aCall.clientId = aClientId; aCall.state = nsITelephonyService.CALL_STATE_DISCONNECTED; - aCall.isEmergency = this._isEmergencyNumber(aCall.number); + aCall.isEmergency = gDialNumberUtils.isEmergency(aCall.number); let duration = ("started" in aCall && typeof aCall.started == "number") ? new Date().getTime() - aCall.started : 0; @@ -1273,12 +1113,12 @@ TelephonyService.prototype = { call.state = aCall.state; call.number = aCall.number; call.isConference = aCall.isConference; - call.isEmergency = this._isEmergencyNumber(aCall.number); + call.isEmergency = gDialNumberUtils.isEmergency(aCall.number); call.isSwitchable = pick(aCall.isSwitchable, call.isSwitchable); call.isMergeable = pick(aCall.isMergeable, call.isMergeable); } else { call = aCall; - call.isEmergency = pick(aCall.isEmergency, this._isEmergencyNumber(aCall.number)); + call.isEmergency = pick(aCall.isEmergency, gDialNumberUtils.isEmergency(aCall.number)); call.isSwitchable = pick(aCall.isSwitchable, true); call.isMergeable = pick(aCall.isMergeable, true); call.name = pick(aCall.name, ""); diff --git a/dom/telephony/moz.build b/dom/telephony/moz.build index e2dbba00f6cb..f21b695446ac 100644 --- a/dom/telephony/moz.build +++ b/dom/telephony/moz.build @@ -66,6 +66,9 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['MOZ_B2G_RIL']: 'gonk/TelephonyService.js', 'gonk/TelephonyService.manifest', ] + EXTRA_JS_MODULES += [ + 'gonk/DialNumberUtils.jsm' + ] FAIL_ON_WARNINGS = True include('/ipc/chromium/chromium-config.mozbuild') diff --git a/dom/telephony/test/xpcshell/test_parseMMI.js b/dom/telephony/test/xpcshell/test_parseMMI.js index 9ed9d08fa4a8..ca02a65d459a 100644 --- a/dom/telephony/test/xpcshell/test_parseMMI.js +++ b/dom/telephony/test/xpcshell/test_parseMMI.js @@ -4,15 +4,14 @@ subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this); let NS = {}; -subscriptLoader.loadSubScript("resource://gre/components/TelephonyService.js", - NS); +subscriptLoader.loadSubScript("resource://gre/modules/DialNumberUtils.jsm", NS); function run_test() { run_next_test(); } function parseMMI(mmiString) { - return NS.TelephonyService.prototype._parseMMI(mmiString); + return NS.DialNumberUtils.parseMMI(mmiString); } add_test(function test_parseMMI_empty() { diff --git a/dom/tests/browser/browser_ConsoleAPITests.js b/dom/tests/browser/browser_ConsoleAPITests.js index 288d002f0195..17ebebc8a92e 100644 --- a/dom/tests/browser/browser_ConsoleAPITests.js +++ b/dom/tests/browser/browser_ConsoleAPITests.js @@ -5,7 +5,7 @@ const TEST_URI = "http://example.com/browser/dom/tests/browser/test-console-api.html"; -var gWindow, gLevel, gArgs, gTestDriver, gStyle; +var gWindow, gLevel, gArgs, gStyle; function test() { waitForExplicitFinish(); @@ -15,7 +15,7 @@ function test() { var browser = gBrowser.selectedBrowser; registerCleanupFunction(function () { - gWindow = gLevel = gArgs = gTestDriver = null; + gWindow = gLevel = gArgs = null; gBrowser.removeTab(tab); }); @@ -26,8 +26,7 @@ function test() { executeSoon(function test_executeSoon() { gWindow = browser.contentWindow; consoleAPISanityTest(); - gTestDriver = observeConsoleTest(); - gTestDriver.next(); + observeConsoleTest(); }); }, false); @@ -74,8 +73,6 @@ function testConsoleData(aMessageObject) { } } } - - gTestDriver.next(); } function testLocationData(aMessageObject) { @@ -215,127 +212,100 @@ function observeConsoleTest() { let win = XPCNativeWrapper.unwrap(gWindow); expect("log", "arg"); win.console.log("arg"); - yield undefined; expect("info", "arg", "extra arg"); win.console.info("arg", "extra arg"); - yield undefined; expect("warn", "Lesson 1: PI is approximately equal to 3"); win.console.warn("Lesson %d: %s is approximately equal to %1.0f", 1, "PI", 3.14159); - yield undefined; expect("warn", "Lesson 1: PI is approximately equal to 3.14"); win.console.warn("Lesson %d: %s is approximately equal to %1.2f", 1, "PI", 3.14159); - yield undefined; expect("warn", "Lesson 1: PI is approximately equal to 3.141590"); win.console.warn("Lesson %d: %s is approximately equal to %f", 1, "PI", 3.14159); - yield undefined; expect("warn", "Lesson 1: PI is approximately equal to 3.1415900"); win.console.warn("Lesson %d: %s is approximately equal to %0.7f", 1, "PI", 3.14159); - yield undefined; expect("log", "%d, %s, %l"); win.console.log("%d, %s, %l"); - yield undefined; expect("log", "%a %b %g"); win.console.log("%a %b %g"); - yield undefined; expect("log", "%a %b %g", "a", "b"); win.console.log("%a %b %g", "a", "b"); - yield undefined; expect("log", "2, a, %l", 3); win.console.log("%d, %s, %l", 2, "a", 3); - yield undefined; // Bug #692550 handle null and undefined. expect("log", "null, undefined"); win.console.log("%s, %s", null, undefined); - yield undefined; // Bug #696288 handle object as first argument. let obj = { a: 1 }; expect("log", obj, "a"); win.console.log(obj, "a"); - yield undefined; expect("dir", win.toString()); win.console.dir(win); - yield undefined; expect("error", "arg"); win.console.error("arg"); - yield undefined; expect("exception", "arg"); win.console.exception("arg"); - yield undefined; expect("log", "foobar"); gStyle = ["color:red;foobar;;"]; win.console.log("%cfoobar", gStyle[0]); - yield undefined; let obj4 = { d: 4 }; expect("warn", "foobar", obj4, "test", "bazbazstr", "last"); gStyle = [null, null, null, "color:blue;", "color:red"]; win.console.warn("foobar%Otest%cbazbaz%s%clast", obj4, gStyle[3], "str", gStyle[4]); - yield undefined; let obj3 = { c: 3 }; expect("info", "foobar", "bazbaz", obj3, "%comg", "color:yellow"); gStyle = [null, "color:pink;"]; win.console.info("foobar%cbazbaz", gStyle[1], obj3, "%comg", "color:yellow"); - yield undefined; gStyle = null; let obj2 = { b: 2 }; expect("log", "omg ", obj, " foo ", 4, obj2); win.console.log("omg %o foo %o", obj, 4, obj2); - yield undefined; expect("assert", "message"); win.console.assert(false, "message"); - yield undefined; expect("count", { label: "label a", count: 1 }) win.console.count("label a"); - yield undefined; expect("count", { label: "label b", count: 1 }) win.console.count("label b"); - yield undefined; expect("count", { label: "label a", count: 2 }) win.console.count("label a"); - yield undefined; expect("count", { label: "label b", count: 2 }) win.console.count("label b"); - yield undefined; startTraceTest(); - yield undefined; - startLocationTest(); - yield undefined; } function consoleAPISanityTest() { diff --git a/dom/webidl/Event.webidl b/dom/webidl/Event.webidl index 8d1c14bddcce..188045654e10 100644 --- a/dom/webidl/Event.webidl +++ b/dom/webidl/Event.webidl @@ -56,6 +56,7 @@ partial interface Event { readonly attribute EventTarget? originalTarget; readonly attribute EventTarget? explicitOriginalTarget; + [ChromeOnly] readonly attribute EventTarget? composedTarget; [ChromeOnly] readonly attribute boolean multipleActionsPrevented; [ChromeOnly] readonly attribute boolean isSynthesized; diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 08b4e01408a6..f4c6bac57d54 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -1729,6 +1729,14 @@ private: bool mIsOffline; }; +#ifdef DEBUG +static bool +StartsWithExplicit(nsACString& s) +{ + return StringBeginsWith(s, NS_LITERAL_CSTRING("explicit/")); +} +#endif + class WorkerJSRuntimeStats : public JS::RuntimeStats { const nsACString& mRtPath; @@ -1761,6 +1769,9 @@ public: xpc::ZoneStatsExtras* extras = new xpc::ZoneStatsExtras; extras->pathPrefix = mRtPath; extras->pathPrefix += nsPrintfCString("zone(0x%p)/", (void *)aZone); + + MOZ_ASSERT(StartsWithExplicit(extras->pathPrefix)); + aZoneStats->extra = extras; } @@ -1787,6 +1798,9 @@ public: // This should never be used when reporting with workers (hence the "?!"). extras->domPathPrefix.AssignLiteral("explicit/workers/?!/"); + MOZ_ASSERT(StartsWithExplicit(extras->jsPathPrefix)); + MOZ_ASSERT(StartsWithExplicit(extras->domPathPrefix)); + extras->location = nullptr; aCompartmentStats->extra = extras; @@ -2081,15 +2095,14 @@ public: AssertIsOnMainThread(); // Assumes that WorkerJSRuntimeStats will hold a reference to |path|, and - // not a copy, as TryToMapAddon() may later modify if. + // not a copy, as TryToMapAddon() may later modify it. nsCString path; WorkerJSRuntimeStats rtStats(path); { MutexAutoLock lock(mMutex); - if (!mWorkerPrivate || - !mWorkerPrivate->BlockAndCollectRuntimeStats(&rtStats, aAnonymize)) { + if (!mWorkerPrivate) { // Returning NS_OK here will effectively report 0 memory. return NS_OK; } @@ -2113,6 +2126,11 @@ public: path.AppendPrintf(", 0x%p)/", static_cast(mWorkerPrivate)); TryToMapAddon(path); + + if (!mWorkerPrivate->BlockAndCollectRuntimeStats(&rtStats, aAnonymize)) { + // Returning NS_OK here will effectively report 0 memory. + return NS_OK; + } } return xpc::ReportJSRuntimeExplicitTreeStats(rtStats, path, @@ -3502,7 +3520,7 @@ WorkerPrivateParent::SetBaseURI(nsIURI* aBaseURI) if (NS_SUCCEEDED(aBaseURI->GetRef(temp)) && !temp.IsEmpty()) { nsCOMPtr converter = do_GetService(NS_ITEXTTOSUBURI_CONTRACTID); - if (converter) { + if (converter && nsContentUtils::EncodeDecodeURLHash()) { nsCString charset; nsAutoString unicodeRef; if (NS_SUCCEEDED(aBaseURI->GetOriginCharset(charset)) && diff --git a/dom/workers/WorkerScope.cpp b/dom/workers/WorkerScope.cpp index c2eb0b76be85..06f50d7b3d80 100644 --- a/dom/workers/WorkerScope.cpp +++ b/dom/workers/WorkerScope.cpp @@ -95,6 +95,7 @@ NS_IMPL_RELEASE_INHERITED(WorkerGlobalScope, DOMEventTargetHelper) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WorkerGlobalScope) NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) JSObject* diff --git a/dom/workers/WorkerScope.h b/dom/workers/WorkerScope.h index 786d6b92eb34..84f6066f6d49 100644 --- a/dom/workers/WorkerScope.h +++ b/dom/workers/WorkerScope.h @@ -10,6 +10,7 @@ #include "mozilla/DOMEventTargetHelper.h" #include "mozilla/dom/Headers.h" #include "mozilla/dom/RequestBinding.h" +#include "nsWeakReference.h" namespace mozilla { namespace dom { @@ -37,7 +38,8 @@ class WorkerNavigator; class Performance; class WorkerGlobalScope : public DOMEventTargetHelper, - public nsIGlobalObject + public nsIGlobalObject, + public nsSupportsWeakReference { typedef mozilla::dom::indexedDB::IDBFactory IDBFactory; diff --git a/editor/libeditor/nsEditor.cpp b/editor/libeditor/nsEditor.cpp index 4bc6cb9c4cf1..4aeda8b14799 100644 --- a/editor/libeditor/nsEditor.cpp +++ b/editor/libeditor/nsEditor.cpp @@ -1133,6 +1133,12 @@ nsEditor::CanCopy(bool *aCanCut) return NS_ERROR_NOT_IMPLEMENTED; } +NS_IMETHODIMP +nsEditor::CanDelete(bool *aCanDelete) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + NS_IMETHODIMP nsEditor::Paste(int32_t aSelectionType) { diff --git a/editor/libeditor/nsEditorCommands.cpp b/editor/libeditor/nsEditorCommands.cpp index a9576ab6c0ad..dd7f87af1818 100644 --- a/editor/libeditor/nsEditorCommands.cpp +++ b/editor/libeditor/nsEditorCommands.cpp @@ -590,7 +590,7 @@ nsDeleteCommand::IsCommandEnabled(const char *aCommandName, NS_ENSURE_SUCCESS(rv, rv); if (!nsCRT::strcmp("cmd_delete", aCommandName) && *outCmdEnabled) { - rv = editor->CanCut(outCmdEnabled); + rv = editor->CanDelete(outCmdEnabled); NS_ENSURE_SUCCESS(rv, rv); } diff --git a/editor/libeditor/nsHTMLEditor.cpp b/editor/libeditor/nsHTMLEditor.cpp index ea1e6d9f6227..8069fdafcfe3 100644 --- a/editor/libeditor/nsHTMLEditor.cpp +++ b/editor/libeditor/nsHTMLEditor.cpp @@ -969,7 +969,6 @@ nsHTMLEditor::IsVisBreak(nsINode* aNode) return true; } - bool nsHTMLEditor::IsVisBreak(nsIDOMNode* aNode) { @@ -978,17 +977,6 @@ nsHTMLEditor::IsVisBreak(nsIDOMNode* aNode) return IsVisBreak(node); } -NS_IMETHODIMP -nsHTMLEditor::BreakIsVisible(nsIDOMNode *aNode, bool *aIsVisible) -{ - NS_ENSURE_ARG_POINTER(aNode && aIsVisible); - - *aIsVisible = IsVisBreak(aNode); - - return NS_OK; -} - - NS_IMETHODIMP nsHTMLEditor::GetIsDocumentEditable(bool *aIsDocumentEditable) { diff --git a/editor/libeditor/nsPlaintextEditor.cpp b/editor/libeditor/nsPlaintextEditor.cpp index 08c053c2e6fe..ae4906af49ff 100644 --- a/editor/libeditor/nsPlaintextEditor.cpp +++ b/editor/libeditor/nsPlaintextEditor.cpp @@ -1153,14 +1153,15 @@ nsPlaintextEditor::Redo(uint32_t aCount) } bool -nsPlaintextEditor::CanCutOrCopy() +nsPlaintextEditor::CanCutOrCopy(PasswordFieldAllowed aPasswordFieldAllowed) { nsRefPtr selection = GetSelection(); if (!selection) { return false; } - if (IsPasswordEditor()) + if (aPasswordFieldAllowed == ePasswordFieldNotAllowed && + IsPasswordEditor()) return false; return !selection->Collapsed(); @@ -1198,7 +1199,7 @@ NS_IMETHODIMP nsPlaintextEditor::Cut() NS_IMETHODIMP nsPlaintextEditor::CanCut(bool *aCanCut) { NS_ENSURE_ARG_POINTER(aCanCut); - *aCanCut = IsModifiable() && CanCutOrCopy(); + *aCanCut = IsModifiable() && CanCutOrCopy(ePasswordFieldNotAllowed); return NS_OK; } @@ -1211,7 +1212,14 @@ NS_IMETHODIMP nsPlaintextEditor::Copy() NS_IMETHODIMP nsPlaintextEditor::CanCopy(bool *aCanCopy) { NS_ENSURE_ARG_POINTER(aCanCopy); - *aCanCopy = CanCutOrCopy(); + *aCanCopy = CanCutOrCopy(ePasswordFieldNotAllowed); + return NS_OK; +} + +NS_IMETHODIMP nsPlaintextEditor::CanDelete(bool *aCanDelete) +{ + NS_ENSURE_ARG_POINTER(aCanDelete); + *aCanDelete = IsModifiable() && CanCutOrCopy(ePasswordFieldAllowed); return NS_OK; } diff --git a/editor/libeditor/nsPlaintextEditor.h b/editor/libeditor/nsPlaintextEditor.h index 89de1deb2db9..3f900e6ba78c 100644 --- a/editor/libeditor/nsPlaintextEditor.h +++ b/editor/libeditor/nsPlaintextEditor.h @@ -96,6 +96,7 @@ public: NS_IMETHOD CanCut(bool *aCanCut) MOZ_OVERRIDE; NS_IMETHOD Copy() MOZ_OVERRIDE; NS_IMETHOD CanCopy(bool *aCanCopy) MOZ_OVERRIDE; + NS_IMETHOD CanDelete(bool *aCanDelete) MOZ_OVERRIDE; NS_IMETHOD Paste(int32_t aSelectionType) MOZ_OVERRIDE; NS_IMETHOD CanPaste(int32_t aSelectionType, bool *aCanPaste) MOZ_OVERRIDE; NS_IMETHOD PasteTransferable(nsITransferable *aTransferable) MOZ_OVERRIDE; @@ -203,7 +204,11 @@ protected: /* small utility routine to test the eEditorReadonly bit */ bool IsModifiable(); - bool CanCutOrCopy(); + enum PasswordFieldAllowed { + ePasswordFieldAllowed, + ePasswordFieldNotAllowed + }; + bool CanCutOrCopy(PasswordFieldAllowed aPasswordFieldAllowed); bool FireClipboardEvent(int32_t aType, int32_t aSelectionType); bool UpdateMetaCharset(nsIDOMDocument* aDocument, diff --git a/editor/libeditor/nsTextEditRules.cpp b/editor/libeditor/nsTextEditRules.cpp index ec317be0de99..2da4bc29c68d 100644 --- a/editor/libeditor/nsTextEditRules.cpp +++ b/editor/libeditor/nsTextEditRules.cpp @@ -1198,7 +1198,9 @@ nsTextEditRules::TruncateInsertionIfNeeded(Selection* aSelection, if (!aSelection || !aInString || !aOutString) {return NS_ERROR_NULL_POINTER;} nsresult res = NS_OK; - *aOutString = *aInString; + if (!aOutString->Assign(*aInString, mozilla::fallible_t())) { + return NS_ERROR_OUT_OF_MEMORY; + } if (aTruncated) { *aTruncated = false; } @@ -1233,6 +1235,8 @@ nsTextEditRules::TruncateInsertionIfNeeded(Selection* aSelection, const int32_t resultingDocLength = docLength - selectionLength - oldCompStrLength; if (resultingDocLength >= aMaxLength) { + // This call is guaranteed to reduce the capacity of the string, so it + // cannot cause an OOM. aOutString->Truncate(); if (aTruncated) { *aTruncated = true; @@ -1253,6 +1257,8 @@ nsTextEditRules::TruncateInsertionIfNeeded(Selection* aSelection, } // XXX What should we do if we're removing IVS and its preceding // character won't be removed? + // This call is guaranteed to reduce the capacity of the string, so it + // cannot cause an OOM. aOutString->Truncate(newLength); if (aTruncated) { *aTruncated = true; diff --git a/editor/libeditor/tests/test_bug1067255.html b/editor/libeditor/tests/test_bug1067255.html index c91dbb3e8cbd..5840404ab8a3 100644 --- a/editor/libeditor/tests/test_bug1067255.html +++ b/editor/libeditor/tests/test_bug1067255.html @@ -34,12 +34,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1067255 ok(editor1.canCopy(), "can copy, text"); ok(editor1.canCut(), "can cut, text"); + ok(editor1.canDelete(), "can delete, text"); password.focus(); password.select(); ok(!editor2.canCopy(), "can copy, password"); ok(!editor2.canCut(), "can cut, password"); + ok(editor1.canDelete(), "can delete, password"); SimpleTest.finish(); } diff --git a/editor/nsIEditor.idl b/editor/nsIEditor.idl index 250a2b18584c..79a36614a918 100644 --- a/editor/nsIEditor.idl +++ b/editor/nsIEditor.idl @@ -21,8 +21,7 @@ interface nsIEditActionListener; interface nsIInlineSpellChecker; interface nsITransferable; -[scriptable, uuid(a1ddae68-35d0-11e4-9329-cb55463f21c9)] - +[scriptable, uuid(094be624-f0bf-400f-89e2-6a84baab9474)] interface nsIEditor : nsISupports { %{C++ @@ -305,18 +304,22 @@ interface nsIEditor : nsISupports * collapsed selection. */ boolean canCut(); - + /** copy the currently selected text, putting it into the OS clipboard * What if no text is selected? * What about mixed selections? * What are the clipboard formats? */ void copy(); - + /** Can we copy? True if we have a non-collapsed selection. */ boolean canCopy(); - + + /** Can we delete? True if we have a non-collapsed selection. + */ + boolean canDelete(); + /** paste the text in the OS clipboard at the cursor position, replacing * the selected text (if any) */ diff --git a/editor/nsIHTMLEditor.idl b/editor/nsIHTMLEditor.idl index 6347f13c59db..d49ec4157a14 100644 --- a/editor/nsIHTMLEditor.idl +++ b/editor/nsIHTMLEditor.idl @@ -22,8 +22,7 @@ class Element; [ptr] native Element (mozilla::dom::Element); -[scriptable, uuid(393a364f-e8e2-48a1-a271-a0067b6bac9b)] - +[scriptable, uuid(87ee993e-985f-4a43-a974-0d9512da2fb0)] interface nsIHTMLEditor : nsISupports { %{C++ @@ -551,11 +550,6 @@ interface nsIHTMLEditor : nsISupports */ attribute boolean returnInParagraphCreatesNewParagraph; - /** - * Checks whether a BR node is visible to the user. - */ - boolean breakIsVisible(in nsIDOMNode aNode); - /** * Get an active editor's editing host in DOM window. If this editor isn't * active in the DOM window, this returns NULL. diff --git a/extensions/pref/autoconfig/src/nsJSConfigTriggers.cpp b/extensions/pref/autoconfig/src/nsJSConfigTriggers.cpp index 7979ef0f99ae..ac691c345221 100644 --- a/extensions/pref/autoconfig/src/nsJSConfigTriggers.cpp +++ b/extensions/pref/autoconfig/src/nsJSConfigTriggers.cpp @@ -24,14 +24,14 @@ using mozilla::AutoSafeJSContext; //***************************************************************************** -static mozilla::Maybe > autoconfigSb; +static JS::PersistentRooted autoconfigSb; nsresult CentralizedAdminPrefManagerInit() { nsresult rv; // If the sandbox is already created, no need to create it again. - if (autoconfigSb) + if (autoconfigSb.initialized()) return NS_OK; // Grab XPConnect. @@ -53,14 +53,14 @@ nsresult CentralizedAdminPrefManagerInit() // Unwrap, store and root the sandbox. NS_ENSURE_STATE(sandbox->GetJSObject()); - autoconfigSb.emplace(cx, js::UncheckedUnwrap(sandbox->GetJSObject())); + autoconfigSb.init(cx, js::UncheckedUnwrap(sandbox->GetJSObject())); return NS_OK; } nsresult CentralizedAdminPrefManagerFinish() { - if (autoconfigSb) { + if (autoconfigSb.initialized()) { AutoSafeJSContext cx; autoconfigSb.reset(); JS_MaybeGC(cx); @@ -103,12 +103,12 @@ nsresult EvaluateAdminConfigScript(const char *js_buffer, size_t length, } AutoSafeJSContext cx; - JSAutoCompartment ac(cx, *autoconfigSb); + JSAutoCompartment ac(cx, autoconfigSb); nsAutoCString script(js_buffer, length); JS::RootedValue v(cx); rv = xpc->EvalInSandboxObject(NS_ConvertASCIItoUTF16(script), filename, cx, - *autoconfigSb, &v); + autoconfigSb, &v); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; diff --git a/gfx/layers/ImageContainer.cpp b/gfx/layers/ImageContainer.cpp index cf57987199a1..3b4e9b5620d2 100644 --- a/gfx/layers/ImageContainer.cpp +++ b/gfx/layers/ImageContainer.cpp @@ -35,7 +35,6 @@ #include "gfxD2DSurface.h" #include "gfxWindowsPlatform.h" #include -#include "d3d10/ImageLayerD3D10.h" #include "D3D9SurfaceImage.h" #endif diff --git a/gfx/layers/client/CanvasClient.cpp b/gfx/layers/client/CanvasClient.cpp index a01da3feb9ea..6c6a3cb5d14b 100644 --- a/gfx/layers/client/CanvasClient.cpp +++ b/gfx/layers/client/CanvasClient.cpp @@ -403,5 +403,20 @@ CanvasClientSharedSurface::Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) forwarder->UseTexture(this, mFrontTex); } +void +CanvasClientSharedSurface::ClearSurfaces() +{ + if (mFrontTex && (mFront || mPrevFront)) { + // Force a synchronous destruction so that the TextureHost does not + // outlive the SharedSurface. This won't be needed once TextureClient/Host + // and SharedSurface are merged. + mFrontTex->ForceRemove(true /* sync */); + mFrontTex = nullptr; + } + // It is important to destroy the SharedSurface *after* the TextureClient. + mFront = nullptr; + mPrevFront = nullptr; +} + } } diff --git a/gfx/layers/client/CanvasClient.h b/gfx/layers/client/CanvasClient.h index a0a49ed5c72c..70f38c24d3c3 100644 --- a/gfx/layers/client/CanvasClient.h +++ b/gfx/layers/client/CanvasClient.h @@ -119,25 +119,30 @@ private: RefPtr mFrontTex; + void ClearSurfaces(); + public: CanvasClientSharedSurface(CompositableForwarder* aLayerForwarder, TextureFlags aFlags); + ~CanvasClientSharedSurface() + { + ClearSurfaces(); + } + virtual TextureInfo GetTextureInfo() const MOZ_OVERRIDE { return TextureInfo(CompositableType::IMAGE); } virtual void Clear() MOZ_OVERRIDE { - mFront = nullptr; - mPrevFront = nullptr; - mFrontTex = nullptr; + ClearSurfaces(); } virtual void Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) MOZ_OVERRIDE; virtual void OnDetach() MOZ_OVERRIDE { - CanvasClientSharedSurface::Clear(); + ClearSurfaces(); } }; diff --git a/gfx/layers/client/TextureClient.cpp b/gfx/layers/client/TextureClient.cpp index 341284f9fbc9..7ab4ff74aed9 100644 --- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -503,10 +503,10 @@ TextureClient::KeepUntilFullDeallocation(KeepAlive* aKeep) mActor->mKeep = aKeep; } -void TextureClient::ForceRemove() +void TextureClient::ForceRemove(bool sync) { if (mValid && mActor) { - if (GetFlags() & TextureFlags::DEALLOCATE_CLIENT) { + if (sync || GetFlags() & TextureFlags::DEALLOCATE_CLIENT) { MOZ_PERFORMANCE_WARNING("gfx", "TextureClient/Host pair requires synchronous deallocation"); if (mActor->IPCOpen()) { mActor->SendClearTextureHostSync(); diff --git a/gfx/layers/client/TextureClient.h b/gfx/layers/client/TextureClient.h index 760e5006fee1..e52d9ad07540 100644 --- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -426,8 +426,10 @@ public: * If the texture flags contain TextureFlags::DEALLOCATE_CLIENT, the destruction * will be synchronously coordinated with the compositor side, otherwise it * will be done asynchronously. + * If sync is true, the destruction will be synchronous regardless of the + * texture's flags (bad for performance, use with care). */ - void ForceRemove(); + void ForceRemove(bool sync = false); virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) { diff --git a/gfx/layers/d3d10/CanvasLayerD3D10.cpp b/gfx/layers/d3d10/CanvasLayerD3D10.cpp deleted file mode 100644 index 52b62cd40869..000000000000 --- a/gfx/layers/d3d10/CanvasLayerD3D10.cpp +++ /dev/null @@ -1,241 +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 "CanvasLayerD3D10.h" - -#include "../d3d9/Nv3DVUtils.h" -#include "gfxWindowsSurface.h" -#include "gfxWindowsPlatform.h" -#include "SharedSurfaceANGLE.h" -#include "SharedSurfaceGL.h" -#include "gfxContext.h" -#include "GLContext.h" -#include "gfxPrefs.h" - -namespace mozilla { -namespace layers { - -using namespace mozilla::gl; -using namespace mozilla::gfx; - -CanvasLayerD3D10::CanvasLayerD3D10(LayerManagerD3D10 *aManager) - : CanvasLayer(aManager, nullptr) - , LayerD3D10(aManager) - , mDataIsPremultiplied(true) - , mOriginPos(gl::OriginPos::TopLeft) - , mHasAlpha(true) -{ - mImplData = static_cast(this); -} - -CanvasLayerD3D10::~CanvasLayerD3D10() -{ -} - -void -CanvasLayerD3D10::Initialize(const Data& aData) -{ - NS_ASSERTION(mSurface == nullptr, "BasicCanvasLayer::Initialize called twice!"); - - if (aData.mGLContext) { - mGLContext = aData.mGLContext; - NS_ASSERTION(mGLContext->IsOffscreen(), "Canvas GLContext must be offscreen."); - mDataIsPremultiplied = aData.mIsGLAlphaPremult; - mOriginPos = gl::OriginPos::TopLeft; - - GLScreenBuffer* screen = mGLContext->Screen(); - - UniquePtr factory = nullptr; - if (!gfxPrefs::WebGLForceLayersReadback()) { - if (mGLContext->IsANGLE()) { - factory = SurfaceFactory_ANGLEShareHandle::Create(mGLContext, - screen->mCaps); - } - } - - if (factory) { - screen->Morph(Move(factory)); - } - } else if (aData.mDrawTarget) { - mDrawTarget = aData.mDrawTarget; - void *texture = mDrawTarget->GetNativeSurface(NativeSurfaceType::D3D10_TEXTURE); - - if (texture) { - mTexture = static_cast(texture); - - NS_ASSERTION(!aData.mGLContext, - "CanvasLayer can't have both DrawTarget and WebGLContext/Surface"); - - mBounds.SetRect(0, 0, aData.mSize.width, aData.mSize.height); - device()->CreateShaderResourceView(mTexture, nullptr, getter_AddRefs(mSRView)); - return; - } - - // XXX we should store mDrawTarget and use it directly in UpdateSurface, - // bypassing Thebes - mSurface = mDrawTarget->Snapshot(); - } else { - MOZ_CRASH("CanvasLayer created without mSurface, mDrawTarget or mGLContext?"); - } - - mBounds.SetRect(0, 0, aData.mSize.width, aData.mSize.height); - mIsD2DTexture = false; - - // Create a texture in case we need to readback. - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, mBounds.width, mBounds.height, 1, 1); - desc.Usage = D3D10_USAGE_DYNAMIC; - desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; - - HRESULT hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(mTexture)); - if (FAILED(hr)) { - NS_WARNING("Failed to create texture for CanvasLayer!"); - return; - } - - device()->CreateShaderResourceView(mTexture, nullptr, getter_AddRefs(mUploadSRView)); -} - -void -CanvasLayerD3D10::UpdateSurface() -{ - if (!IsDirty()) - return; - Painted(); - - if (mDrawTarget) { - mDrawTarget->Flush(); - } else if (mIsD2DTexture) { - return; - } - - if (!mTexture) { - return; - } - - SharedSurface* surf = nullptr; - if (mGLContext) { - auto screen = mGLContext->Screen(); - MOZ_ASSERT(screen); - - surf = screen->Front()->Surf(); - if (!surf) - return; - surf->WaitSync(); - - if (surf->mType == SharedSurfaceType::EGLSurfaceANGLE) { - SharedSurface_ANGLEShareHandle* shareSurf = SharedSurface_ANGLEShareHandle::Cast(surf); - HANDLE shareHandle = shareSurf->GetShareHandle(); - - HRESULT hr = device()->OpenSharedResource(shareHandle, - __uuidof(ID3D10Texture2D), - getter_AddRefs(mTexture)); - if (FAILED(hr)) - return; - - hr = device()->CreateShaderResourceView(mTexture, - nullptr, - getter_AddRefs(mSRView)); - if (FAILED(hr)) - return; - - return; - } - } - - D3D10_MAPPED_TEXTURE2D map; - HRESULT hr = mTexture->Map(0, D3D10_MAP_WRITE_DISCARD, 0, &map); - - if (FAILED(hr)) { - gfxWarning() << "Failed to lock CanvasLayer texture."; - return; - } - - RefPtr destTarget = - Factory::CreateDrawTargetForD3D10Texture(mTexture, - SurfaceFormat::R8G8B8A8); - - if (!destTarget) { - gfxWarning() << "Invalid D3D10 texture target R8G8B8A8"; - return; - } - - if (surf) { - if (!ReadbackSharedSurface(surf, destTarget)) { - gfxWarning() << "Failed to readback into texture."; - } - } else if (mSurface) { - Rect r(Point(0, 0), ToRect(mBounds).Size()); - destTarget->DrawSurface(mSurface, r, r, DrawSurfaceOptions(), - DrawOptions(1.0F, CompositionOp::OP_SOURCE)); - } - - mTexture->Unmap(0); - mSRView = mUploadSRView; -} - -Layer* -CanvasLayerD3D10::GetLayer() -{ - return this; -} - -void -CanvasLayerD3D10::RenderLayer() -{ - FirePreTransactionCallback(); - UpdateSurface(); - FireDidTransactionCallback(); - - if (!mTexture) - return; - - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - - SetEffectTransformAndOpacity(); - - uint8_t shaderFlags = 0; - shaderFlags |= LoadMaskTexture(); - shaderFlags |= mDataIsPremultiplied - ? SHADER_PREMUL : SHADER_NON_PREMUL | SHADER_RGBA; - shaderFlags |= mHasAlpha ? SHADER_RGBA : SHADER_RGB; - shaderFlags |= mFilter == GraphicsFilter::FILTER_NEAREST - ? SHADER_POINT : SHADER_LINEAR; - ID3D10EffectTechnique* technique = SelectShader(shaderFlags); - - if (mSRView) { - effect()->GetVariableByName("tRGB")->AsShaderResource()->SetResource(mSRView); - } - - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)mBounds.x, - (float)mBounds.y, - (float)mBounds.width, - (float)mBounds.height) - ); - - const bool needsYFlip = (mOriginPos == gl::OriginPos::BottomLeft); - - if (needsYFlip) { - effect()->GetVariableByName("vTextureCoords")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - 0, - 1.0f, - 1.0f, - -1.0f) - ); - } - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); - - if (needsYFlip) { - effect()->GetVariableByName("vTextureCoords")->AsVector()-> - SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); - } -} - -} /* namespace layers */ -} /* namespace mozilla */ diff --git a/gfx/layers/d3d10/CanvasLayerD3D10.h b/gfx/layers/d3d10/CanvasLayerD3D10.h deleted file mode 100644 index 34733f0d37b9..000000000000 --- a/gfx/layers/d3d10/CanvasLayerD3D10.h +++ /dev/null @@ -1,73 +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 GFX_CANVASLAYERD3D10_H -#define GFX_CANVASLAYERD3D10_H - -#include "GLContextTypes.h" -#include "LayerManagerD3D10.h" -#include "mozilla/Preferences.h" - -namespace mozilla { - -namespace gl { -class GLContext; -} - -namespace layers { - -class CanvasLayerD3D10 : public CanvasLayer, - public LayerD3D10 -{ -public: - CanvasLayerD3D10(LayerManagerD3D10 *aManager); - ~CanvasLayerD3D10(); - - // CanvasLayer implementation - virtual void Initialize(const Data& aData); - - // LayerD3D10 implementation - virtual Layer* GetLayer(); - virtual void RenderLayer(); - -private: - typedef mozilla::gl::GLContext GLContext; - - void UpdateSurface(); - - RefPtr mSurface; - mozilla::RefPtr mDrawTarget; - nsRefPtr mGLContext; - nsRefPtr mTexture; - nsRefPtr mUploadSRView; - nsRefPtr mSRView; - - bool mDataIsPremultiplied; - gl::OriginPos mOriginPos; - bool mIsD2DTexture; - bool mHasAlpha; - - nsAutoArrayPtr mCachedTempBlob; - uint32_t mCachedTempBlob_Size; - - uint8_t* GetTempBlob(const uint32_t aSize) - { - if (!mCachedTempBlob || aSize != mCachedTempBlob_Size) { - mCachedTempBlob = new uint8_t[aSize]; - mCachedTempBlob_Size = aSize; - } - - return mCachedTempBlob; - } - - void DiscardTempBlob() - { - mCachedTempBlob = nullptr; - } -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_CANVASLAYERD3D10_H */ diff --git a/gfx/layers/d3d10/ColorLayerD3D10.cpp b/gfx/layers/d3d10/ColorLayerD3D10.cpp deleted file mode 100644 index 0b06c9079d2d..000000000000 --- a/gfx/layers/d3d10/ColorLayerD3D10.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 "ColorLayerD3D10.h" - -#include "../d3d9/Nv3DVUtils.h" - -namespace mozilla { -namespace layers { - -ColorLayerD3D10::ColorLayerD3D10(LayerManagerD3D10 *aManager) - : ColorLayer(aManager, nullptr) - , LayerD3D10(aManager) -{ - mImplData = static_cast(this); -} - -Layer* -ColorLayerD3D10::GetLayer() -{ - return this; -} - -void -ColorLayerD3D10::RenderLayer() -{ - float color[4]; - // output color is premultiplied, so we need to adjust all channels. - // mColor is not premultiplied. - float opacity = GetEffectiveOpacity() * mColor.a; - color[0] = (float)(mColor.r * opacity); - color[1] = (float)(mColor.g * opacity); - color[2] = (float)(mColor.b * opacity); - color[3] = opacity; - - const gfx::Matrix4x4& transform = GetEffectiveTransform(); - void* raw = &const_cast(transform)._11; - effect()->GetVariableByName("mLayerTransform")->SetRawValue(raw, 0, 64); - effect()->GetVariableByName("fLayerColor")->AsVector()->SetFloatVector(color); - - ID3D10EffectTechnique *technique = SelectShader(SHADER_SOLID | LoadMaskTexture()); - - nsIntRect bounds = GetBounds(); - - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)bounds.x, - (float)bounds.y, - (float)bounds.width, - (float)bounds.height) - ); - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d10/ColorLayerD3D10.h b/gfx/layers/d3d10/ColorLayerD3D10.h deleted file mode 100644 index cdd085912ecd..000000000000 --- a/gfx/layers/d3d10/ColorLayerD3D10.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_COLORLAYERD3D10_H -#define GFX_COLORLAYERD3D10_H - -#include "LayerManagerD3D10.h" - -namespace mozilla { -namespace layers { - -class ColorLayerD3D10 : public ColorLayer, - public LayerD3D10 -{ -public: - ColorLayerD3D10(LayerManagerD3D10 *aManager); - - /* LayerD3D10 implementation */ - virtual Layer* GetLayer(); - virtual void RenderLayer(); -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_PAINTEDLAYERD3D10_H */ diff --git a/gfx/layers/d3d10/ContainerLayerD3D10.cpp b/gfx/layers/d3d10/ContainerLayerD3D10.cpp deleted file mode 100644 index 116ae2f264b6..000000000000 --- a/gfx/layers/d3d10/ContainerLayerD3D10.cpp +++ /dev/null @@ -1,268 +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 "ContainerLayerD3D10.h" - -#include "PaintedLayerD3D10.h" -#include "ReadbackProcessor.h" - -using namespace mozilla::gfx; - -namespace mozilla { -namespace layers { - -ContainerLayerD3D10::ContainerLayerD3D10(LayerManagerD3D10 *aManager) - : ContainerLayer(aManager, nullptr) - , LayerD3D10(aManager) -{ - mImplData = static_cast(this); -} - -ContainerLayerD3D10::~ContainerLayerD3D10() -{ - while (mFirstChild) { - RemoveChild(mFirstChild); - } -} - -Layer* -ContainerLayerD3D10::GetLayer() -{ - return this; -} - -LayerD3D10* -ContainerLayerD3D10::GetFirstChildD3D10() -{ - if (!mFirstChild) { - return nullptr; - } - return static_cast(mFirstChild->ImplData()); -} - -void -ContainerLayerD3D10::RenderLayer() -{ - float renderTargetOffset[] = { 0, 0 }; - - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - float opacity = GetEffectiveOpacity(); - bool useIntermediate = UseIntermediateSurface(); - - nsRefPtr previousRTView; - nsRefPtr renderTexture; - nsRefPtr rtView; - float previousRenderTargetOffset[2]; - nsIntSize previousViewportSize; - - gfx3DMatrix oldViewMatrix; - - if (useIntermediate) { - device()->OMGetRenderTargets(1, getter_AddRefs(previousRTView), nullptr); - - D3D10_TEXTURE2D_DESC desc; - memset(&desc, 0, sizeof(D3D10_TEXTURE2D_DESC)); - desc.ArraySize = 1; - desc.MipLevels = 1; - desc.Width = visibleRect.width; - desc.Height = visibleRect.height; - desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; - desc.SampleDesc.Count = 1; - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - HRESULT hr; - hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(renderTexture)); - - if (FAILED(hr)) { - LayerManagerD3D10::ReportFailure(NS_LITERAL_CSTRING("Failed to create new texture for ContainerLayerD3D10!"), - hr); - return; - } - - hr = device()->CreateRenderTargetView(renderTexture, nullptr, getter_AddRefs(rtView)); - NS_ASSERTION(SUCCEEDED(hr), "Failed to create render target view for ContainerLayerD3D10!"); - - effect()->GetVariableByName("vRenderTargetOffset")-> - GetRawValue(previousRenderTargetOffset, 0, 8); - - previousViewportSize = mD3DManager->GetViewport(); - - if (mVisibleRegion.GetNumRects() != 1 || !(GetContentFlags() & CONTENT_OPAQUE)) { - Matrix4x4 transform3D = GetEffectiveTransform(); - Matrix transform; - // If we have an opaque ancestor layer, then we can be sure that - // all the pixels we draw into are either opaque already or will be - // covered by something opaque. Otherwise copying up the background is - // not safe. - if (mSupportsComponentAlphaChildren) { - bool is2d = transform3D.Is2D(&transform); - NS_ASSERTION(is2d, "Transform should be 2d when mSupportsComponentAlphaChildren."); - - // Copy background up from below. This applies any 2D transform that is - // applied to use relative to our parent, and compensates for the offset - // that was applied on our parent's rendering. - D3D10_BOX srcBox; - srcBox.left = std::max(visibleRect.x + int32_t(transform._31) - int32_t(previousRenderTargetOffset[0]), 0); - srcBox.top = std::max(visibleRect.y + int32_t(transform._32) - int32_t(previousRenderTargetOffset[1]), 0); - srcBox.right = std::min(srcBox.left + visibleRect.width, previousViewportSize.width); - srcBox.bottom = std::min(srcBox.top + visibleRect.height, previousViewportSize.height); - srcBox.back = 1; - srcBox.front = 0; - - nsRefPtr srcResource; - previousRTView->GetResource(getter_AddRefs(srcResource)); - - device()->CopySubresourceRegion(renderTexture, 0, - 0, 0, 0, - srcResource, 0, - &srcBox); - } else { - float black[] = { 0, 0, 0, 0}; - device()->ClearRenderTargetView(rtView, black); - } - } - - ID3D10RenderTargetView *rtViewPtr = rtView; - device()->OMSetRenderTargets(1, &rtViewPtr, nullptr); - - renderTargetOffset[0] = (float)visibleRect.x; - renderTargetOffset[1] = (float)visibleRect.y; - effect()->GetVariableByName("vRenderTargetOffset")-> - SetRawValue(renderTargetOffset, 0, 8); - - mD3DManager->SetViewport(nsIntSize(visibleRect.Size())); - } - - D3D10_RECT oldD3D10Scissor; - UINT numRects = 1; - device()->RSGetScissorRects(&numRects, &oldD3D10Scissor); - // Convert scissor to an nsIntRect. D3D10_RECT's are exclusive - // on the bottom and right values. - nsIntRect oldScissor(oldD3D10Scissor.left, - oldD3D10Scissor.top, - oldD3D10Scissor.right - oldD3D10Scissor.left, - oldD3D10Scissor.bottom - oldD3D10Scissor.top); - - nsAutoTArray children; - SortChildrenBy3DZOrder(children); - - /* - * Render this container's contents. - */ - for (uint32_t i = 0; i < children.Length(); i++) { - LayerD3D10* layerToRender = static_cast(children.ElementAt(i)->ImplData()); - - if (layerToRender->GetLayer()->GetEffectiveVisibleRegion().IsEmpty()) { - continue; - } - - nsIntRect scissorRect = - RenderTargetPixel::ToUntyped(layerToRender->GetLayer()->CalculateScissorRect(RenderTargetPixel::FromUntyped(oldScissor))); - if (scissorRect.IsEmpty()) { - continue; - } - - D3D10_RECT d3drect; - d3drect.left = scissorRect.x; - d3drect.top = scissorRect.y; - d3drect.right = scissorRect.x + scissorRect.width; - d3drect.bottom = scissorRect.y + scissorRect.height; - device()->RSSetScissorRects(1, &d3drect); - - layerToRender->RenderLayer(); - } - - device()->RSSetScissorRects(1, &oldD3D10Scissor); - - if (useIntermediate) { - mD3DManager->SetViewport(previousViewportSize); - ID3D10RenderTargetView *rtView = previousRTView; - device()->OMSetRenderTargets(1, &rtView, nullptr); - effect()->GetVariableByName("vRenderTargetOffset")-> - SetRawValue(previousRenderTargetOffset, 0, 8); - - SetEffectTransformAndOpacity(); - - ID3D10EffectTechnique *technique; - if (LoadMaskTexture()) { - if (GetTransform().CanDraw2D()) { - technique = SelectShader(SHADER_RGBA | SHADER_PREMUL | SHADER_MASK); - } else { - technique = SelectShader(SHADER_RGBA | SHADER_PREMUL | SHADER_MASK_3D); - } - } else { - technique = SelectShader(SHADER_RGBA | SHADER_PREMUL | SHADER_NO_MASK); - } - - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)visibleRect.x, - (float)visibleRect.y, - (float)visibleRect.width, - (float)visibleRect.height) - ); - - technique->GetPassByIndex(0)->Apply(0); - - ID3D10ShaderResourceView *view; - device()->CreateShaderResourceView(renderTexture, nullptr, &view); - device()->PSSetShaderResources(0, 1, &view); - device()->Draw(4, 0); - view->Release(); - } -} - -void -ContainerLayerD3D10::LayerManagerDestroyed() -{ - while (mFirstChild) { - GetFirstChildD3D10()->LayerManagerDestroyed(); - RemoveChild(mFirstChild); - } -} - -void -ContainerLayerD3D10::Validate() -{ - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - - mSupportsComponentAlphaChildren = false; - - if (UseIntermediateSurface()) { - Matrix4x4 transform3D = GetEffectiveTransform(); - Matrix transform; - - if (mVisibleRegion.GetNumRects() == 1 && (GetContentFlags() & CONTENT_OPAQUE)) { - // don't need a background, we're going to paint all opaque stuff - mSupportsComponentAlphaChildren = true; - } else { - if (HasOpaqueAncestorLayer(this) && - transform3D.Is2D(&transform) && !ThebesMatrix(transform).HasNonIntegerTranslation() && - GetParent()->GetEffectiveVisibleRegion().GetBounds().Contains(visibleRect)) - { - // In this case we can copy up the background. See RenderLayer. - mSupportsComponentAlphaChildren = true; - } - } - } else { - mSupportsComponentAlphaChildren = (GetContentFlags() & CONTENT_OPAQUE) || - (mParent && mParent->SupportsComponentAlphaChildren()); - } - - ReadbackProcessor readback; - readback.BuildUpdates(this); - - Layer *layer = GetFirstChild(); - while (layer) { - if (layer->GetType() == TYPE_PAINTED) { - static_cast(layer)->Validate(&readback); - } else { - static_cast(layer->ImplData())->Validate(); - } - layer = layer->GetNextSibling(); - } -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d10/ContainerLayerD3D10.h b/gfx/layers/d3d10/ContainerLayerD3D10.h deleted file mode 100644 index 572d01cd35e7..000000000000 --- a/gfx/layers/d3d10/ContainerLayerD3D10.h +++ /dev/null @@ -1,42 +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 GFX_CONTAINERLAYERD3D10_H -#define GFX_CONTAINERLAYERD3D10_H - -#include "LayerManagerD3D10.h" - -namespace mozilla { -namespace layers { - -class ContainerLayerD3D10 : public ContainerLayer, - public LayerD3D10 -{ -public: - ContainerLayerD3D10(LayerManagerD3D10 *aManager); - ~ContainerLayerD3D10(); - - nsIntRect GetVisibleRect() { return mVisibleRegion.GetBounds(); } - - /* LayerD3D10 implementation */ - virtual Layer* GetLayer(); - - virtual LayerD3D10* GetFirstChildD3D10(); - - virtual void RenderLayer(); - virtual void Validate(); - - virtual void LayerManagerDestroyed(); - - virtual void ComputeEffectiveTransforms(const gfx::Matrix4x4& aTransformToSurface) - { - DefaultComputeEffectiveTransforms(aTransformToSurface); - } -}; - -} /* layers */ -} /* mozilla */ - -#endif /* GFX_CONTAINERLAYERD3D10_H */ diff --git a/gfx/layers/d3d10/ImageLayerD3D10.cpp b/gfx/layers/d3d10/ImageLayerD3D10.cpp deleted file mode 100644 index 805ba49bba94..000000000000 --- a/gfx/layers/d3d10/ImageLayerD3D10.cpp +++ /dev/null @@ -1,400 +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 "ImageLayerD3D10.h" -#include "gfxD2DSurface.h" -#include "gfxWindowsSurface.h" -#include "yuv_convert.h" -#include "../d3d9/Nv3DVUtils.h" -#include "D3D9SurfaceImage.h" -#include "mozilla/gfx/Point.h" -#include "gfx2DGlue.h" - -#include "gfxWindowsPlatform.h" - -namespace mozilla { -namespace layers { - -using namespace mozilla::gfx; - -static already_AddRefed -DataToTexture(ID3D10Device *aDevice, - unsigned char *data, - int stride, - const IntSize &aSize) -{ - D3D10_SUBRESOURCE_DATA srdata; - - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, - aSize.width, - aSize.height, - 1, 1); - desc.Usage = D3D10_USAGE_IMMUTABLE; - - srdata.pSysMem = data; - srdata.SysMemPitch = stride; - - nsRefPtr texture; - HRESULT hr = aDevice->CreateTexture2D(&desc, &srdata, getter_AddRefs(texture)); - - if (FAILED(hr)) { - LayerManagerD3D10::ReportFailure(NS_LITERAL_CSTRING("Failed to create texture for data"), - hr); - } - - return texture.forget(); -} - -static already_AddRefed -SurfaceToTexture(ID3D10Device *aDevice, - SourceSurface *aSurface, - const IntSize &aSize) -{ - if (!aSurface) { - return nullptr; - } - - void *nativeSurf = - aSurface->GetNativeSurface(NativeSurfaceType::D3D10_TEXTURE); - if (nativeSurf) { - nsRefPtr texture = - static_cast(nativeSurf); - ID3D10Device *dev; - texture->GetDevice(&dev); - if (dev == aDevice) { - return texture.forget(); - } - } - RefPtr dataSurface = aSurface->GetDataSurface(); - if (!dataSurface) { - return nullptr; - } - DataSourceSurface::MappedSurface map; - if (!dataSurface->Map(DataSourceSurface::MapType::READ, &map)) { - return nullptr; - } - nsRefPtr texture = - DataToTexture(aDevice, map.mData, map.mStride, aSize); - dataSurface->Unmap(); - return texture.forget(); -} - -Layer* -ImageLayerD3D10::GetLayer() -{ - return this; -} - -/** - * Returns a shader resource view for an image. - * Returns nullptr if unsuccessful. - * If successful, aHasAlpha will be true iff the resulting texture - * has an alpha component. - */ -ID3D10ShaderResourceView* -ImageLayerD3D10::GetImageSRView(Image* aImage, bool& aHasAlpha, IDXGIKeyedMutex **aMutex) -{ - NS_ASSERTION(aImage, "Null image."); - - if (aImage->GetFormat() == ImageFormat::CAIRO_SURFACE) { - CairoImage *cairoImage = - static_cast(aImage); - - RefPtr surf = cairoImage->GetAsSourceSurface(); - if (!surf) { - return nullptr; - } - - if (!aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10)) { - nsAutoPtr dat(new TextureD3D10BackendData()); - dat->mTexture = SurfaceToTexture(device(), surf, cairoImage->GetSize()); - - if (dat->mTexture) { - device()->CreateShaderResourceView(dat->mTexture, nullptr, getter_AddRefs(dat->mSRView)); - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10, dat.forget()); - } - } - - aHasAlpha = surf->GetFormat() == SurfaceFormat::B8G8R8A8; - } else if (aImage->GetFormat() == ImageFormat::D3D9_RGB32_TEXTURE) { - if (!aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10)) { - // Use resource sharing to open the D3D9 texture as a D3D10 texture, - HRESULT hr; - D3D9SurfaceImage* d3dImage = reinterpret_cast(aImage); - nsRefPtr texture; - hr = device()->OpenSharedResource(d3dImage->GetShareHandle(), - IID_ID3D10Texture2D, - (void**)getter_AddRefs(texture)); - NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr); - - nsAutoPtr dat(new TextureD3D10BackendData()); - dat->mTexture = texture; - - hr = device()->CreateShaderResourceView(dat->mTexture, nullptr, getter_AddRefs(dat->mSRView)); - NS_ENSURE_TRUE(SUCCEEDED(hr) && dat->mSRView, nullptr); - - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10, dat.forget()); - } - aHasAlpha = false; - } else { - NS_WARNING("Incorrect image type."); - return nullptr; - } - - TextureD3D10BackendData *data = - static_cast(aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10)); - - if (!data) { - return nullptr; - } - - if (aMutex && - SUCCEEDED(data->mTexture->QueryInterface(IID_IDXGIKeyedMutex, (void**)aMutex))) { - if (FAILED((*aMutex)->AcquireSync(0, 0))) { - NS_WARNING("Failed to acquire sync on keyed mutex, plugin forgot to release?"); - return nullptr; - } - } - - nsRefPtr dev; - data->mTexture->GetDevice(getter_AddRefs(dev)); - if (dev != device()) { - return nullptr; - } - - return data->mSRView; -} - -void -ImageLayerD3D10::RenderLayer() -{ - ImageContainer *container = GetContainer(); - if (!container) { - return; - } - - AutoLockImage autoLock(container); - - Image *image = autoLock.GetImage(); - if (!image) { - return; - } - - IntSize size = image->GetSize(); - - SetEffectTransformAndOpacity(); - - ID3D10EffectTechnique *technique; - nsRefPtr keyedMutex; - - if (image->GetFormat() == ImageFormat::CAIRO_SURFACE || - image->GetFormat() == ImageFormat::D3D9_RGB32_TEXTURE) { - NS_ASSERTION(image->GetFormat() != ImageFormat::CAIRO_SURFACE || - !static_cast(image)->mSourceSurface || - static_cast(image)->mSourceSurface->GetFormat() != SurfaceFormat::A8, - "Image layer has alpha image"); - bool hasAlpha = false; - - nsRefPtr srView = GetImageSRView(image, hasAlpha, getter_AddRefs(keyedMutex)); - if (!srView) { - return; - } - - uint8_t shaderFlags = SHADER_PREMUL; - shaderFlags |= LoadMaskTexture(); - shaderFlags |= hasAlpha - ? SHADER_RGBA : SHADER_RGB; - shaderFlags |= mFilter == GraphicsFilter::FILTER_NEAREST - ? SHADER_POINT : SHADER_LINEAR; - technique = SelectShader(shaderFlags); - - - effect()->GetVariableByName("tRGB")->AsShaderResource()->SetResource(srView); - - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)0, - (float)0, - (float)size.width, - (float)size.height) - ); - } else if (image->GetFormat() == ImageFormat::PLANAR_YCBCR) { - PlanarYCbCrImage *yuvImage = - static_cast(image); - - if (!yuvImage->IsValid()) { - return; - } - - if (!yuvImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10)) { - AllocateTexturesYCbCr(yuvImage); - } - - PlanarYCbCrD3D10BackendData *data = - static_cast(yuvImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10)); - - if (!data) { - return; - } - - nsRefPtr dev; - data->mYTexture->GetDevice(getter_AddRefs(dev)); - if (dev != device()) { - return; - } - - // TODO: At some point we should try to deal with mFilter here, you don't - // really want to use point filtering in the case of NEAREST, since that - // would also use point filtering for Chroma upsampling. Where most likely - // the user would only want point filtering for final RGB image upsampling. - - technique = SelectShader(SHADER_YCBCR | LoadMaskTexture()); - - effect()->GetVariableByName("tY")->AsShaderResource()->SetResource(data->mYView); - effect()->GetVariableByName("tCb")->AsShaderResource()->SetResource(data->mCbView); - effect()->GetVariableByName("tCr")->AsShaderResource()->SetResource(data->mCrView); - - /* - * Send 3d control data and metadata to NV3DVUtils - */ - if (GetNv3DVUtils()) { - Nv_Stereo_Mode mode; - switch (yuvImage->GetData()->mStereoMode) { - case StereoMode::LEFT_RIGHT: - mode = NV_STEREO_MODE_LEFT_RIGHT; - break; - case StereoMode::RIGHT_LEFT: - mode = NV_STEREO_MODE_RIGHT_LEFT; - break; - case StereoMode::BOTTOM_TOP: - mode = NV_STEREO_MODE_BOTTOM_TOP; - break; - case StereoMode::TOP_BOTTOM: - mode = NV_STEREO_MODE_TOP_BOTTOM; - break; - case StereoMode::MONO: - mode = NV_STEREO_MODE_MONO; - break; - } - - // Send control data even in mono case so driver knows to leave stereo mode. - GetNv3DVUtils()->SendNv3DVControl(mode, true, FIREFOX_3DV_APP_HANDLE); - - if (yuvImage->GetData()->mStereoMode != StereoMode::MONO) { - // Dst resource is optional - GetNv3DVUtils()->SendNv3DVMetaData((unsigned int)yuvImage->GetData()->mYSize.width, - (unsigned int)yuvImage->GetData()->mYSize.height, (HANDLE)(data->mYTexture), (HANDLE)(nullptr)); - } - } - - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)0, - (float)0, - (float)size.width, - (float)size.height) - ); - - effect()->GetVariableByName("vTextureCoords")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)yuvImage->GetData()->mPicX / yuvImage->GetData()->mYSize.width, - (float)yuvImage->GetData()->mPicY / yuvImage->GetData()->mYSize.height, - (float)yuvImage->GetData()->mPicSize.width / yuvImage->GetData()->mYSize.width, - (float)yuvImage->GetData()->mPicSize.height / yuvImage->GetData()->mYSize.height) - ); - } else { - MOZ_CRASH("unexpected image format"); - } - - bool resetTexCoords = image->GetFormat() == ImageFormat::PLANAR_YCBCR; - image = nullptr; - autoLock.Unlock(); - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); - - if (keyedMutex) { - keyedMutex->ReleaseSync(0); - } - - if (resetTexCoords) { - effect()->GetVariableByName("vTextureCoords")->AsVector()-> - SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); - } - - GetContainer()->NotifyPaintedImage(image); -} - -void ImageLayerD3D10::AllocateTexturesYCbCr(PlanarYCbCrImage *aImage) -{ - nsAutoPtr backendData( - new PlanarYCbCrD3D10BackendData); - - const PlanarYCbCrData *data = aImage->GetData(); - - D3D10_SUBRESOURCE_DATA dataY; - D3D10_SUBRESOURCE_DATA dataCb; - D3D10_SUBRESOURCE_DATA dataCr; - CD3D10_TEXTURE2D_DESC descY(DXGI_FORMAT_A8_UNORM, - data->mYSize.width, - data->mYSize.height, 1, 1); - CD3D10_TEXTURE2D_DESC descCbCr(DXGI_FORMAT_A8_UNORM, - data->mCbCrSize.width, - data->mCbCrSize.height, 1, 1); - - descY.Usage = descCbCr.Usage = D3D10_USAGE_IMMUTABLE; - - dataY.pSysMem = data->mYChannel; - dataY.SysMemPitch = data->mYStride; - dataCb.pSysMem = data->mCbChannel; - dataCb.SysMemPitch = data->mCbCrStride; - dataCr.pSysMem = data->mCrChannel; - dataCr.SysMemPitch = data->mCbCrStride; - - HRESULT hr = device()->CreateTexture2D(&descY, &dataY, getter_AddRefs(backendData->mYTexture)); - if (!FAILED(hr)) { - hr = device()->CreateTexture2D(&descCbCr, &dataCb, getter_AddRefs(backendData->mCbTexture)); - } - if (!FAILED(hr)) { - hr = device()->CreateTexture2D(&descCbCr, &dataCr, getter_AddRefs(backendData->mCrTexture)); - } - if (FAILED(hr)) { - LayerManagerD3D10::ReportFailure(NS_LITERAL_CSTRING("PlanarYCbCrImageD3D10::AllocateTextures(): Failed to create texture"), - hr); - return; - } - device()->CreateShaderResourceView(backendData->mYTexture, nullptr, getter_AddRefs(backendData->mYView)); - device()->CreateShaderResourceView(backendData->mCbTexture, nullptr, getter_AddRefs(backendData->mCbView)); - device()->CreateShaderResourceView(backendData->mCrTexture, nullptr, getter_AddRefs(backendData->mCrView)); - - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D10, backendData.forget()); -} - -already_AddRefed -ImageLayerD3D10::GetAsTexture(gfx::IntSize* aSize) -{ - if (!GetContainer()) { - return nullptr; - } - - AutoLockImage autoLock(GetContainer()); - - Image *image = autoLock.GetImage(); - if (!image) { - return nullptr; - } - - if (image->GetFormat() != ImageFormat::CAIRO_SURFACE) { - return nullptr; - } - - *aSize = image->GetSize(); - bool dontCare; - nsRefPtr result = GetImageSRView(image, dontCare); - return result.forget(); -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d10/ImageLayerD3D10.h b/gfx/layers/d3d10/ImageLayerD3D10.h deleted file mode 100644 index e9371f5c1197..000000000000 --- a/gfx/layers/d3d10/ImageLayerD3D10.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_IMAGELAYERD3D10_H -#define GFX_IMAGELAYERD3D10_H - -#include "LayerManagerD3D10.h" -#include "ImageLayers.h" -#include "ImageContainer.h" -#include "yuv_convert.h" - -namespace mozilla { -namespace layers { - -class ImageLayerD3D10 : public ImageLayer, - public LayerD3D10 -{ -public: - ImageLayerD3D10(LayerManagerD3D10 *aManager) - : ImageLayer(aManager, nullptr) - , LayerD3D10(aManager) - { - mImplData = static_cast(this); - } - - // LayerD3D10 Implementation - virtual Layer* GetLayer(); - - virtual void RenderLayer(); - - void AllocateTexturesYCbCr(PlanarYCbCrImage *aImage); - - virtual already_AddRefed GetAsTexture(gfx::IntSize* aSize); - -private: - ID3D10ShaderResourceView* GetImageSRView(Image* aImage, bool& aHasAlpha, - IDXGIKeyedMutex **aMutex = nullptr); -}; - -struct PlanarYCbCrD3D10BackendData : public ImageBackendData -{ - nsRefPtr mYTexture; - nsRefPtr mCrTexture; - nsRefPtr mCbTexture; - nsRefPtr mYView; - nsRefPtr mCbView; - nsRefPtr mCrView; -}; - -struct TextureD3D10BackendData : public ImageBackendData -{ - nsRefPtr mTexture; - nsRefPtr mSRView; -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_IMAGELAYERD3D10_H */ diff --git a/gfx/layers/d3d10/LayerManagerD3D10.cpp b/gfx/layers/d3d10/LayerManagerD3D10.cpp deleted file mode 100644 index 781fa7656d2a..000000000000 --- a/gfx/layers/d3d10/LayerManagerD3D10.cpp +++ /dev/null @@ -1,888 +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 - -#include "LayerManagerD3D10.h" -#include "LayerManagerD3D10Effect.h" -#include "gfxWindowsPlatform.h" -#include "gfx2DGlue.h" -#include "gfxD2DSurface.h" -#include "gfxFailure.h" -#include "cairo-win32.h" -#include "dxgi.h" - -#include "ContainerLayerD3D10.h" -#include "PaintedLayerD3D10.h" -#include "ColorLayerD3D10.h" -#include "CanvasLayerD3D10.h" -#include "ReadbackLayerD3D10.h" -#include "ImageLayerD3D10.h" -#include "mozilla/layers/PLayerChild.h" -#include "mozilla/WidgetUtils.h" - -#include "../d3d9/Nv3DVUtils.h" - -#include "gfxCrashReporterUtils.h" -#include "nsWindowsHelpers.h" -#ifdef MOZ_METRO -#include "DXGI1_2.h" -#endif - -namespace mozilla { -namespace layers { - -using namespace std; -using namespace mozilla::gfx; - -struct Vertex -{ - float position[2]; -}; - -// {592BF306-0EED-4F76-9D03-A0846450F472} -static const GUID sDeviceAttachments = -{ 0x592bf306, 0xeed, 0x4f76, { 0x9d, 0x3, 0xa0, 0x84, 0x64, 0x50, 0xf4, 0x72 } }; -// {716AEDB1-C9C3-4B4D-8332-6F65D44AF6A8} -static const GUID sLayerManagerCount = -{ 0x716aedb1, 0xc9c3, 0x4b4d, { 0x83, 0x32, 0x6f, 0x65, 0xd4, 0x4a, 0xf6, 0xa8 } }; - -LayerManagerD3D10::LayerManagerD3D10(nsIWidget *aWidget) - : mWidget(aWidget) - , mDisableSequenceForNextFrame(false) -{ -} - -struct DeviceAttachments -{ - nsRefPtr mEffect; - nsRefPtr mInputLayout; - nsRefPtr mVertexBuffer; - nsRefPtr mReadbackManager; -}; - -LayerManagerD3D10::~LayerManagerD3D10() -{ - if (mDevice) { - int referenceCount = 0; - UINT size = sizeof(referenceCount); - HRESULT hr = mDevice->GetPrivateData(sLayerManagerCount, &size, &referenceCount); - NS_ASSERTION(SUCCEEDED(hr), "Reference count not found on device."); - referenceCount--; - mDevice->SetPrivateData(sLayerManagerCount, sizeof(referenceCount), &referenceCount); - - if (!referenceCount) { - DeviceAttachments *attachments; - size = sizeof(attachments); - mDevice->GetPrivateData(sDeviceAttachments, &size, &attachments); - // No LayerManagers left for this device. Clear out interfaces stored which - // hold a reference to the device. - mDevice->SetPrivateData(sDeviceAttachments, 0, nullptr); - - delete attachments; - } - } - - Destroy(); -} - -static inline void -SetHRESULT(HRESULT* aHresultPtr, HRESULT aHresult) -{ - if (aHresultPtr) { - *aHresultPtr = aHresult; - } -} - -bool -LayerManagerD3D10::Initialize(bool force, HRESULT* aHresultPtr) -{ - ScopedGfxFeatureReporter reporter("D3D10 Layers", force); - - HRESULT hr = E_UNEXPECTED; - - /* Create an Nv3DVUtils instance */ - if (!mNv3DVUtils) { - mNv3DVUtils = new Nv3DVUtils(); - if (!mNv3DVUtils) { - NS_WARNING("Could not create a new instance of Nv3DVUtils.\n"); - } - } - - /* Initialize the Nv3DVUtils object */ - if (mNv3DVUtils) { - mNv3DVUtils->Initialize(); - } - - mDevice = gfxWindowsPlatform::GetPlatform()->GetD3D10Device(); - if (!mDevice) { - SetHRESULT(aHresultPtr, hr); - return false; - } - - /* - * Do some post device creation setup - */ - if (mNv3DVUtils) { - IUnknown* devUnknown = nullptr; - if (mDevice) { - mDevice->QueryInterface(IID_IUnknown, (void **)&devUnknown); - } - mNv3DVUtils->SetDeviceInfo(devUnknown); - } - - int referenceCount = 0; - UINT size = sizeof(referenceCount); - // If this isn't there yet it'll fail, count will remain 0, which is correct. - mDevice->GetPrivateData(sLayerManagerCount, &size, &referenceCount); - referenceCount++; - mDevice->SetPrivateData(sLayerManagerCount, sizeof(referenceCount), &referenceCount); - - DeviceAttachments *attachments; - size = sizeof(DeviceAttachments*); - if (FAILED(mDevice->GetPrivateData(sDeviceAttachments, &size, &attachments))) { - attachments = new DeviceAttachments; - mDevice->SetPrivateData(sDeviceAttachments, sizeof(attachments), &attachments); - - SetLastError(0); - decltype(D3D10CreateEffectFromMemory)* createEffect = - (decltype(D3D10CreateEffectFromMemory)*) - GetProcAddress(LoadLibraryA("d3d10_1.dll"), "D3D10CreateEffectFromMemory"); - if (!createEffect) { - SetHRESULT(aHresultPtr, HRESULT_FROM_WIN32(GetLastError())); - return false; - } - - hr = createEffect((void*)g_main, - sizeof(g_main), - D3D10_EFFECT_SINGLE_THREADED, - mDevice, - nullptr, - getter_AddRefs(mEffect)); - - if (FAILED(hr)) { - SetHRESULT(aHresultPtr, hr); - return false; - } - - attachments->mEffect = mEffect; - - D3D10_INPUT_ELEMENT_DESC layout[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, - }; - D3D10_PASS_DESC passDesc; - mEffect->GetTechniqueByName("RenderRGBLayerPremul")->GetPassByIndex(0)-> - GetDesc(&passDesc); - - hr = mDevice->CreateInputLayout(layout, - sizeof(layout) / sizeof(D3D10_INPUT_ELEMENT_DESC), - passDesc.pIAInputSignature, - passDesc.IAInputSignatureSize, - getter_AddRefs(mInputLayout)); - - if (FAILED(hr)) { - SetHRESULT(aHresultPtr, hr); - return false; - } - - attachments->mInputLayout = mInputLayout; - - Vertex vertices[] = { {{0.0, 0.0}}, {{1.0, 0.0}}, {{0.0, 1.0}}, {{1.0, 1.0}} }; - CD3D10_BUFFER_DESC bufferDesc(sizeof(vertices), D3D10_BIND_VERTEX_BUFFER); - D3D10_SUBRESOURCE_DATA data; - data.pSysMem = (void*)vertices; - - hr = mDevice->CreateBuffer(&bufferDesc, &data, getter_AddRefs(mVertexBuffer)); - - if (FAILED(hr)) { - SetHRESULT(aHresultPtr, hr); - return false; - } - - attachments->mVertexBuffer = mVertexBuffer; - } else { - mEffect = attachments->mEffect; - mVertexBuffer = attachments->mVertexBuffer; - mInputLayout = attachments->mInputLayout; - } - - nsRefPtr dxgiDevice; - nsRefPtr dxgiAdapter; - - mDevice->QueryInterface(dxgiDevice.StartAssignment()); - dxgiDevice->GetAdapter(getter_AddRefs(dxgiAdapter)); - -#ifdef MOZ_METRO - if (IsRunningInWindowsMetro()) { - nsRefPtr dxgiFactory; - dxgiAdapter->GetParent(IID_PPV_ARGS(dxgiFactory.StartAssignment())); - - nsIntRect rect; - mWidget->GetClientBounds(rect); - - DXGI_SWAP_CHAIN_DESC1 swapDesc = { 0 }; - // Automatically detect the width and the height from the winrt CoreWindow - swapDesc.Width = rect.width; - swapDesc.Height = rect.height; - // This is the most common swapchain format - swapDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - swapDesc.Stereo = false; - // Don't use multi-sampling - swapDesc.SampleDesc.Count = 1; - swapDesc.SampleDesc.Quality = 0; - swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - // Use double buffering to enable flip - swapDesc.BufferCount = 2; - swapDesc.Scaling = DXGI_SCALING_NONE; - // All Metro style apps must use this SwapEffect - swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - swapDesc.Flags = 0; - - /** - * Create a swap chain, this swap chain will contain the backbuffer for - * the window we draw to. The front buffer is the full screen front - * buffer. - */ - nsRefPtr swapChain1; - hr = dxgiFactory->CreateSwapChainForCoreWindow( - dxgiDevice, (IUnknown *)mWidget->GetNativeData(NS_NATIVE_ICOREWINDOW), - &swapDesc, nullptr, getter_AddRefs(swapChain1)); - if (FAILED(hr)) { - SetHRESULT(aHresultPtr, hr); - return false; - } - mSwapChain = swapChain1; - } else -#endif - { - nsRefPtr dxgiFactory; - dxgiAdapter->GetParent(IID_PPV_ARGS(dxgiFactory.StartAssignment())); - - DXGI_SWAP_CHAIN_DESC swapDesc; - ::ZeroMemory(&swapDesc, sizeof(swapDesc)); - swapDesc.BufferDesc.Width = 0; - swapDesc.BufferDesc.Height = 0; - swapDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - swapDesc.BufferDesc.RefreshRate.Numerator = 60; - swapDesc.BufferDesc.RefreshRate.Denominator = 1; - swapDesc.SampleDesc.Count = 1; - swapDesc.SampleDesc.Quality = 0; - swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swapDesc.BufferCount = 1; - swapDesc.OutputWindow = (HWND)mWidget->GetNativeData(NS_NATIVE_WINDOW); - swapDesc.Windowed = TRUE; - // We don't really need this flag, however it seems on some NVidia hardware - // smaller area windows do not present properly without this flag. This flag - // should have no negative consequences by itself. See bug 613790. This flag - // is broken on optimus devices. As a temporary solution we don't set it - // there, the only way of reliably detecting we're on optimus is looking for - // the DLL. See Bug 623807. - if (gfxWindowsPlatform::IsOptimus()) { - swapDesc.Flags = 0; - } else { - swapDesc.Flags = DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE; - } - - /** - * Create a swap chain, this swap chain will contain the backbuffer for - * the window we draw to. The front buffer is the full screen front - * buffer. - */ - hr = dxgiFactory->CreateSwapChain(dxgiDevice, &swapDesc, getter_AddRefs(mSwapChain)); - if (FAILED(hr)) { - return false; - } - - // We need this because we don't want DXGI to respond to Alt+Enter. - dxgiFactory->MakeWindowAssociation(swapDesc.OutputWindow, DXGI_MWA_NO_WINDOW_CHANGES); - } - - reporter.SetSuccessful(); - return true; -} - -void -LayerManagerD3D10::Destroy() -{ - if (!IsDestroyed()) { - if (mRoot) { - static_cast(mRoot->ImplData())->LayerManagerDestroyed(); - } - // XXX need to be careful here about surface destruction - // racing with share-to-chrome message - } - LayerManager::Destroy(); -} - -void -LayerManagerD3D10::SetRoot(Layer *aRoot) -{ - mRoot = aRoot; -} - -void -LayerManagerD3D10::BeginTransaction() -{ - mInTransaction = true; - -#ifdef MOZ_LAYERS_HAVE_LOG - MOZ_LAYERS_LOG(("[----- BeginTransaction")); - Log(); -#endif -} - -void -LayerManagerD3D10::BeginTransactionWithTarget(gfxContext* aTarget) -{ - mInTransaction = true; - mTarget = aTarget; -} - -bool -LayerManagerD3D10::EndEmptyTransaction(EndTransactionFlags aFlags) -{ - mInTransaction = false; - - if (!mRoot) - return false; - - EndTransaction(nullptr, nullptr, aFlags); - return true; -} - -void -LayerManagerD3D10::EndTransaction(DrawPaintedLayerCallback aCallback, - void* aCallbackData, - EndTransactionFlags aFlags) -{ - mInTransaction = false; - - if (mRoot && !(aFlags & END_NO_IMMEDIATE_REDRAW)) { - mCurrentCallbackInfo.Callback = aCallback; - mCurrentCallbackInfo.CallbackData = aCallbackData; - - if (aFlags & END_NO_COMPOSITE) { - // Apply pending tree updates before recomputing effective - // properties. - mRoot->ApplyPendingUpdatesToSubtree(); - } - - // The results of our drawing always go directly into a pixel buffer, - // so we don't need to pass any global transform here. - mRoot->ComputeEffectiveTransforms(Matrix4x4()); - -#ifdef MOZ_LAYERS_HAVE_LOG - MOZ_LAYERS_LOG((" ----- (beginning paint)")); - Log(); -#endif - - Render(aFlags); - mCurrentCallbackInfo.Callback = nullptr; - mCurrentCallbackInfo.CallbackData = nullptr; - } - -#ifdef MOZ_LAYERS_HAVE_LOG - Log(); - MOZ_LAYERS_LOG(("]----- EndTransaction")); -#endif - - mTarget = nullptr; -} - -already_AddRefed -LayerManagerD3D10::CreatePaintedLayer() -{ - nsRefPtr layer = new PaintedLayerD3D10(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D10::CreateContainerLayer() -{ - nsRefPtr layer = new ContainerLayerD3D10(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D10::CreateImageLayer() -{ - nsRefPtr layer = new ImageLayerD3D10(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D10::CreateColorLayer() -{ - nsRefPtr layer = new ColorLayerD3D10(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D10::CreateCanvasLayer() -{ - nsRefPtr layer = new CanvasLayerD3D10(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D10::CreateReadbackLayer() -{ - nsRefPtr layer = new ReadbackLayerD3D10(this); - return layer.forget(); -} - -TemporaryRef -LayerManagerD3D10::CreateOptimalDrawTarget(const IntSize &aSize, - SurfaceFormat aFormat) -{ - if ((aFormat != SurfaceFormat::B8G8R8X8 && - aFormat != SurfaceFormat::B8G8R8A8)) { - return LayerManager::CreateOptimalDrawTarget(aSize, aFormat); - } - - nsRefPtr texture; - - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, aSize.width, aSize.height, 1, 1); - desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; - desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE; - - HRESULT hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(texture)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create new texture for CreateOptimalDrawTarget!"); - return LayerManager::CreateOptimalDrawTarget(aSize, aFormat); - } - - RefPtr dt = - Factory::CreateDrawTargetForD3D10Texture(texture, aFormat); - - if (!dt) { - return LayerManager::CreateOptimalDrawTarget(aSize, aFormat); - } - - return dt; -} - - -TemporaryRef -LayerManagerD3D10::CreateOptimalMaskDrawTarget(const IntSize &aSize) -{ - return CreateOptimalDrawTarget(aSize, SurfaceFormat::B8G8R8A8); -} - - -TemporaryRef -LayerManagerD3D10::CreateDrawTarget(const IntSize &aSize, - SurfaceFormat aFormat) -{ - if ((aFormat != SurfaceFormat::B8G8R8A8 && - aFormat != SurfaceFormat::B8G8R8X8) || - gfxPlatform::GetPlatform()->GetPreferredCanvasBackend() != BackendType::DIRECT2D) { - return LayerManager::CreateDrawTarget(aSize, aFormat); - } - - nsRefPtr texture; - - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, aSize.width, aSize.height, 1, 1); - desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; - - HRESULT hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(texture)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create new texture for CreateOptimalDrawTarget!"); - return LayerManager::CreateDrawTarget(aSize, aFormat); - } - - RefPtr surface = - Factory::CreateDrawTargetForD3D10Texture(texture, aFormat); - - if (!surface) { - return LayerManager::CreateDrawTarget(aSize, aFormat); - } - - return surface; -} - -ReadbackManagerD3D10* -LayerManagerD3D10::readbackManager() -{ - EnsureReadbackManager(); - return mReadbackManager; -} - -void -LayerManagerD3D10::SetViewport(const nsIntSize &aViewport) -{ - mViewport = aViewport; - - D3D10_VIEWPORT viewport; - viewport.MaxDepth = 1.0f; - viewport.MinDepth = 0; - viewport.Width = aViewport.width; - viewport.Height = aViewport.height; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - - mDevice->RSSetViewports(1, &viewport); - - gfx3DMatrix projection; - /* - * Matrix to transform to viewport space ( <-1.0, 1.0> topleft, - * <1.0, -1.0> bottomright) - */ - projection._11 = 2.0f / aViewport.width; - projection._22 = -2.0f / aViewport.height; - projection._33 = 0.0f; - projection._41 = -1.0f; - projection._42 = 1.0f; - projection._44 = 1.0f; - - HRESULT hr = mEffect->GetVariableByName("mProjection")-> - SetRawValue(&projection._11, 0, 64); - - if (FAILED(hr)) { - NS_WARNING("Failed to set projection matrix."); - } -} - -void -LayerManagerD3D10::SetupInputAssembler() -{ - mDevice->IASetInputLayout(mInputLayout); - - UINT stride = sizeof(Vertex); - UINT offset = 0; - ID3D10Buffer *buffer = mVertexBuffer; - mDevice->IASetVertexBuffers(0, 1, &buffer, &stride, &offset); - mDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); -} - -void -LayerManagerD3D10::SetupPipeline() -{ - VerifyBufferSize(); - UpdateRenderTarget(); - - nsIntRect rect; - mWidget->GetClientBounds(rect); - - HRESULT hr; - - hr = mEffect->GetVariableByName("vTextureCoords")->AsVector()-> - SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); - - if (FAILED(hr)) { - NS_WARNING("Failed to set Texture Coordinates."); - return; - } - - ID3D10RenderTargetView *view = mRTView; - mDevice->OMSetRenderTargets(1, &view, nullptr); - - SetupInputAssembler(); - - SetViewport(nsIntSize(rect.width, rect.height)); -} - -void -LayerManagerD3D10::UpdateRenderTarget() -{ - if (mRTView || !mSwapChain) { - return; - } - - HRESULT hr; - - nsRefPtr backBuf; - hr = mSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)backBuf.StartAssignment()); - if (FAILED(hr)) { - return; - } - mDevice->CreateRenderTargetView(backBuf, nullptr, getter_AddRefs(mRTView)); -} - -void -LayerManagerD3D10::VerifyBufferSize() -{ - nsIntRect rect; - mWidget->GetClientBounds(rect); - - if (mSwapChain) { - DXGI_SWAP_CHAIN_DESC swapDesc; - mSwapChain->GetDesc(&swapDesc); - - if (swapDesc.BufferDesc.Width == rect.width && - swapDesc.BufferDesc.Height == rect.height) { - return; - } - - mRTView = nullptr; - if (IsRunningInWindowsMetro()) { - mSwapChain->ResizeBuffers(2, rect.width, rect.height, - DXGI_FORMAT_B8G8R8A8_UNORM, - 0); - mDisableSequenceForNextFrame = true; - } else if (gfxWindowsPlatform::IsOptimus()) { - mSwapChain->ResizeBuffers(1, rect.width, rect.height, - DXGI_FORMAT_B8G8R8A8_UNORM, - 0); - } else { - mSwapChain->ResizeBuffers(1, rect.width, rect.height, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE); - } - } -} - -void -LayerManagerD3D10::EnsureReadbackManager() -{ - if (mReadbackManager) { - return; - } - - DeviceAttachments *attachments; - UINT size = sizeof(DeviceAttachments*); - if (FAILED(mDevice->GetPrivateData(sDeviceAttachments, &size, &attachments))) { - // Strange! This shouldn't happen ... return a readback manager for this - // layer manager only. - mReadbackManager = new ReadbackManagerD3D10(); - gfx::LogFailure(NS_LITERAL_CSTRING("Couldn't get device attachments for device.")); - return; - } - - if (attachments->mReadbackManager) { - mReadbackManager = attachments->mReadbackManager; - return; - } - - mReadbackManager = new ReadbackManagerD3D10(); - attachments->mReadbackManager = mReadbackManager; -} - -void -LayerManagerD3D10::Render(EndTransactionFlags aFlags) -{ - static_cast(mRoot->ImplData())->Validate(); - - if (aFlags & END_NO_COMPOSITE) { - return; - } - - SetupPipeline(); - - float black[] = { 0, 0, 0, 0 }; - device()->ClearRenderTargetView(mRTView, black); - - nsIntRect rect; - mWidget->GetClientBounds(rect); - - const nsIntRect *clipRect = mRoot->GetClipRect(); - D3D10_RECT r; - if (clipRect) { - r.left = (LONG)clipRect->x; - r.top = (LONG)clipRect->y; - r.right = (LONG)(clipRect->x + clipRect->width); - r.bottom = (LONG)(clipRect->y + clipRect->height); - } else { - r.left = r.top = 0; - r.right = rect.width; - r.bottom = rect.height; - } - device()->RSSetScissorRects(1, &r); - - static_cast(mRoot->ImplData())->RenderLayer(); - - if (!mRegionToClear.IsEmpty()) { - float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - gfx::Matrix4x4 transform; - effect()->GetVariableByName("mLayerTransform")->SetRawValue(&transform, 0, 64); - effect()->GetVariableByName("fLayerColor")->AsVector()->SetFloatVector(color); - - ID3D10EffectTechnique *technique = effect()->GetTechniqueByName("RenderClearLayer"); - - nsIntRegionRectIterator iter(mRegionToClear); - const nsIntRect *r; - while ((r = iter.Next())) { - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)r->x, - (float)r->y, - (float)r->width, - (float)r->height) - ); - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); - } - } - - // See bug 630197 - we have some reasons to believe if an earlier call - // returned an error, the upcoming present call may raise an exception. - // This will check if any of the calls done recently has returned an error - // and bails on composition. On the -next- frame we will then abandon - // hardware acceleration from gfxWindowsPlatform::VerifyD2DDevice. - // This might not be the 'optimal' solution but it will help us assert - // whether our thoughts of the causes of the issues are correct. - if (FAILED(mDevice->GetDeviceRemovedReason())) { - return; - } - - if (mTarget) { - PaintToTarget(); - } else { - mSwapChain->Present(0, mDisableSequenceForNextFrame ? DXGI_PRESENT_DO_NOT_SEQUENCE : 0); - mDisableSequenceForNextFrame = false; - } - RecordFrame(); - PostPresent(); -} - -void -LayerManagerD3D10::PaintToTarget() -{ - nsRefPtr backBuf; - - mSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)backBuf.StartAssignment()); - - D3D10_TEXTURE2D_DESC bbDesc; - backBuf->GetDesc(&bbDesc); - - CD3D10_TEXTURE2D_DESC softDesc(bbDesc.Format, bbDesc.Width, bbDesc.Height); - softDesc.MipLevels = 1; - softDesc.CPUAccessFlags = D3D10_CPU_ACCESS_READ; - softDesc.Usage = D3D10_USAGE_STAGING; - softDesc.BindFlags = 0; - - nsRefPtr readTexture; - - HRESULT hr = device()->CreateTexture2D(&softDesc, nullptr, getter_AddRefs(readTexture)); - if (FAILED(hr)) { - ReportFailure(NS_LITERAL_CSTRING("LayerManagerD3D10::PaintToTarget(): Failed to create texture"), - hr); - return; - } - - device()->CopyResource(readTexture, backBuf); - - D3D10_MAPPED_TEXTURE2D map; - readTexture->Map(0, D3D10_MAP_READ, 0, &map); - - nsRefPtr tmpSurface = - new gfxImageSurface((unsigned char*)map.pData, - gfxIntSize(bbDesc.Width, bbDesc.Height), - map.RowPitch, - gfxImageFormat::ARGB32); - - mTarget->SetSource(tmpSurface); - mTarget->SetOperator(gfxContext::OPERATOR_OVER); - mTarget->Paint(); - - readTexture->Unmap(0); -} - -void -LayerManagerD3D10::ReportFailure(const nsACString &aMsg, HRESULT aCode) -{ - // We could choose to abort here when hr == E_OUTOFMEMORY. - nsCString msg; - msg.Append(aMsg); - msg.AppendLiteral(" Error code: "); - msg.AppendInt(uint32_t(aCode)); - NS_WARNING(msg.BeginReading()); - - gfx::LogFailure(msg); -} - -LayerD3D10::LayerD3D10(LayerManagerD3D10 *aManager) - : mD3DManager(aManager) -{ -} - -ID3D10EffectTechnique* -LayerD3D10::SelectShader(uint8_t aFlags) -{ - switch (aFlags) { - case (SHADER_RGBA | SHADER_NON_PREMUL | SHADER_LINEAR | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerNonPremulMask"); - case (SHADER_RGBA | SHADER_NON_PREMUL | SHADER_LINEAR | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerNonPremul"); - case (SHADER_RGBA | SHADER_NON_PREMUL | SHADER_POINT | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerNonPremulPoint"); - case (SHADER_RGBA | SHADER_NON_PREMUL | SHADER_POINT | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerNonPremulPointMask"); - case (SHADER_RGBA | SHADER_PREMUL | SHADER_LINEAR | SHADER_MASK_3D): - return effect()->GetTechniqueByName("RenderRGBALayerPremulMask3D"); - case (SHADER_RGBA | SHADER_PREMUL | SHADER_LINEAR | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerPremulMask"); - case (SHADER_RGBA | SHADER_PREMUL | SHADER_LINEAR | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerPremul"); - case (SHADER_RGBA | SHADER_PREMUL | SHADER_POINT | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerPremulPointMask"); - case (SHADER_RGBA | SHADER_PREMUL | SHADER_POINT | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBALayerPremulPoint"); - case (SHADER_RGB | SHADER_PREMUL | SHADER_POINT | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBLayerPremulPointMask"); - case (SHADER_RGB | SHADER_PREMUL | SHADER_POINT | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBLayerPremulPoint"); - case (SHADER_RGB | SHADER_PREMUL | SHADER_LINEAR | SHADER_MASK): - return effect()->GetTechniqueByName("RenderRGBLayerPremulMask"); - case (SHADER_RGB | SHADER_PREMUL | SHADER_LINEAR | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderRGBLayerPremul"); - case (SHADER_SOLID | SHADER_MASK): - return effect()->GetTechniqueByName("RenderSolidColorLayerMask"); - case (SHADER_SOLID | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderSolidColorLayer"); - case (SHADER_COMPONENT_ALPHA | SHADER_MASK): - return effect()->GetTechniqueByName("RenderComponentAlphaLayerMask"); - case (SHADER_COMPONENT_ALPHA | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderComponentAlphaLayer"); - case (SHADER_YCBCR | SHADER_MASK): - return effect()->GetTechniqueByName("RenderYCbCrLayerMask"); - case (SHADER_YCBCR | SHADER_NO_MASK): - return effect()->GetTechniqueByName("RenderYCbCrLayer"); - default: - NS_ERROR("Invalid shader."); - return nullptr; - } -} - -uint8_t -LayerD3D10::LoadMaskTexture() -{ - if (Layer* maskLayer = GetLayer()->GetMaskLayer()) { - IntSize size; - nsRefPtr maskSRV = - static_cast(maskLayer->ImplData())->GetAsTexture(&size); - - if (!maskSRV) { - return SHADER_NO_MASK; - } - - Matrix maskTransform; - Matrix4x4 effectiveTransform = maskLayer->GetEffectiveTransform(); - bool maskIs2D = effectiveTransform.CanDraw2D(&maskTransform); - NS_ASSERTION(maskIs2D, "How did we end up with a 3D transform here?!"); - Rect bounds = Rect(Point(), Size(size)); - bounds = maskTransform.TransformBounds(bounds); - - effect()->GetVariableByName("vMaskQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)bounds.x, - (float)bounds.y, - (float)bounds.width, - (float)bounds.height) - ); - - effect()->GetVariableByName("tMask")->AsShaderResource()->SetResource(maskSRV); - return SHADER_MASK; - } - - return SHADER_NO_MASK; -} - -} -} diff --git a/gfx/layers/d3d10/LayerManagerD3D10.fx b/gfx/layers/d3d10/LayerManagerD3D10.fx deleted file mode 100644 index e051a4c60384..000000000000 --- a/gfx/layers/d3d10/LayerManagerD3D10.fx +++ /dev/null @@ -1,605 +0,0 @@ -typedef float4 rect; -cbuffer PerLayer { - rect vTextureCoords; - rect vLayerQuad; - rect vMaskQuad; - float fLayerOpacity; - float4x4 mLayerTransform; -} - -cbuffer PerOccasionalLayer { - float4 vRenderTargetOffset; - float4 fLayerColor; -} - -cbuffer PerLayerManager { - float4x4 mProjection; -} - -BlendState Premul -{ - AlphaToCoverageEnable = FALSE; - BlendEnable[0] = TRUE; - SrcBlend = One; - DestBlend = Inv_Src_Alpha; - BlendOp = Add; - SrcBlendAlpha = One; - DestBlendAlpha = Inv_Src_Alpha; - BlendOpAlpha = Add; - RenderTargetWriteMask[0] = 0x0F; // All -}; - -BlendState NonPremul -{ - AlphaToCoverageEnable = FALSE; - BlendEnable[0] = TRUE; - SrcBlend = Src_Alpha; - DestBlend = Inv_Src_Alpha; - BlendOp = Add; - SrcBlendAlpha = One; - DestBlendAlpha = Inv_Src_Alpha; - BlendOpAlpha = Add; - RenderTargetWriteMask[0] = 0x0F; // All -}; - -BlendState NoBlendDual -{ - AlphaToCoverageEnable = FALSE; - BlendEnable[0] = FALSE; - BlendEnable[1] = FALSE; - RenderTargetWriteMask[0] = 0x0F; // All - RenderTargetWriteMask[1] = 0x0F; // All -}; - -BlendState ComponentAlphaBlend -{ - AlphaToCoverageEnable = FALSE; - BlendEnable[0] = TRUE; - SrcBlend = One; - DestBlend = Inv_Src1_Color; - BlendOp = Add; - SrcBlendAlpha = One; - DestBlendAlpha = Inv_Src_Alpha; - BlendOpAlpha = Add; - RenderTargetWriteMask[0] = 0x0F; // All -}; - -RasterizerState LayerRast -{ - ScissorEnable = True; - CullMode = None; -}; - -Texture2D tRGB; -Texture2D tY; -Texture2D tCb; -Texture2D tCr; -Texture2D tRGBWhite; -Texture2D tMask; - -SamplerState LayerTextureSamplerLinear -{ - Filter = MIN_MAG_MIP_LINEAR; - AddressU = Clamp; - AddressV = Clamp; -}; - -SamplerState LayerTextureSamplerPoint -{ - Filter = MIN_MAG_MIP_POINT; - AddressU = Clamp; - AddressV = Clamp; -}; - -struct VS_INPUT { - float2 vPosition : POSITION; -}; - -struct VS_OUTPUT { - float4 vPosition : SV_Position; - float2 vTexCoords : TEXCOORD0; -}; - -struct VS_MASK_OUTPUT { - float4 vPosition : SV_Position; - float2 vTexCoords : TEXCOORD0; - float2 vMaskCoords : TEXCOORD1; -}; - -struct VS_MASK_3D_OUTPUT { - float4 vPosition : SV_Position; - float2 vTexCoords : TEXCOORD0; - float3 vMaskCoords : TEXCOORD1; -}; - -struct PS_OUTPUT { - float4 vSrc; - float4 vAlpha; -}; - -struct PS_DUAL_OUTPUT { - float4 vOutput1 : SV_Target0; - float4 vOutput2 : SV_Target1; -}; - -float2 TexCoords(const float2 aPosition) -{ - float2 result; - const float2 size = vTextureCoords.zw; - result.x = vTextureCoords.x + aPosition.x * size.x; - result.y = vTextureCoords.y + aPosition.y * size.y; - - return result; -} - -float4 TransformedPostion(float2 aInPosition) -{ - // the current vertex's position on the quad - float4 position = float4(0, 0, 0, 1); - - // We use 4 component floats to uniquely describe a rectangle, by the structure - // of x, y, width, height. This allows us to easily generate the 4 corners - // of any rectangle from the 4 corners of the 0,0-1,1 quad that we use as the - // stream source for our LayerQuad vertex shader. We do this by doing: - // Xout = x + Xin * width - // Yout = y + Yin * height - float2 size = vLayerQuad.zw; - position.x = vLayerQuad.x + aInPosition.x * size.x; - position.y = vLayerQuad.y + aInPosition.y * size.y; - - position = mul(mLayerTransform, position); - - return position; -} - -float4 VertexPosition(float4 aTransformedPosition) -{ - float4 result; - result.w = aTransformedPosition.w; - result.xyz = aTransformedPosition.xyz / aTransformedPosition.w; - result -= vRenderTargetOffset; - result.xyz *= result.w; - - result = mul(mProjection, result); - - return result; -} - -VS_OUTPUT LayerQuadVS(const VS_INPUT aVertex) -{ - VS_OUTPUT outp; - float4 position = TransformedPostion(aVertex.vPosition); - - outp.vPosition = VertexPosition(position); - outp.vTexCoords = TexCoords(aVertex.vPosition.xy); - - return outp; -} - -VS_MASK_OUTPUT LayerQuadMaskVS(const VS_INPUT aVertex) -{ - VS_MASK_OUTPUT outp; - float4 position = TransformedPostion(aVertex.vPosition); - - outp.vPosition = VertexPosition(position); - - // calculate the position on the mask texture - outp.vMaskCoords.x = (position.x - vMaskQuad.x) / vMaskQuad.z; - outp.vMaskCoords.y = (position.y - vMaskQuad.y) / vMaskQuad.w; - - outp.vTexCoords = TexCoords(aVertex.vPosition.xy); - - return outp; -} - -VS_MASK_3D_OUTPUT LayerQuadMask3DVS(const VS_INPUT aVertex) -{ - VS_MASK_3D_OUTPUT outp; - float4 position = TransformedPostion(aVertex.vPosition); - - outp.vPosition = VertexPosition(position); - - // calculate the position on the mask texture - position.xyz /= position.w; - outp.vMaskCoords.x = (position.x - vMaskQuad.x) / vMaskQuad.z; - outp.vMaskCoords.y = (position.y - vMaskQuad.y) / vMaskQuad.w; - // We use the w coord to do non-perspective correct interpolation: - // the quad might be transformed in 3D, in which case it will have some - // perspective. The graphics card will do perspective-correct interpolation - // of the texture, but our mask is already transformed and so we require - // linear interpolation. Therefore, we must correct the interpolation - // ourselves, we do this by multiplying all coords by w here, and dividing by - // w in the pixel shader (post-interpolation), we pass w in outp.vMaskCoords.z. - // See http://en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness - outp.vMaskCoords.z = 1; - outp.vMaskCoords *= position.w; - - outp.vTexCoords = TexCoords(aVertex.vPosition.xy); - - return outp; -} - -float4 RGBAShaderMask(const VS_MASK_OUTPUT aVertex, uniform sampler aSampler) : SV_Target -{ - float2 maskCoords = aVertex.vMaskCoords; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - return tRGB.Sample(aSampler, aVertex.vTexCoords) * fLayerOpacity * mask; -} - -float4 RGBAShaderLinearMask3D(const VS_MASK_3D_OUTPUT aVertex) : SV_Target -{ - float2 maskCoords = aVertex.vMaskCoords.xy / aVertex.vMaskCoords.z; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - return tRGB.Sample(LayerTextureSamplerLinear, aVertex.vTexCoords) * fLayerOpacity * mask; -} - -float4 RGBShaderMask(const VS_MASK_OUTPUT aVertex, uniform sampler aSampler) : SV_Target -{ - float4 result; - result = tRGB.Sample(aSampler, aVertex.vTexCoords) * fLayerOpacity; - result.a = fLayerOpacity; - - float2 maskCoords = aVertex.vMaskCoords; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - return result * mask; -} - -/* From Rec601: -[R] [1.1643835616438356, 0.0, 1.5960267857142858] [ Y - 16] -[G] = [1.1643835616438358, -0.3917622900949137, -0.8129676472377708] x [Cb - 128] -[B] [1.1643835616438356, 2.017232142857143, 8.862867620416422e-17] [Cr - 128] - -For [0,1] instead of [0,255], and to 5 places: -[R] [1.16438, 0.00000, 1.59603] [ Y - 0.06275] -[G] = [1.16438, -0.39176, -0.81297] x [Cb - 0.50196] -[B] [1.16438, 2.01723, 0.00000] [Cr - 0.50196] -*/ - -float4 CalculateYCbCrColor(const float2 aTexCoords) -{ - float4 yuv; - float4 color; - - yuv.r = tCr.Sample(LayerTextureSamplerLinear, aTexCoords).a - 0.50196; - yuv.g = tY.Sample(LayerTextureSamplerLinear, aTexCoords).a - 0.06275; - yuv.b = tCb.Sample(LayerTextureSamplerLinear, aTexCoords).a - 0.50196; - - color.r = yuv.g * 1.16438 + yuv.r * 1.59603; - color.g = yuv.g * 1.16438 - 0.81297 * yuv.r - 0.39176 * yuv.b; - color.b = yuv.g * 1.16438 + yuv.b * 2.01723; - color.a = 1.0f; - - return color; -} - -float4 YCbCrShaderMask(const VS_MASK_OUTPUT aVertex) : SV_Target -{ - float2 maskCoords = aVertex.vMaskCoords; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - - return CalculateYCbCrColor(aVertex.vTexCoords) * fLayerOpacity * mask; -} - -PS_OUTPUT ComponentAlphaShaderMask(const VS_MASK_OUTPUT aVertex) : SV_Target -{ - PS_OUTPUT result; - - result.vSrc = tRGB.Sample(LayerTextureSamplerLinear, aVertex.vTexCoords); - result.vAlpha = 1.0 - tRGBWhite.Sample(LayerTextureSamplerLinear, aVertex.vTexCoords) + result.vSrc; - result.vSrc.a = result.vAlpha.g; - - float2 maskCoords = aVertex.vMaskCoords; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - result.vSrc *= fLayerOpacity * mask; - result.vAlpha *= fLayerOpacity * mask; - - return result; -} - -float4 SolidColorShaderMask(const VS_MASK_OUTPUT aVertex) : SV_Target -{ - float2 maskCoords = aVertex.vMaskCoords; - float mask = tMask.Sample(LayerTextureSamplerLinear, maskCoords).a; - return fLayerColor * mask; -} - -/* - * Un-masked versions - ************************************************************* - */ -float4 RGBAShader(const VS_OUTPUT aVertex, uniform sampler aSampler) : SV_Target -{ - return tRGB.Sample(aSampler, aVertex.vTexCoords) * fLayerOpacity; -} - -float4 RGBShader(const VS_OUTPUT aVertex, uniform sampler aSampler) : SV_Target -{ - float4 result; - result = tRGB.Sample(aSampler, aVertex.vTexCoords) * fLayerOpacity; - result.a = fLayerOpacity; - return result; -} - -float4 YCbCrShader(const VS_OUTPUT aVertex) : SV_Target -{ - return CalculateYCbCrColor(aVertex.vTexCoords) * fLayerOpacity; -} - -PS_OUTPUT ComponentAlphaShader(const VS_OUTPUT aVertex) : SV_Target -{ - PS_OUTPUT result; - - result.vSrc = tRGB.Sample(LayerTextureSamplerLinear, aVertex.vTexCoords); - result.vAlpha = 1.0 - tRGBWhite.Sample(LayerTextureSamplerLinear, aVertex.vTexCoords) + result.vSrc; - result.vSrc.a = result.vAlpha.g; - result.vSrc *= fLayerOpacity; - result.vAlpha *= fLayerOpacity; - return result; -} - -float4 SolidColorShader(const VS_OUTPUT aVertex) : SV_Target -{ - return fLayerColor; -} - -PS_DUAL_OUTPUT AlphaExtractionPrepareShader(const VS_OUTPUT aVertex) -{ - PS_DUAL_OUTPUT result; - result.vOutput1 = float4(0, 0, 0, 1); - result.vOutput2 = float4(1, 1, 1, 1); - return result; -} - -technique10 RenderRGBLayerPremul -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBShader(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBLayerPremulPoint -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBShader(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderRGBALayerPremul -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShader(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBALayerNonPremul -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NonPremul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShader(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBALayerPremulPoint -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShader(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderRGBALayerNonPremulPoint -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NonPremul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShader(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderYCbCrLayer -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, YCbCrShader() ) ); - } -} - -technique10 RenderComponentAlphaLayer -{ - Pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( ComponentAlphaBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, ComponentAlphaShader() ) ); - } - -} - -technique10 RenderSolidColorLayer -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, SolidColorShader() ) ); - } -} - -technique10 RenderClearLayer -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NoBlendDual, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, SolidColorShader() ) ); - } -} - -technique10 PrepareAlphaExtractionTextures -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NoBlendDual, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, AlphaExtractionPrepareShader() ) ); - } -} - -technique10 RenderRGBLayerPremulMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBShaderMask(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBLayerPremulPointMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBShaderMask(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderRGBALayerPremulMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShaderMask(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBALayerPremulMask3D -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMask3DVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShaderLinearMask3D() ) ); - } -} - -technique10 RenderRGBALayerNonPremulMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NonPremul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShaderMask(LayerTextureSamplerLinear) ) ); - } -} - -technique10 RenderRGBALayerPremulPointMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShaderMask(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderRGBALayerNonPremulPointMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( NonPremul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, RGBAShaderMask(LayerTextureSamplerPoint) ) ); - } -} - -technique10 RenderYCbCrLayerMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, YCbCrShaderMask() ) ); - } -} - -technique10 RenderComponentAlphaLayerMask -{ - Pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( ComponentAlphaBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, ComponentAlphaShaderMask() ) ); - } -} - -technique10 RenderSolidColorLayerMask -{ - pass P0 - { - SetRasterizerState( LayerRast ); - SetBlendState( Premul, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader( CompileShader( vs_4_0_level_9_3, LayerQuadMaskVS() ) ); - SetGeometryShader( NULL ); - SetPixelShader( CompileShader( ps_4_0_level_9_3, SolidColorShaderMask() ) ); - } -} - diff --git a/gfx/layers/d3d10/LayerManagerD3D10.h b/gfx/layers/d3d10/LayerManagerD3D10.h deleted file mode 100644 index e7b27118c796..000000000000 --- a/gfx/layers/d3d10/LayerManagerD3D10.h +++ /dev/null @@ -1,288 +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 GFX_LAYERMANAGERD3D10_H -#define GFX_LAYERMANAGERD3D10_H - -#include "Layers.h" - -#include -#include - -#include "gfxContext.h" -#include "mozilla/gfx/UserData.h" -#include "nsIWidget.h" - -#include "ReadbackManagerD3D10.h" - -namespace mozilla { -namespace layers { - -class DummyRoot; -class Nv3DVUtils; - -/** - * This structure is used to pass rectangles to our shader constant. We can use - * this for passing rectangular areas to SetVertexShaderConstant. In the format - * of a 4 component float(x,y,width,height). Our vertex shader can then use - * this to construct rectangular positions from the 0,0-1,1 quad that we source - * it with. - */ -struct ShaderConstantRectD3D10 -{ - float mX, mY, mWidth, mHeight; - ShaderConstantRectD3D10(float aX, float aY, float aWidth, float aHeight) - : mX(aX), mY(aY), mWidth(aWidth), mHeight(aHeight) - { } - - // For easy passing to SetVertexShaderConstantF. - operator float* () { return &mX; } -}; - -/* - * This is the LayerManager used for Direct3D 10. For now this will - * render on the main thread. - * - * For the time being, LayerManagerD3D10 forwards layers - * transactions. - */ -class LayerManagerD3D10 : public LayerManager { - typedef mozilla::gfx::DrawTarget DrawTarget; - typedef mozilla::gfx::IntSize IntSize; - typedef mozilla::gfx::SurfaceFormat SurfaceFormat; - -public: - LayerManagerD3D10(nsIWidget *aWidget); - virtual ~LayerManagerD3D10(); - - /* - * Initializes the layer manager, this is when the layer manager will - * actually access the device and attempt to create the swap chain used - * to draw to the window. If this method fails the device cannot be used. - * This function is not threadsafe. - * - * return True is initialization was succesful, false when it was not. - */ - bool Initialize(bool force = false, HRESULT* aHresultPtr = nullptr); - - /* - * LayerManager implementation. - */ - virtual void Destroy(); - - virtual void SetRoot(Layer *aLayer); - - virtual void BeginTransaction(); - - virtual void BeginTransactionWithTarget(gfxContext* aTarget); - - virtual bool EndEmptyTransaction(EndTransactionFlags aFlags = END_DEFAULT); - - struct CallbackInfo { - DrawPaintedLayerCallback Callback; - void *CallbackData; - }; - - virtual void EndTransaction(DrawPaintedLayerCallback aCallback, - void* aCallbackData, - EndTransactionFlags aFlags = END_DEFAULT); - - const CallbackInfo &GetCallbackInfo() { return mCurrentCallbackInfo; } - - // D3D10 guarantees textures can be at least this size - enum { - MAX_TEXTURE_SIZE = 8192 - }; - virtual bool CanUseCanvasLayerForSize(const gfx::IntSize &aSize) - { - return aSize <= gfx::IntSize(MAX_TEXTURE_SIZE, MAX_TEXTURE_SIZE); - } - - virtual int32_t GetMaxTextureSize() const - { - return MAX_TEXTURE_SIZE; - } - - virtual already_AddRefed CreatePaintedLayer(); - virtual already_AddRefed CreateContainerLayer(); - virtual already_AddRefed CreateImageLayer(); - virtual already_AddRefed CreateColorLayer(); - virtual already_AddRefed CreateCanvasLayer(); - virtual already_AddRefed CreateReadbackLayer(); - - virtual TemporaryRef - CreateOptimalDrawTarget(const IntSize &aSize, - SurfaceFormat aSurfaceFormat); - - virtual TemporaryRef - CreateOptimalMaskDrawTarget(const IntSize &aSize); - - virtual TemporaryRef - CreateDrawTarget(const gfx::IntSize &aSize, - mozilla::gfx::SurfaceFormat aFormat); - - virtual LayersBackend GetBackendType() { return LayersBackend::LAYERS_D3D10; } - virtual void GetBackendName(nsAString& name) { name.AssignLiteral("Direct3D 10"); } - - virtual const char* Name() const { return "D3D10"; } - - // Public helpers - - ID3D10Device1 *device() const { return mDevice; } - - ID3D10Effect *effect() const { return mEffect; } - IDXGISwapChain *SwapChain() const - { - return mSwapChain; - } - ReadbackManagerD3D10 *readbackManager(); - - void SetupInputAssembler(); - void SetViewport(const nsIntSize &aViewport); - const nsIntSize &GetViewport() { return mViewport; } - - /** - * Return pointer to the Nv3DVUtils instance - */ - Nv3DVUtils *GetNv3DVUtils() { return mNv3DVUtils; } - - static void ReportFailure(const nsACString &aMsg, HRESULT aCode); - -private: - void SetupPipeline(); - void UpdateRenderTarget(); - void VerifyBufferSize(); - void EnsureReadbackManager(); - - void Render(EndTransactionFlags aFlags); - - nsRefPtr mDevice; - - nsRefPtr mEffect; - nsRefPtr mInputLayout; - nsRefPtr mVertexBuffer; - nsRefPtr mReadbackManager; - - nsRefPtr mRTView; - - nsRefPtr mSwapChain; - - nsIWidget *mWidget; - - bool mDisableSequenceForNextFrame; - - CallbackInfo mCurrentCallbackInfo; - - nsIntSize mViewport; - - /* Nv3DVUtils instance */ - nsAutoPtr mNv3DVUtils; - - /* - * Context target, nullptr when drawing directly to our swap chain. - */ - nsRefPtr mTarget; - - /* - * Copies the content of our backbuffer to the set transaction target. - */ - void PaintToTarget(); -}; - -/* - * General information and tree management for OGL layers. - */ -class LayerD3D10 -{ -public: - LayerD3D10(LayerManagerD3D10 *aManager); - - virtual LayerD3D10 *GetFirstChildD3D10() { return nullptr; } - - void SetFirstChild(LayerD3D10 *aParent); - - virtual Layer* GetLayer() = 0; - - /** - * This will render a child layer to whatever render target is currently - * active. - */ - virtual void RenderLayer() = 0; - virtual void Validate() {} - - ID3D10Device1 *device() const { return mD3DManager->device(); } - ID3D10Effect *effect() const { return mD3DManager->effect(); } - - /* Called by the layer manager when it's destroyed */ - virtual void LayerManagerDestroyed() {} - - /** - * Return pointer to the Nv3DVUtils instance. Calls equivalent method in LayerManager. - */ - Nv3DVUtils *GetNv3DVUtils() { return mD3DManager->GetNv3DVUtils(); } - - /* - * Returns a shader resource view of a texture containing the contents of this - * layer. Will try to return an existing texture if possible, or a temporary - * one if not. It is the callee's responsibility to release the shader - * resource view. Will return null if a texture could not be constructed. - * The texture will not be transformed, i.e., it will be in the same coord - * space as this. - * Any layer that can be used as a mask layer should override this method. - * If aSize is non-null, it will contain the size of the texture. - */ - virtual already_AddRefed GetAsTexture(gfx::IntSize* aSize) - { - return nullptr; - } - - void SetEffectTransformAndOpacity() - { - Layer* layer = GetLayer(); - const gfx::Matrix4x4& transform = layer->GetEffectiveTransform(); - void* raw = &const_cast(transform)._11; - effect()->GetVariableByName("mLayerTransform")->SetRawValue(raw, 0, 64); - effect()->GetVariableByName("fLayerOpacity")->AsScalar()->SetFloat(layer->GetEffectiveOpacity()); - } - -protected: - /* - * Finds a texture for this layer's mask layer (if it has one) and sets it - * as an input to the shaders. - * Returns SHADER_MASK if a texture is loaded, SHADER_NO_MASK if there was no - * mask layer, or a texture for the mask layer could not be loaded. - */ - uint8_t LoadMaskTexture(); - - /** - * Select a shader technique using a combination of the following flags. - * Not all combinations of flags are supported, and might cause an error, - * check the fx file to see which shaders exist. In particular, aFlags should - * include any combination of the 0x20 bit = 0 flags OR one of the 0x20 bit = 1 - * flags. Mask flags can be used in either case. - */ - ID3D10EffectTechnique* SelectShader(uint8_t aFlags); - const static uint8_t SHADER_NO_MASK = 0; - const static uint8_t SHADER_MASK = 0x1; - const static uint8_t SHADER_MASK_3D = 0x2; - // 0x20 bit = 0 - const static uint8_t SHADER_RGB = 0; - const static uint8_t SHADER_RGBA = 0x4; - const static uint8_t SHADER_NON_PREMUL = 0; - const static uint8_t SHADER_PREMUL = 0x8; - const static uint8_t SHADER_LINEAR = 0; - const static uint8_t SHADER_POINT = 0x10; - // 0x20 bit = 1 - const static uint8_t SHADER_YCBCR = 0x20; - const static uint8_t SHADER_COMPONENT_ALPHA = 0x24; - const static uint8_t SHADER_SOLID = 0x28; - - LayerManagerD3D10 *mD3DManager; -}; - -} /* layers */ -} /* mozilla */ - -#endif /* GFX_LAYERMANAGERD3D9_H */ diff --git a/gfx/layers/d3d10/LayerManagerD3D10Effect.h b/gfx/layers/d3d10/LayerManagerD3D10Effect.h deleted file mode 100644 index fa8de1cb7ad8..000000000000 --- a/gfx/layers/d3d10/LayerManagerD3D10Effect.h +++ /dev/null @@ -1,17658 +0,0 @@ -#if 0 -// -// FX Version: fx_4_0 -// Child effect (requires effect pool): false -// -// 3 local buffer(s) -// -cbuffer PerLayer -{ - float4 vTextureCoords; // Offset: 0, size: 16 - float4 vLayerQuad; // Offset: 16, size: 16 - float4 vMaskQuad; // Offset: 32, size: 16 - float fLayerOpacity; // Offset: 48, size: 4 - float4x4 mLayerTransform; // Offset: 64, size: 64 -} - -cbuffer PerOccasionalLayer -{ - float4 vRenderTargetOffset; // Offset: 0, size: 16 - float4 fLayerColor; // Offset: 16, size: 16 -} - -cbuffer PerLayerManager -{ - float4x4 mProjection; // Offset: 0, size: 64 -} - -// -// 13 local object(s) -// -BlendState Premul -{ - AlphaToCoverageEnable = bool(FALSE /* 0 */); - BlendEnable[0] = bool(TRUE /* 1 */); - SrcBlend[0] = uint(ONE /* 2 */); - DestBlend[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOp[0] = uint(ADD /* 1 */); - SrcBlendAlpha[0] = uint(ONE /* 2 */); - DestBlendAlpha[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOpAlpha[0] = uint(ADD /* 1 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; -BlendState NonPremul -{ - AlphaToCoverageEnable = bool(FALSE /* 0 */); - BlendEnable[0] = bool(TRUE /* 1 */); - SrcBlend[0] = uint(SRC_ALPHA /* 5 */); - DestBlend[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOp[0] = uint(ADD /* 1 */); - SrcBlendAlpha[0] = uint(ONE /* 2 */); - DestBlendAlpha[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOpAlpha[0] = uint(ADD /* 1 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; -BlendState NoBlendDual -{ - AlphaToCoverageEnable = bool(FALSE /* 0 */); - BlendEnable[0] = bool(FALSE /* 0 */); - BlendEnable[1] = bool(FALSE /* 0 */); - RenderTargetWriteMask[0] = byte(0x0f); - RenderTargetWriteMask[1] = byte(0x0f); -}; -BlendState ComponentAlphaBlend -{ - AlphaToCoverageEnable = bool(FALSE /* 0 */); - BlendEnable[0] = bool(TRUE /* 1 */); - SrcBlend[0] = uint(ONE /* 2 */); - DestBlend[0] = uint(INV_SRC1_COLOR /* 17 */); - BlendOp[0] = uint(ADD /* 1 */); - SrcBlendAlpha[0] = uint(ONE /* 2 */); - DestBlendAlpha[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOpAlpha[0] = uint(ADD /* 1 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; -RasterizerState LayerRast -{ - ScissorEnable = bool(TRUE /* 1 */); - CullMode = uint(NONE /* 1 */); -}; -Texture2D tRGB; -Texture2D tY; -Texture2D tCb; -Texture2D tCr; -Texture2D tRGBWhite; -Texture2D tMask; -SamplerState LayerTextureSamplerLinear -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - AddressU = uint(CLAMP /* 3 */); - AddressV = uint(CLAMP /* 3 */); -}; -SamplerState LayerTextureSamplerPoint -{ - Filter = uint(MIN_MAG_MIP_POINT /* 0 */); - AddressU = uint(CLAMP /* 3 */); - AddressV = uint(CLAMP /* 3 */); -}; - -// -// 21 technique(s) -// -technique10 RenderRGBLayerPremul -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0.xyz, r0, c0.x - mov r0.w, c0.x - mov oC0, r0 - - // approximately 4 instruction slots used (1 texture, 3 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyz, r0.xyzx, cb0[3].xxxx - mov o0.w, cb0[3].x - ret - // Approximately 4 instruction slots used - - }; - } - -} - -technique10 RenderRGBLayerPremulPoint -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerPoint sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0.xyz, r0, c0.x - mov r0.w, c0.x - mov oC0, r0 - - // approximately 4 instruction slots used (1 texture, 3 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyz, r0.xyzx, cb0[3].xxxx - mov o0.w, cb0[3].x - ret - // Approximately 4 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerPremul -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0, r0, c0.x - mov oC0, r0 - - // approximately 3 instruction slots used (1 texture, 2 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyzw, r0.xyzw, cb0[3].xxxx - ret - // Approximately 3 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerNonPremul -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NonPremul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0, r0, c0.x - mov oC0, r0 - - // approximately 3 instruction slots used (1 texture, 2 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyzw, r0.xyzw, cb0[3].xxxx - ret - // Approximately 3 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerPremulPoint -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerPoint sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0, r0, c0.x - mov oC0, r0 - - // approximately 3 instruction slots used (1 texture, 2 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyzw, r0.xyzw, cb0[3].xxxx - ret - // Approximately 3 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerNonPremulPoint -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NonPremul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerPoint sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl_2d s0 - texld r0, t0, s0 - mul r0, r0, c0.x - mov oC0, r0 - - // approximately 3 instruction slots used (1 texture, 2 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o0.xyzw, r0.xyzw, cb0[3].xxxx - ret - // Approximately 3 instruction slots used - - }; - } - -} - -technique10 RenderYCbCrLayer -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tY texture float4 2d 0 1 - // tCb texture float4 2d 1 1 - // tCr texture float4 2d 2 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // s2 s0 t2 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, -0.50195998, -0.0627499968, 1.59603, 0.812969983 - def c2, 1.16437995, 2.01723003, 0.391759992, 1 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - dcl_2d s2 - texld r0, t0, s0 - texld r1, t0, s2 - add r0.x, r1.w, c1.x - mul r0.xy, r0.x, c1.zwzw - add r0.z, r0.w, c1.y - mad r0.y, r0.z, c2.x, -r0.y - mad r1.x, r0.z, c2.x, r0.x - texld r2, t0, s1 - add r0.x, r2.w, c1.x - mad r1.y, r0.x, -c2.z, r0.y - mul r0.x, r0.x, c2.y - mad r1.z, r0.z, c2.x, r0.x - mov r1.w, c2.w - mul r0, r1, c0.x - mov oC0, r0 - - // approximately 15 instruction slots used (3 texture, 12 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_resource_texture2d (float,float,float,float) t2 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 3 - sample r0.xyzw, v1.xyxx, t2.xyzw, s0 - add r0.x, r0.w, l(-0.501960) - mul r0.xy, r0.xxxx, l(1.596030, 0.812970, 0.000000, 0.000000) - sample r1.xyzw, v1.xyxx, t0.xyzw, s0 - add r0.z, r1.w, l(-0.062750) - mad r0.y, r0.z, l(1.164380), -r0.y - mad r1.x, r0.z, l(1.164380), r0.x - sample r2.xyzw, v1.xyxx, t1.xyzw, s0 - add r0.x, r2.w, l(-0.501960) - mad r1.y, -r0.x, l(0.391760), r0.y - mul r0.x, r0.x, l(2.017230) - mad r1.z, r0.z, l(1.164380), r0.x - mov r1.w, l(1.000000) - mul o0.xyzw, r1.xyzw, cb0[3].xxxx - ret - // Approximately 15 instruction slots used - - }; - } - -} - -technique10 RenderComponentAlphaLayer -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = ComponentAlphaBlend; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tRGBWhite texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // SV_Target 1 xyzw 1 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, 1, 0, 0, 0 - dcl t0.xy - dcl_2d s0 - dcl_2d s1 - texld r0, t0, s0 - texld r1, t0, s1 - add r1, r0, -r1 - add r1, r1, c1.x - mov r0.w, r1.y - mul r1, r1, c0.x - mov oC1, r1 - mul r0, r0, c0.x - mov oC0, r0 - - // approximately 9 instruction slots used (2 texture, 7 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_output o1.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t1.xyzw, s0 - sample r1.xyzw, v1.xyxx, t0.xyzw, s0 - add r0.xyzw, -r0.xyzw, r1.xyzw - add r0.xyzw, r0.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000) - mov r1.w, r0.y - mul o1.xyzw, r0.xyzw, cb0[3].xxxx - mul o0.xyzw, r1.xyzw, cb0[3].xxxx - ret - // Approximately 8 instruction slots used - - }; - } - -} - -technique10 RenderSolidColorLayer -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 [unused] - // float4 fLayerColor; // Offset: 16 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerOccasionalLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 1 1 ( FLT, FLT, FLT, FLT) - // - // - // Level9 shader bytecode: - // - ps_2_x - mov oC0, c0 - - // approximately 1 instruction slot used - ps_4_0 - dcl_constantbuffer cb0[2], immediateIndexed - dcl_output o0.xyzw - mov o0.xyzw, cb0[1].xyzw - ret - // Approximately 2 instruction slots used - - }; - } - -} - -technique10 RenderClearLayer -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NoBlendDual; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 [unused] - // float4 fLayerColor; // Offset: 16 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerOccasionalLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 1 1 ( FLT, FLT, FLT, FLT) - // - // - // Level9 shader bytecode: - // - ps_2_x - mov oC0, c0 - - // approximately 1 instruction slot used - ps_4_0 - dcl_constantbuffer cb0[2], immediateIndexed - dcl_output o0.xyzw - mov o0.xyzw, cb0[1].xyzw - ret - // Approximately 2 instruction slots used - - }; - } - -} - -technique10 PrepareAlphaExtractionTextures -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NoBlendDual; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 2 ( FLT, FLT, FLT, FLT) - // c3 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c5 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c6 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c7 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - mad oT0.xy, v0, c1.zwzw, c1 - mad r0.xy, v0, c2.zwzw, c2 - mul r1, r0.y, c4 - mad r0, c3, r0.x, r1 - add r0, r0, c5 - rcp r1.x, r0.w - mul r0.xyz, r0, r1.x - add r0, r0, -c6 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c8 - mad r1, c7, r0.x, r1 - mad r1, c9, r0.z, r1 - mad r0, c10, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 15 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r0.xyzw, r0.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 13 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // SV_Target 1 xyzw 1 TARGET float xyzw - // - // - // Level9 shader bytecode: - // - ps_2_x - def c0, 0, 0, 0, 1 - mov oC0, c0 - mov r0, c0.w - mov oC1, r0 - - // approximately 3 instruction slots used - ps_4_0 - dcl_output o0.xyzw - dcl_output o1.xyzw - mov o0.xyzw, l(0,0,0,1.000000) - mov o1.xyzw, l(1.000000,1.000000,1.000000,1.000000) - ret - // Approximately 3 instruction slots used - - }; - } - -} - -technique10 RenderRGBLayerPremulMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s0 - texld r0, r0, s1 - mul r1.xyz, r1, c0.x - mov r1.w, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 7 instruction slots used (2 texture, 5 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul r0.xyz, r0.xyzx, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mov r0.w, cb0[3].x - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 6 instruction slots used - - }; - } - -} - -technique10 RenderRGBLayerPremulPointMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // LayerTextureSamplerPoint sampler NA NA 1 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t1 - // s1 s1 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s1 - texld r0, r0, s0 - mul r1.xyz, r1, c0.x - mov r1.w, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 7 instruction slots used (2 texture, 5 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s1 - mul r0.xyz, r0.xyzx, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mov r0.w, cb0[3].x - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 6 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerPremulMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s0 - texld r0, r0, s1 - mul r1, r1, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 6 instruction slots used (2 texture, 4 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul r0.xyzw, r0.xyzw, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 5 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerPremulMask3D -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 xyz 2 NONE float xyz - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c12, 1, 0, 0, 0 - dcl_texcoord v0 - mov r0.z, c12.x - rcp r0.w, c3.z - mad r1.xy, v0, c2.zwzw, c2 - mul r2, r1.y, c5 - mad r1, c4, r1.x, r2 - add r1, r1, c6 - rcp r2.x, r1.w - mad r2.yz, r1.xxyw, r2.x, -c3.xxyw - mul r1.xyz, r1, r2.x - mul r0.x, r0.w, r2.y - rcp r0.w, c3.w - mul r0.y, r0.w, r2.z - mul oT1.xyz, r0, r1.w - add r0, r1, -c7 - mad oT0.xy, v0, c1.zwzw, c1 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 22 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o2.xyz - dcl_temps 3 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r0.xyz, r0.xyzx, r0.wwww - add r1.xyzw, r0.xyzw, -cb1[0].xyzw - add r0.xy, r0.xyxx, -cb0[2].xyxx - div r0.xy, r0.xyxx, cb0[2].zwzz - mul r1.xyz, r1.wwww, r1.xyzx - mul r2.xyzw, r1.yyyy, cb2[1].xyzw - mad r2.xyzw, cb2[0].xyzw, r1.xxxx, r2.xyzw - mad r2.xyzw, cb2[2].xyzw, r1.zzzz, r2.xyzw - mad o0.xyzw, cb2[3].xyzw, r1.wwww, r2.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov r0.z, l(1.000000) - mul o2.xyz, r0.wwww, r0.xyzx - ret - // Approximately 17 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 xyz 2 NONE float xyz - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0.xy - dcl t1.xyz - dcl_2d s0 - dcl_2d s1 - rcp r0.w, t1.z - mul r0.xy, r0.w, t1 - texld r1, t0, s0 - texld r0, r0, s1 - mul r1, r1, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 7 instruction slots used (2 texture, 5 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v2.xyz - dcl_output o0.xyzw - dcl_temps 2 - div r0.xy, v2.xyxx, v2.zzzz - sample r0.xyzw, r0.xyxx, t1.xyzw, s0 - sample r1.xyzw, v1.xyxx, t0.xyzw, s0 - mul r1.xyzw, r1.xyzw, cb0[3].xxxx - mul o0.xyzw, r0.wwww, r1.xyzw - ret - // Approximately 6 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerNonPremulMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NonPremul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s0 - texld r0, r0, s1 - mul r1, r1, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 6 instruction slots used (2 texture, 4 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul r0.xyzw, r0.xyzw, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 5 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerPremulPointMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // LayerTextureSamplerPoint sampler NA NA 1 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t1 - // s1 s1 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s1 - texld r0, r0, s0 - mul r1, r1, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 6 instruction slots used (2 texture, 4 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s1 - mul r0.xyzw, r0.xyzw, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 5 instruction slots used - - }; - } - -} - -technique10 RenderRGBALayerNonPremulPointMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = NonPremul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // LayerTextureSamplerPoint sampler NA NA 1 1 - // tRGB texture float4 2d 0 1 - // tMask texture float4 2d 1 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t1 - // s1 s1 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s1 - texld r0, r0, s0 - mul r1, r1, c0.x - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 6 instruction slots used (2 texture, 4 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s1 - mul r0.xyzw, r0.xyzw, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 5 instruction slots used - - }; - } - -} - -technique10 RenderYCbCrLayerMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tY texture float4 2d 0 1 - // tCb texture float4 2d 1 1 - // tCr texture float4 2d 2 1 - // tMask texture float4 2d 3 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // s2 s0 t2 - // s3 s0 t3 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, -0.50195998, -0.0627499968, 1.59603, 0.812969983 - def c2, 1.16437995, 2.01723003, 0.391759992, 1 - dcl t0 - dcl_2d s0 - dcl_2d s1 - dcl_2d s2 - dcl_2d s3 - texld r0, t0, s0 - texld r1, t0, s2 - add r0.x, r1.w, c1.x - mul r0.xy, r0.x, c1.zwzw - add r0.z, r0.w, c1.y - mad r0.y, r0.z, c2.x, -r0.y - mad r1.x, r0.z, c2.x, r0.x - mov r2.xy, t0.wzzw - texld r3, t0, s1 - texld r2, r2, s3 - add r0.x, r3.w, c1.x - mad r1.y, r0.x, -c2.z, r0.y - mul r0.x, r0.x, c2.y - mad r1.z, r0.z, c2.x, r0.x - mov r1.w, c2.w - mul r0, r1, c0.x - mul r0, r2.w, r0 - mov oC0, r0 - - // approximately 18 instruction slots used (4 texture, 14 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_resource_texture2d (float,float,float,float) t2 - dcl_resource_texture2d (float,float,float,float) t3 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 3 - sample r0.xyzw, v1.xyxx, t2.xyzw, s0 - add r0.x, r0.w, l(-0.501960) - mul r0.xy, r0.xxxx, l(1.596030, 0.812970, 0.000000, 0.000000) - sample r1.xyzw, v1.xyxx, t0.xyzw, s0 - add r0.z, r1.w, l(-0.062750) - mad r0.y, r0.z, l(1.164380), -r0.y - mad r1.x, r0.z, l(1.164380), r0.x - sample r2.xyzw, v1.xyxx, t1.xyzw, s0 - add r0.x, r2.w, l(-0.501960) - mad r1.y, -r0.x, l(0.391760), r0.y - mul r0.x, r0.x, l(2.017230) - mad r1.z, r0.z, l(1.164380), r0.x - mov r1.w, l(1.000000) - mul r0.xyzw, r1.xyzw, cb0[3].xxxx - sample r1.xyzw, v1.zwzz, t3.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 17 instruction slots used - - }; - } - -} - -technique10 RenderComponentAlphaLayerMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = ComponentAlphaBlend; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 [unused] - // float4 vLayerQuad; // Offset: 16 Size: 16 [unused] - // float4 vMaskQuad; // Offset: 32 Size: 16 [unused] - // float fLayerOpacity; // Offset: 48 Size: 4 - // float4x4 mLayerTransform; // Offset: 64 Size: 64 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tRGB texture float4 2d 0 1 - // tRGBWhite texture float4 2d 1 1 - // tMask texture float4 2d 2 1 - // PerLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // SV_Target 1 xyzw 1 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s0 t1 - // s2 s0 t2 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, 1, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - dcl_2d s2 - mov r0.xy, t0.wzzw - texld r0, r0, s2 - mul r0.x, r0.w, c0.x - texld r1, t0, s0 - texld r2, t0, s1 - add r2, r1, -r2 - add r2, r2, c1.x - mov r1.w, r2.y - mul r2, r0.x, r2 - mul r0, r0.x, r1 - mov oC0, r0 - mov oC1, r2 - - // approximately 12 instruction slots used (3 texture, 9 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_resource_texture2d (float,float,float,float) t2 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_output o1.xyzw - dcl_temps 3 - sample r0.xyzw, v1.xyxx, t1.xyzw, s0 - sample r1.xyzw, v1.xyxx, t0.xyzw, s0 - add r0.xyzw, -r0.xyzw, r1.xyzw - add r0.xyzw, r0.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000) - mov r1.w, r0.y - sample r2.xyzw, v1.zwzz, t2.xyzw, s0 - mul r2.x, r2.w, cb0[3].x - mul o0.xyzw, r1.xyzw, r2.xxxx - mul o1.xyzw, r0.xyzw, r2.xxxx - ret - // Approximately 10 instruction slots used - - }; - } - -} - -technique10 RenderSolidColorLayerMask -{ - pass P0 - { - RasterizerState = LayerRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = Premul; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerLayer - // { - // - // float4 vTextureCoords; // Offset: 0 Size: 16 - // float4 vLayerQuad; // Offset: 16 Size: 16 - // float4 vMaskQuad; // Offset: 32 Size: 16 - // float fLayerOpacity; // Offset: 48 Size: 4 [unused] - // float4x4 mLayerTransform; // Offset: 64 Size: 64 - // - // } - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 - // float4 fLayerColor; // Offset: 16 Size: 16 [unused] - // - // } - // - // cbuffer PerLayerManager - // { - // - // float4x4 mProjection; // Offset: 0 Size: 64 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // PerLayer cbuffer NA NA 0 1 - // PerOccasionalLayer cbuffer NA NA 1 1 - // PerLayerManager cbuffer NA NA 2 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xy 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c4 cb0 4 2 ( FLT, FLT, FLT, FLT) - // c6 cb0 7 1 ( FLT, FLT, FLT, FLT) - // c7 cb1 0 1 ( FLT, FLT, FLT, FLT) - // c8 cb2 0 4 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - dcl_texcoord v0 - rcp r0.x, c3.z - mad r0.yz, v0.xxyw, c2.xzww, c2.xxyw - mul r1, r0.z, c5 - mad r1, c4, r0.y, r1 - add r1, r1, c6 - add r0.yz, r1.xxyw, -c3.xxyw - mul oT0.w, r0.x, r0.y - rcp r0.x, c3.w - mul oT0.z, r0.x, r0.z - mad oT0.xy, v0, c1.zwzw, c1 - rcp r0.x, r1.w - mul r1.xyz, r0.x, r1 - add r0, r1, -c7 - mul r0.xyz, r0.w, r0 - mul r1, r0.y, c9 - mad r1, c8, r0.x, r1 - mad r1, c10, r0.z, r1 - mad r0, c11, r0.w, r1 - mad oPos.xy, r0.w, c0, r0 - mov oPos.zw, r0 - - // approximately 20 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[8], immediateIndexed - dcl_constantbuffer cb1[1], immediateIndexed - dcl_constantbuffer cb2[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mad r0.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mul r1.xyzw, r0.yyyy, cb0[5].xyzw - mad r0.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw - add r0.xyzw, r0.xyzw, cb0[7].xyzw - div r1.xyz, r0.xyzx, r0.wwww - mov r1.w, r0.w - add r0.xy, r0.xyxx, -cb0[2].xyxx - div o1.zw, r0.xxxy, cb0[2].zzzw - add r0.xyzw, r1.xyzw, -cb1[0].xyzw - mul r0.xyz, r0.wwww, r0.xyzx - mul r1.xyzw, r0.yyyy, cb2[1].xyzw - mad r1.xyzw, cb2[0].xyzw, r0.xxxx, r1.xyzw - mad r1.xyzw, cb2[2].xyzw, r0.zzzz, r1.xyzw - mad o0.xyzw, cb2[3].xyzw, r0.wwww, r1.xyzw - mad o1.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - ret - // Approximately 16 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer PerOccasionalLayer - // { - // - // float4 vRenderTargetOffset; // Offset: 0 Size: 16 [unused] - // float4 fLayerColor; // Offset: 16 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // LayerTextureSamplerLinear sampler NA NA 0 1 - // tMask texture float4 2d 0 1 - // PerOccasionalLayer cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 1 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - mov r0.xy, t0.wzzw - texld r0, r0, s0 - mul r0, r0.w, c0 - mov oC0, r0 - - // approximately 4 instruction slots used (1 texture, 3 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[2], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 1 - sample r0.xyzw, v1.zwzz, t0.xyzw, s0 - mul o0.xyzw, r0.wwww, cb0[1].xyzw - ret - // Approximately 3 instruction slots used - - }; - } - -} - -#endif - -const BYTE g_main[] = -{ - 68, 88, 66, 67, 173, 229, - 104, 135, 246, 30, 133, 190, - 80, 1, 18, 239, 172, 11, - 34, 194, 1, 0, 0, 0, - 107, 43, 1, 0, 1, 0, - 0, 0, 36, 0, 0, 0, - 70, 88, 49, 48, 63, 43, - 1, 0, 1, 16, 255, 254, - 3, 0, 0, 0, 8, 0, - 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 21, 0, 0, 0, 3, 27, - 1, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, - 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 102, 108, 111, 97, 116, - 52, 0, 13, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 10, 33, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 118, 76, 97, - 121, 101, 114, 81, 117, 97, - 100, 0, 118, 77, 97, 115, - 107, 81, 117, 97, 100, 0, - 102, 108, 111, 97, 116, 0, - 84, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 16, 0, - 0, 0, 4, 0, 0, 0, - 9, 9, 0, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 102, 108, 111, 97, 116, 52, - 120, 52, 0, 132, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 11, 100, 0, - 0, 109, 76, 97, 121, 101, - 114, 84, 114, 97, 110, 115, - 102, 111, 114, 109, 0, 80, - 101, 114, 79, 99, 99, 97, - 115, 105, 111, 110, 97, 108, - 76, 97, 121, 101, 114, 0, - 118, 82, 101, 110, 100, 101, - 114, 84, 97, 114, 103, 101, - 116, 79, 102, 102, 115, 101, - 116, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 109, 80, 114, 111, 106, 101, - 99, 116, 105, 111, 110, 0, - 66, 108, 101, 110, 100, 83, - 116, 97, 116, 101, 0, 8, - 1, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 80, 114, 101, - 109, 117, 108, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 78, 111, - 110, 80, 114, 101, 109, 117, - 108, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 6, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 78, 111, 66, 108, - 101, 110, 100, 68, 117, 97, - 108, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 15, 0, - 0, 0, 67, 111, 109, 112, - 111, 110, 101, 110, 116, 65, - 108, 112, 104, 97, 66, 108, - 101, 110, 100, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 17, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 15, 0, 0, 0, 82, 97, - 115, 116, 101, 114, 105, 122, - 101, 114, 83, 116, 97, 116, - 101, 0, 224, 2, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 76, 97, 121, 101, 114, 82, - 97, 115, 116, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 84, 101, - 120, 116, 117, 114, 101, 50, - 68, 0, 46, 3, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, - 116, 82, 71, 66, 0, 116, - 89, 0, 116, 67, 98, 0, - 116, 67, 114, 0, 116, 82, - 71, 66, 87, 104, 105, 116, - 101, 0, 116, 77, 97, 115, - 107, 0, 83, 97, 109, 112, - 108, 101, 114, 83, 116, 97, - 116, 101, 0, 116, 3, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 21, 0, 0, - 0, 76, 97, 121, 101, 114, - 84, 101, 120, 116, 117, 114, - 101, 83, 97, 109, 112, 108, - 101, 114, 76, 105, 110, 101, - 97, 114, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 21, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 3, - 0, 0, 0, 76, 97, 121, - 101, 114, 84, 101, 120, 116, - 117, 114, 101, 83, 97, 109, - 112, 108, 101, 114, 80, 111, - 105, 110, 116, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 82, 101, - 110, 100, 101, 114, 82, 71, - 66, 76, 97, 121, 101, 114, - 80, 114, 101, 109, 117, 108, - 0, 80, 48, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 255, 255, 255, 255, 136, 7, - 0, 0, 68, 88, 66, 67, - 134, 58, 181, 81, 234, 180, - 23, 54, 140, 98, 159, 162, - 74, 150, 11, 172, 1, 0, - 0, 0, 136, 7, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 188, 1, 0, 0, - 228, 3, 0, 0, 96, 4, - 0, 0, 252, 6, 0, 0, - 48, 7, 0, 0, 65, 111, - 110, 57, 124, 1, 0, 0, - 124, 1, 0, 0, 0, 2, - 254, 255, 24, 1, 0, 0, - 100, 0, 0, 0, 5, 0, - 36, 0, 0, 0, 96, 0, - 0, 0, 96, 0, 0, 0, - 36, 0, 1, 0, 96, 0, - 0, 0, 0, 0, 2, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 2, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, - 5, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 254, 255, 31, 0, 0, 2, - 5, 0, 0, 128, 0, 0, - 15, 144, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, - 228, 144, 1, 0, 238, 160, - 1, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 2, 0, - 238, 160, 2, 0, 228, 160, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 4, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 15, 128, - 3, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 5, 0, 228, 160, 6, 0, - 0, 2, 1, 0, 1, 128, - 0, 0, 255, 128, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 228, 128, 1, 0, - 0, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 6, 0, 228, 161, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 8, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 7, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 9, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 10, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 32, 2, 0, 0, 64, 0, - 1, 0, 136, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 104, 0, - 0, 2, 2, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 128, 65, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 13, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 148, 2, - 0, 0, 3, 0, 0, 0, - 168, 0, 0, 0, 3, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 254, 255, 0, 1, - 0, 0, 96, 2, 0, 0, - 124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 77, 97, 110, 97, 103, 101, - 114, 0, 124, 0, 0, 0, - 5, 0, 0, 0, 240, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 2, 0, 0, 0, 220, 1, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 1, 0, 0, 0, 60, 2, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 104, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 147, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 157, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 172, 1, 0, 0, 0, 0, - 0, 0, 188, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 2, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 48, 2, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 118, 82, - 101, 110, 100, 101, 114, 84, - 97, 114, 103, 101, 116, 79, - 102, 102, 115, 101, 116, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 76, - 97, 121, 101, 114, 67, 111, - 108, 111, 114, 0, 84, 2, - 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 109, 80, - 114, 111, 106, 101, 99, 116, - 105, 111, 110, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, - 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 80, 0, - 0, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 96, 4, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 116, 4, 0, 0, 68, 88, - 66, 67, 139, 125, 209, 68, - 164, 105, 119, 76, 10, 245, - 168, 227, 98, 190, 98, 86, - 1, 0, 0, 0, 116, 4, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 204, 0, - 0, 0, 136, 1, 0, 0, - 4, 2, 0, 0, 232, 3, - 0, 0, 64, 4, 0, 0, - 65, 111, 110, 57, 140, 0, - 0, 0, 140, 0, 0, 0, - 0, 2, 255, 255, 88, 0, - 0, 0, 52, 0, 0, 0, - 1, 0, 40, 0, 0, 0, - 52, 0, 0, 0, 52, 0, - 1, 0, 36, 0, 0, 0, - 52, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 176, 0, 8, - 228, 160, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 228, 128, 0, 0, 0, 160, - 1, 0, 0, 2, 0, 0, - 8, 128, 0, 0, 0, 160, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 180, 0, 0, 0, - 64, 0, 0, 0, 45, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, - 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 98, 16, - 0, 3, 50, 16, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 69, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 1, 0, - 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 114, 32, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 6, 128, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 54, 0, 0, 6, - 130, 32, 16, 0, 0, 0, - 0, 0, 10, 128, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 220, 1, 0, 0, - 1, 0, 0, 0, 164, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 168, 1, 0, 0, 124, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 150, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 76, 97, - 121, 101, 114, 84, 101, 120, - 116, 117, 114, 101, 83, 97, - 109, 112, 108, 101, 114, 76, - 105, 110, 101, 97, 114, 0, - 116, 82, 71, 66, 0, 80, - 101, 114, 76, 97, 121, 101, - 114, 0, 155, 0, 0, 0, - 5, 0, 0, 0, 188, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 52, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 84, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 95, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 105, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 152, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 80, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 56, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 68, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 0, 12, - 0, 0, 0, 0, 0, 0, - 82, 101, 110, 100, 101, 114, - 82, 71, 66, 76, 97, 121, - 101, 114, 80, 114, 101, 109, - 117, 108, 80, 111, 105, 110, - 116, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 255, 255, - 255, 255, 136, 7, 0, 0, - 68, 88, 66, 67, 134, 58, - 181, 81, 234, 180, 23, 54, - 140, 98, 159, 162, 74, 150, - 11, 172, 1, 0, 0, 0, - 136, 7, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 188, 1, 0, 0, 228, 3, - 0, 0, 96, 4, 0, 0, - 252, 6, 0, 0, 48, 7, - 0, 0, 65, 111, 110, 57, - 124, 1, 0, 0, 124, 1, - 0, 0, 0, 2, 254, 255, - 24, 1, 0, 0, 100, 0, - 0, 0, 5, 0, 36, 0, - 0, 0, 96, 0, 0, 0, - 96, 0, 0, 0, 36, 0, - 1, 0, 96, 0, 0, 0, - 0, 0, 2, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 2, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 7, 0, 1, 0, 5, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 6, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 254, 255, - 31, 0, 0, 2, 5, 0, - 0, 128, 0, 0, 15, 144, - 4, 0, 0, 4, 0, 0, - 3, 224, 0, 0, 228, 144, - 1, 0, 238, 160, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 3, 128, 0, 0, - 228, 144, 2, 0, 238, 160, - 2, 0, 228, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 4, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 3, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 5, 0, - 228, 160, 6, 0, 0, 2, - 1, 0, 1, 128, 0, 0, - 255, 128, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 228, 128, 1, 0, 0, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 6, 0, 228, 161, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 255, 128, 0, 0, - 228, 128, 5, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 85, 128, 8, 0, 228, 160, - 4, 0, 0, 4, 1, 0, - 15, 128, 7, 0, 228, 160, - 0, 0, 0, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 1, 0, 15, 128, 9, 0, - 228, 160, 0, 0, 170, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 255, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 3, 192, 0, 0, 255, 128, - 0, 0, 228, 160, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 12, 192, 0, 0, - 228, 128, 255, 255, 0, 0, - 83, 72, 68, 82, 32, 2, - 0, 0, 64, 0, 1, 0, - 136, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 95, 0, - 0, 3, 50, 16, 16, 0, - 0, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 50, 32, 16, 0, 1, 0, - 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 50, 0, - 0, 11, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 70, 128, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 14, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 128, - 65, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 13, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, - 3, 0, 0, 0, 168, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 79, 99, - 99, 97, 115, 105, 111, 110, - 97, 108, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 124, 0, 0, 0, 5, 0, - 0, 0, 240, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 2, 0, - 0, 0, 220, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 1, 0, - 0, 0, 60, 2, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 104, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 147, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 172, 1, - 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 48, 2, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 84, 2, 0, 0, - 0, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 109, 80, 114, 111, - 106, 101, 99, 116, 105, 111, - 110, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, - 71, 78, 80, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 202, 16, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 116, 4, - 0, 0, 68, 88, 66, 67, - 168, 126, 222, 160, 23, 76, - 232, 98, 152, 133, 227, 163, - 37, 248, 175, 170, 1, 0, - 0, 0, 116, 4, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 204, 0, 0, 0, - 136, 1, 0, 0, 4, 2, - 0, 0, 232, 3, 0, 0, - 64, 4, 0, 0, 65, 111, - 110, 57, 140, 0, 0, 0, - 140, 0, 0, 0, 0, 2, - 255, 255, 88, 0, 0, 0, - 52, 0, 0, 0, 1, 0, - 40, 0, 0, 0, 52, 0, - 0, 0, 52, 0, 1, 0, - 36, 0, 0, 0, 52, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 3, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 128, - 0, 0, 0, 160, 1, 0, - 0, 2, 0, 0, 8, 128, - 0, 0, 0, 160, 1, 0, - 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 180, 0, 0, 0, 64, 0, - 0, 0, 45, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 0, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, - 1, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 114, 32, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 6, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 54, 0, 0, 6, 130, 32, - 16, 0, 0, 0, 0, 0, - 10, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 220, 1, 0, 0, 1, 0, - 0, 0, 164, 0, 0, 0, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 255, 255, - 0, 1, 0, 0, 168, 1, - 0, 0, 124, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 149, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 154, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 76, 97, 121, 101, - 114, 84, 101, 120, 116, 117, - 114, 101, 83, 97, 109, 112, - 108, 101, 114, 80, 111, 105, - 110, 116, 0, 116, 82, 71, - 66, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 171, - 154, 0, 0, 0, 5, 0, - 0, 0, 188, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 52, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 84, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 95, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 105, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 152, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 80, 0, - 0, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 106, 24, 0, 0, - 0, 0, 0, 0, 82, 101, - 110, 100, 101, 114, 82, 71, - 66, 65, 76, 97, 121, 101, - 114, 80, 114, 101, 109, 117, - 108, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 255, 255, - 255, 255, 136, 7, 0, 0, - 68, 88, 66, 67, 134, 58, - 181, 81, 234, 180, 23, 54, - 140, 98, 159, 162, 74, 150, - 11, 172, 1, 0, 0, 0, - 136, 7, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 188, 1, 0, 0, 228, 3, - 0, 0, 96, 4, 0, 0, - 252, 6, 0, 0, 48, 7, - 0, 0, 65, 111, 110, 57, - 124, 1, 0, 0, 124, 1, - 0, 0, 0, 2, 254, 255, - 24, 1, 0, 0, 100, 0, - 0, 0, 5, 0, 36, 0, - 0, 0, 96, 0, 0, 0, - 96, 0, 0, 0, 36, 0, - 1, 0, 96, 0, 0, 0, - 0, 0, 2, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 2, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 7, 0, 1, 0, 5, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 6, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 254, 255, - 31, 0, 0, 2, 5, 0, - 0, 128, 0, 0, 15, 144, - 4, 0, 0, 4, 0, 0, - 3, 224, 0, 0, 228, 144, - 1, 0, 238, 160, 1, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 3, 128, 0, 0, - 228, 144, 2, 0, 238, 160, - 2, 0, 228, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 4, 0, - 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 3, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 5, 0, - 228, 160, 6, 0, 0, 2, - 1, 0, 1, 128, 0, 0, - 255, 128, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 228, 128, 1, 0, 0, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 6, 0, 228, 161, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 255, 128, 0, 0, - 228, 128, 5, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 85, 128, 8, 0, 228, 160, - 4, 0, 0, 4, 1, 0, - 15, 128, 7, 0, 228, 160, - 0, 0, 0, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 1, 0, 15, 128, 9, 0, - 228, 160, 0, 0, 170, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 255, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 3, 192, 0, 0, 255, 128, - 0, 0, 228, 160, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 12, 192, 0, 0, - 228, 128, 255, 255, 0, 0, - 83, 72, 68, 82, 32, 2, - 0, 0, 64, 0, 1, 0, - 136, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 8, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 2, 0, 0, 0, - 4, 0, 0, 0, 95, 0, - 0, 3, 50, 16, 16, 0, - 0, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 50, 32, 16, 0, 1, 0, - 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 50, 0, - 0, 11, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 70, 128, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 5, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 0, 0, 0, 8, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 14, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 128, - 65, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 13, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, - 3, 0, 0, 0, 168, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 79, 99, - 99, 97, 115, 105, 111, 110, - 97, 108, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 124, 0, 0, 0, 5, 0, - 0, 0, 240, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 2, 0, - 0, 0, 220, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 1, 0, - 0, 0, 60, 2, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 104, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 147, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 172, 1, - 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 48, 2, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 84, 2, 0, 0, - 0, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 109, 80, 114, 111, - 106, 101, 99, 116, 105, 111, - 110, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, - 71, 78, 80, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 48, 29, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 80, 4, - 0, 0, 68, 88, 66, 67, - 197, 240, 201, 103, 219, 157, - 229, 76, 76, 196, 241, 175, - 193, 131, 135, 238, 1, 0, - 0, 0, 80, 4, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 192, 0, 0, 0, - 100, 1, 0, 0, 224, 1, - 0, 0, 196, 3, 0, 0, - 28, 4, 0, 0, 65, 111, - 110, 57, 128, 0, 0, 0, - 128, 0, 0, 0, 0, 2, - 255, 255, 76, 0, 0, 0, - 52, 0, 0, 0, 1, 0, - 40, 0, 0, 0, 52, 0, - 0, 0, 52, 0, 1, 0, - 36, 0, 0, 0, 52, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 3, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 5, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 0, 0, 0, 160, 1, 0, - 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 156, 0, 0, 0, 64, 0, - 0, 0, 39, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 0, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, - 1, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 6, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 220, 1, 0, 0, 1, 0, - 0, 0, 164, 0, 0, 0, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 255, 255, - 0, 1, 0, 0, 168, 1, - 0, 0, 124, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 150, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 155, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 76, 97, 121, 101, - 114, 84, 101, 120, 116, 117, - 114, 101, 83, 97, 109, 112, - 108, 101, 114, 76, 105, 110, - 101, 97, 114, 0, 116, 82, - 71, 66, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 155, 0, 0, 0, 5, 0, - 0, 0, 188, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 52, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 84, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 95, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 68, 1, - 0, 0, 0, 0, 0, 0, - 105, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 152, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 80, 0, - 0, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 208, 36, 0, 0, - 0, 0, 0, 0, 82, 101, - 110, 100, 101, 114, 82, 71, - 66, 65, 76, 97, 121, 101, - 114, 78, 111, 110, 80, 114, - 101, 109, 117, 108, 0, 4, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 255, 255, 255, 255, 136, - 7, 0, 0, 68, 88, 66, - 67, 134, 58, 181, 81, 234, - 180, 23, 54, 140, 98, 159, - 162, 74, 150, 11, 172, 1, - 0, 0, 0, 136, 7, 0, - 0, 6, 0, 0, 0, 56, - 0, 0, 0, 188, 1, 0, - 0, 228, 3, 0, 0, 96, - 4, 0, 0, 252, 6, 0, - 0, 48, 7, 0, 0, 65, - 111, 110, 57, 124, 1, 0, - 0, 124, 1, 0, 0, 0, - 2, 254, 255, 24, 1, 0, - 0, 100, 0, 0, 0, 5, - 0, 36, 0, 0, 0, 96, - 0, 0, 0, 96, 0, 0, - 0, 36, 0, 1, 0, 96, - 0, 0, 0, 0, 0, 2, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 2, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 1, - 0, 5, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 6, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 4, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 2, 254, 255, 31, 0, 0, - 2, 5, 0, 0, 128, 0, - 0, 15, 144, 4, 0, 0, - 4, 0, 0, 3, 224, 0, - 0, 228, 144, 1, 0, 238, - 160, 1, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 2, - 0, 238, 160, 2, 0, 228, - 160, 5, 0, 0, 3, 1, - 0, 15, 128, 0, 0, 85, - 128, 4, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 15, - 128, 3, 0, 228, 160, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 5, 0, 228, 160, 6, - 0, 0, 2, 1, 0, 1, - 128, 0, 0, 255, 128, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 228, 128, 1, - 0, 0, 128, 2, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 6, 0, 228, - 161, 5, 0, 0, 3, 0, - 0, 7, 128, 0, 0, 255, - 128, 0, 0, 228, 128, 5, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 85, 128, 8, - 0, 228, 160, 4, 0, 0, - 4, 1, 0, 15, 128, 7, - 0, 228, 160, 0, 0, 0, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 1, 0, 15, - 128, 9, 0, 228, 160, 0, - 0, 170, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 15, 128, 10, 0, 228, - 160, 0, 0, 255, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 0, 0, 3, 192, 0, - 0, 255, 128, 0, 0, 228, - 160, 0, 0, 228, 128, 1, - 0, 0, 2, 0, 0, 12, - 192, 0, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 32, 2, 0, 0, 64, - 0, 1, 0, 136, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 2, - 0, 0, 0, 4, 0, 0, - 0, 95, 0, 0, 3, 50, - 16, 16, 0, 0, 0, 0, - 0, 103, 0, 0, 4, 242, - 32, 16, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 50, 32, 16, - 0, 1, 0, 0, 0, 104, - 0, 0, 2, 2, 0, 0, - 0, 50, 0, 0, 11, 50, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 0, 0, 0, - 8, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 14, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 128, 65, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, - 7, 114, 0, 16, 0, 0, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 2, 0, 0, - 0, 166, 10, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 32, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 3, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 1, - 0, 0, 0, 70, 16, 16, - 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 13, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 12, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 148, - 2, 0, 0, 3, 0, 0, - 0, 168, 0, 0, 0, 3, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 254, 255, 0, - 1, 0, 0, 96, 2, 0, - 0, 124, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 133, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 79, 99, 99, 97, 115, - 105, 111, 110, 97, 108, 76, - 97, 121, 101, 114, 0, 80, - 101, 114, 76, 97, 121, 101, - 114, 77, 97, 110, 97, 103, - 101, 114, 0, 124, 0, 0, - 0, 5, 0, 0, 0, 240, - 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 133, 0, 0, - 0, 2, 0, 0, 0, 220, - 1, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 152, 0, 0, - 0, 1, 0, 0, 0, 60, - 2, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 104, 1, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 136, 1, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 147, 1, 0, - 0, 32, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 157, 1, 0, - 0, 48, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 172, 1, 0, 0, 0, - 0, 0, 0, 188, 1, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 2, 0, 0, - 0, 204, 1, 0, 0, 0, - 0, 0, 0, 118, 84, 101, - 120, 116, 117, 114, 101, 67, - 111, 111, 114, 100, 115, 0, - 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, - 76, 97, 121, 101, 114, 81, - 117, 97, 100, 0, 118, 77, - 97, 115, 107, 81, 117, 97, - 100, 0, 102, 76, 97, 121, - 101, 114, 79, 112, 97, 99, - 105, 116, 121, 0, 171, 0, - 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 76, 97, - 121, 101, 114, 84, 114, 97, - 110, 115, 102, 111, 114, 109, - 0, 3, 0, 3, 0, 4, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, - 2, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 32, 2, 0, - 0, 0, 0, 0, 0, 48, - 2, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 32, 2, 0, - 0, 0, 0, 0, 0, 118, - 82, 101, 110, 100, 101, 114, - 84, 97, 114, 103, 101, 116, - 79, 102, 102, 115, 101, 116, - 0, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, - 76, 97, 121, 101, 114, 67, - 111, 108, 111, 114, 0, 84, - 2, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 109, - 80, 114, 111, 106, 101, 99, - 116, 105, 111, 110, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 3, 3, 0, - 0, 80, 79, 83, 73, 84, - 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 12, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 117, - 41, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 80, 4, 0, 0, 68, - 88, 66, 67, 197, 240, 201, - 103, 219, 157, 229, 76, 76, - 196, 241, 175, 193, 131, 135, - 238, 1, 0, 0, 0, 80, - 4, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 192, - 0, 0, 0, 100, 1, 0, - 0, 224, 1, 0, 0, 196, - 3, 0, 0, 28, 4, 0, - 0, 65, 111, 110, 57, 128, - 0, 0, 0, 128, 0, 0, - 0, 0, 2, 255, 255, 76, - 0, 0, 0, 52, 0, 0, - 0, 1, 0, 40, 0, 0, - 0, 52, 0, 0, 0, 52, - 0, 1, 0, 36, 0, 0, - 0, 52, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 31, - 0, 0, 2, 0, 0, 0, - 128, 0, 0, 3, 176, 31, - 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 66, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 228, 176, 0, - 8, 228, 160, 5, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 0, 0, 0, - 160, 1, 0, 0, 2, 0, - 8, 15, 128, 0, 0, 228, - 128, 255, 255, 0, 0, 83, - 72, 68, 82, 156, 0, 0, - 0, 64, 0, 0, 0, 39, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 0, - 0, 0, 0, 4, 0, 0, - 0, 90, 0, 0, 3, 0, - 96, 16, 0, 0, 0, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 0, 0, 0, - 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 104, - 0, 0, 2, 1, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 6, 128, 32, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 220, 1, 0, - 0, 1, 0, 0, 0, 164, - 0, 0, 0, 3, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 255, 255, 0, 1, 0, - 0, 168, 1, 0, 0, 124, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 150, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 155, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 76, - 97, 121, 101, 114, 84, 101, - 120, 116, 117, 114, 101, 83, - 97, 109, 112, 108, 101, 114, - 76, 105, 110, 101, 97, 114, - 0, 116, 82, 71, 66, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 155, 0, 0, - 0, 5, 0, 0, 0, 188, - 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 52, 1, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 68, 1, 0, 0, 0, - 0, 0, 0, 84, 1, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 68, 1, 0, 0, 0, - 0, 0, 0, 95, 1, 0, - 0, 32, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 68, 1, 0, 0, 0, - 0, 0, 0, 105, 1, 0, - 0, 48, 0, 0, 0, 4, - 0, 0, 0, 2, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 136, 1, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 152, 1, 0, 0, 0, - 0, 0, 0, 118, 84, 101, - 120, 116, 117, 114, 101, 67, - 111, 111, 114, 100, 115, 0, - 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, - 76, 97, 121, 101, 114, 81, - 117, 97, 100, 0, 118, 77, - 97, 115, 107, 81, 117, 97, - 100, 0, 102, 76, 97, 121, - 101, 114, 79, 112, 97, 99, - 105, 116, 121, 0, 171, 0, - 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 76, 97, - 121, 101, 114, 84, 114, 97, - 110, 115, 102, 111, 114, 109, - 0, 3, 0, 3, 0, 4, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 80, 0, 0, 0, 2, - 0, 0, 0, 8, 0, 0, - 0, 56, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 21, - 49, 0, 0, 0, 0, 0, - 0, 82, 101, 110, 100, 101, - 114, 82, 71, 66, 65, 76, - 97, 121, 101, 114, 80, 114, - 101, 109, 117, 108, 80, 111, - 105, 110, 116, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 255, 255, 255, 255, 136, 7, - 0, 0, 68, 88, 66, 67, - 134, 58, 181, 81, 234, 180, - 23, 54, 140, 98, 159, 162, - 74, 150, 11, 172, 1, 0, - 0, 0, 136, 7, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 188, 1, 0, 0, - 228, 3, 0, 0, 96, 4, - 0, 0, 252, 6, 0, 0, - 48, 7, 0, 0, 65, 111, - 110, 57, 124, 1, 0, 0, - 124, 1, 0, 0, 0, 2, - 254, 255, 24, 1, 0, 0, - 100, 0, 0, 0, 5, 0, - 36, 0, 0, 0, 96, 0, - 0, 0, 96, 0, 0, 0, - 36, 0, 1, 0, 96, 0, - 0, 0, 0, 0, 2, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 2, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, - 5, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 254, 255, 31, 0, 0, 2, - 5, 0, 0, 128, 0, 0, - 15, 144, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, - 228, 144, 1, 0, 238, 160, - 1, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 2, 0, - 238, 160, 2, 0, 228, 160, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 4, 0, 228, 160, 4, 0, - 0, 4, 0, 0, 15, 128, - 3, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 5, 0, 228, 160, 6, 0, - 0, 2, 1, 0, 1, 128, - 0, 0, 255, 128, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 228, 128, 1, 0, - 0, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 6, 0, 228, 161, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 8, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 7, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 9, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 10, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 32, 2, 0, 0, 64, 0, - 1, 0, 136, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 104, 0, - 0, 2, 2, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 128, 65, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 13, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 148, 2, - 0, 0, 3, 0, 0, 0, - 168, 0, 0, 0, 3, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 254, 255, 0, 1, - 0, 0, 96, 2, 0, 0, - 124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 77, 97, 110, 97, 103, 101, - 114, 0, 124, 0, 0, 0, - 5, 0, 0, 0, 240, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 2, 0, 0, 0, 220, 1, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 1, 0, 0, 0, 60, 2, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 104, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 147, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 157, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 172, 1, 0, 0, 0, 0, - 0, 0, 188, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 2, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 48, 2, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 118, 82, - 101, 110, 100, 101, 114, 84, - 97, 114, 103, 101, 116, 79, - 102, 102, 115, 101, 116, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 76, - 97, 121, 101, 114, 67, 111, - 108, 111, 114, 0, 84, 2, - 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 109, 80, - 114, 111, 106, 101, 99, 116, - 105, 111, 110, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, - 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 80, 0, - 0, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 188, 53, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 80, 4, 0, 0, 68, 88, - 66, 67, 151, 150, 8, 20, - 71, 31, 33, 136, 86, 87, - 200, 101, 153, 133, 218, 4, - 1, 0, 0, 0, 80, 4, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 192, 0, - 0, 0, 100, 1, 0, 0, - 224, 1, 0, 0, 196, 3, - 0, 0, 28, 4, 0, 0, - 65, 111, 110, 57, 128, 0, - 0, 0, 128, 0, 0, 0, - 0, 2, 255, 255, 76, 0, - 0, 0, 52, 0, 0, 0, - 1, 0, 40, 0, 0, 0, - 52, 0, 0, 0, 52, 0, - 1, 0, 36, 0, 0, 0, - 52, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 176, 0, 8, - 228, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 0, 0, 0, 160, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 156, 0, 0, 0, - 64, 0, 0, 0, 39, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, - 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 98, 16, - 0, 3, 50, 16, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 104, 0, - 0, 2, 1, 0, 0, 0, - 69, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 1, 0, - 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 6, 128, 32, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 220, 1, 0, 0, - 1, 0, 0, 0, 164, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 168, 1, 0, 0, 124, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 149, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 154, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 76, 97, - 121, 101, 114, 84, 101, 120, - 116, 117, 114, 101, 83, 97, - 109, 112, 108, 101, 114, 80, - 111, 105, 110, 116, 0, 116, - 82, 71, 66, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 171, 154, 0, 0, 0, - 5, 0, 0, 0, 188, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 52, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 84, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 95, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 68, 1, 0, 0, 0, 0, - 0, 0, 105, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 152, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 80, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 56, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 68, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 92, 61, - 0, 0, 0, 0, 0, 0, - 82, 101, 110, 100, 101, 114, - 82, 71, 66, 65, 76, 97, - 121, 101, 114, 78, 111, 110, - 80, 114, 101, 109, 117, 108, - 80, 111, 105, 110, 116, 0, - 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 255, 255, 255, 255, - 136, 7, 0, 0, 68, 88, - 66, 67, 134, 58, 181, 81, - 234, 180, 23, 54, 140, 98, - 159, 162, 74, 150, 11, 172, - 1, 0, 0, 0, 136, 7, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 188, 1, - 0, 0, 228, 3, 0, 0, - 96, 4, 0, 0, 252, 6, - 0, 0, 48, 7, 0, 0, - 65, 111, 110, 57, 124, 1, - 0, 0, 124, 1, 0, 0, - 0, 2, 254, 255, 24, 1, - 0, 0, 100, 0, 0, 0, - 5, 0, 36, 0, 0, 0, - 96, 0, 0, 0, 96, 0, - 0, 0, 36, 0, 1, 0, - 96, 0, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 2, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 1, 0, 5, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 6, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 31, 0, - 0, 2, 5, 0, 0, 128, - 0, 0, 15, 144, 4, 0, - 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 3, 128, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, - 228, 160, 5, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 85, 128, 4, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 0, 128, 1, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 5, 0, 228, 160, - 6, 0, 0, 2, 1, 0, - 1, 128, 0, 0, 255, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 128, - 1, 0, 0, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 6, 0, - 228, 161, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 8, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 7, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 15, 128, 9, 0, 228, 160, - 0, 0, 170, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 10, 0, - 228, 160, 0, 0, 255, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 3, 192, - 0, 0, 255, 128, 0, 0, - 228, 160, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 12, 192, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 32, 2, 0, 0, - 64, 0, 1, 0, 136, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 95, 0, 0, 3, - 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 50, 32, - 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 50, 0, 0, 11, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 14, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 0, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 128, 65, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 11, 50, 32, 16, 0, - 1, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 13, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 148, 2, 0, 0, 3, 0, - 0, 0, 168, 0, 0, 0, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, - 0, 1, 0, 0, 96, 2, - 0, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 80, - 101, 114, 79, 99, 99, 97, - 115, 105, 111, 110, 97, 108, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 77, 97, 110, 97, - 103, 101, 114, 0, 124, 0, - 0, 0, 5, 0, 0, 0, - 240, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 2, 0, 0, 0, - 220, 1, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 1, 0, 0, 0, - 60, 2, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 104, 1, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 136, 1, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 147, 1, - 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 157, 1, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 172, 1, 0, 0, - 0, 0, 0, 0, 188, 1, - 0, 0, 64, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 118, 84, - 101, 120, 116, 117, 114, 101, - 67, 111, 111, 114, 100, 115, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 118, 76, 97, 121, 101, 114, - 81, 117, 97, 100, 0, 118, - 77, 97, 115, 107, 81, 117, - 97, 100, 0, 102, 76, 97, - 121, 101, 114, 79, 112, 97, - 99, 105, 116, 121, 0, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 76, - 97, 121, 101, 114, 84, 114, - 97, 110, 115, 102, 111, 114, - 109, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 12, 2, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 48, 2, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 118, 82, 101, 110, 100, 101, - 114, 84, 97, 114, 103, 101, - 116, 79, 102, 102, 115, 101, - 116, 0, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 102, 76, 97, 121, 101, 114, - 67, 111, 108, 111, 114, 0, - 84, 2, 0, 0, 0, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 109, 80, 114, 111, 106, 101, - 99, 116, 105, 111, 110, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, - 52, 0, 171, 171, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 3, 3, - 0, 0, 80, 79, 83, 73, - 84, 73, 79, 78, 0, 171, - 171, 171, 79, 83, 71, 78, - 80, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 56, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 68, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 12, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 6, 66, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 80, 4, 0, 0, - 68, 88, 66, 67, 151, 150, - 8, 20, 71, 31, 33, 136, - 86, 87, 200, 101, 153, 133, - 218, 4, 1, 0, 0, 0, - 80, 4, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 192, 0, 0, 0, 100, 1, - 0, 0, 224, 1, 0, 0, - 196, 3, 0, 0, 28, 4, - 0, 0, 65, 111, 110, 57, - 128, 0, 0, 0, 128, 0, - 0, 0, 0, 2, 255, 255, - 76, 0, 0, 0, 52, 0, - 0, 0, 1, 0, 40, 0, - 0, 0, 52, 0, 0, 0, - 52, 0, 1, 0, 36, 0, - 0, 0, 52, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 255, 255, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 3, 176, - 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, - 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 176, - 0, 8, 228, 160, 5, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 0, 0, - 0, 160, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, - 228, 128, 255, 255, 0, 0, - 83, 72, 68, 82, 156, 0, - 0, 0, 64, 0, 0, 0, - 39, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 90, 0, 0, 3, - 0, 96, 16, 0, 0, 0, - 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 0, 0, - 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 1, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, - 0, 0, 56, 0, 0, 8, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 220, 1, - 0, 0, 1, 0, 0, 0, - 164, 0, 0, 0, 3, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 255, 255, 0, 1, - 0, 0, 168, 1, 0, 0, - 124, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 149, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 154, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 76, 97, 121, 101, 114, 84, - 101, 120, 116, 117, 114, 101, - 83, 97, 109, 112, 108, 101, - 114, 80, 111, 105, 110, 116, - 0, 116, 82, 71, 66, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 171, 154, 0, - 0, 0, 5, 0, 0, 0, - 188, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 52, 1, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 68, 1, 0, 0, - 0, 0, 0, 0, 84, 1, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 68, 1, 0, 0, - 0, 0, 0, 0, 95, 1, - 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 68, 1, 0, 0, - 0, 0, 0, 0, 105, 1, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 136, 1, - 0, 0, 64, 0, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 152, 1, 0, 0, - 0, 0, 0, 0, 118, 84, - 101, 120, 116, 117, 114, 101, - 67, 111, 111, 114, 100, 115, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 118, 76, 97, 121, 101, 114, - 81, 117, 97, 100, 0, 118, - 77, 97, 115, 107, 81, 117, - 97, 100, 0, 102, 76, 97, - 121, 101, 114, 79, 112, 97, - 99, 105, 116, 121, 0, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 76, - 97, 121, 101, 114, 84, 114, - 97, 110, 115, 102, 111, 114, - 109, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, - 52, 0, 171, 171, 73, 83, - 71, 78, 80, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 3, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 79, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 83, 86, 95, 84, 97, 114, - 103, 101, 116, 0, 171, 171, - 166, 73, 0, 0, 0, 0, - 0, 0, 82, 101, 110, 100, - 101, 114, 89, 67, 98, 67, - 114, 76, 97, 121, 101, 114, - 0, 4, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 255, 255, 255, - 255, 136, 7, 0, 0, 68, - 88, 66, 67, 134, 58, 181, - 81, 234, 180, 23, 54, 140, - 98, 159, 162, 74, 150, 11, - 172, 1, 0, 0, 0, 136, - 7, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 188, - 1, 0, 0, 228, 3, 0, - 0, 96, 4, 0, 0, 252, - 6, 0, 0, 48, 7, 0, - 0, 65, 111, 110, 57, 124, - 1, 0, 0, 124, 1, 0, - 0, 0, 2, 254, 255, 24, - 1, 0, 0, 100, 0, 0, - 0, 5, 0, 36, 0, 0, - 0, 96, 0, 0, 0, 96, - 0, 0, 0, 36, 0, 1, - 0, 96, 0, 0, 0, 0, - 0, 2, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 4, - 0, 2, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 1, 0, 5, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 1, 0, 6, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 4, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 2, 254, 255, 31, - 0, 0, 2, 5, 0, 0, - 128, 0, 0, 15, 144, 4, - 0, 0, 4, 0, 0, 3, - 224, 0, 0, 228, 144, 1, - 0, 238, 160, 1, 0, 228, - 160, 4, 0, 0, 4, 0, - 0, 3, 128, 0, 0, 228, - 144, 2, 0, 238, 160, 2, - 0, 228, 160, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 4, 0, 228, - 160, 4, 0, 0, 4, 0, - 0, 15, 128, 3, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 2, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 5, 0, 228, - 160, 6, 0, 0, 2, 1, - 0, 1, 128, 0, 0, 255, - 128, 5, 0, 0, 3, 0, - 0, 7, 128, 0, 0, 228, - 128, 1, 0, 0, 128, 2, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 228, 128, 6, - 0, 228, 161, 5, 0, 0, - 3, 0, 0, 7, 128, 0, - 0, 255, 128, 0, 0, 228, - 128, 5, 0, 0, 3, 1, - 0, 15, 128, 0, 0, 85, - 128, 8, 0, 228, 160, 4, - 0, 0, 4, 1, 0, 15, - 128, 7, 0, 228, 160, 0, - 0, 0, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 1, - 0, 15, 128, 9, 0, 228, - 160, 0, 0, 170, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 0, 0, 15, 128, 10, - 0, 228, 160, 0, 0, 255, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 3, - 192, 0, 0, 255, 128, 0, - 0, 228, 160, 0, 0, 228, - 128, 1, 0, 0, 2, 0, - 0, 12, 192, 0, 0, 228, - 128, 255, 255, 0, 0, 83, - 72, 68, 82, 32, 2, 0, - 0, 64, 0, 1, 0, 136, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 0, - 0, 0, 0, 8, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 2, 0, 0, 0, 4, - 0, 0, 0, 95, 0, 0, - 3, 50, 16, 16, 0, 0, - 0, 0, 0, 103, 0, 0, - 4, 242, 32, 16, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 101, 0, 0, 3, 50, - 32, 16, 0, 1, 0, 0, - 0, 104, 0, 0, 2, 2, - 0, 0, 0, 50, 0, 0, - 11, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 16, 16, - 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 56, - 0, 0, 8, 242, 0, 16, - 0, 1, 0, 0, 0, 86, - 5, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 0, - 0, 0, 0, 5, 0, 0, - 0, 50, 0, 0, 10, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 0, - 0, 0, 0, 4, 0, 0, - 0, 6, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 0, - 0, 0, 8, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 14, 0, 0, 7, 114, - 0, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 128, 65, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 2, - 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 3, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 13, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 12, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 148, 2, 0, 0, 3, - 0, 0, 0, 168, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 96, - 2, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 77, 97, 110, - 97, 103, 101, 114, 0, 124, - 0, 0, 0, 5, 0, 0, - 0, 240, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 2, 0, 0, - 0, 220, 1, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 136, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 147, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 157, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 172, 1, 0, - 0, 0, 0, 0, 0, 188, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 118, 82, 101, 110, 100, - 101, 114, 84, 97, 114, 103, - 101, 116, 79, 102, 102, 115, - 101, 116, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 102, 76, 97, 121, 101, - 114, 67, 111, 108, 111, 114, - 0, 84, 2, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 109, 80, 114, 111, 106, - 101, 99, 116, 105, 111, 110, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, - 78, 80, 0, 0, 0, 2, - 0, 0, 0, 8, 0, 0, - 0, 56, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 67, 78, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 96, 7, 0, - 0, 68, 88, 66, 67, 1, - 118, 228, 119, 234, 238, 25, - 215, 211, 69, 59, 5, 242, - 177, 6, 183, 1, 0, 0, - 0, 96, 7, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 220, 1, 0, 0, 44, - 4, 0, 0, 168, 4, 0, - 0, 212, 6, 0, 0, 44, - 7, 0, 0, 65, 111, 110, - 57, 156, 1, 0, 0, 156, - 1, 0, 0, 0, 2, 255, - 255, 96, 1, 0, 0, 60, - 0, 0, 0, 1, 0, 48, - 0, 0, 0, 60, 0, 0, - 0, 60, 0, 3, 0, 36, - 0, 0, 0, 60, 0, 0, - 0, 0, 0, 1, 0, 1, - 0, 2, 0, 2, 0, 0, - 0, 3, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 2, 255, 255, 81, 0, 0, - 5, 1, 0, 15, 160, 115, - 128, 0, 191, 18, 131, 128, - 189, 182, 74, 204, 63, 205, - 30, 80, 63, 81, 0, 0, - 5, 2, 0, 15, 160, 103, - 10, 149, 63, 76, 26, 1, - 64, 196, 148, 200, 62, 0, - 0, 128, 63, 31, 0, 0, - 2, 0, 0, 0, 128, 0, - 0, 3, 176, 31, 0, 0, - 2, 0, 0, 0, 144, 0, - 8, 15, 160, 31, 0, 0, - 2, 0, 0, 0, 144, 1, - 8, 15, 160, 31, 0, 0, - 2, 0, 0, 0, 144, 2, - 8, 15, 160, 66, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 176, 0, 8, 228, - 160, 66, 0, 0, 3, 1, - 0, 15, 128, 0, 0, 228, - 176, 2, 8, 228, 160, 2, - 0, 0, 3, 0, 0, 1, - 128, 1, 0, 255, 128, 1, - 0, 0, 160, 5, 0, 0, - 3, 0, 0, 3, 128, 0, - 0, 0, 128, 1, 0, 238, - 160, 2, 0, 0, 3, 0, - 0, 4, 128, 0, 0, 255, - 128, 1, 0, 85, 160, 4, - 0, 0, 4, 0, 0, 2, - 128, 0, 0, 170, 128, 2, - 0, 0, 160, 0, 0, 85, - 129, 4, 0, 0, 4, 1, - 0, 1, 128, 0, 0, 170, - 128, 2, 0, 0, 160, 0, - 0, 0, 128, 66, 0, 0, - 3, 2, 0, 15, 128, 0, - 0, 228, 176, 1, 8, 228, - 160, 2, 0, 0, 3, 0, - 0, 1, 128, 2, 0, 255, - 128, 1, 0, 0, 160, 4, - 0, 0, 4, 1, 0, 2, - 128, 0, 0, 0, 128, 2, - 0, 170, 161, 0, 0, 85, - 128, 5, 0, 0, 3, 0, - 0, 1, 128, 0, 0, 0, - 128, 2, 0, 85, 160, 4, - 0, 0, 4, 1, 0, 4, - 128, 0, 0, 170, 128, 2, - 0, 0, 160, 0, 0, 0, - 128, 1, 0, 0, 2, 1, - 0, 8, 128, 2, 0, 255, - 160, 5, 0, 0, 3, 0, - 0, 15, 128, 1, 0, 228, - 128, 0, 0, 0, 160, 1, - 0, 0, 2, 0, 8, 15, - 128, 0, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 72, 2, 0, 0, 64, - 0, 0, 0, 146, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, - 85, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 1, - 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 2, 0, 0, - 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 104, - 0, 0, 2, 3, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 2, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 0, - 0, 0, 0, 1, 64, 0, - 0, 115, 128, 0, 191, 56, - 0, 0, 10, 50, 0, 16, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 2, 64, 0, 0, 182, - 74, 204, 63, 205, 30, 80, - 63, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 16, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 7, 66, 0, 16, 0, 0, - 0, 0, 0, 58, 0, 16, - 0, 1, 0, 0, 0, 1, - 64, 0, 0, 18, 131, 128, - 189, 50, 0, 0, 10, 34, - 0, 16, 0, 0, 0, 0, - 0, 42, 0, 16, 0, 0, - 0, 0, 0, 1, 64, 0, - 0, 103, 10, 149, 63, 26, - 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 50, - 0, 0, 9, 18, 0, 16, - 0, 1, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 103, - 10, 149, 63, 10, 0, 16, - 0, 0, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, - 0, 2, 0, 0, 0, 70, - 16, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 1, - 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 7, 18, 0, 16, - 0, 0, 0, 0, 0, 58, - 0, 16, 0, 2, 0, 0, - 0, 1, 64, 0, 0, 115, - 128, 0, 191, 50, 0, 0, - 10, 34, 0, 16, 0, 1, - 0, 0, 0, 10, 0, 16, - 128, 65, 0, 0, 0, 0, - 0, 0, 0, 1, 64, 0, - 0, 196, 148, 200, 62, 26, - 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, - 0, 0, 0, 1, 64, 0, - 0, 76, 26, 1, 64, 50, - 0, 0, 9, 66, 0, 16, - 0, 1, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 103, - 10, 149, 63, 10, 0, 16, - 0, 0, 0, 0, 0, 54, - 0, 0, 5, 130, 0, 16, - 0, 1, 0, 0, 0, 1, - 64, 0, 0, 0, 0, 128, - 63, 56, 0, 0, 8, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 6, 128, 32, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 15, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 36, 2, 0, - 0, 1, 0, 0, 0, 236, - 0, 0, 0, 5, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 255, 255, 0, 1, 0, - 0, 240, 1, 0, 0, 188, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 214, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 217, 0, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 1, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 221, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 2, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 225, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 76, 97, 121, - 101, 114, 84, 101, 120, 116, - 117, 114, 101, 83, 97, 109, - 112, 108, 101, 114, 76, 105, - 110, 101, 97, 114, 0, 116, - 89, 0, 116, 67, 98, 0, - 116, 67, 114, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 171, 171, 225, 0, 0, - 0, 5, 0, 0, 0, 4, - 1, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 124, 1, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 140, 1, 0, 0, 0, - 0, 0, 0, 156, 1, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 140, 1, 0, 0, 0, - 0, 0, 0, 167, 1, 0, - 0, 32, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 140, 1, 0, 0, 0, - 0, 0, 0, 177, 1, 0, - 0, 48, 0, 0, 0, 4, - 0, 0, 0, 2, 0, 0, - 0, 192, 1, 0, 0, 0, - 0, 0, 0, 208, 1, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 224, 1, 0, 0, 0, - 0, 0, 0, 118, 84, 101, - 120, 116, 117, 114, 101, 67, - 111, 111, 114, 100, 115, 0, - 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, - 76, 97, 121, 101, 114, 81, - 117, 97, 100, 0, 118, 77, - 97, 115, 107, 81, 117, 97, - 100, 0, 102, 76, 97, 121, - 101, 114, 79, 112, 97, 99, - 105, 116, 121, 0, 171, 0, - 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 76, 97, - 121, 101, 114, 84, 114, 97, - 110, 115, 102, 111, 114, 109, - 0, 3, 0, 3, 0, 4, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 80, 0, 0, 0, 2, - 0, 0, 0, 8, 0, 0, - 0, 56, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 227, - 85, 0, 0, 0, 0, 0, - 0, 82, 101, 110, 100, 101, - 114, 67, 111, 109, 112, 111, - 110, 101, 110, 116, 65, 108, - 112, 104, 97, 76, 97, 121, - 101, 114, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 136, 7, 0, - 0, 68, 88, 66, 67, 134, - 58, 181, 81, 234, 180, 23, - 54, 140, 98, 159, 162, 74, - 150, 11, 172, 1, 0, 0, - 0, 136, 7, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 188, 1, 0, 0, 228, - 3, 0, 0, 96, 4, 0, - 0, 252, 6, 0, 0, 48, - 7, 0, 0, 65, 111, 110, - 57, 124, 1, 0, 0, 124, - 1, 0, 0, 0, 2, 254, - 255, 24, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 2, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 5, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 4, 0, 0, - 4, 0, 0, 3, 128, 0, - 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 5, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 85, 128, 4, - 0, 228, 160, 4, 0, 0, - 4, 0, 0, 15, 128, 3, - 0, 228, 160, 0, 0, 0, - 128, 1, 0, 228, 128, 2, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 228, 128, 5, - 0, 228, 160, 6, 0, 0, - 2, 1, 0, 1, 128, 0, - 0, 255, 128, 5, 0, 0, - 3, 0, 0, 7, 128, 0, - 0, 228, 128, 1, 0, 0, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 6, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 8, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 7, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 9, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 10, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 32, - 2, 0, 0, 64, 0, 1, - 0, 136, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 0, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 128, 65, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 114, - 0, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 56, - 0, 0, 8, 242, 0, 16, - 0, 1, 0, 0, 0, 86, - 5, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 6, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 2, 0, 0, 0, 166, - 10, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 3, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 11, 50, - 32, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 13, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 148, 2, 0, - 0, 3, 0, 0, 0, 168, - 0, 0, 0, 3, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 254, 255, 0, 1, 0, - 0, 96, 2, 0, 0, 124, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 133, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 152, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 80, - 101, 114, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 79, - 99, 99, 97, 115, 105, 111, - 110, 97, 108, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 77, - 97, 110, 97, 103, 101, 114, - 0, 124, 0, 0, 0, 5, - 0, 0, 0, 240, 0, 0, - 0, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 133, 0, 0, 0, 2, - 0, 0, 0, 220, 1, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 1, - 0, 0, 0, 60, 2, 0, - 0, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 104, 1, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 136, 1, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 147, 1, 0, 0, 32, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 157, 1, 0, 0, 48, - 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 172, - 1, 0, 0, 0, 0, 0, - 0, 188, 1, 0, 0, 64, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 118, 84, 101, 120, 116, - 117, 114, 101, 67, 111, 111, - 114, 100, 115, 0, 171, 1, - 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 76, 97, - 121, 101, 114, 81, 117, 97, - 100, 0, 118, 77, 97, 115, - 107, 81, 117, 97, 100, 0, - 102, 76, 97, 121, 101, 114, - 79, 112, 97, 99, 105, 116, - 121, 0, 171, 0, 0, 3, - 0, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 109, 76, 97, 121, 101, - 114, 84, 114, 97, 110, 115, - 102, 111, 114, 109, 0, 3, - 0, 3, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 2, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 32, 2, 0, 0, 0, - 0, 0, 0, 48, 2, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 32, 2, 0, 0, 0, - 0, 0, 0, 118, 82, 101, - 110, 100, 101, 114, 84, 97, - 114, 103, 101, 116, 79, 102, - 102, 115, 101, 116, 0, 1, - 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102, 76, 97, - 121, 101, 114, 67, 111, 108, - 111, 114, 0, 84, 2, 0, - 0, 0, 0, 0, 0, 64, - 0, 0, 0, 2, 0, 0, - 0, 204, 1, 0, 0, 0, - 0, 0, 0, 109, 80, 114, - 111, 106, 101, 99, 116, 105, - 111, 110, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 54, 46, 51, 46, - 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, - 171, 73, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 3, 3, 0, 0, 80, - 79, 83, 73, 84, 73, 79, - 78, 0, 171, 171, 171, 79, - 83, 71, 78, 80, 0, 0, - 0, 2, 0, 0, 0, 8, - 0, 0, 0, 56, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, - 12, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, - 171, 171, 171, 153, 93, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 208, - 5, 0, 0, 68, 88, 66, - 67, 221, 34, 215, 183, 71, - 137, 39, 113, 128, 157, 241, - 55, 153, 55, 174, 108, 1, - 0, 0, 0, 208, 5, 0, - 0, 6, 0, 0, 0, 56, - 0, 0, 0, 64, 1, 0, - 0, 160, 2, 0, 0, 28, - 3, 0, 0, 44, 5, 0, - 0, 132, 5, 0, 0, 65, - 111, 110, 57, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 2, 255, 255, 200, 0, 0, - 0, 56, 0, 0, 0, 1, - 0, 44, 0, 0, 0, 56, - 0, 0, 0, 56, 0, 2, - 0, 36, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 1, - 0, 1, 0, 0, 0, 3, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 255, - 255, 81, 0, 0, 5, 1, - 0, 15, 160, 0, 0, 128, - 63, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 31, 0, 0, 2, 0, - 0, 0, 128, 0, 0, 3, - 176, 31, 0, 0, 2, 0, - 0, 0, 144, 0, 8, 15, - 160, 31, 0, 0, 2, 0, - 0, 0, 144, 1, 8, 15, - 160, 66, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 176, 0, 8, 228, 160, 66, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 228, 176, 1, - 8, 228, 160, 2, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 228, 128, 1, 0, 228, - 129, 2, 0, 0, 3, 1, - 0, 15, 128, 1, 0, 228, - 128, 1, 0, 0, 160, 1, - 0, 0, 2, 0, 0, 8, - 128, 1, 0, 85, 128, 5, - 0, 0, 3, 1, 0, 15, - 128, 1, 0, 228, 128, 0, - 0, 0, 160, 1, 0, 0, - 2, 1, 8, 15, 128, 1, - 0, 228, 128, 5, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 0, 0, 0, - 160, 1, 0, 0, 2, 0, - 8, 15, 128, 0, 0, 228, - 128, 255, 255, 0, 0, 83, - 72, 68, 82, 88, 1, 0, - 0, 64, 0, 0, 0, 86, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 0, - 0, 0, 0, 4, 0, 0, - 0, 90, 0, 0, 3, 0, - 96, 16, 0, 0, 0, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 0, 0, 0, - 0, 85, 85, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 1, 0, 0, 0, 85, - 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 1, - 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 0, - 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 8, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 10, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 2, 64, 0, - 0, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, - 63, 0, 0, 128, 63, 54, - 0, 0, 5, 130, 0, 16, - 0, 1, 0, 0, 0, 26, - 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, - 32, 16, 0, 1, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 6, 128, 32, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 56, 0, 0, - 8, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 6, - 128, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 8, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 8, - 2, 0, 0, 1, 0, 0, - 0, 208, 0, 0, 0, 4, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, - 1, 0, 0, 212, 1, 0, - 0, 156, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 182, 0, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 187, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 1, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 197, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 76, 97, 121, - 101, 114, 84, 101, 120, 116, - 117, 114, 101, 83, 97, 109, - 112, 108, 101, 114, 76, 105, - 110, 101, 97, 114, 0, 116, - 82, 71, 66, 0, 116, 82, - 71, 66, 87, 104, 105, 116, - 101, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 171, - 171, 197, 0, 0, 0, 5, - 0, 0, 0, 232, 0, 0, - 0, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 96, 1, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 112, - 1, 0, 0, 0, 0, 0, - 0, 128, 1, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 112, - 1, 0, 0, 0, 0, 0, - 0, 139, 1, 0, 0, 32, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 112, - 1, 0, 0, 0, 0, 0, - 0, 149, 1, 0, 0, 48, - 0, 0, 0, 4, 0, 0, - 0, 2, 0, 0, 0, 164, - 1, 0, 0, 0, 0, 0, - 0, 180, 1, 0, 0, 64, - 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 196, - 1, 0, 0, 0, 0, 0, - 0, 118, 84, 101, 120, 116, - 117, 114, 101, 67, 111, 111, - 114, 100, 115, 0, 171, 1, - 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 76, 97, - 121, 101, 114, 81, 117, 97, - 100, 0, 118, 77, 97, 115, - 107, 81, 117, 97, 100, 0, - 102, 76, 97, 121, 101, 114, - 79, 112, 97, 99, 105, 116, - 121, 0, 171, 0, 0, 3, - 0, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 109, 76, 97, 121, 101, - 114, 84, 114, 97, 110, 115, - 102, 111, 114, 109, 0, 3, - 0, 3, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 54, 46, 51, 46, - 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, - 171, 73, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 3, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 79, - 83, 71, 78, 68, 0, 0, - 0, 2, 0, 0, 0, 8, - 0, 0, 0, 56, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 56, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 15, - 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, - 0, 171, 171, 57, 101, 0, - 0, 0, 0, 0, 0, 82, - 101, 110, 100, 101, 114, 83, - 111, 108, 105, 100, 67, 111, - 108, 111, 114, 76, 97, 121, - 101, 114, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 136, 7, 0, - 0, 68, 88, 66, 67, 134, - 58, 181, 81, 234, 180, 23, - 54, 140, 98, 159, 162, 74, - 150, 11, 172, 1, 0, 0, - 0, 136, 7, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 188, 1, 0, 0, 228, - 3, 0, 0, 96, 4, 0, - 0, 252, 6, 0, 0, 48, - 7, 0, 0, 65, 111, 110, - 57, 124, 1, 0, 0, 124, - 1, 0, 0, 0, 2, 254, - 255, 24, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 2, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 5, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 4, 0, 0, - 4, 0, 0, 3, 128, 0, - 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 5, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 85, 128, 4, - 0, 228, 160, 4, 0, 0, - 4, 0, 0, 15, 128, 3, - 0, 228, 160, 0, 0, 0, - 128, 1, 0, 228, 128, 2, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 228, 128, 5, - 0, 228, 160, 6, 0, 0, - 2, 1, 0, 1, 128, 0, - 0, 255, 128, 5, 0, 0, - 3, 0, 0, 7, 128, 0, - 0, 228, 128, 1, 0, 0, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 6, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 8, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 7, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 9, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 10, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 32, - 2, 0, 0, 64, 0, 1, - 0, 136, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 0, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 128, 65, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 114, - 0, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 56, - 0, 0, 8, 242, 0, 16, - 0, 1, 0, 0, 0, 86, - 5, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 6, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 2, 0, 0, 0, 166, - 10, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 3, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 11, 50, - 32, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, - 0, 0, 0, 13, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, - 68, 69, 70, 148, 2, 0, - 0, 3, 0, 0, 0, 168, - 0, 0, 0, 3, 0, 0, - 0, 28, 0, 0, 0, 0, - 4, 254, 255, 0, 1, 0, - 0, 96, 2, 0, 0, 124, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 133, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 152, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 80, - 101, 114, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 79, - 99, 99, 97, 115, 105, 111, - 110, 97, 108, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 77, - 97, 110, 97, 103, 101, 114, - 0, 124, 0, 0, 0, 5, - 0, 0, 0, 240, 0, 0, - 0, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 133, 0, 0, 0, 2, - 0, 0, 0, 220, 1, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 1, - 0, 0, 0, 60, 2, 0, - 0, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 104, 1, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 136, 1, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 147, 1, 0, 0, 32, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 120, - 1, 0, 0, 0, 0, 0, - 0, 157, 1, 0, 0, 48, - 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 172, - 1, 0, 0, 0, 0, 0, - 0, 188, 1, 0, 0, 64, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 118, 84, 101, 120, 116, - 117, 114, 101, 67, 111, 111, - 114, 100, 115, 0, 171, 1, - 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 76, 97, - 121, 101, 114, 81, 117, 97, - 100, 0, 118, 77, 97, 115, - 107, 81, 117, 97, 100, 0, - 102, 76, 97, 121, 101, 114, - 79, 112, 97, 99, 105, 116, - 121, 0, 171, 0, 0, 3, - 0, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 109, 76, 97, 121, 101, - 114, 84, 114, 97, 110, 115, - 102, 111, 114, 109, 0, 3, - 0, 3, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 2, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 32, 2, 0, 0, 0, - 0, 0, 0, 48, 2, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 32, 2, 0, 0, 0, - 0, 0, 0, 118, 82, 101, - 110, 100, 101, 114, 84, 97, - 114, 103, 101, 116, 79, 102, - 102, 115, 101, 116, 0, 1, - 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102, 76, 97, - 121, 101, 114, 67, 111, 108, - 111, 114, 0, 84, 2, 0, - 0, 0, 0, 0, 0, 64, - 0, 0, 0, 2, 0, 0, - 0, 204, 1, 0, 0, 0, - 0, 0, 0, 109, 80, 114, - 111, 106, 101, 99, 116, 105, - 111, 110, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 54, 46, 51, 46, - 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, - 171, 73, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 3, 3, 0, 0, 80, - 79, 83, 73, 84, 73, 79, - 78, 0, 171, 171, 171, 79, - 83, 71, 78, 80, 0, 0, - 0, 2, 0, 0, 0, 8, - 0, 0, 0, 56, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, - 12, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, - 171, 171, 171, 91, 107, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 216, - 2, 0, 0, 68, 88, 66, - 67, 127, 205, 139, 78, 240, - 148, 72, 80, 60, 232, 29, - 175, 91, 153, 47, 16, 1, - 0, 0, 0, 216, 2, 0, - 0, 6, 0, 0, 0, 56, - 0, 0, 0, 132, 0, 0, - 0, 204, 0, 0, 0, 72, - 1, 0, 0, 76, 2, 0, - 0, 164, 2, 0, 0, 65, - 111, 110, 57, 68, 0, 0, - 0, 68, 0, 0, 0, 0, - 2, 255, 255, 20, 0, 0, - 0, 48, 0, 0, 0, 1, - 0, 36, 0, 0, 0, 48, - 0, 0, 0, 48, 0, 0, - 0, 36, 0, 0, 0, 48, - 0, 0, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 1, - 0, 0, 2, 0, 8, 15, - 128, 0, 0, 228, 160, 255, - 255, 0, 0, 83, 72, 68, - 82, 64, 0, 0, 0, 64, - 0, 0, 0, 16, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 54, - 0, 0, 6, 242, 32, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 252, - 0, 0, 0, 1, 0, 0, - 0, 80, 0, 0, 0, 1, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, - 1, 0, 0, 200, 0, 0, - 0, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 171, 60, - 0, 0, 0, 2, 0, 0, - 0, 104, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 172, 0, 0, - 0, 0, 0, 0, 0, 188, - 0, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 172, 0, 0, - 0, 0, 0, 0, 0, 118, - 82, 101, 110, 100, 101, 114, - 84, 97, 114, 103, 101, 116, - 79, 102, 102, 115, 101, 116, - 0, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, - 76, 97, 121, 101, 114, 67, - 111, 108, 111, 114, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 80, 0, 0, 0, 2, - 0, 0, 0, 8, 0, 0, - 0, 56, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 251, - 114, 0, 0, 0, 0, 0, - 0, 82, 101, 110, 100, 101, - 114, 67, 108, 101, 97, 114, - 76, 97, 121, 101, 114, 0, - 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 255, 255, 255, 255, - 136, 7, 0, 0, 68, 88, - 66, 67, 134, 58, 181, 81, - 234, 180, 23, 54, 140, 98, - 159, 162, 74, 150, 11, 172, - 1, 0, 0, 0, 136, 7, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 188, 1, - 0, 0, 228, 3, 0, 0, - 96, 4, 0, 0, 252, 6, - 0, 0, 48, 7, 0, 0, - 65, 111, 110, 57, 124, 1, - 0, 0, 124, 1, 0, 0, - 0, 2, 254, 255, 24, 1, - 0, 0, 100, 0, 0, 0, - 5, 0, 36, 0, 0, 0, - 96, 0, 0, 0, 96, 0, - 0, 0, 36, 0, 1, 0, - 96, 0, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 2, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 1, 0, 5, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 6, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 31, 0, - 0, 2, 5, 0, 0, 128, - 0, 0, 15, 144, 4, 0, - 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 3, 128, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, - 228, 160, 5, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 85, 128, 4, 0, 228, 160, - 4, 0, 0, 4, 0, 0, - 15, 128, 3, 0, 228, 160, - 0, 0, 0, 128, 1, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 5, 0, 228, 160, - 6, 0, 0, 2, 1, 0, - 1, 128, 0, 0, 255, 128, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 228, 128, - 1, 0, 0, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 6, 0, - 228, 161, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 8, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 7, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 15, 128, 9, 0, 228, 160, - 0, 0, 170, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 10, 0, - 228, 160, 0, 0, 255, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 3, 192, - 0, 0, 255, 128, 0, 0, - 228, 160, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 12, 192, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 32, 2, 0, 0, - 64, 0, 1, 0, 136, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 95, 0, 0, 3, - 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 50, 32, - 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 50, 0, 0, 11, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 14, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 0, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 128, 65, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 166, 10, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 11, 50, 32, 16, 0, - 1, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 13, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 148, 2, 0, 0, 3, 0, - 0, 0, 168, 0, 0, 0, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, - 0, 1, 0, 0, 96, 2, - 0, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 80, - 101, 114, 79, 99, 99, 97, - 115, 105, 111, 110, 97, 108, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 77, 97, 110, 97, - 103, 101, 114, 0, 124, 0, - 0, 0, 5, 0, 0, 0, - 240, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 2, 0, 0, 0, - 220, 1, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 1, 0, 0, 0, - 60, 2, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 104, 1, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 136, 1, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 147, 1, - 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 157, 1, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 172, 1, 0, 0, - 0, 0, 0, 0, 188, 1, - 0, 0, 64, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 118, 84, - 101, 120, 116, 117, 114, 101, - 67, 111, 111, 114, 100, 115, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 118, 76, 97, 121, 101, 114, - 81, 117, 97, 100, 0, 118, - 77, 97, 115, 107, 81, 117, - 97, 100, 0, 102, 76, 97, - 121, 101, 114, 79, 112, 97, - 99, 105, 116, 121, 0, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 76, - 97, 121, 101, 114, 84, 114, - 97, 110, 115, 102, 111, 114, - 109, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 12, 2, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 48, 2, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 118, 82, 101, 110, 100, 101, - 114, 84, 97, 114, 103, 101, - 116, 79, 102, 102, 115, 101, - 116, 0, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 102, 76, 97, 121, 101, 114, - 67, 111, 108, 111, 114, 0, - 84, 2, 0, 0, 0, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 109, 80, 114, 111, 106, 101, - 99, 116, 105, 111, 110, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, - 52, 0, 171, 171, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 3, 3, - 0, 0, 80, 79, 83, 73, - 84, 73, 79, 78, 0, 171, - 171, 171, 79, 83, 71, 78, - 80, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, - 56, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 68, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 12, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 32, 118, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 216, 2, 0, 0, - 68, 88, 66, 67, 127, 205, - 139, 78, 240, 148, 72, 80, - 60, 232, 29, 175, 91, 153, - 47, 16, 1, 0, 0, 0, - 216, 2, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 132, 0, 0, 0, 204, 0, - 0, 0, 72, 1, 0, 0, - 76, 2, 0, 0, 164, 2, - 0, 0, 65, 111, 110, 57, - 68, 0, 0, 0, 68, 0, - 0, 0, 0, 2, 255, 255, - 20, 0, 0, 0, 48, 0, - 0, 0, 1, 0, 36, 0, - 0, 0, 48, 0, 0, 0, - 48, 0, 0, 0, 36, 0, - 0, 0, 48, 0, 0, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 255, 255, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, - 228, 160, 255, 255, 0, 0, - 83, 72, 68, 82, 64, 0, - 0, 0, 64, 0, 0, 0, - 16, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 6, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 252, 0, 0, 0, - 1, 0, 0, 0, 80, 0, - 0, 0, 1, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 200, 0, 0, 0, 60, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 171, 60, 0, 0, 0, - 2, 0, 0, 0, 104, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 172, 0, 0, 0, 0, 0, - 0, 0, 188, 0, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 172, 0, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 80, 0, - 0, 0, 2, 0, 0, 0, - 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 192, 125, 0, 0, - 0, 0, 0, 0, 80, 114, - 101, 112, 97, 114, 101, 65, - 108, 112, 104, 97, 69, 120, - 116, 114, 97, 99, 116, 105, - 111, 110, 84, 101, 120, 116, - 117, 114, 101, 115, 0, 4, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 255, 255, 255, 255, 136, - 7, 0, 0, 68, 88, 66, - 67, 134, 58, 181, 81, 234, - 180, 23, 54, 140, 98, 159, - 162, 74, 150, 11, 172, 1, - 0, 0, 0, 136, 7, 0, - 0, 6, 0, 0, 0, 56, - 0, 0, 0, 188, 1, 0, - 0, 228, 3, 0, 0, 96, - 4, 0, 0, 252, 6, 0, - 0, 48, 7, 0, 0, 65, - 111, 110, 57, 124, 1, 0, - 0, 124, 1, 0, 0, 0, - 2, 254, 255, 24, 1, 0, - 0, 100, 0, 0, 0, 5, - 0, 36, 0, 0, 0, 96, - 0, 0, 0, 96, 0, 0, - 0, 36, 0, 1, 0, 96, - 0, 0, 0, 0, 0, 2, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 2, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 1, - 0, 5, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 6, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 4, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 2, 254, 255, 31, 0, 0, - 2, 5, 0, 0, 128, 0, - 0, 15, 144, 4, 0, 0, - 4, 0, 0, 3, 224, 0, - 0, 228, 144, 1, 0, 238, - 160, 1, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 2, - 0, 238, 160, 2, 0, 228, - 160, 5, 0, 0, 3, 1, - 0, 15, 128, 0, 0, 85, - 128, 4, 0, 228, 160, 4, - 0, 0, 4, 0, 0, 15, - 128, 3, 0, 228, 160, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 5, 0, 228, 160, 6, - 0, 0, 2, 1, 0, 1, - 128, 0, 0, 255, 128, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 228, 128, 1, - 0, 0, 128, 2, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 6, 0, 228, - 161, 5, 0, 0, 3, 0, - 0, 7, 128, 0, 0, 255, - 128, 0, 0, 228, 128, 5, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 85, 128, 8, - 0, 228, 160, 4, 0, 0, - 4, 1, 0, 15, 128, 7, - 0, 228, 160, 0, 0, 0, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 1, 0, 15, - 128, 9, 0, 228, 160, 0, - 0, 170, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 15, 128, 10, 0, 228, - 160, 0, 0, 255, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 0, 0, 3, 192, 0, - 0, 255, 128, 0, 0, 228, - 160, 0, 0, 228, 128, 1, - 0, 0, 2, 0, 0, 12, - 192, 0, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 32, 2, 0, 0, 64, - 0, 1, 0, 136, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 2, - 0, 0, 0, 4, 0, 0, - 0, 95, 0, 0, 3, 50, - 16, 16, 0, 0, 0, 0, - 0, 103, 0, 0, 4, 242, - 32, 16, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 50, 32, 16, - 0, 1, 0, 0, 0, 104, - 0, 0, 2, 2, 0, 0, - 0, 50, 0, 0, 11, 50, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 0, 0, 0, - 8, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 14, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 128, 65, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, - 7, 114, 0, 16, 0, 0, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 2, 0, 0, - 0, 166, 10, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 32, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 3, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 1, - 0, 0, 0, 70, 16, 16, - 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 13, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 12, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 148, - 2, 0, 0, 3, 0, 0, - 0, 168, 0, 0, 0, 3, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 254, 255, 0, - 1, 0, 0, 96, 2, 0, - 0, 124, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 133, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 79, 99, 99, 97, 115, - 105, 111, 110, 97, 108, 76, - 97, 121, 101, 114, 0, 80, - 101, 114, 76, 97, 121, 101, - 114, 77, 97, 110, 97, 103, - 101, 114, 0, 124, 0, 0, - 0, 5, 0, 0, 0, 240, - 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 133, 0, 0, - 0, 2, 0, 0, 0, 220, - 1, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 152, 0, 0, - 0, 1, 0, 0, 0, 60, - 2, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 104, 1, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 136, 1, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 147, 1, 0, - 0, 32, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 120, 1, 0, 0, 0, - 0, 0, 0, 157, 1, 0, - 0, 48, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 172, 1, 0, 0, 0, - 0, 0, 0, 188, 1, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 2, 0, 0, - 0, 204, 1, 0, 0, 0, - 0, 0, 0, 118, 84, 101, - 120, 116, 117, 114, 101, 67, - 111, 111, 114, 100, 115, 0, - 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, - 76, 97, 121, 101, 114, 81, - 117, 97, 100, 0, 118, 77, - 97, 115, 107, 81, 117, 97, - 100, 0, 102, 76, 97, 121, - 101, 114, 79, 112, 97, 99, - 105, 116, 121, 0, 171, 0, - 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 76, 97, - 121, 101, 114, 84, 114, 97, - 110, 115, 102, 111, 114, 109, - 0, 3, 0, 3, 0, 4, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, - 2, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 32, 2, 0, - 0, 0, 0, 0, 0, 48, - 2, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 32, 2, 0, - 0, 0, 0, 0, 0, 118, - 82, 101, 110, 100, 101, 114, - 84, 97, 114, 103, 101, 116, - 79, 102, 102, 115, 101, 116, - 0, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, - 76, 97, 121, 101, 114, 67, - 111, 108, 111, 114, 0, 84, - 2, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 109, - 80, 114, 111, 106, 101, 99, - 116, 105, 111, 110, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 3, 3, 0, - 0, 80, 79, 83, 73, 84, - 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 12, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 243, - 128, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 140, 2, 0, 0, 68, - 88, 66, 67, 242, 13, 26, - 125, 185, 83, 251, 62, 147, - 219, 54, 247, 94, 94, 245, - 124, 1, 0, 0, 0, 140, - 2, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 168, - 0, 0, 0, 20, 1, 0, - 0, 144, 1, 0, 0, 232, - 1, 0, 0, 64, 2, 0, - 0, 65, 111, 110, 57, 104, - 0, 0, 0, 104, 0, 0, - 0, 0, 2, 255, 255, 68, - 0, 0, 0, 36, 0, 0, - 0, 0, 0, 36, 0, 0, - 0, 36, 0, 0, 0, 36, - 0, 0, 0, 36, 0, 0, - 0, 36, 0, 1, 2, 255, - 255, 81, 0, 0, 5, 0, - 0, 15, 160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, - 63, 1, 0, 0, 2, 0, - 8, 15, 128, 0, 0, 228, - 160, 1, 0, 0, 2, 0, - 0, 15, 128, 0, 0, 255, - 160, 1, 0, 0, 2, 1, - 8, 15, 128, 0, 0, 228, - 128, 255, 255, 0, 0, 83, - 72, 68, 82, 100, 0, 0, - 0, 64, 0, 0, 0, 25, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 1, - 0, 0, 0, 54, 0, 0, - 8, 242, 32, 16, 0, 0, - 0, 0, 0, 2, 64, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 63, 54, - 0, 0, 8, 242, 32, 16, - 0, 1, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 128, - 63, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, - 63, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 28, - 0, 0, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 54, 46, 51, 46, - 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, - 171, 73, 83, 71, 78, 80, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 83, - 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 79, - 83, 71, 78, 68, 0, 0, - 0, 2, 0, 0, 0, 8, - 0, 0, 0, 56, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 56, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 15, - 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, - 0, 171, 171, 147, 136, 0, - 0, 0, 0, 0, 0, 82, - 101, 110, 100, 101, 114, 82, - 71, 66, 76, 97, 121, 101, - 114, 80, 114, 101, 109, 117, - 108, 77, 97, 115, 107, 0, - 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 255, 255, 255, 255, - 76, 8, 0, 0, 68, 88, - 66, 67, 190, 117, 181, 57, - 187, 108, 178, 85, 11, 114, - 197, 104, 54, 155, 141, 115, - 1, 0, 0, 0, 76, 8, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 4, 2, - 0, 0, 144, 4, 0, 0, - 12, 5, 0, 0, 168, 7, - 0, 0, 220, 7, 0, 0, - 65, 111, 110, 57, 196, 1, - 0, 0, 196, 1, 0, 0, - 0, 2, 254, 255, 96, 1, - 0, 0, 100, 0, 0, 0, - 5, 0, 36, 0, 0, 0, - 96, 0, 0, 0, 96, 0, - 0, 0, 36, 0, 1, 0, - 96, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 2, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 1, 0, 6, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 31, 0, - 0, 2, 5, 0, 0, 128, - 0, 0, 15, 144, 6, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 170, 160, 4, 0, - 0, 4, 0, 0, 6, 128, - 0, 0, 208, 144, 2, 0, - 248, 160, 2, 0, 208, 160, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 170, 128, - 5, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 4, 0, 228, 160, 0, 0, - 85, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 6, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 6, 128, - 1, 0, 208, 128, 3, 0, - 208, 161, 5, 0, 0, 3, - 0, 0, 8, 224, 0, 0, - 0, 128, 0, 0, 85, 128, - 6, 0, 0, 2, 0, 0, - 1, 128, 3, 0, 255, 160, - 5, 0, 0, 3, 0, 0, - 4, 224, 0, 0, 0, 128, - 0, 0, 170, 128, 4, 0, - 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, - 6, 0, 0, 2, 0, 0, - 1, 128, 1, 0, 255, 128, - 5, 0, 0, 3, 1, 0, - 7, 128, 0, 0, 0, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 1, 0, 228, 128, 7, 0, - 228, 161, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 9, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 8, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 15, 128, 10, 0, 228, 160, - 0, 0, 170, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 11, 0, - 228, 160, 0, 0, 255, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 3, 192, - 0, 0, 255, 128, 0, 0, - 228, 160, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 12, 192, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 132, 2, 0, 0, - 64, 0, 1, 0, 161, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 95, 0, 0, 3, - 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 50, 32, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 194, 32, - 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 50, 0, 0, 11, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 14, 0, 0, 7, 114, 0, - 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 1, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 70, 128, 32, 128, - 65, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 14, 0, 0, 8, 194, 32, - 16, 0, 1, 0, 0, 0, - 6, 4, 16, 0, 0, 0, - 0, 0, 166, 142, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 128, 65, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 148, 2, - 0, 0, 3, 0, 0, 0, - 168, 0, 0, 0, 3, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 254, 255, 0, 1, - 0, 0, 96, 2, 0, 0, - 124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 77, 97, 110, 97, 103, 101, - 114, 0, 124, 0, 0, 0, - 5, 0, 0, 0, 240, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 2, 0, 0, 0, 220, 1, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 1, 0, 0, 0, 60, 2, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 104, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 147, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 157, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 172, 1, 0, 0, 0, 0, - 0, 0, 188, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 2, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 48, 2, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 118, 82, - 101, 110, 100, 101, 114, 84, - 97, 114, 103, 101, 116, 79, - 102, 102, 115, 101, 116, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 76, - 97, 121, 101, 114, 67, 111, - 108, 111, 114, 0, 84, 2, - 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 109, 80, - 114, 111, 106, 101, 99, 116, - 105, 111, 110, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, - 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 12, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 116, 139, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 76, 5, 0, 0, 68, 88, - 66, 67, 130, 78, 41, 193, - 98, 190, 236, 116, 206, 211, - 190, 246, 52, 93, 124, 137, - 1, 0, 0, 0, 76, 5, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 8, 1, - 0, 0, 32, 2, 0, 0, - 156, 2, 0, 0, 168, 4, - 0, 0, 24, 5, 0, 0, - 65, 111, 110, 57, 200, 0, - 0, 0, 200, 0, 0, 0, - 0, 2, 255, 255, 144, 0, - 0, 0, 56, 0, 0, 0, - 1, 0, 44, 0, 0, 0, - 56, 0, 0, 0, 56, 0, - 2, 0, 36, 0, 0, 0, - 56, 0, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 31, 0, 0, 2, - 0, 0, 0, 144, 1, 8, - 15, 160, 1, 0, 0, 2, - 0, 0, 3, 128, 0, 0, - 235, 176, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 1, 8, 228, 160, 5, 0, - 0, 3, 1, 0, 7, 128, - 1, 0, 228, 128, 0, 0, - 0, 160, 1, 0, 0, 2, - 1, 0, 8, 128, 0, 0, - 0, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 255, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 16, 1, 0, 0, - 64, 0, 0, 0, 68, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, - 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 1, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, - 0, 0, 98, 16, 0, 3, - 194, 16, 16, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 6, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 69, 0, 0, 9, 242, 0, - 16, 0, 1, 0, 0, 0, - 230, 26, 16, 0, 1, 0, - 0, 0, 70, 126, 16, 0, - 1, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 130, 0, - 16, 0, 0, 0, 0, 0, - 10, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 56, 0, 0, 7, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 1, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 6, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 4, 2, - 0, 0, 1, 0, 0, 0, - 204, 0, 0, 0, 4, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 255, 255, 0, 1, - 0, 0, 208, 1, 0, 0, - 156, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 182, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 187, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 193, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 76, 97, 121, 101, - 114, 84, 101, 120, 116, 117, - 114, 101, 83, 97, 109, 112, - 108, 101, 114, 76, 105, 110, - 101, 97, 114, 0, 116, 82, - 71, 66, 0, 116, 77, 97, - 115, 107, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 171, 171, 193, 0, 0, 0, - 5, 0, 0, 0, 228, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 92, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 108, 1, 0, 0, 0, 0, - 0, 0, 124, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 108, 1, 0, 0, 0, 0, - 0, 0, 135, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 108, 1, 0, 0, 0, 0, - 0, 0, 145, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 160, 1, 0, 0, 0, 0, - 0, 0, 176, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 192, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, - 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 12, 12, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 216, 147, - 0, 0, 0, 0, 0, 0, - 82, 101, 110, 100, 101, 114, - 82, 71, 66, 76, 97, 121, - 101, 114, 80, 114, 101, 109, - 117, 108, 80, 111, 105, 110, - 116, 77, 97, 115, 107, 0, - 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 255, 255, 255, 255, - 76, 8, 0, 0, 68, 88, - 66, 67, 190, 117, 181, 57, - 187, 108, 178, 85, 11, 114, - 197, 104, 54, 155, 141, 115, - 1, 0, 0, 0, 76, 8, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 4, 2, - 0, 0, 144, 4, 0, 0, - 12, 5, 0, 0, 168, 7, - 0, 0, 220, 7, 0, 0, - 65, 111, 110, 57, 196, 1, - 0, 0, 196, 1, 0, 0, - 0, 2, 254, 255, 96, 1, - 0, 0, 100, 0, 0, 0, - 5, 0, 36, 0, 0, 0, - 96, 0, 0, 0, 96, 0, - 0, 0, 36, 0, 1, 0, - 96, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 2, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 1, 0, 6, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 7, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 4, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 31, 0, - 0, 2, 5, 0, 0, 128, - 0, 0, 15, 144, 6, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 170, 160, 4, 0, - 0, 4, 0, 0, 6, 128, - 0, 0, 208, 144, 2, 0, - 248, 160, 2, 0, 208, 160, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 170, 128, - 5, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 4, 0, 228, 160, 0, 0, - 85, 128, 1, 0, 228, 128, - 2, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, - 6, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 6, 128, - 1, 0, 208, 128, 3, 0, - 208, 161, 5, 0, 0, 3, - 0, 0, 8, 224, 0, 0, - 0, 128, 0, 0, 85, 128, - 6, 0, 0, 2, 0, 0, - 1, 128, 3, 0, 255, 160, - 5, 0, 0, 3, 0, 0, - 4, 224, 0, 0, 0, 128, - 0, 0, 170, 128, 4, 0, - 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, - 6, 0, 0, 2, 0, 0, - 1, 128, 1, 0, 255, 128, - 5, 0, 0, 3, 1, 0, - 7, 128, 0, 0, 0, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 15, 128, - 1, 0, 228, 128, 7, 0, - 228, 161, 5, 0, 0, 3, - 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, - 5, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 85, 128, - 9, 0, 228, 160, 4, 0, - 0, 4, 1, 0, 15, 128, - 8, 0, 228, 160, 0, 0, - 0, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 15, 128, 10, 0, 228, 160, - 0, 0, 170, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 15, 128, 11, 0, - 228, 160, 0, 0, 255, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 3, 192, - 0, 0, 255, 128, 0, 0, - 228, 160, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 0, - 12, 192, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 132, 2, 0, 0, - 64, 0, 1, 0, 161, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 8, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 2, 0, 0, 0, 4, 0, - 0, 0, 95, 0, 0, 3, - 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 50, 32, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 194, 32, - 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 50, 0, 0, 11, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 0, 0, - 0, 8, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 14, 0, 0, 7, 114, 0, - 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 54, 0, - 0, 5, 130, 0, 16, 0, - 1, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 0, 16, 0, 0, 0, - 0, 0, 70, 128, 32, 128, - 65, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 14, 0, 0, 8, 194, 32, - 16, 0, 1, 0, 0, 0, - 6, 4, 16, 0, 0, 0, - 0, 0, 166, 142, 32, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 128, 65, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, - 86, 5, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 2, 0, 0, 0, - 166, 10, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 4, 0, - 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 148, 2, - 0, 0, 3, 0, 0, 0, - 168, 0, 0, 0, 3, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 254, 255, 0, 1, - 0, 0, 96, 2, 0, 0, - 124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 77, 97, 110, 97, 103, 101, - 114, 0, 124, 0, 0, 0, - 5, 0, 0, 0, 240, 0, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 133, 0, 0, 0, - 2, 0, 0, 0, 220, 1, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 1, 0, 0, 0, 60, 2, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 104, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 136, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 147, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 120, 1, 0, 0, 0, 0, - 0, 0, 157, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 172, 1, 0, 0, 0, 0, - 0, 0, 188, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 2, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 48, 2, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 118, 82, - 101, 110, 100, 101, 114, 84, - 97, 114, 103, 101, 116, 79, - 102, 102, 115, 101, 116, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 76, - 97, 121, 101, 114, 67, 111, - 108, 111, 114, 0, 84, 2, - 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 109, 80, - 114, 111, 106, 101, 99, 116, - 105, 111, 110, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 0, 0, - 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 12, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 126, 153, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 144, 5, 0, 0, 68, 88, - 66, 67, 113, 140, 186, 29, - 121, 124, 246, 156, 156, 129, - 164, 254, 156, 2, 223, 127, - 1, 0, 0, 0, 144, 5, - 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 8, 1, - 0, 0, 44, 2, 0, 0, - 168, 2, 0, 0, 236, 4, - 0, 0, 92, 5, 0, 0, - 65, 111, 110, 57, 200, 0, - 0, 0, 200, 0, 0, 0, - 0, 2, 255, 255, 144, 0, - 0, 0, 56, 0, 0, 0, - 1, 0, 44, 0, 0, 0, - 56, 0, 0, 0, 56, 0, - 2, 0, 36, 0, 0, 0, - 56, 0, 1, 0, 0, 0, - 0, 1, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, - 15, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, - 15, 160, 31, 0, 0, 2, - 0, 0, 0, 144, 1, 8, - 15, 160, 1, 0, 0, 2, - 0, 0, 3, 128, 0, 0, - 235, 176, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 228, 176, 1, 8, 228, 160, - 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 0, 8, 228, 160, 5, 0, - 0, 3, 1, 0, 7, 128, - 1, 0, 228, 128, 0, 0, - 0, 160, 1, 0, 0, 2, - 1, 0, 8, 128, 0, 0, - 0, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 255, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 28, 1, 0, 0, - 64, 0, 0, 0, 71, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 1, 0, 0, 0, - 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 1, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, - 0, 0, 98, 16, 0, 3, - 194, 16, 16, 0, 1, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, - 1, 0, 0, 0, 56, 0, - 0, 8, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 6, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 69, 0, 0, 9, 242, 0, - 16, 0, 1, 0, 0, 0, - 230, 26, 16, 0, 1, 0, - 0, 0, 70, 126, 16, 0, - 1, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, - 54, 0, 0, 6, 130, 0, - 16, 0, 0, 0, 0, 0, - 10, 128, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 56, 0, 0, 7, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 0, 0, - 0, 0, 246, 15, 16, 0, - 1, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 6, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 60, 2, - 0, 0, 1, 0, 0, 0, - 4, 1, 0, 0, 5, 0, - 0, 0, 28, 0, 0, 0, - 0, 4, 255, 255, 0, 1, - 0, 0, 8, 2, 0, 0, - 188, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 214, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 239, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 244, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, - 255, 255, 1, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 76, 97, - 121, 101, 114, 84, 101, 120, - 116, 117, 114, 101, 83, 97, - 109, 112, 108, 101, 114, 76, - 105, 110, 101, 97, 114, 0, - 76, 97, 121, 101, 114, 84, - 101, 120, 116, 117, 114, 101, - 83, 97, 109, 112, 108, 101, - 114, 80, 111, 105, 110, 116, - 0, 116, 82, 71, 66, 0, - 116, 77, 97, 115, 107, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 171, 250, 0, - 0, 0, 5, 0, 0, 0, - 28, 1, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 1, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 164, 1, 0, 0, - 0, 0, 0, 0, 180, 1, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 164, 1, 0, 0, - 0, 0, 0, 0, 191, 1, - 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 0, 0, - 0, 0, 164, 1, 0, 0, - 0, 0, 0, 0, 201, 1, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 2, 0, - 0, 0, 216, 1, 0, 0, - 0, 0, 0, 0, 232, 1, - 0, 0, 64, 0, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 248, 1, 0, 0, - 0, 0, 0, 0, 118, 84, - 101, 120, 116, 117, 114, 101, - 67, 111, 111, 114, 100, 115, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 118, 76, 97, 121, 101, 114, - 81, 117, 97, 100, 0, 118, - 77, 97, 115, 107, 81, 117, - 97, 100, 0, 102, 76, 97, - 121, 101, 114, 79, 112, 97, - 99, 105, 116, 121, 0, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 76, - 97, 121, 101, 114, 84, 114, - 97, 110, 115, 102, 111, 114, - 109, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, - 52, 0, 171, 171, 73, 83, - 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 3, - 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 12, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 79, 83, 71, 78, - 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 83, 86, 95, 84, 97, 114, - 103, 101, 116, 0, 171, 171, - 226, 161, 0, 0, 0, 0, - 0, 0, 82, 101, 110, 100, - 101, 114, 82, 71, 66, 65, - 76, 97, 121, 101, 114, 80, - 114, 101, 109, 117, 108, 77, - 97, 115, 107, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 255, 255, 255, 255, 76, 8, - 0, 0, 68, 88, 66, 67, - 190, 117, 181, 57, 187, 108, - 178, 85, 11, 114, 197, 104, - 54, 155, 141, 115, 1, 0, - 0, 0, 76, 8, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 4, 2, 0, 0, - 144, 4, 0, 0, 12, 5, - 0, 0, 168, 7, 0, 0, - 220, 7, 0, 0, 65, 111, - 110, 57, 196, 1, 0, 0, - 196, 1, 0, 0, 0, 2, - 254, 255, 96, 1, 0, 0, - 100, 0, 0, 0, 5, 0, - 36, 0, 0, 0, 96, 0, - 0, 0, 96, 0, 0, 0, - 36, 0, 1, 0, 96, 0, - 0, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 2, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, - 6, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 7, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 254, 255, 31, 0, 0, 2, - 5, 0, 0, 128, 0, 0, - 15, 144, 6, 0, 0, 2, - 0, 0, 1, 128, 3, 0, - 170, 160, 4, 0, 0, 4, - 0, 0, 6, 128, 0, 0, - 208, 144, 2, 0, 248, 160, - 2, 0, 208, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 170, 128, 5, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 4, 0, - 228, 160, 0, 0, 85, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 6, 0, - 228, 160, 2, 0, 0, 3, - 0, 0, 6, 128, 1, 0, - 208, 128, 3, 0, 208, 161, - 5, 0, 0, 3, 0, 0, - 8, 224, 0, 0, 0, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 255, 160, 5, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 0, 0, - 170, 128, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, - 228, 144, 1, 0, 238, 160, - 1, 0, 228, 160, 6, 0, - 0, 2, 0, 0, 1, 128, - 1, 0, 255, 128, 5, 0, - 0, 3, 1, 0, 7, 128, - 0, 0, 0, 128, 1, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 1, 0, - 228, 128, 7, 0, 228, 161, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 8, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 11, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 132, 2, 0, 0, 64, 0, - 1, 0, 161, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 194, 32, 16, 0, - 1, 0, 0, 0, 104, 0, - 0, 2, 2, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 1, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 1, 0, - 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 0, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 70, 128, 32, 128, 65, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 14, 0, - 0, 8, 194, 32, 16, 0, - 1, 0, 0, 0, 6, 4, - 16, 0, 0, 0, 0, 0, - 166, 142, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 128, - 65, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, - 3, 0, 0, 0, 168, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 79, 99, - 99, 97, 115, 105, 111, 110, - 97, 108, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 124, 0, 0, 0, 5, 0, - 0, 0, 240, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 2, 0, - 0, 0, 220, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 1, 0, - 0, 0, 60, 2, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 104, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 147, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 172, 1, - 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 48, 2, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 84, 2, 0, 0, - 0, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 109, 80, 114, 111, - 106, 101, 99, 116, 105, 111, - 110, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, - 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, - 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 200, 167, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 40, 5, - 0, 0, 68, 88, 66, 67, - 134, 242, 22, 210, 198, 226, - 208, 239, 25, 201, 212, 19, - 217, 12, 67, 204, 1, 0, - 0, 0, 40, 5, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 252, 0, 0, 0, - 252, 1, 0, 0, 120, 2, - 0, 0, 132, 4, 0, 0, - 244, 4, 0, 0, 65, 111, - 110, 57, 188, 0, 0, 0, - 188, 0, 0, 0, 0, 2, - 255, 255, 132, 0, 0, 0, - 56, 0, 0, 0, 1, 0, - 44, 0, 0, 0, 56, 0, - 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 255, 255, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 176, - 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, - 31, 0, 0, 2, 0, 0, - 0, 144, 1, 8, 15, 160, - 1, 0, 0, 2, 0, 0, - 3, 128, 0, 0, 235, 176, - 66, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 228, 176, - 0, 8, 228, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 1, 8, - 228, 160, 5, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 0, 0, 0, 160, - 5, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 255, 128, - 1, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 248, 0, 0, 0, 64, 0, - 0, 0, 62, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 0, 0, 0, 0, 85, 85, - 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, - 16, 0, 1, 0, 0, 0, - 98, 16, 0, 3, 194, 16, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 230, 26, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 1, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 1, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 5, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 4, 2, 0, 0, - 1, 0, 0, 0, 204, 0, - 0, 0, 4, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 208, 1, 0, 0, 156, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 182, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 187, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 1, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 193, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 76, 97, 121, 101, 114, 84, - 101, 120, 116, 117, 114, 101, - 83, 97, 109, 112, 108, 101, - 114, 76, 105, 110, 101, 97, - 114, 0, 116, 82, 71, 66, - 0, 116, 77, 97, 115, 107, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 0, 171, 171, - 193, 0, 0, 0, 5, 0, - 0, 0, 228, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 92, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 124, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 135, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 145, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 160, 1, - 0, 0, 0, 0, 0, 0, - 176, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 192, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 12, 12, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 44, 176, 0, 0, - 0, 0, 0, 0, 82, 101, - 110, 100, 101, 114, 82, 71, - 66, 65, 76, 97, 121, 101, - 114, 80, 114, 101, 109, 117, - 108, 77, 97, 115, 107, 51, - 68, 0, 4, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 255, 255, - 255, 255, 160, 8, 0, 0, - 68, 88, 66, 67, 34, 121, - 201, 137, 199, 29, 125, 49, - 68, 233, 221, 121, 196, 122, - 136, 83, 1, 0, 0, 0, - 160, 8, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 60, 2, 0, 0, 228, 4, - 0, 0, 96, 5, 0, 0, - 252, 7, 0, 0, 48, 8, - 0, 0, 65, 111, 110, 57, - 252, 1, 0, 0, 252, 1, - 0, 0, 0, 2, 254, 255, - 152, 1, 0, 0, 100, 0, - 0, 0, 5, 0, 36, 0, - 0, 0, 96, 0, 0, 0, - 96, 0, 0, 0, 36, 0, - 1, 0, 96, 0, 0, 0, - 0, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 2, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 7, 0, 1, 0, 6, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 7, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 4, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 254, 255, - 81, 0, 0, 5, 12, 0, - 15, 160, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 31, 0, 0, 2, 5, 0, - 0, 128, 0, 0, 15, 144, - 1, 0, 0, 2, 0, 0, - 4, 128, 12, 0, 0, 160, - 6, 0, 0, 2, 0, 0, - 8, 128, 3, 0, 170, 160, - 4, 0, 0, 4, 1, 0, - 3, 128, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, - 228, 160, 5, 0, 0, 3, - 2, 0, 15, 128, 1, 0, - 85, 128, 5, 0, 228, 160, - 4, 0, 0, 4, 1, 0, - 15, 128, 4, 0, 228, 160, - 1, 0, 0, 128, 2, 0, - 228, 128, 2, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 6, 0, 228, 160, - 6, 0, 0, 2, 2, 0, - 1, 128, 1, 0, 255, 128, - 4, 0, 0, 4, 2, 0, - 6, 128, 1, 0, 208, 128, - 2, 0, 0, 128, 3, 0, - 208, 161, 5, 0, 0, 3, - 1, 0, 7, 128, 1, 0, - 228, 128, 2, 0, 0, 128, - 5, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 255, 128, - 2, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 8, 128, - 3, 0, 255, 160, 5, 0, - 0, 3, 0, 0, 2, 128, - 0, 0, 255, 128, 2, 0, - 170, 128, 5, 0, 0, 3, - 1, 0, 7, 224, 0, 0, - 228, 128, 1, 0, 255, 128, - 2, 0, 0, 3, 0, 0, - 15, 128, 1, 0, 228, 128, - 7, 0, 228, 161, 4, 0, - 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 8, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 11, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 160, 2, 0, 0, 64, 0, - 1, 0, 168, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 114, 32, 16, 0, - 2, 0, 0, 0, 104, 0, - 0, 2, 3, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 128, 65, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 70, 128, - 32, 128, 65, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 14, 0, 0, 8, - 50, 0, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, - 1, 0, 0, 0, 246, 15, - 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 2, 0, - 0, 0, 86, 5, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 2, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 6, 0, - 16, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 2, 0, - 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 2, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 2, 0, - 0, 0, 166, 10, 16, 0, - 1, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, - 50, 0, 0, 10, 242, 32, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 3, 0, 0, 0, - 246, 15, 16, 0, 1, 0, - 0, 0, 70, 14, 16, 0, - 2, 0, 0, 0, 50, 0, - 0, 11, 50, 32, 16, 0, - 1, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, - 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 56, 0, 0, 7, - 114, 32, 16, 0, 2, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, - 17, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, - 148, 2, 0, 0, 3, 0, - 0, 0, 168, 0, 0, 0, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, - 0, 1, 0, 0, 96, 2, - 0, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 80, - 101, 114, 79, 99, 99, 97, - 115, 105, 111, 110, 97, 108, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 77, 97, 110, 97, - 103, 101, 114, 0, 124, 0, - 0, 0, 5, 0, 0, 0, - 240, 0, 0, 0, 128, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 0, - 0, 0, 2, 0, 0, 0, - 220, 1, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 0, - 0, 0, 1, 0, 0, 0, - 60, 2, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 104, 1, - 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 136, 1, - 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 147, 1, - 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 2, 0, - 0, 0, 120, 1, 0, 0, - 0, 0, 0, 0, 157, 1, - 0, 0, 48, 0, 0, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 172, 1, 0, 0, - 0, 0, 0, 0, 188, 1, - 0, 0, 64, 0, 0, 0, - 64, 0, 0, 0, 2, 0, - 0, 0, 204, 1, 0, 0, - 0, 0, 0, 0, 118, 84, - 101, 120, 116, 117, 114, 101, - 67, 111, 111, 114, 100, 115, - 0, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 118, 76, 97, 121, 101, 114, - 81, 117, 97, 100, 0, 118, - 77, 97, 115, 107, 81, 117, - 97, 100, 0, 102, 76, 97, - 121, 101, 114, 79, 112, 97, - 99, 105, 116, 121, 0, 171, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 76, - 97, 121, 101, 114, 84, 114, - 97, 110, 115, 102, 111, 114, - 109, 0, 3, 0, 3, 0, - 4, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 12, 2, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 48, 2, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 0, 0, - 118, 82, 101, 110, 100, 101, - 114, 84, 97, 114, 103, 101, - 116, 79, 102, 102, 115, 101, - 116, 0, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 102, 76, 97, 121, 101, 114, - 67, 111, 108, 111, 114, 0, - 84, 2, 0, 0, 0, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 109, 80, 114, 111, 106, 101, - 99, 116, 105, 111, 110, 0, - 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, - 52, 0, 171, 171, 73, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 3, 3, - 0, 0, 80, 79, 83, 73, - 84, 73, 79, 78, 0, 171, - 171, 171, 79, 83, 71, 78, - 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 12, 0, 0, - 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 2, 0, - 0, 0, 7, 8, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 172, 181, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 96, 5, 0, 0, - 68, 88, 66, 67, 241, 142, - 205, 228, 253, 156, 187, 52, - 46, 187, 89, 206, 15, 61, - 26, 195, 1, 0, 0, 0, - 96, 5, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, - 24, 1, 0, 0, 52, 2, - 0, 0, 176, 2, 0, 0, - 188, 4, 0, 0, 44, 5, - 0, 0, 65, 111, 110, 57, - 216, 0, 0, 0, 216, 0, - 0, 0, 0, 2, 255, 255, - 160, 0, 0, 0, 56, 0, - 0, 0, 1, 0, 44, 0, - 0, 0, 56, 0, 0, 0, - 56, 0, 2, 0, 36, 0, - 0, 0, 56, 0, 0, 0, - 0, 0, 1, 0, 1, 0, - 0, 0, 3, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 128, - 1, 0, 7, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 6, 0, - 0, 2, 0, 0, 8, 128, - 1, 0, 170, 176, 5, 0, - 0, 3, 0, 0, 3, 128, - 0, 0, 255, 128, 1, 0, - 228, 176, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 228, 176, 0, 8, 228, 160, - 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, - 1, 8, 228, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 0, 0, - 0, 160, 5, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 255, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 0, 8, - 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, - 68, 82, 20, 1, 0, 0, - 64, 0, 0, 0, 69, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, - 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 1, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, - 0, 0, 98, 16, 0, 3, - 114, 16, 16, 0, 2, 0, - 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 14, 0, - 0, 7, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 16, - 16, 0, 2, 0, 0, 0, - 166, 26, 16, 0, 2, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 70, 126, - 16, 0, 1, 0, 0, 0, - 0, 96, 16, 0, 0, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 56, 0, - 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 6, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 4, 2, 0, 0, - 1, 0, 0, 0, 204, 0, - 0, 0, 4, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 208, 1, 0, 0, 156, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 182, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, - 0, 0, 187, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 1, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 193, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 76, 97, 121, 101, 114, 84, - 101, 120, 116, 117, 114, 101, - 83, 97, 109, 112, 108, 101, - 114, 76, 105, 110, 101, 97, - 114, 0, 116, 82, 71, 66, - 0, 116, 77, 97, 115, 107, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 0, 171, 171, - 193, 0, 0, 0, 5, 0, - 0, 0, 228, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 92, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 124, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 135, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 108, 1, - 0, 0, 0, 0, 0, 0, - 145, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 160, 1, - 0, 0, 0, 0, 0, 0, - 176, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 192, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 2, 0, 0, 0, - 7, 7, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 100, 190, 0, 0, - 0, 0, 0, 0, 82, 101, - 110, 100, 101, 114, 82, 71, - 66, 65, 76, 97, 121, 101, - 114, 78, 111, 110, 80, 114, - 101, 109, 117, 108, 77, 97, - 115, 107, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 76, 8, 0, - 0, 68, 88, 66, 67, 190, - 117, 181, 57, 187, 108, 178, - 85, 11, 114, 197, 104, 54, - 155, 141, 115, 1, 0, 0, - 0, 76, 8, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 4, 2, 0, 0, 144, - 4, 0, 0, 12, 5, 0, - 0, 168, 7, 0, 0, 220, - 7, 0, 0, 65, 111, 110, - 57, 196, 1, 0, 0, 196, - 1, 0, 0, 0, 2, 254, - 255, 96, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 7, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 6, 0, 0, 2, 0, - 0, 1, 128, 3, 0, 170, - 160, 4, 0, 0, 4, 0, - 0, 6, 128, 0, 0, 208, - 144, 2, 0, 248, 160, 2, - 0, 208, 160, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 170, 128, 5, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 4, 0, 228, - 160, 0, 0, 85, 128, 1, - 0, 228, 128, 2, 0, 0, - 3, 1, 0, 15, 128, 1, - 0, 228, 128, 6, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 6, 128, 1, 0, 208, - 128, 3, 0, 208, 161, 5, - 0, 0, 3, 0, 0, 8, - 224, 0, 0, 0, 128, 0, - 0, 85, 128, 6, 0, 0, - 2, 0, 0, 1, 128, 3, - 0, 255, 160, 5, 0, 0, - 3, 0, 0, 4, 224, 0, - 0, 0, 128, 0, 0, 170, - 128, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 6, 0, 0, - 2, 0, 0, 1, 128, 1, - 0, 255, 128, 5, 0, 0, - 3, 1, 0, 7, 128, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 1, 0, 228, - 128, 7, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 9, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 8, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 10, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 11, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 132, - 2, 0, 0, 64, 0, 1, - 0, 161, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 194, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 1, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 130, - 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 14, 0, 0, - 8, 194, 32, 16, 0, 1, - 0, 0, 0, 6, 4, 16, - 0, 0, 0, 0, 0, 166, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 128, 65, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 2, - 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 3, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 14, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 148, 2, 0, 0, 3, - 0, 0, 0, 168, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 96, - 2, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 77, 97, 110, - 97, 103, 101, 114, 0, 124, - 0, 0, 0, 5, 0, 0, - 0, 240, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 2, 0, 0, - 0, 220, 1, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 136, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 147, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 157, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 172, 1, 0, - 0, 0, 0, 0, 0, 188, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 118, 82, 101, 110, 100, - 101, 114, 84, 97, 114, 103, - 101, 116, 79, 102, 102, 115, - 101, 116, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 102, 76, 97, 121, 101, - 114, 67, 111, 108, 111, 114, - 0, 84, 2, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 109, 80, 114, 111, 106, - 101, 99, 116, 105, 111, 110, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 29, 196, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 40, 5, 0, - 0, 68, 88, 66, 67, 134, - 242, 22, 210, 198, 226, 208, - 239, 25, 201, 212, 19, 217, - 12, 67, 204, 1, 0, 0, - 0, 40, 5, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 252, 0, 0, 0, 252, - 1, 0, 0, 120, 2, 0, - 0, 132, 4, 0, 0, 244, - 4, 0, 0, 65, 111, 110, - 57, 188, 0, 0, 0, 188, - 0, 0, 0, 0, 2, 255, - 255, 132, 0, 0, 0, 56, - 0, 0, 0, 1, 0, 44, - 0, 0, 0, 56, 0, 0, - 0, 56, 0, 2, 0, 36, - 0, 0, 0, 56, 0, 0, - 0, 0, 0, 1, 0, 1, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 31, - 0, 0, 2, 0, 0, 0, - 128, 0, 0, 15, 176, 31, - 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 31, - 0, 0, 2, 0, 0, 0, - 144, 1, 8, 15, 160, 1, - 0, 0, 2, 0, 0, 3, - 128, 0, 0, 235, 176, 66, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 228, 176, 0, - 8, 228, 160, 66, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 1, 8, 228, - 160, 5, 0, 0, 3, 1, - 0, 15, 128, 1, 0, 228, - 128, 0, 0, 0, 160, 5, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 255, 128, 1, - 0, 228, 128, 1, 0, 0, - 2, 0, 8, 15, 128, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 248, - 0, 0, 0, 64, 0, 0, - 0, 62, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 90, 0, 0, - 3, 0, 96, 16, 0, 0, - 0, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 0, - 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 1, 0, 0, - 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, - 0, 1, 0, 0, 0, 98, - 16, 0, 3, 194, 16, 16, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 104, - 0, 0, 2, 2, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 6, 128, 32, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 1, - 0, 0, 0, 230, 26, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 1, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 7, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 1, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 5, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 4, 2, 0, 0, 1, - 0, 0, 0, 204, 0, 0, - 0, 4, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 208, - 1, 0, 0, 156, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 182, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 187, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 1, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 193, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 76, - 97, 121, 101, 114, 84, 101, - 120, 116, 117, 114, 101, 83, - 97, 109, 112, 108, 101, 114, - 76, 105, 110, 101, 97, 114, - 0, 116, 82, 71, 66, 0, - 116, 77, 97, 115, 107, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 171, 171, 193, - 0, 0, 0, 5, 0, 0, - 0, 228, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 108, 1, 0, - 0, 0, 0, 0, 0, 124, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 108, 1, 0, - 0, 0, 0, 0, 0, 135, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 108, 1, 0, - 0, 0, 0, 0, 0, 145, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 2, - 0, 0, 0, 160, 1, 0, - 0, 0, 0, 0, 0, 176, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 0, - 0, 0, 0, 192, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 104, 0, 0, - 0, 3, 0, 0, 0, 8, - 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 92, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, - 3, 0, 0, 92, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 12, - 12, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, - 171, 171, 171, 79, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 83, 86, 95, 84, 97, - 114, 103, 101, 116, 0, 171, - 171, 129, 204, 0, 0, 0, - 0, 0, 0, 82, 101, 110, - 100, 101, 114, 82, 71, 66, - 65, 76, 97, 121, 101, 114, - 80, 114, 101, 109, 117, 108, - 80, 111, 105, 110, 116, 77, - 97, 115, 107, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 255, 255, 255, 255, 76, 8, - 0, 0, 68, 88, 66, 67, - 190, 117, 181, 57, 187, 108, - 178, 85, 11, 114, 197, 104, - 54, 155, 141, 115, 1, 0, - 0, 0, 76, 8, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 4, 2, 0, 0, - 144, 4, 0, 0, 12, 5, - 0, 0, 168, 7, 0, 0, - 220, 7, 0, 0, 65, 111, - 110, 57, 196, 1, 0, 0, - 196, 1, 0, 0, 0, 2, - 254, 255, 96, 1, 0, 0, - 100, 0, 0, 0, 5, 0, - 36, 0, 0, 0, 96, 0, - 0, 0, 96, 0, 0, 0, - 36, 0, 1, 0, 96, 0, - 0, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 2, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, - 6, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 7, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 254, 255, 31, 0, 0, 2, - 5, 0, 0, 128, 0, 0, - 15, 144, 6, 0, 0, 2, - 0, 0, 1, 128, 3, 0, - 170, 160, 4, 0, 0, 4, - 0, 0, 6, 128, 0, 0, - 208, 144, 2, 0, 248, 160, - 2, 0, 208, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 170, 128, 5, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 4, 0, - 228, 160, 0, 0, 85, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 6, 0, - 228, 160, 2, 0, 0, 3, - 0, 0, 6, 128, 1, 0, - 208, 128, 3, 0, 208, 161, - 5, 0, 0, 3, 0, 0, - 8, 224, 0, 0, 0, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 255, 160, 5, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 0, 0, - 170, 128, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, - 228, 144, 1, 0, 238, 160, - 1, 0, 228, 160, 6, 0, - 0, 2, 0, 0, 1, 128, - 1, 0, 255, 128, 5, 0, - 0, 3, 1, 0, 7, 128, - 0, 0, 0, 128, 1, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 1, 0, - 228, 128, 7, 0, 228, 161, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 8, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 11, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 132, 2, 0, 0, 64, 0, - 1, 0, 161, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 194, 32, 16, 0, - 1, 0, 0, 0, 104, 0, - 0, 2, 2, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 1, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 1, 0, - 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 0, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 70, 128, 32, 128, 65, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 14, 0, - 0, 8, 194, 32, 16, 0, - 1, 0, 0, 0, 6, 4, - 16, 0, 0, 0, 0, 0, - 166, 142, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 128, - 65, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, - 3, 0, 0, 0, 168, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 79, 99, - 99, 97, 115, 105, 111, 110, - 97, 108, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 124, 0, 0, 0, 5, 0, - 0, 0, 240, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 2, 0, - 0, 0, 220, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 1, 0, - 0, 0, 60, 2, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 104, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 147, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 172, 1, - 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 48, 2, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 84, 2, 0, 0, - 0, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 109, 80, 114, 111, - 106, 101, 99, 116, 105, 111, - 110, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, - 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, - 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 4, 210, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 108, 5, - 0, 0, 68, 88, 66, 67, - 186, 119, 163, 245, 195, 113, - 37, 97, 142, 174, 157, 244, - 160, 5, 164, 176, 1, 0, - 0, 0, 108, 5, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 252, 0, 0, 0, - 8, 2, 0, 0, 132, 2, - 0, 0, 200, 4, 0, 0, - 56, 5, 0, 0, 65, 111, - 110, 57, 188, 0, 0, 0, - 188, 0, 0, 0, 0, 2, - 255, 255, 132, 0, 0, 0, - 56, 0, 0, 0, 1, 0, - 44, 0, 0, 0, 56, 0, - 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, - 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 255, 255, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 176, - 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, - 31, 0, 0, 2, 0, 0, - 0, 144, 1, 8, 15, 160, - 1, 0, 0, 2, 0, 0, - 3, 128, 0, 0, 235, 176, - 66, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 228, 176, - 1, 8, 228, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 0, 8, - 228, 160, 5, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 0, 0, 0, 160, - 5, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 255, 128, - 1, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 4, 1, 0, 0, 64, 0, - 0, 0, 65, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 1, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 0, 0, 0, 0, 85, 85, - 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, - 16, 0, 1, 0, 0, 0, - 98, 16, 0, 3, 194, 16, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 230, 26, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 1, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 1, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 5, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 60, 2, 0, 0, - 1, 0, 0, 0, 4, 1, - 0, 0, 5, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 8, 2, 0, 0, 188, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 214, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 239, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 244, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 76, 97, 121, 101, - 114, 84, 101, 120, 116, 117, - 114, 101, 83, 97, 109, 112, - 108, 101, 114, 76, 105, 110, - 101, 97, 114, 0, 76, 97, - 121, 101, 114, 84, 101, 120, - 116, 117, 114, 101, 83, 97, - 109, 112, 108, 101, 114, 80, - 111, 105, 110, 116, 0, 116, - 82, 71, 66, 0, 116, 77, - 97, 115, 107, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 171, 250, 0, 0, 0, - 5, 0, 0, 0, 28, 1, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 148, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 180, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 191, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 201, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 216, 1, 0, 0, 0, 0, - 0, 0, 232, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 248, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, - 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 12, 12, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 104, 218, - 0, 0, 0, 0, 0, 0, - 82, 101, 110, 100, 101, 114, - 82, 71, 66, 65, 76, 97, - 121, 101, 114, 78, 111, 110, - 80, 114, 101, 109, 117, 108, - 80, 111, 105, 110, 116, 77, - 97, 115, 107, 0, 4, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 255, 255, 255, 255, 76, 8, - 0, 0, 68, 88, 66, 67, - 190, 117, 181, 57, 187, 108, - 178, 85, 11, 114, 197, 104, - 54, 155, 141, 115, 1, 0, - 0, 0, 76, 8, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 4, 2, 0, 0, - 144, 4, 0, 0, 12, 5, - 0, 0, 168, 7, 0, 0, - 220, 7, 0, 0, 65, 111, - 110, 57, 196, 1, 0, 0, - 196, 1, 0, 0, 0, 2, - 254, 255, 96, 1, 0, 0, - 100, 0, 0, 0, 5, 0, - 36, 0, 0, 0, 96, 0, - 0, 0, 96, 0, 0, 0, - 36, 0, 1, 0, 96, 0, - 0, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 2, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 1, 0, - 6, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 1, 0, - 7, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 4, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, - 254, 255, 31, 0, 0, 2, - 5, 0, 0, 128, 0, 0, - 15, 144, 6, 0, 0, 2, - 0, 0, 1, 128, 3, 0, - 170, 160, 4, 0, 0, 4, - 0, 0, 6, 128, 0, 0, - 208, 144, 2, 0, 248, 160, - 2, 0, 208, 160, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 170, 128, 5, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 4, 0, - 228, 160, 0, 0, 85, 128, - 1, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 6, 0, - 228, 160, 2, 0, 0, 3, - 0, 0, 6, 128, 1, 0, - 208, 128, 3, 0, 208, 161, - 5, 0, 0, 3, 0, 0, - 8, 224, 0, 0, 0, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 255, 160, 5, 0, - 0, 3, 0, 0, 4, 224, - 0, 0, 0, 128, 0, 0, - 170, 128, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, - 228, 144, 1, 0, 238, 160, - 1, 0, 228, 160, 6, 0, - 0, 2, 0, 0, 1, 128, - 1, 0, 255, 128, 5, 0, - 0, 3, 1, 0, 7, 128, - 0, 0, 0, 128, 1, 0, - 228, 128, 2, 0, 0, 3, - 0, 0, 15, 128, 1, 0, - 228, 128, 7, 0, 228, 161, - 5, 0, 0, 3, 0, 0, - 7, 128, 0, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 15, 128, - 0, 0, 85, 128, 9, 0, - 228, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 8, 0, - 228, 160, 0, 0, 0, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 15, 128, - 10, 0, 228, 160, 0, 0, - 170, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 15, 128, 11, 0, 228, 160, - 0, 0, 255, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 192, 0, 0, - 255, 128, 0, 0, 228, 160, - 0, 0, 228, 128, 1, 0, - 0, 2, 0, 0, 12, 192, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 132, 2, 0, 0, 64, 0, - 1, 0, 161, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 1, 0, - 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 2, 0, - 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, - 0, 3, 194, 32, 16, 0, - 1, 0, 0, 0, 104, 0, - 0, 2, 2, 0, 0, 0, - 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 1, 0, - 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 6, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, - 1, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 5, - 130, 0, 16, 0, 1, 0, - 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 0, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, - 70, 128, 32, 128, 65, 0, - 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 14, 0, - 0, 8, 194, 32, 16, 0, - 1, 0, 0, 0, 6, 4, - 16, 0, 0, 0, 0, 0, - 166, 142, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 128, - 65, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, - 1, 0, 0, 0, 86, 5, - 16, 0, 0, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 142, - 32, 0, 2, 0, 0, 0, - 2, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, - 70, 14, 16, 0, 1, 0, - 0, 0, 50, 0, 0, 10, - 242, 32, 16, 0, 0, 0, - 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, - 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, - 3, 0, 0, 0, 168, 0, - 0, 0, 3, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 79, 99, - 99, 97, 115, 105, 111, 110, - 97, 108, 76, 97, 121, 101, - 114, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 77, 97, - 110, 97, 103, 101, 114, 0, - 124, 0, 0, 0, 5, 0, - 0, 0, 240, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 133, 0, 0, 0, 2, 0, - 0, 0, 220, 1, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 152, 0, 0, 0, 1, 0, - 0, 0, 60, 2, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 104, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 136, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 147, 1, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 120, 1, - 0, 0, 0, 0, 0, 0, - 157, 1, 0, 0, 48, 0, - 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 172, 1, - 0, 0, 0, 0, 0, 0, - 188, 1, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, - 2, 0, 0, 0, 204, 1, - 0, 0, 0, 0, 0, 0, - 118, 84, 101, 120, 116, 117, - 114, 101, 67, 111, 111, 114, - 100, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 118, 76, 97, 121, - 101, 114, 81, 117, 97, 100, - 0, 118, 77, 97, 115, 107, - 81, 117, 97, 100, 0, 102, - 76, 97, 121, 101, 114, 79, - 112, 97, 99, 105, 116, 121, - 0, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 109, 76, 97, 121, 101, 114, - 84, 114, 97, 110, 115, 102, - 111, 114, 109, 0, 3, 0, - 3, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 12, 2, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 48, 2, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 0, 0, - 0, 0, 118, 82, 101, 110, - 100, 101, 114, 84, 97, 114, - 103, 101, 116, 79, 102, 102, - 115, 101, 116, 0, 1, 0, - 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 102, 76, 97, 121, - 101, 114, 67, 111, 108, 111, - 114, 0, 84, 2, 0, 0, - 0, 0, 0, 0, 64, 0, - 0, 0, 2, 0, 0, 0, - 204, 1, 0, 0, 0, 0, - 0, 0, 109, 80, 114, 111, - 106, 101, 99, 116, 105, 111, - 110, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, - 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, - 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, - 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, - 171, 171, 50, 224, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 108, 5, - 0, 0, 68, 88, 66, 67, - 186, 119, 163, 245, 195, 113, - 37, 97, 142, 174, 157, 244, - 160, 5, 164, 176, 1, 0, - 0, 0, 108, 5, 0, 0, - 6, 0, 0, 0, 56, 0, - 0, 0, 252, 0, 0, 0, - 8, 2, 0, 0, 132, 2, - 0, 0, 200, 4, 0, 0, - 56, 5, 0, 0, 65, 111, - 110, 57, 188, 0, 0, 0, - 188, 0, 0, 0, 0, 2, - 255, 255, 132, 0, 0, 0, - 56, 0, 0, 0, 1, 0, - 44, 0, 0, 0, 56, 0, - 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, - 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 255, 255, - 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 176, - 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, - 31, 0, 0, 2, 0, 0, - 0, 144, 1, 8, 15, 160, - 1, 0, 0, 2, 0, 0, - 3, 128, 0, 0, 235, 176, - 66, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 228, 176, - 1, 8, 228, 160, 66, 0, - 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 0, 8, - 228, 160, 5, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 0, 0, 0, 160, - 5, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 255, 128, - 1, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, - 4, 1, 0, 0, 64, 0, - 0, 0, 65, 0, 0, 0, - 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 90, 0, - 0, 3, 0, 96, 16, 0, - 1, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, - 0, 0, 0, 0, 85, 85, - 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, - 16, 0, 1, 0, 0, 0, - 98, 16, 0, 3, 194, 16, - 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 2, 0, - 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, - 242, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, - 0, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 230, 26, - 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 1, 0, - 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 56, 0, - 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 1, 0, - 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, - 0, 0, 5, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, - 69, 70, 60, 2, 0, 0, - 1, 0, 0, 0, 4, 1, - 0, 0, 5, 0, 0, 0, - 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, - 8, 2, 0, 0, 188, 0, - 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 214, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 239, 0, 0, 0, - 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 244, 0, - 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, - 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 76, 97, 121, 101, - 114, 84, 101, 120, 116, 117, - 114, 101, 83, 97, 109, 112, - 108, 101, 114, 76, 105, 110, - 101, 97, 114, 0, 76, 97, - 121, 101, 114, 84, 101, 120, - 116, 117, 114, 101, 83, 97, - 109, 112, 108, 101, 114, 80, - 111, 105, 110, 116, 0, 116, - 82, 71, 66, 0, 116, 77, - 97, 115, 107, 0, 80, 101, - 114, 76, 97, 121, 101, 114, - 0, 171, 250, 0, 0, 0, - 5, 0, 0, 0, 28, 1, - 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 148, 1, 0, 0, - 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 180, 1, 0, 0, - 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 191, 1, 0, 0, - 32, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, - 0, 0, 201, 1, 0, 0, - 48, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, - 216, 1, 0, 0, 0, 0, - 0, 0, 232, 1, 0, 0, - 64, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, - 248, 1, 0, 0, 0, 0, - 0, 0, 118, 84, 101, 120, - 116, 117, 114, 101, 67, 111, - 111, 114, 100, 115, 0, 171, - 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 76, - 97, 121, 101, 114, 81, 117, - 97, 100, 0, 118, 77, 97, - 115, 107, 81, 117, 97, 100, - 0, 102, 76, 97, 121, 101, - 114, 79, 112, 97, 99, 105, - 116, 121, 0, 171, 0, 0, - 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 109, 76, 97, 121, - 101, 114, 84, 114, 97, 110, - 115, 102, 111, 114, 109, 0, - 3, 0, 3, 0, 4, 0, - 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, - 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, - 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, - 0, 0, 12, 12, 0, 0, - 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 150, 232, - 0, 0, 0, 0, 0, 0, - 82, 101, 110, 100, 101, 114, - 89, 67, 98, 67, 114, 76, - 97, 121, 101, 114, 77, 97, - 115, 107, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 76, 8, 0, - 0, 68, 88, 66, 67, 190, - 117, 181, 57, 187, 108, 178, - 85, 11, 114, 197, 104, 54, - 155, 141, 115, 1, 0, 0, - 0, 76, 8, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 4, 2, 0, 0, 144, - 4, 0, 0, 12, 5, 0, - 0, 168, 7, 0, 0, 220, - 7, 0, 0, 65, 111, 110, - 57, 196, 1, 0, 0, 196, - 1, 0, 0, 0, 2, 254, - 255, 96, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 7, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 6, 0, 0, 2, 0, - 0, 1, 128, 3, 0, 170, - 160, 4, 0, 0, 4, 0, - 0, 6, 128, 0, 0, 208, - 144, 2, 0, 248, 160, 2, - 0, 208, 160, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 170, 128, 5, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 4, 0, 228, - 160, 0, 0, 85, 128, 1, - 0, 228, 128, 2, 0, 0, - 3, 1, 0, 15, 128, 1, - 0, 228, 128, 6, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 6, 128, 1, 0, 208, - 128, 3, 0, 208, 161, 5, - 0, 0, 3, 0, 0, 8, - 224, 0, 0, 0, 128, 0, - 0, 85, 128, 6, 0, 0, - 2, 0, 0, 1, 128, 3, - 0, 255, 160, 5, 0, 0, - 3, 0, 0, 4, 224, 0, - 0, 0, 128, 0, 0, 170, - 128, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 6, 0, 0, - 2, 0, 0, 1, 128, 1, - 0, 255, 128, 5, 0, 0, - 3, 1, 0, 7, 128, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 1, 0, 228, - 128, 7, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 9, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 8, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 10, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 11, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 132, - 2, 0, 0, 64, 0, 1, - 0, 161, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 194, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 1, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 130, - 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 14, 0, 0, - 8, 194, 32, 16, 0, 1, - 0, 0, 0, 6, 4, 16, - 0, 0, 0, 0, 0, 166, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 128, 65, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 2, - 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 3, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 14, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 148, 2, 0, 0, 3, - 0, 0, 0, 168, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 96, - 2, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 77, 97, 110, - 97, 103, 101, 114, 0, 124, - 0, 0, 0, 5, 0, 0, - 0, 240, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 2, 0, 0, - 0, 220, 1, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 136, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 147, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 157, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 172, 1, 0, - 0, 0, 0, 0, 0, 188, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 118, 82, 101, 110, 100, - 101, 114, 84, 97, 114, 103, - 101, 116, 79, 102, 102, 115, - 101, 116, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 102, 76, 97, 121, 101, - 114, 67, 111, 108, 111, 114, - 0, 84, 2, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 109, 80, 114, 111, 106, - 101, 99, 116, 105, 111, 110, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 83, 238, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 52, 8, 0, - 0, 68, 88, 66, 67, 1, - 74, 129, 243, 237, 178, 75, - 1, 68, 217, 73, 188, 217, - 60, 1, 254, 1, 0, 0, - 0, 52, 8, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 24, 2, 0, 0, 196, - 4, 0, 0, 64, 5, 0, - 0, 144, 7, 0, 0, 0, - 8, 0, 0, 65, 111, 110, - 57, 216, 1, 0, 0, 216, - 1, 0, 0, 0, 2, 255, - 255, 152, 1, 0, 0, 64, - 0, 0, 0, 1, 0, 52, - 0, 0, 0, 64, 0, 0, - 0, 64, 0, 4, 0, 36, - 0, 0, 0, 64, 0, 0, - 0, 0, 0, 1, 0, 1, - 0, 2, 0, 2, 0, 3, - 0, 3, 0, 0, 0, 3, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 255, - 255, 81, 0, 0, 5, 1, - 0, 15, 160, 115, 128, 0, - 191, 18, 131, 128, 189, 182, - 74, 204, 63, 205, 30, 80, - 63, 81, 0, 0, 5, 2, - 0, 15, 160, 103, 10, 149, - 63, 76, 26, 1, 64, 196, - 148, 200, 62, 0, 0, 128, - 63, 31, 0, 0, 2, 0, - 0, 0, 128, 0, 0, 15, - 176, 31, 0, 0, 2, 0, - 0, 0, 144, 0, 8, 15, - 160, 31, 0, 0, 2, 0, - 0, 0, 144, 1, 8, 15, - 160, 31, 0, 0, 2, 0, - 0, 0, 144, 2, 8, 15, - 160, 31, 0, 0, 2, 0, - 0, 0, 144, 3, 8, 15, - 160, 66, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 176, 0, 8, 228, 160, 66, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 228, 176, 2, - 8, 228, 160, 2, 0, 0, - 3, 0, 0, 1, 128, 1, - 0, 255, 128, 1, 0, 0, - 160, 5, 0, 0, 3, 0, - 0, 3, 128, 0, 0, 0, - 128, 1, 0, 238, 160, 2, - 0, 0, 3, 0, 0, 4, - 128, 0, 0, 255, 128, 1, - 0, 85, 160, 4, 0, 0, - 4, 0, 0, 2, 128, 0, - 0, 170, 128, 2, 0, 0, - 160, 0, 0, 85, 129, 4, - 0, 0, 4, 1, 0, 1, - 128, 0, 0, 170, 128, 2, - 0, 0, 160, 0, 0, 0, - 128, 1, 0, 0, 2, 2, - 0, 3, 128, 0, 0, 235, - 176, 66, 0, 0, 3, 3, - 0, 15, 128, 0, 0, 228, - 176, 1, 8, 228, 160, 66, - 0, 0, 3, 2, 0, 15, - 128, 2, 0, 228, 128, 3, - 8, 228, 160, 2, 0, 0, - 3, 0, 0, 1, 128, 3, - 0, 255, 128, 1, 0, 0, - 160, 4, 0, 0, 4, 1, - 0, 2, 128, 0, 0, 0, - 128, 2, 0, 170, 161, 0, - 0, 85, 128, 5, 0, 0, - 3, 0, 0, 1, 128, 0, - 0, 0, 128, 2, 0, 85, - 160, 4, 0, 0, 4, 1, - 0, 4, 128, 0, 0, 170, - 128, 2, 0, 0, 160, 0, - 0, 0, 128, 1, 0, 0, - 2, 1, 0, 8, 128, 2, - 0, 255, 160, 5, 0, 0, - 3, 0, 0, 15, 128, 1, - 0, 228, 128, 0, 0, 0, - 160, 5, 0, 0, 3, 0, - 0, 15, 128, 2, 0, 255, - 128, 0, 0, 228, 128, 1, - 0, 0, 2, 0, 8, 15, - 128, 0, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 164, 2, 0, 0, 64, - 0, 0, 0, 169, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, - 85, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 1, - 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 2, 0, 0, - 0, 85, 85, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 3, 0, 0, 0, 85, - 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, - 0, 0, 0, 98, 16, 0, - 3, 194, 16, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, - 0, 0, 0, 104, 0, 0, - 2, 3, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 2, - 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 7, 18, 0, 16, - 0, 0, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 115, - 128, 0, 191, 56, 0, 0, - 10, 50, 0, 16, 0, 0, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 2, - 64, 0, 0, 182, 74, 204, - 63, 205, 30, 80, 63, 0, - 0, 0, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 66, - 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 1, - 0, 0, 0, 1, 64, 0, - 0, 18, 131, 128, 189, 50, - 0, 0, 10, 34, 0, 16, - 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 103, - 10, 149, 63, 26, 0, 16, - 128, 65, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 0, - 9, 18, 0, 16, 0, 1, - 0, 0, 0, 42, 0, 16, - 0, 0, 0, 0, 0, 1, - 64, 0, 0, 103, 10, 149, - 63, 10, 0, 16, 0, 0, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 2, - 0, 0, 0, 70, 16, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 1, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 7, 18, 0, 16, 0, 0, - 0, 0, 0, 58, 0, 16, - 0, 2, 0, 0, 0, 1, - 64, 0, 0, 115, 128, 0, - 191, 50, 0, 0, 10, 34, - 0, 16, 0, 1, 0, 0, - 0, 10, 0, 16, 128, 65, - 0, 0, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 196, - 148, 200, 62, 26, 0, 16, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 18, 0, 16, - 0, 0, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 76, - 26, 1, 64, 50, 0, 0, - 9, 66, 0, 16, 0, 1, - 0, 0, 0, 42, 0, 16, - 0, 0, 0, 0, 0, 1, - 64, 0, 0, 103, 10, 149, - 63, 10, 0, 16, 0, 0, - 0, 0, 0, 54, 0, 0, - 5, 130, 0, 16, 0, 1, - 0, 0, 0, 1, 64, 0, - 0, 0, 0, 128, 63, 56, - 0, 0, 8, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 6, 128, 32, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, - 0, 230, 26, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 3, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 246, 15, 16, - 0, 1, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 17, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 72, - 2, 0, 0, 1, 0, 0, - 0, 16, 1, 0, 0, 6, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, - 1, 0, 0, 20, 2, 0, - 0, 220, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 246, 0, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 249, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 1, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 253, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 2, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 1, 1, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 3, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 7, - 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 76, 97, 121, 101, 114, - 84, 101, 120, 116, 117, 114, - 101, 83, 97, 109, 112, 108, - 101, 114, 76, 105, 110, 101, - 97, 114, 0, 116, 89, 0, - 116, 67, 98, 0, 116, 67, - 114, 0, 116, 77, 97, 115, - 107, 0, 80, 101, 114, 76, - 97, 121, 101, 114, 0, 7, - 1, 0, 0, 5, 0, 0, - 0, 40, 1, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 160, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 176, 1, 0, - 0, 0, 0, 0, 0, 192, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 176, 1, 0, - 0, 0, 0, 0, 0, 203, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 176, 1, 0, - 0, 0, 0, 0, 0, 213, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 2, - 0, 0, 0, 228, 1, 0, - 0, 0, 0, 0, 0, 244, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 0, - 0, 0, 0, 4, 2, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 104, 0, 0, - 0, 3, 0, 0, 0, 8, - 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, - 0, 0, 0, 92, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, - 3, 0, 0, 92, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 12, - 12, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, - 171, 171, 171, 79, 83, 71, - 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 83, 86, 95, 84, 97, - 114, 103, 101, 116, 0, 171, - 171, 183, 246, 0, 0, 0, - 0, 0, 0, 82, 101, 110, - 100, 101, 114, 67, 111, 109, - 112, 111, 110, 101, 110, 116, - 65, 108, 112, 104, 97, 76, - 97, 121, 101, 114, 77, 97, - 115, 107, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 76, 8, 0, - 0, 68, 88, 66, 67, 190, - 117, 181, 57, 187, 108, 178, - 85, 11, 114, 197, 104, 54, - 155, 141, 115, 1, 0, 0, - 0, 76, 8, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 4, 2, 0, 0, 144, - 4, 0, 0, 12, 5, 0, - 0, 168, 7, 0, 0, 220, - 7, 0, 0, 65, 111, 110, - 57, 196, 1, 0, 0, 196, - 1, 0, 0, 0, 2, 254, - 255, 96, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 7, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 6, 0, 0, 2, 0, - 0, 1, 128, 3, 0, 170, - 160, 4, 0, 0, 4, 0, - 0, 6, 128, 0, 0, 208, - 144, 2, 0, 248, 160, 2, - 0, 208, 160, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 170, 128, 5, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 4, 0, 228, - 160, 0, 0, 85, 128, 1, - 0, 228, 128, 2, 0, 0, - 3, 1, 0, 15, 128, 1, - 0, 228, 128, 6, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 6, 128, 1, 0, 208, - 128, 3, 0, 208, 161, 5, - 0, 0, 3, 0, 0, 8, - 224, 0, 0, 0, 128, 0, - 0, 85, 128, 6, 0, 0, - 2, 0, 0, 1, 128, 3, - 0, 255, 160, 5, 0, 0, - 3, 0, 0, 4, 224, 0, - 0, 0, 128, 0, 0, 170, - 128, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 6, 0, 0, - 2, 0, 0, 1, 128, 1, - 0, 255, 128, 5, 0, 0, - 3, 1, 0, 7, 128, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 1, 0, 228, - 128, 7, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 9, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 8, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 10, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 11, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 132, - 2, 0, 0, 64, 0, 1, - 0, 161, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 194, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 1, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 130, - 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 14, 0, 0, - 8, 194, 32, 16, 0, 1, - 0, 0, 0, 6, 4, 16, - 0, 0, 0, 0, 0, 166, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 128, 65, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 2, - 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 3, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 14, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 148, 2, 0, 0, 3, - 0, 0, 0, 168, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 96, - 2, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 77, 97, 110, - 97, 103, 101, 114, 0, 124, - 0, 0, 0, 5, 0, 0, - 0, 240, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 2, 0, 0, - 0, 220, 1, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 136, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 147, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 157, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 172, 1, 0, - 0, 0, 0, 0, 0, 188, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 118, 82, 101, 110, 100, - 101, 114, 84, 97, 114, 103, - 101, 116, 79, 102, 102, 115, - 101, 116, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 102, 76, 97, 121, 101, - 114, 67, 111, 108, 111, 114, - 0, 84, 2, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 109, 80, 114, 111, 106, - 101, 99, 116, 105, 111, 110, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 69, 255, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 160, 6, 0, - 0, 68, 88, 66, 67, 178, - 167, 73, 233, 167, 120, 251, - 206, 98, 157, 244, 246, 26, - 126, 89, 155, 1, 0, 0, - 0, 160, 6, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 124, 1, 0, 0, 52, - 3, 0, 0, 176, 3, 0, - 0, 228, 5, 0, 0, 84, - 6, 0, 0, 65, 111, 110, - 57, 60, 1, 0, 0, 60, - 1, 0, 0, 0, 2, 255, - 255, 0, 1, 0, 0, 60, - 0, 0, 0, 1, 0, 48, - 0, 0, 0, 60, 0, 0, - 0, 60, 0, 3, 0, 36, - 0, 0, 0, 60, 0, 0, - 0, 0, 0, 1, 0, 1, - 0, 2, 0, 2, 0, 0, - 0, 3, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 2, 255, 255, 81, 0, 0, - 5, 1, 0, 15, 160, 0, - 0, 128, 63, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 0, - 2, 0, 0, 0, 128, 0, - 0, 15, 176, 31, 0, 0, - 2, 0, 0, 0, 144, 0, - 8, 15, 160, 31, 0, 0, - 2, 0, 0, 0, 144, 1, - 8, 15, 160, 31, 0, 0, - 2, 0, 0, 0, 144, 2, - 8, 15, 160, 1, 0, 0, - 2, 0, 0, 3, 128, 0, - 0, 235, 176, 66, 0, 0, - 3, 0, 0, 15, 128, 0, - 0, 228, 128, 2, 8, 228, - 160, 5, 0, 0, 3, 0, - 0, 1, 128, 0, 0, 255, - 128, 0, 0, 0, 160, 66, - 0, 0, 3, 1, 0, 15, - 128, 0, 0, 228, 176, 0, - 8, 228, 160, 66, 0, 0, - 3, 2, 0, 15, 128, 0, - 0, 228, 176, 1, 8, 228, - 160, 2, 0, 0, 3, 2, - 0, 15, 128, 1, 0, 228, - 128, 2, 0, 228, 129, 2, - 0, 0, 3, 2, 0, 15, - 128, 2, 0, 228, 128, 1, - 0, 0, 160, 1, 0, 0, - 2, 1, 0, 8, 128, 2, - 0, 85, 128, 5, 0, 0, - 3, 2, 0, 15, 128, 0, - 0, 0, 128, 2, 0, 228, - 128, 5, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 0, - 128, 1, 0, 228, 128, 1, - 0, 0, 2, 0, 8, 15, - 128, 0, 0, 228, 128, 1, - 0, 0, 2, 1, 8, 15, - 128, 2, 0, 228, 128, 255, - 255, 0, 0, 83, 72, 68, - 82, 176, 1, 0, 0, 64, - 0, 0, 0, 108, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, - 85, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 1, - 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, - 112, 16, 0, 2, 0, 0, - 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, - 0, 1, 0, 0, 0, 98, - 16, 0, 3, 194, 16, 16, - 0, 1, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, - 0, 1, 0, 0, 0, 104, - 0, 0, 2, 3, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 1, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 128, 65, - 0, 0, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 0, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 128, - 63, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, - 63, 54, 0, 0, 5, 130, - 0, 16, 0, 1, 0, 0, - 0, 26, 0, 16, 0, 0, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 2, - 0, 0, 0, 230, 26, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 2, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 18, 0, 16, 0, 2, - 0, 0, 0, 58, 0, 16, - 0, 2, 0, 0, 0, 10, - 128, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 56, - 0, 0, 7, 242, 32, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 6, 0, 16, 0, 2, - 0, 0, 0, 56, 0, 0, - 7, 242, 32, 16, 0, 1, - 0, 0, 0, 70, 14, 16, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 2, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 10, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 44, 2, 0, 0, 1, - 0, 0, 0, 244, 0, 0, - 0, 5, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 248, - 1, 0, 0, 188, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 214, - 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, - 0, 219, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, - 255, 255, 255, 1, 0, 0, - 0, 1, 0, 0, 0, 12, - 0, 0, 0, 229, 0, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 2, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 235, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 76, 97, 121, 101, 114, - 84, 101, 120, 116, 117, 114, - 101, 83, 97, 109, 112, 108, - 101, 114, 76, 105, 110, 101, - 97, 114, 0, 116, 82, 71, - 66, 0, 116, 82, 71, 66, - 87, 104, 105, 116, 101, 0, - 116, 77, 97, 115, 107, 0, - 80, 101, 114, 76, 97, 121, - 101, 114, 0, 235, 0, 0, - 0, 5, 0, 0, 0, 12, - 1, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 132, 1, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 148, 1, 0, 0, 0, - 0, 0, 0, 164, 1, 0, - 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 148, 1, 0, 0, 0, - 0, 0, 0, 175, 1, 0, - 0, 32, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 148, 1, 0, 0, 0, - 0, 0, 0, 185, 1, 0, - 0, 48, 0, 0, 0, 4, - 0, 0, 0, 2, 0, 0, - 0, 200, 1, 0, 0, 0, - 0, 0, 0, 216, 1, 0, - 0, 64, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 232, 1, 0, 0, 0, - 0, 0, 0, 118, 84, 101, - 120, 116, 117, 114, 101, 67, - 111, 111, 114, 100, 115, 0, - 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, - 76, 97, 121, 101, 114, 81, - 117, 97, 100, 0, 118, 77, - 97, 115, 107, 81, 117, 97, - 100, 0, 102, 76, 97, 121, - 101, 114, 79, 112, 97, 99, - 105, 116, 121, 0, 171, 0, - 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 76, 97, - 121, 101, 114, 84, 114, 97, - 110, 115, 102, 111, 114, 109, - 0, 3, 0, 3, 0, 4, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 3, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 12, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 68, - 0, 0, 0, 2, 0, 0, - 0, 8, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 56, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 169, - 7, 1, 0, 0, 0, 0, - 0, 82, 101, 110, 100, 101, - 114, 83, 111, 108, 105, 100, - 67, 111, 108, 111, 114, 76, - 97, 121, 101, 114, 77, 97, - 115, 107, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 255, - 255, 255, 255, 76, 8, 0, - 0, 68, 88, 66, 67, 190, - 117, 181, 57, 187, 108, 178, - 85, 11, 114, 197, 104, 54, - 155, 141, 115, 1, 0, 0, - 0, 76, 8, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 4, 2, 0, 0, 144, - 4, 0, 0, 12, 5, 0, - 0, 168, 7, 0, 0, 220, - 7, 0, 0, 65, 111, 110, - 57, 196, 1, 0, 0, 196, - 1, 0, 0, 0, 2, 254, - 255, 96, 1, 0, 0, 100, - 0, 0, 0, 5, 0, 36, - 0, 0, 0, 96, 0, 0, - 0, 96, 0, 0, 0, 36, - 0, 1, 0, 96, 0, 0, - 0, 0, 0, 3, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 2, 0, 4, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 7, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 4, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 254, - 255, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, - 144, 6, 0, 0, 2, 0, - 0, 1, 128, 3, 0, 170, - 160, 4, 0, 0, 4, 0, - 0, 6, 128, 0, 0, 208, - 144, 2, 0, 248, 160, 2, - 0, 208, 160, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 170, 128, 5, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 4, 0, 228, - 160, 0, 0, 85, 128, 1, - 0, 228, 128, 2, 0, 0, - 3, 1, 0, 15, 128, 1, - 0, 228, 128, 6, 0, 228, - 160, 2, 0, 0, 3, 0, - 0, 6, 128, 1, 0, 208, - 128, 3, 0, 208, 161, 5, - 0, 0, 3, 0, 0, 8, - 224, 0, 0, 0, 128, 0, - 0, 85, 128, 6, 0, 0, - 2, 0, 0, 1, 128, 3, - 0, 255, 160, 5, 0, 0, - 3, 0, 0, 4, 224, 0, - 0, 0, 128, 0, 0, 170, - 128, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, - 144, 1, 0, 238, 160, 1, - 0, 228, 160, 6, 0, 0, - 2, 0, 0, 1, 128, 1, - 0, 255, 128, 5, 0, 0, - 3, 1, 0, 7, 128, 0, - 0, 0, 128, 1, 0, 228, - 128, 2, 0, 0, 3, 0, - 0, 15, 128, 1, 0, 228, - 128, 7, 0, 228, 161, 5, - 0, 0, 3, 0, 0, 7, - 128, 0, 0, 255, 128, 0, - 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 0, - 0, 85, 128, 9, 0, 228, - 160, 4, 0, 0, 4, 1, - 0, 15, 128, 8, 0, 228, - 160, 0, 0, 0, 128, 1, - 0, 228, 128, 4, 0, 0, - 4, 1, 0, 15, 128, 10, - 0, 228, 160, 0, 0, 170, - 128, 1, 0, 228, 128, 4, - 0, 0, 4, 0, 0, 15, - 128, 11, 0, 228, 160, 0, - 0, 255, 128, 1, 0, 228, - 128, 4, 0, 0, 4, 0, - 0, 3, 192, 0, 0, 255, - 128, 0, 0, 228, 160, 0, - 0, 228, 128, 1, 0, 0, - 2, 0, 0, 12, 192, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 132, - 2, 0, 0, 64, 0, 1, - 0, 161, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 8, - 0, 0, 0, 89, 0, 0, - 4, 70, 142, 32, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 89, 0, 0, 4, 70, - 142, 32, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, - 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, - 3, 194, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 50, - 0, 0, 11, 50, 0, 16, - 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 56, 0, 0, 8, 242, - 0, 16, 0, 1, 0, 0, - 0, 86, 5, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 5, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 6, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 0, 0, 0, 8, 242, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 0, - 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 14, 0, 0, - 7, 114, 0, 16, 0, 1, - 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 130, - 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, - 9, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 14, 0, 0, - 8, 194, 32, 16, 0, 1, - 0, 0, 0, 6, 4, 16, - 0, 0, 0, 0, 0, 166, - 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 128, 65, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, - 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, - 0, 70, 2, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 0, 16, 0, 1, - 0, 0, 0, 86, 5, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, - 0, 1, 0, 0, 0, 70, - 142, 32, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, - 0, 2, 0, 0, 0, 2, - 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 70, - 14, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, - 32, 16, 0, 0, 0, 0, - 0, 70, 142, 32, 0, 2, - 0, 0, 0, 3, 0, 0, - 0, 246, 15, 16, 0, 0, - 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 50, - 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 14, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, - 70, 148, 2, 0, 0, 3, - 0, 0, 0, 168, 0, 0, - 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 96, - 2, 0, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 80, 101, 114, - 76, 97, 121, 101, 114, 0, - 80, 101, 114, 79, 99, 99, - 97, 115, 105, 111, 110, 97, - 108, 76, 97, 121, 101, 114, - 0, 80, 101, 114, 76, 97, - 121, 101, 114, 77, 97, 110, - 97, 103, 101, 114, 0, 124, - 0, 0, 0, 5, 0, 0, - 0, 240, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 133, - 0, 0, 0, 2, 0, 0, - 0, 220, 1, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, - 1, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 136, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 147, - 1, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 120, 1, 0, - 0, 0, 0, 0, 0, 157, - 1, 0, 0, 48, 0, 0, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 172, 1, 0, - 0, 0, 0, 0, 0, 188, - 1, 0, 0, 64, 0, 0, - 0, 64, 0, 0, 0, 2, - 0, 0, 0, 204, 1, 0, - 0, 0, 0, 0, 0, 118, - 84, 101, 120, 116, 117, 114, - 101, 67, 111, 111, 114, 100, - 115, 0, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 76, 97, 121, 101, - 114, 81, 117, 97, 100, 0, - 118, 77, 97, 115, 107, 81, - 117, 97, 100, 0, 102, 76, - 97, 121, 101, 114, 79, 112, - 97, 99, 105, 116, 121, 0, - 171, 0, 0, 3, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, - 76, 97, 121, 101, 114, 84, - 114, 97, 110, 115, 102, 111, - 114, 109, 0, 3, 0, 3, - 0, 4, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 16, - 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, - 0, 118, 82, 101, 110, 100, - 101, 114, 84, 97, 114, 103, - 101, 116, 79, 102, 102, 115, - 101, 116, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 102, 76, 97, 121, 101, - 114, 67, 111, 108, 111, 114, - 0, 84, 2, 0, 0, 0, - 0, 0, 0, 64, 0, 0, - 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, - 0, 109, 80, 114, 111, 106, - 101, 99, 116, 105, 111, 110, - 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, - 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, - 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 159, 14, 1, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 244, 3, 0, - 0, 68, 88, 66, 67, 238, - 234, 249, 25, 8, 157, 205, - 248, 243, 67, 9, 213, 110, - 126, 232, 189, 1, 0, 0, - 0, 244, 3, 0, 0, 6, - 0, 0, 0, 56, 0, 0, - 0, 204, 0, 0, 0, 112, - 1, 0, 0, 236, 1, 0, - 0, 80, 3, 0, 0, 192, - 3, 0, 0, 65, 111, 110, - 57, 140, 0, 0, 0, 140, - 0, 0, 0, 0, 2, 255, - 255, 88, 0, 0, 0, 52, - 0, 0, 0, 1, 0, 40, - 0, 0, 0, 52, 0, 0, - 0, 52, 0, 1, 0, 36, - 0, 0, 0, 52, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 255, - 255, 31, 0, 0, 2, 0, - 0, 0, 128, 0, 0, 15, - 176, 31, 0, 0, 2, 0, - 0, 0, 144, 0, 8, 15, - 160, 1, 0, 0, 2, 0, - 0, 3, 128, 0, 0, 235, - 176, 66, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 228, - 128, 0, 8, 228, 160, 5, - 0, 0, 3, 0, 0, 15, - 128, 0, 0, 255, 128, 0, - 0, 228, 160, 1, 0, 0, - 2, 0, 8, 15, 128, 0, - 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 156, - 0, 0, 0, 64, 0, 0, - 0, 39, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 90, 0, 0, - 3, 0, 96, 16, 0, 0, - 0, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 0, - 0, 0, 0, 85, 85, 0, - 0, 98, 16, 0, 3, 194, - 16, 16, 0, 1, 0, 0, - 0, 101, 0, 0, 3, 242, - 32, 16, 0, 0, 0, 0, - 0, 104, 0, 0, 2, 1, - 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 0, - 0, 0, 0, 230, 26, 16, - 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, - 0, 0, 0, 56, 0, 0, - 8, 242, 32, 16, 0, 0, - 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 62, - 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 92, - 1, 0, 0, 1, 0, 0, - 0, 176, 0, 0, 0, 3, - 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, - 1, 0, 0, 40, 1, 0, - 0, 124, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 150, 0, 0, - 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 156, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 76, 97, 121, 101, 114, - 84, 101, 120, 116, 117, 114, - 101, 83, 97, 109, 112, 108, - 101, 114, 76, 105, 110, 101, - 97, 114, 0, 116, 77, 97, - 115, 107, 0, 80, 101, 114, - 79, 99, 99, 97, 115, 105, - 111, 110, 97, 108, 76, 97, - 121, 101, 114, 0, 171, 156, - 0, 0, 0, 2, 0, 0, - 0, 200, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 248, - 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 12, 1, 0, - 0, 0, 0, 0, 0, 28, - 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, - 0, 0, 0, 12, 1, 0, - 0, 0, 0, 0, 0, 118, - 82, 101, 110, 100, 101, 114, - 84, 97, 114, 103, 101, 116, - 79, 102, 102, 115, 101, 116, - 0, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, - 76, 97, 121, 101, 114, 67, - 111, 108, 111, 114, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, - 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, - 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 12, 0, - 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 3, - 23, 1, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 128, - 0, 0, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 48, 0, 0, 0, 20, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, - 0, 0, 0, 20, 0, 0, - 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 0, - 0, 20, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 118, 0, 0, 0, 90, - 0, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 169, - 0, 0, 0, 141, 0, 0, - 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 0, - 0, 32, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 204, 0, 0, - 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 224, 0, 0, 0, 20, - 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 236, - 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 252, - 0, 0, 0, 141, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 1, 0, - 0, 19, 1, 0, 0, 0, - 0, 0, 0, 255, 255, 255, - 255, 9, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 54, - 1, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 66, 1, 0, - 0, 38, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 78, 1, 0, 0, 39, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 90, - 1, 0, 0, 40, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 102, 1, 0, - 0, 41, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 114, 1, 0, 0, 42, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 126, - 1, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 138, 1, 0, - 0, 44, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 150, 1, 0, 0, 0, - 0, 0, 0, 162, 1, 0, - 0, 19, 1, 0, 0, 0, - 0, 0, 0, 255, 255, 255, - 255, 9, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 172, - 1, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 184, 1, 0, - 0, 38, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 196, 1, 0, 0, 39, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 208, - 1, 0, 0, 40, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 220, 1, 0, - 0, 41, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 232, 1, 0, 0, 42, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 244, - 1, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 2, 0, - 0, 44, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 12, 2, 0, 0, 0, - 0, 0, 0, 24, 2, 0, - 0, 19, 1, 0, 0, 0, - 0, 0, 0, 255, 255, 255, - 255, 5, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 36, - 2, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 48, 2, 0, - 0, 37, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, - 0, 60, 2, 0, 0, 44, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 72, - 2, 0, 0, 44, 0, 0, - 0, 1, 0, 0, 0, 1, - 0, 0, 0, 84, 2, 0, - 0, 0, 0, 0, 0, 96, - 2, 0, 0, 19, 1, 0, - 0, 0, 0, 0, 0, 255, - 255, 255, 255, 9, 0, 0, - 0, 36, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 116, 2, 0, 0, 37, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 128, - 2, 0, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 140, 2, 0, - 0, 39, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 152, 2, 0, 0, 40, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 164, - 2, 0, 0, 41, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 176, 2, 0, - 0, 42, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 188, 2, 0, 0, 43, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 200, - 2, 0, 0, 44, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 212, 2, 0, - 0, 0, 0, 0, 0, 12, - 3, 0, 0, 240, 2, 0, - 0, 0, 0, 0, 0, 255, - 255, 255, 255, 2, 0, 0, - 0, 19, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 22, 3, 0, 0, 13, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 34, - 3, 0, 0, 0, 0, 0, - 0, 84, 3, 0, 0, 56, - 3, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 89, 3, 0, - 0, 56, 3, 0, 0, 0, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 92, - 3, 0, 0, 56, 3, 0, - 0, 0, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 96, 3, 0, 0, 56, - 3, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 0, - 0, 0, 0, 100, 3, 0, - 0, 56, 3, 0, 0, 0, - 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 110, - 3, 0, 0, 56, 3, 0, - 0, 0, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, - 0, 157, 3, 0, 0, 129, - 3, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 3, - 0, 0, 0, 45, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 183, 3, 0, - 0, 46, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 195, 3, 0, 0, 47, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 207, - 3, 0, 0, 0, 0, 0, - 0, 219, 3, 0, 0, 129, - 3, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 3, - 0, 0, 0, 45, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 244, 3, 0, - 0, 46, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 4, 0, 0, 47, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 12, - 4, 0, 0, 0, 0, 0, - 0, 24, 4, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 48, - 4, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 84, 4, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 47, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 236, - 11, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 244, 11, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 120, 16, 0, 0, 128, - 16, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 154, 16, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 190, 16, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 47, - 1, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 86, 24, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 94, 24, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 226, - 28, 0, 0, 234, 28, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 0, 29, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 36, - 29, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 47, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 188, 36, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 196, - 36, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 36, 41, 0, - 0, 44, 41, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 69, - 41, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 105, 41, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 162, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 1, - 49, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 9, 49, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 105, 53, 0, 0, 113, - 53, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 140, 53, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 176, 53, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 47, - 1, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 72, 61, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 80, 61, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 176, - 65, 0, 0, 184, 65, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 214, 65, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 250, - 65, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 162, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 146, 73, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 154, - 73, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 250, 77, 0, - 0, 2, 78, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 19, - 78, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 55, 78, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 47, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 207, - 85, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 215, 85, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 71, 93, 0, 0, 79, - 93, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 105, 93, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 141, 93, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 96, - 2, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 37, 101, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 45, 101, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 13, - 107, 0, 0, 21, 107, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 43, 107, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 79, - 107, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 47, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 231, 114, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 239, - 114, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 215, 117, 0, - 0, 223, 117, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 240, - 117, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 20, 118, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 24, 2, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 172, - 125, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 180, 125, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 156, 128, 0, 0, 164, - 128, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 195, 128, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 231, 128, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 24, - 2, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 127, 136, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 135, 136, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 35, - 139, 0, 0, 43, 139, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 68, 139, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 104, - 139, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 47, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 196, 147, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 204, - 147, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 40, 153, 0, - 0, 48, 153, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 78, - 153, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 114, 153, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 47, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 206, - 161, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 214, 161, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 118, 167, 0, 0, 126, - 167, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 152, 167, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 188, 167, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 47, - 1, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 24, 176, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 32, 176, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 88, - 181, 0, 0, 96, 181, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 124, 181, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 160, - 181, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 47, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 80, 190, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 88, - 190, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 200, 195, 0, - 0, 208, 195, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 237, - 195, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 17, 196, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 162, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 109, - 204, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 117, 204, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 173, 209, 0, 0, 181, - 209, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 212, 209, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 248, 209, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 47, - 1, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 84, 218, 0, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 92, 218, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 216, - 223, 0, 0, 224, 223, 0, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 2, 224, 0, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 38, - 224, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 162, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 130, 232, 0, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 138, - 232, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 6, 238, 0, - 0, 14, 238, 0, 0, 1, - 0, 0, 0, 0, 0, 0, - 0, 45, 4, 0, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 12, 3, 0, 0, 10, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 35, - 238, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 71, 238, 0, - 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, - 0, 47, 1, 0, 0, 6, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 163, - 246, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 171, 246, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 239, 254, 0, 0, 247, - 254, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 45, - 4, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 12, - 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, - 0, 0, 0, 21, 255, 0, - 0, 11, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 57, 255, 0, 0, 2, - 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 96, - 2, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 149, 7, 1, - 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 157, 7, 1, 0, 7, - 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 77, - 14, 1, 0, 85, 14, 1, - 0, 1, 0, 0, 0, 0, - 0, 0, 0, 45, 4, 0, - 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 12, 3, 0, - 0, 10, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, - 0, 111, 14, 1, 0, 11, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 147, - 14, 1, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, - 0, 0, 0, 47, 1, 0, - 0, 6, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, - 0, 239, 22, 1, 0, 8, - 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 247, - 22, 1, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 7, - 0, 0, 0, 251, 26, 1, - 0 -}; diff --git a/gfx/layers/d3d10/PaintedLayerD3D10.cpp b/gfx/layers/d3d10/PaintedLayerD3D10.cpp deleted file mode 100644 index 887b79ada9f6..000000000000 --- a/gfx/layers/d3d10/PaintedLayerD3D10.cpp +++ /dev/null @@ -1,478 +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 "mozilla/layers/PLayerTransaction.h" - -// This must occur *after* layers/PLayerTransaction.h to avoid -// typedefs conflicts. -#include "mozilla/ArrayUtils.h" - -#include "PaintedLayerD3D10.h" -#include "gfxPlatform.h" - -#include "gfxWindowsPlatform.h" -#ifdef CAIRO_HAS_D2D_SURFACE -#include "gfxD2DSurface.h" -#endif - -#include "../d3d9/Nv3DVUtils.h" -#include "gfxTeeSurface.h" -#include "gfxUtils.h" -#include "ReadbackLayer.h" -#include "ReadbackProcessor.h" - -#include "mozilla/Preferences.h" -#include "mozilla/gfx/2D.h" - -namespace mozilla { -namespace layers { - -using namespace mozilla::gfx; - -PaintedLayerD3D10::PaintedLayerD3D10(LayerManagerD3D10 *aManager) - : PaintedLayer(aManager, nullptr) - , LayerD3D10(aManager) - , mCurrentSurfaceMode(SurfaceMode::SURFACE_OPAQUE) -{ - mImplData = static_cast(this); -} - -PaintedLayerD3D10::~PaintedLayerD3D10() -{ -} - -void -PaintedLayerD3D10::InvalidateRegion(const nsIntRegion &aRegion) -{ - mInvalidRegion.Or(mInvalidRegion, aRegion); - mInvalidRegion.SimplifyOutward(20); - mValidRegion.Sub(mValidRegion, mInvalidRegion); -} - -void PaintedLayerD3D10::CopyRegion(ID3D10Texture2D* aSrc, const nsIntPoint &aSrcOffset, - ID3D10Texture2D* aDest, const nsIntPoint &aDestOffset, - const nsIntRegion &aCopyRegion, nsIntRegion* aValidRegion) -{ - nsIntRegion retainedRegion; - nsIntRegionRectIterator iter(aCopyRegion); - const nsIntRect *r; - while ((r = iter.Next())) { - // Calculate the retained rectangle's position on the old and the new - // surface. - D3D10_BOX box; - box.left = r->x - aSrcOffset.x; - box.top = r->y - aSrcOffset.y; - box.right = box.left + r->width; - box.bottom = box.top + r->height; - box.back = 1; - box.front = 0; - - device()->CopySubresourceRegion(aDest, 0, - r->x - aDestOffset.x, - r->y - aDestOffset.y, - 0, - aSrc, 0, - &box); - - retainedRegion.Or(retainedRegion, *r); - } - - // Areas which were valid and were retained are still valid - aValidRegion->And(*aValidRegion, retainedRegion); -} - -void -PaintedLayerD3D10::RenderLayer() -{ - if (!mTexture) { - return; - } - - SetEffectTransformAndOpacity(); - - ID3D10EffectTechnique *technique; - switch (mCurrentSurfaceMode) { - case SurfaceMode::SURFACE_COMPONENT_ALPHA: - technique = SelectShader(SHADER_COMPONENT_ALPHA | LoadMaskTexture()); - break; - case SurfaceMode::SURFACE_OPAQUE: - technique = SelectShader(SHADER_RGB | SHADER_PREMUL | LoadMaskTexture()); - break; - case SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA: - technique = SelectShader(SHADER_RGBA | SHADER_PREMUL | LoadMaskTexture()); - break; - default: - NS_ERROR("Unknown mode"); - return; - } - - nsIntRegionRectIterator iter(mVisibleRegion); - - const nsIntRect *iterRect; - if (mSRView) { - effect()->GetVariableByName("tRGB")->AsShaderResource()->SetResource(mSRView); - } - if (mSRViewOnWhite) { - effect()->GetVariableByName("tRGBWhite")->AsShaderResource()->SetResource(mSRViewOnWhite); - } - - while ((iterRect = iter.Next())) { - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)iterRect->x, - (float)iterRect->y, - (float)iterRect->width, - (float)iterRect->height) - ); - - effect()->GetVariableByName("vTextureCoords")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)(iterRect->x - mTextureRect.x) / (float)mTextureRect.width, - (float)(iterRect->y - mTextureRect.y) / (float)mTextureRect.height, - (float)iterRect->width / (float)mTextureRect.width, - (float)iterRect->height / (float)mTextureRect.height) - ); - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); - } - - // Set back to default. - effect()->GetVariableByName("vTextureCoords")->AsVector()-> - SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); -} - -void -PaintedLayerD3D10::Validate(ReadbackProcessor *aReadback) -{ - if (mVisibleRegion.IsEmpty()) { - return; - } - - if (FAILED(gfxWindowsPlatform::GetPlatform()->GetD3D10Device()->GetDeviceRemovedReason())) { - // Device removed, this will be discovered on the next rendering pass. - // Do no validate. - return; - } - - nsIntRect newTextureRect = mVisibleRegion.GetBounds(); - - SurfaceMode mode = GetSurfaceMode(); - if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA && - (!mParent || !mParent->SupportsComponentAlphaChildren())) { - mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA; - } - // If we have a transform that requires resampling of our texture, then - // we need to make sure we don't sample pixels that haven't been drawn. - // We clamp sample coordinates to the texture rect, but when the visible region - // doesn't fill the entire texture rect we need to make sure we draw all the - // pixels in the texture rect anyway in case they get sampled. - nsIntRegion neededRegion = mVisibleRegion; - if (!neededRegion.GetBounds().IsEqualInterior(newTextureRect) || - neededRegion.GetNumRects() > 1) { - if (MayResample()) { - neededRegion = newTextureRect; - if (mode == SurfaceMode::SURFACE_OPAQUE) { - // We're going to paint outside the visible region, but layout hasn't - // promised that it will paint opaquely there, so we'll have to - // treat this layer as transparent. - mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA; - } - } - } - mCurrentSurfaceMode = mode; - - VerifyContentType(mode); - - nsTArray readbackUpdates; - nsIntRegion readbackRegion; - if (aReadback && UsedForReadback()) { - aReadback->GetPaintedLayerUpdates(this, &readbackUpdates, &readbackRegion); - } - - if (mTexture) { - if (!mTextureRect.IsEqualInterior(newTextureRect)) { - nsRefPtr oldTexture = mTexture; - mTexture = nullptr; - nsRefPtr oldTextureOnWhite = mTextureOnWhite; - mTextureOnWhite = nullptr; - - nsIntRegion retainRegion = mTextureRect; - // Old visible region will become the region that is covered by both the - // old and the new visible region. - retainRegion.And(retainRegion, mVisibleRegion); - // No point in retaining parts which were not valid. - retainRegion.And(retainRegion, mValidRegion); - - CreateNewTextures(gfx::IntSize(newTextureRect.width, newTextureRect.height), mode); - - nsIntRect largeRect = retainRegion.GetLargestRectangle(); - - // If we had no hardware texture before, or have no retained area larger than - // the retention threshold, we're not retaining and are done here. - // If our texture creation failed this can mean a device reset is pending - // and we should silently ignore the failure. In the future when device - // failures are properly handled we should test for the type of failure - // and gracefully handle different failures. See bug 569081. - if (!oldTexture || !mTexture) { - mValidRegion.SetEmpty(); - } else { - CopyRegion(oldTexture, mTextureRect.TopLeft(), - mTexture, newTextureRect.TopLeft(), - retainRegion, &mValidRegion); - if (oldTextureOnWhite) { - CopyRegion(oldTextureOnWhite, mTextureRect.TopLeft(), - mTextureOnWhite, newTextureRect.TopLeft(), - retainRegion, &mValidRegion); - } - } - } - } - mTextureRect = newTextureRect; - - if (!mTexture || (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA && !mTextureOnWhite)) { - CreateNewTextures(gfx::IntSize(newTextureRect.width, newTextureRect.height), mode); - mValidRegion.SetEmpty(); - } - - nsIntRegion drawRegion; - drawRegion.Sub(neededRegion, mValidRegion); - - if (!drawRegion.IsEmpty()) { - LayerManagerD3D10::CallbackInfo cbInfo = mD3DManager->GetCallbackInfo(); - if (!cbInfo.Callback) { - NS_ERROR("D3D10 should never need to update PaintedLayers in an empty transaction"); - return; - } - - DrawRegion(drawRegion, mode); - - if (readbackUpdates.Length() > 0) { - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, - newTextureRect.width, newTextureRect.height, - 1, 1, 0, D3D10_USAGE_STAGING, - D3D10_CPU_ACCESS_READ); - - nsRefPtr readbackTexture; - HRESULT hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(readbackTexture)); - if (FAILED(hr)) { - LayerManagerD3D10::ReportFailure(NS_LITERAL_CSTRING("PaintedLayerD3D10::Validate(): Failed to create texture"), - hr); - return; - } - - device()->CopyResource(readbackTexture, mTexture); - - for (uint32_t i = 0; i < readbackUpdates.Length(); i++) { - mD3DManager->readbackManager()->PostTask(readbackTexture, - &readbackUpdates[i], - gfxPoint(newTextureRect.x, newTextureRect.y)); - } - } - - mValidRegion = neededRegion; - } -} - -void -PaintedLayerD3D10::LayerManagerDestroyed() -{ - mD3DManager = nullptr; -} - -Layer* -PaintedLayerD3D10::GetLayer() -{ - return this; -} - -void -PaintedLayerD3D10::VerifyContentType(SurfaceMode aMode) -{ - if (mDrawTarget) { - SurfaceFormat format = aMode != SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA ? - SurfaceFormat::B8G8R8X8 : SurfaceFormat::B8G8R8A8; - - if (format != mDrawTarget->GetFormat()) { - mDrawTarget = Factory::CreateDrawTargetForD3D10Texture(mTexture, format); - - if (!mDrawTarget) { - gfxWarning() << "Failed to create drawtarget for PaintedLayerD3D10."; - return; - } - - mValidRegion.SetEmpty(); - } - } - - if (aMode != SurfaceMode::SURFACE_COMPONENT_ALPHA && mTextureOnWhite) { - // If we've transitioned away from component alpha, we can delete those resources. - mSRViewOnWhite = nullptr; - mTextureOnWhite = nullptr; - mValidRegion.SetEmpty(); - } -} - -void -PaintedLayerD3D10::FillTexturesBlackWhite(const nsIntRegion& aRegion, const nsIntPoint& aOffset) -{ - if (mTexture && mTextureOnWhite) { - // It would be more optimal to draw the actual geometry, but more code - // and probably not worth the win here as this will often be a single - // rect. - nsRefPtr oldRT; - device()->OMGetRenderTargets(1, getter_AddRefs(oldRT), nullptr); - - nsRefPtr viewBlack; - nsRefPtr viewWhite; - device()->CreateRenderTargetView(mTexture, nullptr, getter_AddRefs(viewBlack)); - device()->CreateRenderTargetView(mTextureOnWhite, nullptr, getter_AddRefs(viewWhite)); - - D3D10_RECT oldScissor; - UINT numRects = 1; - device()->RSGetScissorRects(&numRects, &oldScissor); - - D3D10_TEXTURE2D_DESC desc; - mTexture->GetDesc(&desc); - - D3D10_RECT scissor = { 0, 0, desc.Width, desc.Height }; - device()->RSSetScissorRects(1, &scissor); - - mD3DManager->SetupInputAssembler(); - nsIntSize oldVP = mD3DManager->GetViewport(); - - mD3DManager->SetViewport(nsIntSize(desc.Width, desc.Height)); - - ID3D10RenderTargetView *views[2] = { viewBlack, viewWhite }; - device()->OMSetRenderTargets(2, views, nullptr); - - gfx3DMatrix transform; - transform.Translate(Point3D(-aOffset.x, -aOffset.y, 0)); - void* raw = &const_cast(transform)._11; - effect()->GetVariableByName("mLayerTransform")->SetRawValue(raw, 0, 64); - - ID3D10EffectTechnique *technique = - effect()->GetTechniqueByName("PrepareAlphaExtractionTextures"); - - nsIntRegionRectIterator iter(aRegion); - - const nsIntRect *iterRect; - while ((iterRect = iter.Next())) { - effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector( - ShaderConstantRectD3D10( - (float)iterRect->x, - (float)iterRect->y, - (float)iterRect->width, - (float)iterRect->height) - ); - - technique->GetPassByIndex(0)->Apply(0); - device()->Draw(4, 0); - } - - views[0] = oldRT; - device()->OMSetRenderTargets(1, views, nullptr); - mD3DManager->SetViewport(oldVP); - device()->RSSetScissorRects(1, &oldScissor); - } -} - -void -PaintedLayerD3D10::DrawRegion(nsIntRegion &aRegion, SurfaceMode aMode) -{ - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - - if (!mDrawTarget) { - return; - } - - aRegion.SimplifyOutwardByArea(100 * 100); - - if (aMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { - FillTexturesBlackWhite(aRegion, visibleRect.TopLeft()); - } - - nsRefPtr context = new gfxContext(mDrawTarget); - - context->SetMatrix( - context->CurrentMatrix().Translate(-visibleRect.x, -visibleRect.y)); - if (aMode == SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA) { - nsIntRegionRectIterator iter(aRegion); - const nsIntRect *iterRect; - while ((iterRect = iter.Next())) { - mDrawTarget->ClearRect(Rect(iterRect->x, iterRect->y, iterRect->width, iterRect->height)); - } - } - - mDrawTarget->SetPermitSubpixelAA(!(mContentFlags & CONTENT_COMPONENT_ALPHA)); - - LayerManagerD3D10::CallbackInfo cbInfo = mD3DManager->GetCallbackInfo(); - cbInfo.Callback(this, context, aRegion, DrawRegionClip::DRAW, nsIntRegion(), cbInfo.CallbackData); -} - -void -PaintedLayerD3D10::CreateNewTextures(const gfx::IntSize &aSize, SurfaceMode aMode) -{ - if (aSize.width == 0 || aSize.height == 0) { - // Nothing to do. - return; - } - - CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, aSize.width, aSize.height, 1, 1); - desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE; - desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE; - HRESULT hr; - - if (!mTexture) { - hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(mTexture)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create new texture for PaintedLayerD3D10!"); - return; - } - - hr = device()->CreateShaderResourceView(mTexture, nullptr, getter_AddRefs(mSRView)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create shader resource view for PaintedLayerD3D10."); - } - - mDrawTarget = nullptr; - } - - if (aMode == SurfaceMode::SURFACE_COMPONENT_ALPHA && !mTextureOnWhite) { - hr = device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(mTextureOnWhite)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create new texture for PaintedLayerD3D10!"); - return; - } - - hr = device()->CreateShaderResourceView(mTextureOnWhite, nullptr, getter_AddRefs(mSRViewOnWhite)); - - if (FAILED(hr)) { - NS_WARNING("Failed to create shader resource view for PaintedLayerD3D10."); - } - - mDrawTarget = nullptr; - } - - if (!mDrawTarget) { - if (aMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { - mDrawTarget = Factory::CreateDualDrawTargetForD3D10Textures(mTexture, mTextureOnWhite, SurfaceFormat::B8G8R8X8); - } else { - mDrawTarget = Factory::CreateDrawTargetForD3D10Texture(mTexture, aMode != SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA ? - SurfaceFormat::B8G8R8X8 : SurfaceFormat::B8G8R8A8); - } - - if (!mDrawTarget) { - gfxWarning() << "Failed to create DrawTarget for PaintedLayerD3D10."; - return; - } - } -} - -} /* namespace layers */ -} /* namespace mozilla */ diff --git a/gfx/layers/d3d10/PaintedLayerD3D10.h b/gfx/layers/d3d10/PaintedLayerD3D10.h deleted file mode 100644 index c6d502d377b8..000000000000 --- a/gfx/layers/d3d10/PaintedLayerD3D10.h +++ /dev/null @@ -1,73 +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 GFX_PAINTEDLAYERD3D10_H -#define GFX_PAINTEDLAYERD3D10_H - -#include "LayerManagerD3D10.h" - -namespace mozilla { -namespace layers { - -class PaintedLayerD3D10 : public PaintedLayer, - public LayerD3D10 -{ -public: - PaintedLayerD3D10(LayerManagerD3D10 *aManager); - virtual ~PaintedLayerD3D10(); - - void Validate(ReadbackProcessor *aReadback); - - /* PaintedLayer implementation */ - void InvalidateRegion(const nsIntRegion& aRegion); - - /* LayerD3D10 implementation */ - virtual Layer* GetLayer(); - virtual void RenderLayer(); - virtual void Validate() { Validate(nullptr); } - virtual void LayerManagerDestroyed(); - -private: - /* Texture with our surface data */ - nsRefPtr mTexture; - - /* Shader resource view for our texture */ - nsRefPtr mSRView; - - /* Texture for render-on-whitew when doing component alpha */ - nsRefPtr mTextureOnWhite; - - /* Shader resource view for our render-on-white texture */ - nsRefPtr mSRViewOnWhite; - - /* Area of layer currently stored in texture(s) */ - nsIntRect mTextureRect; - - /* Last surface mode set in Validate() */ - SurfaceMode mCurrentSurfaceMode; - - /* Checks if our D2D surface has the right content type */ - void VerifyContentType(SurfaceMode aMode); - - mozilla::RefPtr mDrawTarget; - - /* Have a region of our layer drawn */ - void DrawRegion(nsIntRegion &aRegion, SurfaceMode aMode); - - /* Create a new texture */ - void CreateNewTextures(const gfx::IntSize &aSize, SurfaceMode aMode); - - // Fill textures with opaque black and white in the specified region. - void FillTexturesBlackWhite(const nsIntRegion& aRegion, const nsIntPoint& aOffset); - - /* Copy a texture region */ - void CopyRegion(ID3D10Texture2D* aSrc, const nsIntPoint &aSrcOffset, - ID3D10Texture2D* aDest, const nsIntPoint &aDestOffset, - const nsIntRegion &aCopyRegion, nsIntRegion* aValidRegion); -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_PAINTEDLAYERD3D10_H */ diff --git a/gfx/layers/d3d10/ReadbackLayerD3D10.h b/gfx/layers/d3d10/ReadbackLayerD3D10.h deleted file mode 100644 index a731304b02e2..000000000000 --- a/gfx/layers/d3d10/ReadbackLayerD3D10.h +++ /dev/null @@ -1,33 +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 GFX_READBACKLAYERD3D10_H -#define GFX_READBACKLAYERD3D10_H - -#include "LayerManagerD3D10.h" -#include "ReadbackLayer.h" - -namespace mozilla { -namespace layers { - -class ReadbackLayerD3D10 : - public ReadbackLayer, - public LayerD3D10 -{ -public: - ReadbackLayerD3D10(LayerManagerD3D10 *aManager) - : ReadbackLayer(aManager, nullptr), - LayerD3D10(aManager) - { - mImplData = static_cast(this); - } - - virtual Layer* GetLayer() { return this; } - virtual void RenderLayer() {} -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_READBACKLAYERD3D10_H */ diff --git a/gfx/layers/d3d10/ReadbackManagerD3D10.cpp b/gfx/layers/d3d10/ReadbackManagerD3D10.cpp deleted file mode 100644 index 650087615adc..000000000000 --- a/gfx/layers/d3d10/ReadbackManagerD3D10.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 "ReadbackManagerD3D10.h" -#include "ReadbackProcessor.h" -#include "ReadbackLayer.h" - -#include "nsIThread.h" -#include "nsThreadUtils.h" -#include "gfxImageSurface.h" -#include "gfxContext.h" - -namespace mozilla { -namespace layers { - -// Structure that contains the information required to execute a readback task, -// the only member accessed off the main thread here is mReadbackTexture. Since -// mLayer may be released only on the main thread this object should always be -// destroyed on the main thread! -struct ReadbackTask { - // The texture that we copied the contents of the paintedlayer to. - nsRefPtr mReadbackTexture; - // This exists purely to keep the ReadbackLayer alive for the lifetime of - // mUpdate. Note that this addref and release should occur -solely- on the - // main thread. - nsRefPtr mLayer; - ReadbackProcessor::Update mUpdate; - // The origin in PaintedLayer coordinates of mReadbackTexture. - gfxPoint mOrigin; - // mLayer->GetBackgroundOffset() when the task is created. We have - // to save this in the ReadbackTask because it might change before - // the update is delivered to the readback sink. - nsIntPoint mBackgroundOffset; -}; - -// This class is created and dispatched from the Readback thread but it must be -// destroyed by the main thread. -class ReadbackResultWriter MOZ_FINAL : public nsIRunnable -{ - ~ReadbackResultWriter() {} - NS_DECL_THREADSAFE_ISUPPORTS -public: - ReadbackResultWriter(ReadbackTask *aTask) : mTask(aTask) {} - - NS_IMETHODIMP Run() - { - ReadbackProcessor::Update *update = &mTask->mUpdate; - - if (!update->mLayer->GetSink()) { - // This can happen when a plugin is destroyed. - return NS_OK; - } - - nsIntPoint offset = mTask->mBackgroundOffset; - - D3D10_TEXTURE2D_DESC desc; - mTask->mReadbackTexture->GetDesc(&desc); - - D3D10_MAPPED_TEXTURE2D mappedTex; - // We know this map will immediately succeed, as we've already mapped this - // copied data on our task thread. - HRESULT hr = mTask->mReadbackTexture->Map(0, D3D10_MAP_READ, 0, &mappedTex); - - if (FAILED(hr)) { - // If this fails we're never going to get our PaintedLayer content. - update->mLayer->GetSink()->SetUnknown(update->mSequenceCounter); - return NS_OK; - } - - nsRefPtr sourceSurface = - new gfxImageSurface((unsigned char*)mappedTex.pData, - gfxIntSize(desc.Width, desc.Height), - mappedTex.RowPitch, - gfxImageFormat::RGB24); - - nsRefPtr ctx = - update->mLayer->GetSink()->BeginUpdate(update->mUpdateRect + offset, - update->mSequenceCounter); - - if (ctx) { - ctx->SetMatrix( - ctx->CurrentMatrix().Translate(offset.x, offset.y)); - ctx->SetSource(sourceSurface, gfxPoint(mTask->mOrigin.x, - mTask->mOrigin.y)); - ctx->Paint(); - - update->mLayer->GetSink()->EndUpdate(ctx, update->mUpdateRect + offset); - } - - mTask->mReadbackTexture->Unmap(0); - - return NS_OK; - } - -private: - nsAutoPtr mTask; -}; - -NS_IMPL_ISUPPORTS(ReadbackResultWriter, nsIRunnable) - -DWORD WINAPI StartTaskThread(void *aManager) -{ - static_cast(aManager)->ProcessTasks(); - - return 0; -} - -ReadbackManagerD3D10::ReadbackManagerD3D10() - : mRefCnt(0) -{ - ::InitializeCriticalSection(&mTaskMutex); - mShutdownEvent = ::CreateEventA(nullptr, FALSE, FALSE, nullptr); - mTaskSemaphore = ::CreateSemaphoreA(nullptr, 0, 1000000, nullptr); - mTaskThread = ::CreateThread(nullptr, 0, StartTaskThread, this, 0, 0); -} - -ReadbackManagerD3D10::~ReadbackManagerD3D10() -{ - ::SetEvent(mShutdownEvent); - - // This shouldn't take longer than 5 seconds, if it does we're going to choose - // to leak the thread and its synchronisation in favor of crashing or freezing - DWORD result = ::WaitForSingleObject(mTaskThread, 5000); - if (result != WAIT_TIMEOUT) { - ::DeleteCriticalSection(&mTaskMutex); - ::CloseHandle(mShutdownEvent); - ::CloseHandle(mTaskSemaphore); - ::CloseHandle(mTaskThread); - } else { - NS_RUNTIMEABORT("ReadbackManager: Task thread did not shutdown in 5 seconds."); - } -} - -void -ReadbackManagerD3D10::PostTask(ID3D10Texture2D *aTexture, void *aUpdate, const gfxPoint &aOrigin) -{ - ReadbackTask *task = new ReadbackTask; - task->mReadbackTexture = aTexture; - task->mUpdate = *static_cast(aUpdate); - task->mOrigin = aOrigin; - task->mLayer = task->mUpdate.mLayer; - task->mBackgroundOffset = task->mLayer->GetBackgroundLayerOffset(); - - ::EnterCriticalSection(&mTaskMutex); - mPendingReadbackTasks.AppendElement(task); - ::LeaveCriticalSection(&mTaskMutex); - - ::ReleaseSemaphore(mTaskSemaphore, 1, nullptr); -} - -HRESULT -ReadbackManagerD3D10::QueryInterface(REFIID riid, void **ppvObject) -{ - if (!ppvObject) { - return E_POINTER; - } - - if (riid == IID_IUnknown) { - *ppvObject = this; - } else { - return E_NOINTERFACE; - } - - return S_OK; -} - -ULONG -ReadbackManagerD3D10::AddRef() -{ - NS_ASSERTION(NS_IsMainThread(), - "ReadbackManagerD3D10 should only be refcounted on main thread."); - return ++mRefCnt; -} - -ULONG -ReadbackManagerD3D10::Release() -{ - NS_ASSERTION(NS_IsMainThread(), - "ReadbackManagerD3D10 should only be refcounted on main thread."); - ULONG newRefCnt = --mRefCnt; - if (!newRefCnt) { - mRefCnt++; - delete this; - } - return newRefCnt; -} - -void -ReadbackManagerD3D10::ProcessTasks() -{ - HANDLE handles[] = { mTaskSemaphore, mShutdownEvent }; - - while (true) { - DWORD result = ::WaitForMultipleObjects(2, handles, FALSE, INFINITE); - if (result != WAIT_OBJECT_0) { - return; - } - - ::EnterCriticalSection(&mTaskMutex); - if (mPendingReadbackTasks.Length() == 0) { - NS_RUNTIMEABORT("Trying to read from an empty array, bad bad bad"); - } - ReadbackTask *nextReadbackTask = mPendingReadbackTasks[0].forget(); - mPendingReadbackTasks.RemoveElementAt(0); - ::LeaveCriticalSection(&mTaskMutex); - - // We want to block here until the texture contents are available, the - // easiest thing is to simply map and unmap. - D3D10_MAPPED_TEXTURE2D mappedTex; - nextReadbackTask->mReadbackTexture->Map(0, D3D10_MAP_READ, 0, &mappedTex); - nextReadbackTask->mReadbackTexture->Unmap(0); - - // We can only send the update to the sink on the main thread, so post an - // event there to do so. Ownership of the task is passed from - // mPendingReadbackTasks to ReadbackResultWriter here. - nsCOMPtr thread = do_GetMainThread(); - thread->Dispatch(new ReadbackResultWriter(nextReadbackTask), - nsIEventTarget::DISPATCH_NORMAL); - } -} - -} -} diff --git a/gfx/layers/d3d10/ReadbackManagerD3D10.h b/gfx/layers/d3d10/ReadbackManagerD3D10.h deleted file mode 100644 index 5aa5113746f3..000000000000 --- a/gfx/layers/d3d10/ReadbackManagerD3D10.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_READBACKMANAGERD3D10_H -#define GFX_READBACKMANAGERD3D10_H - -#include -#include - -#include "nsTArray.h" -#include "nsAutoPtr.h" -#include "gfxPoint.h" - -namespace mozilla { -namespace layers { - -DWORD WINAPI StartTaskThread(void *aManager); - -struct ReadbackTask; - -class ReadbackManagerD3D10 MOZ_FINAL : public IUnknown -{ -public: - ReadbackManagerD3D10(); - ~ReadbackManagerD3D10(); - - /** - * Tell the readback manager to post a readback task. - * - * @param aTexture D3D10_USAGE_STAGING texture that will contain the data that - * was readback. - * @param aUpdate ReadbackProcessor::Update object. This is a void pointer - * since we cannot forward declare a nested class, and do not - * export ReadbackProcessor.h - * @param aOrigin Origin of the aTexture surface in the PaintedLayer - * coordinate system. - */ - void PostTask(ID3D10Texture2D *aTexture, void *aUpdate, const gfxPoint &aOrigin); - - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, - void **ppvObject); - virtual ULONG STDMETHODCALLTYPE AddRef(void); - virtual ULONG STDMETHODCALLTYPE Release(void); - -private: - friend DWORD WINAPI StartTaskThread(void *aManager); - - void ProcessTasks(); - - // The invariant maintained by |mTaskSemaphore| is that the readback thread - // will awaken from WaitForMultipleObjects() at least once per readback - // task enqueued by the main thread. Since the readback thread processes - // exactly one task per wakeup (with one exception), no tasks are lost. The - // exception is when the readback thread is shut down, which orphans the - // remaining tasks, on purpose. - HANDLE mTaskSemaphore; - // Event signaled when the task thread should shutdown - HANDLE mShutdownEvent; - // Handle to the task thread - HANDLE mTaskThread; - - // FiFo list of readback tasks that are to be executed. Access is synchronized - // by mTaskMutex. - CRITICAL_SECTION mTaskMutex; - nsTArray> mPendingReadbackTasks; - - ULONG mRefCnt; -}; - -} -} - -#endif /* GFX_READBACKMANAGERD3D10_H */ diff --git a/gfx/layers/d3d10/genshaders.sh b/gfx/layers/d3d10/genshaders.sh deleted file mode 100644 index 6cd82bcb87bf..000000000000 --- a/gfx/layers/d3d10/genshaders.sh +++ /dev/null @@ -1,5 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -fxc LayerManagerD3D10.fx -nologo -FhLayerManagerD3D10Effect.h -Tfx_4_0 diff --git a/gfx/layers/d3d9/CanvasLayerD3D9.cpp b/gfx/layers/d3d9/CanvasLayerD3D9.cpp deleted file mode 100644 index f8ce2e67df18..000000000000 --- a/gfx/layers/d3d9/CanvasLayerD3D9.cpp +++ /dev/null @@ -1,215 +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 "mozilla/layers/PLayerTransaction.h" - -#include "gfxWindowsSurface.h" -#include "gfxWindowsPlatform.h" -#include "SharedSurface.h" -#include "SharedSurfaceGL.h" -#include "GLContext.h" -#include "CanvasLayerD3D9.h" - -using namespace mozilla::gfx; -using namespace mozilla::gl; - -namespace mozilla { -namespace layers { - -CanvasLayerD3D9::CanvasLayerD3D9(LayerManagerD3D9 *aManager) - : CanvasLayer(aManager, nullptr) - , LayerD3D9(aManager) - , mDataIsPremultiplied(true) - , mOriginPos(gl::OriginPos::TopLeft) - , mHasAlpha(true) -{ - mImplData = static_cast(this); - aManager->deviceManager()->mLayersWithResources.AppendElement(this); -} - -CanvasLayerD3D9::~CanvasLayerD3D9() -{ - if (mD3DManager) { - mD3DManager->deviceManager()->mLayersWithResources.RemoveElement(this); - } -} - -void -CanvasLayerD3D9::Initialize(const Data& aData) -{ - NS_ASSERTION(mDrawTarget == nullptr, "BasicCanvasLayer::Initialize called twice!"); - - if (aData.mDrawTarget) { - mDrawTarget = aData.mDrawTarget; - } else if (aData.mGLContext) { - mGLContext = aData.mGLContext; - NS_ASSERTION(mGLContext->IsOffscreen(), "Canvas GLContext must be offscreen."); - mDataIsPremultiplied = aData.mIsGLAlphaPremult; - mOriginPos = gl::OriginPos::BottomLeft; - } else { - NS_ERROR("CanvasLayer created without mGLContext or mDrawTarget?"); - } - - mBounds.SetRect(0, 0, aData.mSize.width, aData.mSize.height); - - CreateTexture(); -} - -void -CanvasLayerD3D9::UpdateSurface() -{ - if (!IsDirty() && mTexture) - return; - Painted(); - - if (!mTexture) { - CreateTexture(); - - if (!mTexture) { - NS_WARNING("CanvasLayerD3D9::Updated called but no texture present and creation failed!"); - return; - } - } - - // WebGL reads entire surface. - LockTextureRectD3D9 textureLock(mTexture); - if (!textureLock.HasLock()) { - NS_WARNING("Failed to lock CanvasLayer texture."); - return; - } - - D3DLOCKED_RECT rect = textureLock.GetLockRect(); - IntSize boundsSize(mBounds.width, mBounds.height); - RefPtr rectDt = Factory::CreateDrawTargetForData(BackendType::CAIRO, - (uint8_t*)rect.pBits, - boundsSize, - rect.Pitch, - SurfaceFormat::B8G8R8A8); - - if (mGLContext) { - auto screen = mGLContext->Screen(); - MOZ_ASSERT(screen); - - SharedSurface* surf = screen->Front()->Surf(); - if (!surf) - return; - surf->WaitSync(); - - if (!ReadbackSharedSurface(surf, rectDt)) { - NS_WARNING("Failed to readback into texture."); - } - } else { - RefPtr surface = mDrawTarget->Snapshot(); - - Rect drawRect(0, 0, surface->GetSize().width, surface->GetSize().height); - rectDt->DrawSurface(surface, drawRect, drawRect, - DrawSurfaceOptions(), DrawOptions(1.0F, CompositionOp::OP_SOURCE)); - - rectDt->Flush(); - } -} - -Layer* -CanvasLayerD3D9::GetLayer() -{ - return this; -} - -void -CanvasLayerD3D9::RenderLayer() -{ - FirePreTransactionCallback(); - UpdateSurface(); - if (mD3DManager->CompositingDisabled()) { - return; - } - FireDidTransactionCallback(); - - if (!mTexture) - return; - - /* - * We flip the Y axis here, note we can only do this because we are in - * CULL_NONE mode! - */ - ShaderConstantRect quad(0, 0, mBounds.width, mBounds.height); - - const bool needsYFlip = (mOriginPos == gl::OriginPos::BottomLeft); - if (needsYFlip) { - quad.mHeight = (float)-mBounds.height; - quad.mY = (float)mBounds.height; - } - - device()->SetVertexShaderConstantF(CBvLayerQuad, quad, 1); - - SetShaderTransformAndOpacity(); - - if (mHasAlpha) { - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBALAYER, GetMaskLayer()); - } else { - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBLAYER, GetMaskLayer()); - } - - if (mFilter == GraphicsFilter::FILTER_NEAREST) { - device()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - device()->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - } - if (!mDataIsPremultiplied) { - device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - device()->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); - } - device()->SetTexture(0, mTexture); - device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - if (!mDataIsPremultiplied) { - device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); - device()->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); - } - if (mFilter == GraphicsFilter::FILTER_NEAREST) { - device()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - device()->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - } -} - -void -CanvasLayerD3D9::CleanResources() -{ - if (mD3DManager->deviceManager()->HasDynamicTextures()) { - // In this case we have a texture in POOL_DEFAULT - mTexture = nullptr; - } -} - -void -CanvasLayerD3D9::LayerManagerDestroyed() -{ - mD3DManager->deviceManager()->mLayersWithResources.RemoveElement(this); - mD3DManager = nullptr; -} - -void -CanvasLayerD3D9::CreateTexture() -{ - HRESULT hr; - if (mD3DManager->deviceManager()->HasDynamicTextures()) { - hr = device()->CreateTexture(mBounds.width, mBounds.height, 1, D3DUSAGE_DYNAMIC, - D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, - getter_AddRefs(mTexture), nullptr); - } else { - // D3DPOOL_MANAGED is fine here since we require Dynamic Textures for D3D9Ex - // devices. - hr = device()->CreateTexture(mBounds.width, mBounds.height, 1, 0, - D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, - getter_AddRefs(mTexture), nullptr); - } - if (FAILED(hr)) { - mD3DManager->ReportFailure(NS_LITERAL_CSTRING("CanvasLayerD3D9::CreateTexture() failed"), - hr); - return; - } -} - -} /* namespace layers */ -} /* namespace mozilla */ diff --git a/gfx/layers/d3d9/CanvasLayerD3D9.h b/gfx/layers/d3d9/CanvasLayerD3D9.h deleted file mode 100644 index 3a4234ea0437..000000000000 --- a/gfx/layers/d3d9/CanvasLayerD3D9.h +++ /dev/null @@ -1,69 +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 GFX_CANVASLAYERD3D9_H -#define GFX_CANVASLAYERD3D9_H - -#include "GLContextTypes.h" -#include "LayerManagerD3D9.h" - -namespace mozilla { -namespace layers { - - -class CanvasLayerD3D9 : - public CanvasLayer, - public LayerD3D9 -{ -public: - CanvasLayerD3D9(LayerManagerD3D9 *aManager); - ~CanvasLayerD3D9(); - - // CanvasLayer implementation - virtual void Initialize(const Data& aData); - - // LayerD3D9 implementation - virtual Layer* GetLayer(); - virtual void RenderLayer(); - virtual void CleanResources(); - virtual void LayerManagerDestroyed(); - - void CreateTexture(); - -protected: - typedef mozilla::gl::GLContext GLContext; - - void UpdateSurface(); - - nsRefPtr mGLContext; - nsRefPtr mTexture; - RefPtr mDrawTarget; - - bool mDataIsPremultiplied; - gl::OriginPos mOriginPos; - bool mHasAlpha; - - nsAutoArrayPtr mCachedTempBlob; - uint32_t mCachedTempBlob_Size; - - uint8_t* GetTempBlob(const uint32_t aSize) - { - if (!mCachedTempBlob || aSize != mCachedTempBlob_Size) { - mCachedTempBlob = new uint8_t[aSize]; - mCachedTempBlob_Size = aSize; - } - - return mCachedTempBlob; - } - - void DiscardTempBlob() - { - mCachedTempBlob = nullptr; - } -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_CANVASLAYERD3D9_H */ diff --git a/gfx/layers/d3d9/ColorLayerD3D9.cpp b/gfx/layers/d3d9/ColorLayerD3D9.cpp deleted file mode 100644 index 3f287fed7f89..000000000000 --- a/gfx/layers/d3d9/ColorLayerD3D9.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 "ColorLayerD3D9.h" - -namespace mozilla { -namespace layers { - -Layer* -ColorLayerD3D9::GetLayer() -{ - return this; -} - -static void -RenderColorLayerD3D9(ColorLayer* aLayer, LayerManagerD3D9 *aManager) -{ - // XXX we might be able to improve performance by using - // IDirect3DDevice9::Clear - if (aManager->CompositingDisabled()) { - return; - } - - nsIntRect bounds = aLayer->GetBounds(); - - aManager->device()->SetVertexShaderConstantF( - CBvLayerQuad, - ShaderConstantRect(bounds.x, - bounds.y, - bounds.width, - bounds.height), - 1); - - const gfx::Matrix4x4& transform = aLayer->GetEffectiveTransform(); - aManager->device()->SetVertexShaderConstantF(CBmLayerTransform, &transform._11, 4); - - gfxRGBA layerColor(aLayer->GetColor()); - float color[4]; - float opacity = aLayer->GetEffectiveOpacity() * layerColor.a; - // output color is premultiplied, so we need to adjust all channels. - // mColor is not premultiplied. - color[0] = (float)(layerColor.r * opacity); - color[1] = (float)(layerColor.g * opacity); - color[2] = (float)(layerColor.b * opacity); - color[3] = (float)(opacity); - - aManager->device()->SetPixelShaderConstantF(CBvColor, color, 1); - - aManager->SetShaderMode(DeviceManagerD3D9::SOLIDCOLORLAYER, - aLayer->GetMaskLayer()); - - aManager->device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); -} - -void -ColorLayerD3D9::RenderLayer() -{ - return RenderColorLayerD3D9(this, mD3DManager); -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d9/ColorLayerD3D9.h b/gfx/layers/d3d9/ColorLayerD3D9.h deleted file mode 100644 index 80b7cf69c6e0..000000000000 --- a/gfx/layers/d3d9/ColorLayerD3D9.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_COLORLAYERD3D9_H -#define GFX_COLORLAYERD3D9_H - -#include "LayerManagerD3D9.h" - -namespace mozilla { -namespace layers { - -class ColorLayerD3D9 : public ColorLayer, - public LayerD3D9 -{ -public: - ColorLayerD3D9(LayerManagerD3D9 *aManager) - : ColorLayer(aManager, nullptr) - , LayerD3D9(aManager) - { - mImplData = static_cast(this); - } - - // LayerD3D9 Implementation - virtual Layer* GetLayer(); - - virtual void RenderLayer(); -}; - -} /* layers */ -} /* mozilla */ - -#endif /* GFX_COLORLAYERD3D9_H */ diff --git a/gfx/layers/d3d9/ContainerLayerD3D9.cpp b/gfx/layers/d3d9/ContainerLayerD3D9.cpp deleted file mode 100644 index a9e486ce9718..000000000000 --- a/gfx/layers/d3d9/ContainerLayerD3D9.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 "ContainerLayerD3D9.h" - -#include "PaintedLayerD3D9.h" -#include "ReadbackProcessor.h" - -using namespace mozilla::gfx; - -namespace mozilla { -namespace layers { - -ContainerLayerD3D9::ContainerLayerD3D9(LayerManagerD3D9 *aManager) - : ContainerLayer(aManager, nullptr) - , LayerD3D9(aManager) -{ - mImplData = static_cast(this); -} - -ContainerLayerD3D9::~ContainerLayerD3D9() -{ - while (mFirstChild) { - RemoveChild(mFirstChild); - } -} - -Layer* -ContainerLayerD3D9::GetLayer() -{ - return this; -} - -LayerD3D9* -ContainerLayerD3D9::GetFirstChildD3D9() -{ - if (!mFirstChild) { - return nullptr; - } - return static_cast(mFirstChild->ImplData()); -} - -void -ContainerLayerD3D9::RenderLayer() -{ - nsRefPtr previousRenderTarget; - nsRefPtr renderTexture; - float previousRenderTargetOffset[4]; - float renderTargetOffset[] = { 0, 0, 0, 0 }; - float oldViewMatrix[4][4]; - - RECT containerD3D9ClipRect; - device()->GetScissorRect(&containerD3D9ClipRect); - // Convert scissor to an nsIntRect. RECT's are exclusive on the bottom and - // right values. - nsIntRect oldScissor(containerD3D9ClipRect.left, - containerD3D9ClipRect.top, - containerD3D9ClipRect.right - containerD3D9ClipRect.left, - containerD3D9ClipRect.bottom - containerD3D9ClipRect.top); - - ReadbackProcessor readback; - readback.BuildUpdates(this); - - nsIntRect visibleRect = GetEffectiveVisibleRegion().GetBounds(); - bool useIntermediate = UseIntermediateSurface(); - - mSupportsComponentAlphaChildren = false; - if (useIntermediate) { - nsRefPtr renderSurface; - if (!mD3DManager->CompositingDisabled()) { - device()->GetRenderTarget(0, getter_AddRefs(previousRenderTarget)); - HRESULT hr = device()->CreateTexture(visibleRect.width, visibleRect.height, 1, - D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, - D3DPOOL_DEFAULT, getter_AddRefs(renderTexture), - nullptr); - if (FAILED(hr)) { - ReportFailure(NS_LITERAL_CSTRING("ContainerLayerD3D9::ContainerRender(): Failed to create texture"), - hr); - return; - } - - nsRefPtr renderSurface; - renderTexture->GetSurfaceLevel(0, getter_AddRefs(renderSurface)); - device()->SetRenderTarget(0, renderSurface); - } - - if (mVisibleRegion.GetNumRects() == 1 && - (GetContentFlags() & CONTENT_OPAQUE)) { - // don't need a background, we're going to paint all opaque stuff - mSupportsComponentAlphaChildren = true; - } else { - Matrix4x4 transform3D = GetEffectiveTransform(); - Matrix transform; - // If we have an opaque ancestor layer, then we can be sure that - // all the pixels we draw into are either opaque already or will be - // covered by something opaque. Otherwise copying up the background is - // not safe. - HRESULT hr = E_FAIL; - if (HasOpaqueAncestorLayer(this) && - transform3D.Is2D(&transform) && !ThebesMatrix(transform).HasNonIntegerTranslation()) { - // Copy background up from below - RECT dest = { 0, 0, visibleRect.width, visibleRect.height }; - RECT src = dest; - ::OffsetRect(&src, - visibleRect.x + int32_t(transform._31), - visibleRect.y + int32_t(transform._32)); - if (!mD3DManager->CompositingDisabled()) { - hr = device()-> - StretchRect(previousRenderTarget, &src, renderSurface, &dest, D3DTEXF_NONE); - } - } - if (hr == S_OK) { - mSupportsComponentAlphaChildren = true; - } else if (!mD3DManager->CompositingDisabled()) { - device()-> - Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 0, 0), 0, 0); - } - } - - device()-> - GetVertexShaderConstantF(CBvRenderTargetOffset, previousRenderTargetOffset, 1); - renderTargetOffset[0] = (float)visibleRect.x; - renderTargetOffset[1] = (float)visibleRect.y; - device()-> - SetVertexShaderConstantF(CBvRenderTargetOffset, renderTargetOffset, 1); - - gfx3DMatrix viewMatrix; - /* - * Matrix to transform to viewport space ( <-1.0, 1.0> topleft, - * <1.0, -1.0> bottomright) - */ - viewMatrix._11 = 2.0f / visibleRect.width; - viewMatrix._22 = -2.0f / visibleRect.height; - viewMatrix._41 = -1.0f; - viewMatrix._42 = 1.0f; - - device()-> - GetVertexShaderConstantF(CBmProjection, &oldViewMatrix[0][0], 4); - device()-> - SetVertexShaderConstantF(CBmProjection, &viewMatrix._11, 4); - } else { - mSupportsComponentAlphaChildren = - (GetContentFlags() & CONTENT_OPAQUE) || - (mParent && - mParent->SupportsComponentAlphaChildren()); - } - - nsAutoTArray children; - SortChildrenBy3DZOrder(children); - - /* - * Render this container's contents. - */ - for (uint32_t i = 0; i < children.Length(); i++) { - LayerD3D9* layerToRender = static_cast(children.ElementAt(i)->ImplData()); - - if (layerToRender->GetLayer()->GetEffectiveVisibleRegion().IsEmpty()) { - continue; - } - - nsIntRect scissorRect = - RenderTargetPixel::ToUntyped(layerToRender->GetLayer()->CalculateScissorRect(RenderTargetPixel::FromUntyped(oldScissor))); - if (scissorRect.IsEmpty()) { - continue; - } - - RECT d3drect; - d3drect.left = scissorRect.x; - d3drect.top = scissorRect.y; - d3drect.right = scissorRect.x + scissorRect.width; - d3drect.bottom = scissorRect.y + scissorRect.height; - device()->SetScissorRect(&d3drect); - - if (layerToRender->GetLayer()->GetType() == TYPE_PAINTED) { - static_cast(layerToRender)->RenderPaintedLayer(&readback); - } else { - layerToRender->RenderLayer(); - } - } - - if (useIntermediate && !mD3DManager->CompositingDisabled()) { - device()->SetRenderTarget(0, previousRenderTarget); - device()->SetVertexShaderConstantF(CBvRenderTargetOffset, previousRenderTargetOffset, 1); - device()->SetVertexShaderConstantF(CBmProjection, &oldViewMatrix[0][0], 4); - - device()->SetVertexShaderConstantF(CBvLayerQuad, - ShaderConstantRect(visibleRect.x, - visibleRect.y, - visibleRect.width, - visibleRect.height), - 1); - - SetShaderTransformAndOpacity(); - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBALAYER, - GetMaskLayer(), - GetTransform().CanDraw2D()); - - device()->SetTexture(0, renderTexture); - device()->SetScissorRect(&containerD3D9ClipRect); - device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - } else { - device()->SetScissorRect(&containerD3D9ClipRect); - } -} - -void -ContainerLayerD3D9::LayerManagerDestroyed() -{ - while (mFirstChild) { - GetFirstChildD3D9()->LayerManagerDestroyed(); - RemoveChild(mFirstChild); - } -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d9/ContainerLayerD3D9.h b/gfx/layers/d3d9/ContainerLayerD3D9.h deleted file mode 100644 index bd8519f6c952..000000000000 --- a/gfx/layers/d3d9/ContainerLayerD3D9.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_CONTAINERLAYERD3D9_H -#define GFX_CONTAINERLAYERD3D9_H - -#include "Layers.h" -#include "LayerManagerD3D9.h" - -namespace mozilla { -namespace layers { - -class ContainerLayerD3D9 : public ContainerLayer, - public LayerD3D9 -{ -public: - ContainerLayerD3D9(LayerManagerD3D9 *aManager); - ~ContainerLayerD3D9(); - - nsIntRect GetVisibleRect() { return mVisibleRegion.GetBounds(); } - - /* LayerD3D9 implementation */ - Layer* GetLayer(); - - LayerD3D9* GetFirstChildD3D9(); - - bool IsEmpty(); - - void RenderLayer(); - - virtual void LayerManagerDestroyed(); - - virtual void ComputeEffectiveTransforms(const gfx::Matrix4x4& aTransformToSurface) - { - DefaultComputeEffectiveTransforms(aTransformToSurface); - } -}; - -} /* layers */ -} /* mozilla */ - -#endif /* GFX_CONTAINERLAYERD3D9_H */ diff --git a/gfx/layers/d3d9/DeviceManagerD3D9.cpp b/gfx/layers/d3d9/DeviceManagerD3D9.cpp index d7de95f70938..2581c8eb691a 100644 --- a/gfx/layers/d3d9/DeviceManagerD3D9.cpp +++ b/gfx/layers/d3d9/DeviceManagerD3D9.cpp @@ -5,7 +5,6 @@ #include "DeviceManagerD3D9.h" #include "LayerManagerD3D9Shaders.h" -#include "PaintedLayerD3D9.h" #include "nsIServiceManager.h" #include "nsIConsoleService.h" #include "nsPrintfCString.h" @@ -557,42 +556,6 @@ DeviceManagerD3D9::CreateSwapChain(HWND hWnd) return swapChain.forget(); } -/* - * Finds a texture for the mask layer and sets it as an - * input to the shaders. - * Returns true if a texture is loaded, false if - * a texture for the mask layer could not be loaded. - */ -bool -LoadMaskTexture(Layer* aMask, IDirect3DDevice9* aDevice, - uint32_t aMaskTexRegister) -{ - IntSize size; - nsRefPtr texture = - static_cast(aMask->ImplData())->GetAsTexture(&size); - - if (!texture) { - return false; - } - - Matrix maskTransform; - Matrix4x4 effectiveTransform = aMask->GetEffectiveTransform(); - bool maskIs2D = effectiveTransform.CanDraw2D(&maskTransform); - NS_ASSERTION(maskIs2D, "How did we end up with a 3D transform here?!"); - Rect bounds = Rect(Point(), Size(size)); - bounds = maskTransform.TransformBounds(bounds); - - aDevice->SetVertexShaderConstantF(DeviceManagerD3D9::sMaskQuadRegister, - ShaderConstantRect((float)bounds.x, - (float)bounds.y, - (float)bounds.width, - (float)bounds.height), - 1); - - aDevice->SetTexture(aMaskTexRegister, texture); - return true; -} - uint32_t DeviceManagerD3D9::SetShaderMode(ShaderMode aMode, MaskType aMaskType) { @@ -667,25 +630,6 @@ DeviceManagerD3D9::SetShaderMode(ShaderMode aMode, MaskType aMaskType) return maskTexRegister; } -void -DeviceManagerD3D9::SetShaderMode(ShaderMode aMode, Layer* aMask, bool aIs2D) -{ - MaskType maskType = MaskType::MaskNone; - if (aMask) { - maskType = aIs2D ? MaskType::Mask2d : MaskType::Mask3d; - } - uint32_t maskTexRegister = SetShaderMode(aMode, maskType); - if (aMask) { - // register allocations are taken from LayerManagerD3D9Shaders.h after - // the shaders are compiled (genshaders.sh) - if (!LoadMaskTexture(aMask, mDevice, maskTexRegister)) { - // if we can't load the mask, fall back to unmasked rendering - NS_WARNING("Could not load texture for mask layer."); - SetShaderMode(aMode, MaskType::MaskNone); - } - } -} - void DeviceManagerD3D9::DestroyDevice() { @@ -718,10 +662,6 @@ DeviceManagerD3D9::VerifyReadyForRendering() return DeviceOK; } - // We need to release all texture resources and swap chains before resetting. - for (unsigned int i = 0; i < mLayersWithResources.Length(); i++) { - mLayersWithResources[i]->CleanResources(); - } ReleaseTextureResources(); for (unsigned int i = 0; i < mSwapChains.Length(); i++) { mSwapChains[i]->Reset(); diff --git a/gfx/layers/d3d9/DeviceManagerD3D9.h b/gfx/layers/d3d9/DeviceManagerD3D9.h index d841fe6338b8..835ecf70aea0 100644 --- a/gfx/layers/d3d9/DeviceManagerD3D9.h +++ b/gfx/layers/d3d9/DeviceManagerD3D9.h @@ -171,7 +171,6 @@ public: SOLIDCOLORLAYER }; - void SetShaderMode(ShaderMode aMode, Layer* aMask, bool aIs2D); // returns the register to be used for the mask texture, if appropriate uint32_t SetShaderMode(ShaderMode aMode, MaskType aMaskType); @@ -187,12 +186,6 @@ public: uint32_t GetDeviceResetCount() { return mDeviceResetCount; } - /** - * We keep a list of all layers here that may have hardware resource allocated - * so we can clean their resources on reset. - */ - nsTArray mLayersWithResources; - int32_t GetMaxTextureSize() { return mMaxTextureSize; } // Removes aHost from our list of texture hosts if it is the head. diff --git a/gfx/layers/d3d9/ImageLayerD3D9.cpp b/gfx/layers/d3d9/ImageLayerD3D9.cpp deleted file mode 100644 index b4b705046cb4..000000000000 --- a/gfx/layers/d3d9/ImageLayerD3D9.cpp +++ /dev/null @@ -1,561 +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 "mozilla/gfx/2D.h" -#include "mozilla/gfx/Point.h" -#include "mozilla/RefPtr.h" -#include "mozilla/layers/PLayerTransaction.h" -#include "gfxSharedImageSurface.h" - -#include "ImageLayerD3D9.h" -#include "PaintedLayerD3D9.h" -#include "gfxPlatform.h" -#include "gfx2DGlue.h" -#include "yuv_convert.h" -#include "nsIServiceManager.h" -#include "nsIConsoleService.h" -#include "Nv3DVUtils.h" -#include "D3D9SurfaceImage.h" - -namespace mozilla { -namespace layers { - -using namespace mozilla::gfx; - -static inline _D3DFORMAT -D3dFormatForSurfaceFormat(SurfaceFormat aFormat) -{ - if (aFormat == SurfaceFormat::A8) { - return D3DFMT_A8; - } - - return D3DFMT_A8R8G8B8; -} - -static already_AddRefed -DataToTexture(IDirect3DDevice9 *aDevice, - unsigned char *aData, - int aStride, - const IntSize &aSize, - _D3DFORMAT aFormat) -{ - nsRefPtr texture; - nsRefPtr deviceEx; - aDevice->QueryInterface(IID_IDirect3DDevice9Ex, - (void**)getter_AddRefs(deviceEx)); - - nsRefPtr surface; - D3DLOCKED_RECT lockedRect; - if (deviceEx) { - // D3D9Ex doesn't support managed textures. We could use dynamic textures - // here but since Images are immutable that probably isn't such a great - // idea. - if (FAILED(aDevice-> - CreateTexture(aSize.width, aSize.height, - 1, 0, aFormat, D3DPOOL_DEFAULT, - getter_AddRefs(texture), nullptr))) - { - return nullptr; - } - - nsRefPtr tmpTexture; - if (FAILED(aDevice-> - CreateTexture(aSize.width, aSize.height, - 1, 0, aFormat, D3DPOOL_SYSTEMMEM, - getter_AddRefs(tmpTexture), nullptr))) - { - return nullptr; - } - - tmpTexture->GetSurfaceLevel(0, getter_AddRefs(surface)); - surface->LockRect(&lockedRect, nullptr, 0); - NS_ASSERTION(lockedRect.pBits, "Could not lock surface"); - } else { - if (FAILED(aDevice-> - CreateTexture(aSize.width, aSize.height, - 1, 0, aFormat, D3DPOOL_MANAGED, - getter_AddRefs(texture), nullptr))) - { - return nullptr; - } - - /* lock the entire texture */ - texture->LockRect(0, &lockedRect, nullptr, 0); - } - - uint32_t width = aSize.width; - if (aFormat == D3DFMT_A8R8G8B8) { - width *= 4; - } - for (int y = 0; y < aSize.height; y++) { - memcpy((char*)lockedRect.pBits + lockedRect.Pitch * y, - aData + aStride * y, - width); - } - - if (deviceEx) { - surface->UnlockRect(); - nsRefPtr dstSurface; - texture->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - aDevice->UpdateSurface(surface, nullptr, dstSurface, nullptr); - } else { - texture->UnlockRect(0); - } - - return texture.forget(); -} - -static already_AddRefed -OpenSharedTexture(const D3DSURFACE_DESC& aDesc, - HANDLE aShareHandle, - IDirect3DDevice9 *aDevice) -{ - MOZ_ASSERT(aDesc.Format == D3DFMT_X8R8G8B8); - - // Open the frame from DXVA's device in our device using the resource - // sharing handle. - nsRefPtr sharedTexture; - HRESULT hr = aDevice->CreateTexture(aDesc.Width, - aDesc.Height, - 1, - D3DUSAGE_RENDERTARGET, - D3DFMT_X8R8G8B8, - D3DPOOL_DEFAULT, - getter_AddRefs(sharedTexture), - &aShareHandle); - if (FAILED(hr)) { - NS_WARNING("Failed to open shared texture on our device"); - } - return sharedTexture.forget(); -} - -static already_AddRefed -SurfaceToTexture(IDirect3DDevice9 *aDevice, - SourceSurface *aSurface, - const IntSize &aSize) -{ - RefPtr dataSurface = aSurface->GetDataSurface(); - if (!dataSurface) { - return nullptr; - } - DataSourceSurface::MappedSurface map; - if (!dataSurface->Map(DataSourceSurface::MapType::READ, &map)) { - return nullptr; - } - nsRefPtr texture = - DataToTexture(aDevice, map.mData, map.mStride, aSize, - D3dFormatForSurfaceFormat(dataSurface->GetFormat())); - dataSurface->Unmap(); - return texture.forget(); -} - -static void AllocateTexturesYCbCr(PlanarYCbCrImage *aImage, - IDirect3DDevice9 *aDevice, - LayerManagerD3D9 *aManager) -{ - nsAutoPtr backendData( - new PlanarYCbCrD3D9BackendData); - - const PlanarYCbCrData *data = aImage->GetData(); - - D3DLOCKED_RECT lockrectY; - D3DLOCKED_RECT lockrectCb; - D3DLOCKED_RECT lockrectCr; - uint8_t* src; - uint8_t* dest; - - nsRefPtr tmpSurfaceY; - nsRefPtr tmpSurfaceCb; - nsRefPtr tmpSurfaceCr; - - nsRefPtr deviceEx; - aDevice->QueryInterface(IID_IDirect3DDevice9Ex, - getter_AddRefs(deviceEx)); - - bool isD3D9Ex = deviceEx; - - if (isD3D9Ex) { - nsRefPtr tmpYTexture; - nsRefPtr tmpCbTexture; - nsRefPtr tmpCrTexture; - // D3D9Ex does not support the managed pool, could use dynamic textures - // here. But since an Image is immutable static textures are probably a - // better idea. - - HRESULT hr; - hr = aDevice->CreateTexture(data->mYSize.width, data->mYSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_DEFAULT, - getter_AddRefs(backendData->mYTexture), nullptr); - if (!FAILED(hr)) { - hr = aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_DEFAULT, - getter_AddRefs(backendData->mCbTexture), nullptr); - } - if (!FAILED(hr)) { - hr = aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_DEFAULT, - getter_AddRefs(backendData->mCrTexture), nullptr); - } - if (!FAILED(hr)) { - hr = aDevice->CreateTexture(data->mYSize.width, data->mYSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_SYSTEMMEM, - getter_AddRefs(tmpYTexture), nullptr); - } - if (!FAILED(hr)) { - hr = aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_SYSTEMMEM, - getter_AddRefs(tmpCbTexture), nullptr); - } - if (!FAILED(hr)) { - hr = aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_SYSTEMMEM, - getter_AddRefs(tmpCrTexture), nullptr); - } - - if (FAILED(hr)) { - aManager->ReportFailure(NS_LITERAL_CSTRING("PlanarYCbCrImageD3D9::AllocateTextures(): Failed to create texture (isD3D9Ex)"), - hr); - return; - } - - tmpYTexture->GetSurfaceLevel(0, getter_AddRefs(tmpSurfaceY)); - tmpCbTexture->GetSurfaceLevel(0, getter_AddRefs(tmpSurfaceCb)); - tmpCrTexture->GetSurfaceLevel(0, getter_AddRefs(tmpSurfaceCr)); - tmpSurfaceY->LockRect(&lockrectY, nullptr, 0); - tmpSurfaceCb->LockRect(&lockrectCb, nullptr, 0); - tmpSurfaceCr->LockRect(&lockrectCr, nullptr, 0); - } else { - HRESULT hr; - hr = aDevice->CreateTexture(data->mYSize.width, data->mYSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_MANAGED, - getter_AddRefs(backendData->mYTexture), nullptr); - if (!FAILED(hr)) { - aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_MANAGED, - getter_AddRefs(backendData->mCbTexture), nullptr); - } - if (!FAILED(hr)) { - aDevice->CreateTexture(data->mCbCrSize.width, data->mCbCrSize.height, - 1, 0, D3DFMT_A8, D3DPOOL_MANAGED, - getter_AddRefs(backendData->mCrTexture), nullptr); - } - - if (FAILED(hr)) { - aManager->ReportFailure(NS_LITERAL_CSTRING("PlanarYCbCrImageD3D9::AllocateTextures(): Failed to create texture (!isD3D9Ex)"), - hr); - return; - } - - /* lock the entire texture */ - backendData->mYTexture->LockRect(0, &lockrectY, nullptr, 0); - backendData->mCbTexture->LockRect(0, &lockrectCb, nullptr, 0); - backendData->mCrTexture->LockRect(0, &lockrectCr, nullptr, 0); - } - - src = data->mYChannel; - //FIX cast - dest = (uint8_t*)lockrectY.pBits; - - // copy over data - for (int h=0; hmYSize.height; h++) { - memcpy(dest, src, data->mYSize.width); - dest += lockrectY.Pitch; - src += data->mYStride; - } - - src = data->mCbChannel; - //FIX cast - dest = (uint8_t*)lockrectCb.pBits; - - // copy over data - for (int h=0; hmCbCrSize.height; h++) { - memcpy(dest, src, data->mCbCrSize.width); - dest += lockrectCb.Pitch; - src += data->mCbCrStride; - } - - src = data->mCrChannel; - //FIX cast - dest = (uint8_t*)lockrectCr.pBits; - - // copy over data - for (int h=0; hmCbCrSize.height; h++) { - memcpy(dest, src, data->mCbCrSize.width); - dest += lockrectCr.Pitch; - src += data->mCbCrStride; - } - - if (isD3D9Ex) { - tmpSurfaceY->UnlockRect(); - tmpSurfaceCb->UnlockRect(); - tmpSurfaceCr->UnlockRect(); - nsRefPtr dstSurface; - backendData->mYTexture->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - aDevice->UpdateSurface(tmpSurfaceY, nullptr, dstSurface, nullptr); - backendData->mCbTexture->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - aDevice->UpdateSurface(tmpSurfaceCb, nullptr, dstSurface, nullptr); - backendData->mCrTexture->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - aDevice->UpdateSurface(tmpSurfaceCr, nullptr, dstSurface, nullptr); - } else { - backendData->mYTexture->UnlockRect(0); - backendData->mCbTexture->UnlockRect(0); - backendData->mCrTexture->UnlockRect(0); - } - - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9, backendData.forget()); -} - -Layer* -ImageLayerD3D9::GetLayer() -{ - return this; -} - -/* - * Returns a texture which backs aImage - * Will only work if aImage is a cairo image. - * Returns nullptr if unsuccessful. - * If successful, aHasAlpha will be set to true if the texture has an - * alpha component, false otherwise. - */ -IDirect3DTexture9* -ImageLayerD3D9::GetTexture(Image *aImage, bool& aHasAlpha) -{ - NS_ASSERTION(aImage, "Null image."); - - if (aImage->GetFormat() == ImageFormat::CAIRO_SURFACE) { - CairoImage *cairoImage = - static_cast(aImage); - - RefPtr surf = cairoImage->GetAsSourceSurface(); - if (!surf) { - return nullptr; - } - - if (!aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9)) { - nsAutoPtr dat(new TextureD3D9BackendData()); - dat->mTexture = SurfaceToTexture(device(), surf, cairoImage->GetSize()); - if (dat->mTexture) { - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9, dat.forget()); - } - } - - aHasAlpha = surf->GetFormat() == SurfaceFormat::B8G8R8A8; - } else if (aImage->GetFormat() == ImageFormat::D3D9_RGB32_TEXTURE) { - if (!aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9)) { - // The texture in which the frame is stored belongs to DXVA's D3D9 device. - // We need to open it on our device before we can use it. - nsAutoPtr backendData(new TextureD3D9BackendData()); - D3D9SurfaceImage* image = static_cast(aImage); - backendData->mTexture = OpenSharedTexture(image->GetDesc(), image->GetShareHandle(), device()); - if (backendData->mTexture) { - aImage->SetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9, backendData.forget()); - } - } - aHasAlpha = false; - } else { - NS_WARNING("Inappropriate image type."); - return nullptr; - } - - TextureD3D9BackendData *data = - static_cast(aImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9)); - - if (!data) { - return nullptr; - } - - nsRefPtr dev; - data->mTexture->GetDevice(getter_AddRefs(dev)); - if (dev != device()) { - return nullptr; - } - - return data->mTexture; -} - -void -ImageLayerD3D9::RenderLayer() -{ - ImageContainer *container = GetContainer(); - if (!container || mD3DManager->CompositingDisabled()) { - return; - } - - AutoLockImage autoLock(container); - - Image *image = autoLock.GetImage(); - if (!image) { - return; - } - - SetShaderTransformAndOpacity(); - - gfx::IntSize size = image->GetSize(); - - if (image->GetFormat() == ImageFormat::CAIRO_SURFACE || - image->GetFormat() == ImageFormat::D3D9_RGB32_TEXTURE) - { - NS_ASSERTION(image->GetFormat() != ImageFormat::CAIRO_SURFACE || - !static_cast(image)->mSourceSurface || - static_cast(image)->mSourceSurface->GetFormat() != SurfaceFormat::A8, - "Image layer has alpha image"); - - bool hasAlpha = false; - nsRefPtr texture = GetTexture(image, hasAlpha); - - device()->SetVertexShaderConstantF(CBvLayerQuad, - ShaderConstantRect(0, - 0, - size.width, - size.height), - 1); - - if (hasAlpha) { - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBALAYER, GetMaskLayer()); - } else { - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBLAYER, GetMaskLayer()); - } - - if (mFilter == GraphicsFilter::FILTER_NEAREST) { - device()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - device()->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - } - device()->SetTexture(0, texture); - - image = nullptr; - autoLock.Unlock(); - - device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - if (mFilter == GraphicsFilter::FILTER_NEAREST) { - device()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - device()->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - } - } else { - PlanarYCbCrImage *yuvImage = - static_cast(image); - - if (!yuvImage->IsValid()) { - return; - } - - if (!yuvImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9)) { - AllocateTexturesYCbCr(yuvImage, device(), mD3DManager); - } - - PlanarYCbCrD3D9BackendData *data = - static_cast(yuvImage->GetBackendData(mozilla::layers::LayersBackend::LAYERS_D3D9)); - - if (!data) { - return; - } - - nsRefPtr dev; - data->mYTexture->GetDevice(getter_AddRefs(dev)); - if (dev != device()) { - return; - } - - device()->SetVertexShaderConstantF(CBvLayerQuad, - ShaderConstantRect(0, - 0, - size.width, - size.height), - 1); - - device()->SetVertexShaderConstantF(CBvTextureCoords, - ShaderConstantRect( - (float)yuvImage->GetData()->mPicX / yuvImage->GetData()->mYSize.width, - (float)yuvImage->GetData()->mPicY / yuvImage->GetData()->mYSize.height, - (float)yuvImage->GetData()->mPicSize.width / yuvImage->GetData()->mYSize.width, - (float)yuvImage->GetData()->mPicSize.height / yuvImage->GetData()->mYSize.height - ), - 1); - - mD3DManager->SetShaderMode(DeviceManagerD3D9::YCBCRLAYER, GetMaskLayer()); - - /* - * Send 3d control data and metadata - */ - if (mD3DManager->GetNv3DVUtils()) { - Nv_Stereo_Mode mode; - switch (yuvImage->GetData()->mStereoMode) { - case StereoMode::LEFT_RIGHT: - mode = NV_STEREO_MODE_LEFT_RIGHT; - break; - case StereoMode::RIGHT_LEFT: - mode = NV_STEREO_MODE_RIGHT_LEFT; - break; - case StereoMode::BOTTOM_TOP: - mode = NV_STEREO_MODE_BOTTOM_TOP; - break; - case StereoMode::TOP_BOTTOM: - mode = NV_STEREO_MODE_TOP_BOTTOM; - break; - case StereoMode::MONO: - mode = NV_STEREO_MODE_MONO; - break; - } - - // Send control data even in mono case so driver knows to leave stereo mode. - mD3DManager->GetNv3DVUtils()->SendNv3DVControl(mode, true, FIREFOX_3DV_APP_HANDLE); - - if (yuvImage->GetData()->mStereoMode != StereoMode::MONO) { - mD3DManager->GetNv3DVUtils()->SendNv3DVControl(mode, true, FIREFOX_3DV_APP_HANDLE); - - nsRefPtr renderTarget; - device()->GetRenderTarget(0, getter_AddRefs(renderTarget)); - mD3DManager->GetNv3DVUtils()->SendNv3DVMetaData((unsigned int)yuvImage->GetSize().width, - (unsigned int)yuvImage->GetSize().height, (HANDLE)(data->mYTexture), (HANDLE)(renderTarget)); - } - } - - // Linear scaling is default here, adhering to mFilter is difficult since - // presumably even with point filtering we'll still want chroma upsampling - // to be linear. In the current approach we can't. - device()->SetTexture(0, data->mYTexture); - device()->SetTexture(1, data->mCbTexture); - device()->SetTexture(2, data->mCrTexture); - - image = nullptr; - data = nullptr; - autoLock.Unlock(); - - device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - - device()->SetVertexShaderConstantF(CBvTextureCoords, - ShaderConstantRect(0, 0, 1.0f, 1.0f), 1); - } - - GetContainer()->NotifyPaintedImage(image); -} - -already_AddRefed -ImageLayerD3D9::GetAsTexture(gfx::IntSize* aSize) -{ - if (!GetContainer()) { - return nullptr; - } - - AutoLockImage autoLock(GetContainer()); - - Image *image = autoLock.GetImage(); - - if (!image) { - return nullptr; - } - - if (image->GetFormat() != ImageFormat::CAIRO_SURFACE) { - return nullptr; - } - - bool dontCare; - *aSize = image->GetSize(); - nsRefPtr result = GetTexture(image, dontCare); - return result.forget(); -} - -} /* layers */ -} /* mozilla */ diff --git a/gfx/layers/d3d9/ImageLayerD3D9.h b/gfx/layers/d3d9/ImageLayerD3D9.h deleted file mode 100644 index af69af5c2631..000000000000 --- a/gfx/layers/d3d9/ImageLayerD3D9.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_IMAGELAYERD3D9_H -#define GFX_IMAGELAYERD3D9_H - -#include "LayerManagerD3D9.h" -#include "ImageLayers.h" -#include "ImageContainer.h" -#include "yuv_convert.h" - -namespace mozilla { -namespace layers { - -class ImageLayerD3D9 : public ImageLayer, - public LayerD3D9 -{ -public: - ImageLayerD3D9(LayerManagerD3D9 *aManager) - : ImageLayer(aManager, nullptr) - , LayerD3D9(aManager) - { - mImplData = static_cast(this); - } - - // LayerD3D9 Implementation - virtual Layer* GetLayer(); - - virtual void RenderLayer(); - - virtual already_AddRefed GetAsTexture(gfx::IntSize* aSize); - -private: - IDirect3DTexture9* GetTexture(Image *aImage, bool& aHasAlpha); -}; - - -struct TextureD3D9BackendData : public ImageBackendData -{ - nsRefPtr mTexture; -}; - -struct PlanarYCbCrD3D9BackendData : public ImageBackendData -{ - nsRefPtr mYTexture; - nsRefPtr mCrTexture; - nsRefPtr mCbTexture; -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_IMAGELAYERD3D9_H */ diff --git a/gfx/layers/d3d9/LayerManagerD3D9.cpp b/gfx/layers/d3d9/LayerManagerD3D9.cpp deleted file mode 100644 index 770c724499ce..000000000000 --- a/gfx/layers/d3d9/LayerManagerD3D9.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 "LayerManagerD3D9.h" - -#include "PaintedLayerD3D9.h" -#include "ContainerLayerD3D9.h" -#include "ImageLayerD3D9.h" -#include "ColorLayerD3D9.h" -#include "CanvasLayerD3D9.h" -#include "ReadbackLayerD3D9.h" -#include "gfxWindowsPlatform.h" -#include "nsIGfxInfo.h" -#include "nsServiceManagerUtils.h" -#include "gfxFailure.h" -#include "gfxPrefs.h" - -#include "gfxCrashReporterUtils.h" - -namespace mozilla { -namespace layers { - -LayerManagerD3D9::LayerManagerD3D9(nsIWidget *aWidget) - : mWidget(aWidget) - , mDeviceResetCount(0) -{ - mCurrentCallbackInfo.Callback = nullptr; - mCurrentCallbackInfo.CallbackData = nullptr; -} - -LayerManagerD3D9::~LayerManagerD3D9() -{ - Destroy(); -} - -bool -LayerManagerD3D9::Initialize(bool force) -{ - ScopedGfxFeatureReporter reporter("D3D9 Layers", force); - - /* XXX: this preference and blacklist code should move out of the layer manager */ - bool forceAccelerate = gfxPrefs::LayersAccelerationForceEnabled(); - - nsCOMPtr gfxInfo = do_GetService("@mozilla.org/gfx/info;1"); - if (gfxInfo) { - int32_t status; - if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_DIRECT3D_9_LAYERS, &status))) { - if (status != nsIGfxInfo::FEATURE_STATUS_OK && !forceAccelerate) - { - NS_WARNING("Direct3D 9-accelerated layers are not supported on this system."); - return false; - } - } - } - - mDeviceManager = gfxWindowsPlatform::GetPlatform()->GetD3D9DeviceManager(); - if (!mDeviceManager) { - return false; - } - - mSwapChain = mDeviceManager-> - CreateSwapChain((HWND)mWidget->GetNativeData(NS_NATIVE_WINDOW)); - - if (!mSwapChain) { - return false; - } - - reporter.SetSuccessful(); - return true; -} - -void -LayerManagerD3D9::SetClippingRegion(const nsIntRegion &aClippingRegion) -{ - mClippingRegion = aClippingRegion; -} - -void -LayerManagerD3D9::Destroy() -{ - if (!IsDestroyed()) { - if (mRoot) { - static_cast(mRoot->ImplData())->LayerManagerDestroyed(); - } - /* Important to release this first since it also holds a reference to the - * device manager - */ - mSwapChain = nullptr; - mDeviceManager = nullptr; - } - LayerManager::Destroy(); -} - -void -LayerManagerD3D9::BeginTransaction() -{ - mInTransaction = true; -} - -void -LayerManagerD3D9::BeginTransactionWithTarget(gfxContext *aTarget) -{ - mInTransaction = true; - mTarget = aTarget; -} - -void -LayerManagerD3D9::EndConstruction() -{ -} - -bool -LayerManagerD3D9::EndEmptyTransaction(EndTransactionFlags aFlags) -{ - mInTransaction = false; - - // If the device reset count from our last EndTransaction doesn't match - // the current device reset count, the device must have been reset one or - // more times since our last transaction. In that case, an empty transaction - // is not possible, because layers may need to be rerendered. - if (!mRoot || mDeviceResetCount != mDeviceManager->GetDeviceResetCount()) - return false; - - EndTransaction(nullptr, nullptr, aFlags); - return true; -} - -void -LayerManagerD3D9::EndTransaction(DrawPaintedLayerCallback aCallback, - void* aCallbackData, - EndTransactionFlags aFlags) -{ - mInTransaction = false; - - mDeviceResetCount = mDeviceManager->GetDeviceResetCount(); - - if (mRoot && !(aFlags & END_NO_IMMEDIATE_REDRAW)) { - mCurrentCallbackInfo.Callback = aCallback; - mCurrentCallbackInfo.CallbackData = aCallbackData; - - if (aFlags & END_NO_COMPOSITE) { - // Apply pending tree updates before recomputing effective - // properties. - mRoot->ApplyPendingUpdatesToSubtree(); - } - - // The results of our drawing always go directly into a pixel buffer, - // so we don't need to pass any global transform here. - mRoot->ComputeEffectiveTransforms(gfx::Matrix4x4()); - - SetCompositingDisabled(aFlags & END_NO_COMPOSITE); - Render(); - /* Clean this out for sanity */ - mCurrentCallbackInfo.Callback = nullptr; - mCurrentCallbackInfo.CallbackData = nullptr; - } - - // Clear mTarget, next transaction could have no target - mTarget = nullptr; -} - -void -LayerManagerD3D9::SetRoot(Layer *aLayer) -{ - mRoot = aLayer; -} - -already_AddRefed -LayerManagerD3D9::CreatePaintedLayer() -{ - nsRefPtr layer = new PaintedLayerD3D9(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D9::CreateContainerLayer() -{ - nsRefPtr layer = new ContainerLayerD3D9(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D9::CreateImageLayer() -{ - nsRefPtr layer = new ImageLayerD3D9(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D9::CreateColorLayer() -{ - nsRefPtr layer = new ColorLayerD3D9(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D9::CreateCanvasLayer() -{ - nsRefPtr layer = new CanvasLayerD3D9(this); - return layer.forget(); -} - -already_AddRefed -LayerManagerD3D9::CreateReadbackLayer() -{ - nsRefPtr layer = new ReadbackLayerD3D9(this); - return layer.forget(); -} - -void -LayerManagerD3D9::ReportFailure(const nsACString &aMsg, HRESULT aCode) -{ - // We could choose to abort here when hr == E_OUTOFMEMORY. - nsCString msg; - msg.Append(aMsg); - msg.AppendLiteral(" Error code: "); - msg.AppendInt(uint32_t(aCode)); - NS_WARNING(msg.BeginReading()); - - gfx::LogFailure(msg); -} - -void -LayerManagerD3D9::Render() -{ - if (mSwapChain->PrepareForRendering() != DeviceOK) { - return; - } - - deviceManager()->SetupRenderState(); - - SetupPipeline(); - - if (CompositingDisabled()) { - static_cast(mRoot->ImplData())->RenderLayer(); - return; - } - - nsIntRect rect; - mWidget->GetClientBounds(rect); - - device()->Clear(0, nullptr, D3DCLEAR_TARGET, 0x00000000, 0, 0); - - device()->BeginScene(); - - const nsIntRect *clipRect = mRoot->GetClipRect(); - RECT r; - if (clipRect) { - r.left = (LONG)clipRect->x; - r.top = (LONG)clipRect->y; - r.right = (LONG)(clipRect->x + clipRect->width); - r.bottom = (LONG)(clipRect->y + clipRect->height); - } else { - r.left = r.top = 0; - r.right = rect.width; - r.bottom = rect.height; - } - device()->SetScissorRect(&r); - - static_cast(mRoot->ImplData())->RenderLayer(); - - if (!mRegionToClear.IsEmpty()) { - D3DRECT* rects = new D3DRECT[mRegionToClear.GetNumRects()]; - nsIntRegionRectIterator iter(mRegionToClear); - const nsIntRect *r; - size_t i = 0; - while ((r = iter.Next())) { - rects[i].x1 = r->x; - rects[i].y1 = r->y; - rects[i].x2 = r->x + r->width; - rects[i].y2 = r->y + r->height; - i++; - } - - device()->Clear(i, rects, D3DCLEAR_TARGET, - 0x00000000, 0, 0); - - delete [] rects; - } - - device()->EndScene(); - - if (!mTarget) { - const nsIntRect *r; - for (nsIntRegionRectIterator iter(mClippingRegion); - (r = iter.Next()) != nullptr;) { - mSwapChain->Present(*r); - } - RecordFrame(); - PostPresent(); - } else { - PaintToTarget(); - } -} - -void -LayerManagerD3D9::SetupPipeline() -{ - nsIntRect rect; - mWidget->GetClientBounds(rect); - - gfx3DMatrix viewMatrix; - /* - * Matrix to transform to viewport space ( <-1.0, 1.0> topleft, - * <1.0, -1.0> bottomright) - */ - viewMatrix._11 = 2.0f / rect.width; - viewMatrix._22 = -2.0f / rect.height; - viewMatrix._33 = 0.0f; - viewMatrix._41 = -1.0f; - viewMatrix._42 = 1.0f; - - HRESULT hr = device()->SetVertexShaderConstantF(CBmProjection, - &viewMatrix._11, 4); - - if (FAILED(hr)) { - NS_WARNING("Failed to set projection shader constant!"); - } - - hr = device()->SetVertexShaderConstantF(CBvTextureCoords, - ShaderConstantRect(0, 0, 1.0f, 1.0f), - 1); - - if (FAILED(hr)) { - NS_WARNING("Failed to set texCoords shader constant!"); - } - - float offset[] = { 0, 0, 0, 0 }; - hr = device()->SetVertexShaderConstantF(CBvRenderTargetOffset, offset, 1); - - if (FAILED(hr)) { - NS_WARNING("Failed to set RenderTargetOffset shader constant!"); - } -} - -void -LayerManagerD3D9::PaintToTarget() -{ - nsRefPtr backBuff; - nsRefPtr destSurf; - device()->GetRenderTarget(0, getter_AddRefs(backBuff)); - - D3DSURFACE_DESC desc; - backBuff->GetDesc(&desc); - - device()->CreateOffscreenPlainSurface(desc.Width, desc.Height, - D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, - getter_AddRefs(destSurf), nullptr); - - device()->GetRenderTargetData(backBuff, destSurf); - - D3DLOCKED_RECT rect; - destSurf->LockRect(&rect, nullptr, D3DLOCK_READONLY); - - nsRefPtr imageSurface = - new gfxImageSurface((unsigned char*)rect.pBits, - gfxIntSize(desc.Width, desc.Height), - rect.Pitch, - gfxImageFormat::ARGB32); - - mTarget->SetSource(imageSurface); - mTarget->SetOperator(gfxContext::OPERATOR_OVER); - mTarget->Paint(); - destSurf->UnlockRect(); -} - -LayerD3D9::LayerD3D9(LayerManagerD3D9 *aManager) - : mD3DManager(aManager) -{ -} - -} /* namespace layers */ -} /* namespace mozilla */ diff --git a/gfx/layers/d3d9/LayerManagerD3D9.h b/gfx/layers/d3d9/LayerManagerD3D9.h deleted file mode 100644 index 5f6ec52439d9..000000000000 --- a/gfx/layers/d3d9/LayerManagerD3D9.h +++ /dev/null @@ -1,289 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_LAYERMANAGERD3D9_H -#define GFX_LAYERMANAGERD3D9_H - -#include "Layers.h" - -#include -#include - -#include "gfxContext.h" -#include "nsIWidget.h" - -#include "DeviceManagerD3D9.h" - -namespace mozilla { -namespace layers { - -class LayerD3D9; -class PaintedLayerD3D9; - -/* - * This is the LayerManager used for Direct3D 9. For now this will render on - * the main thread. - */ -class LayerManagerD3D9 : public LayerManager { -public: - LayerManagerD3D9(nsIWidget *aWidget); - virtual ~LayerManagerD3D9(); - - /* - * Initializes the layer manager, this is when the layer manager will - * actually access the device and attempt to create the swap chain used - * to draw to the window. If this method fails the device cannot be used. - * This function is not threadsafe. - * - * \return True is initialization was succesful, false when it was not. - */ - bool Initialize(bool force = false); - - /* - * Sets the clipping region for this layer manager. This is important on - * windows because using OGL we no longer have GDI's native clipping. Therefor - * widget must tell us what part of the screen is being invalidated, - * and we should clip to this. - * - * \param aClippingRegion Region to clip to. Setting an empty region - * will disable clipping. - */ - void SetClippingRegion(const nsIntRegion& aClippingRegion); - - /* - * LayerManager implementation. - */ - virtual void Destroy(); - - virtual void BeginTransaction(); - - virtual void BeginTransactionWithTarget(gfxContext* aTarget); - - void EndConstruction(); - - virtual bool EndEmptyTransaction(EndTransactionFlags aFlags = END_DEFAULT); - - struct CallbackInfo { - DrawPaintedLayerCallback Callback; - void *CallbackData; - }; - - virtual void EndTransaction(DrawPaintedLayerCallback aCallback, - void* aCallbackData, - EndTransactionFlags aFlags = END_DEFAULT); - - const CallbackInfo &GetCallbackInfo() { return mCurrentCallbackInfo; } - - void SetRoot(Layer* aLayer); - - virtual bool CanUseCanvasLayerForSize(const gfx::IntSize &aSize) - { - if (!mDeviceManager) - return false; - int32_t maxSize = mDeviceManager->GetMaxTextureSize(); - return aSize <= gfx::IntSize(maxSize, maxSize); - } - - virtual int32_t GetMaxTextureSize() const - { - return mDeviceManager->GetMaxTextureSize(); - } - - virtual already_AddRefed CreatePaintedLayer(); - - virtual already_AddRefed CreateContainerLayer(); - - virtual already_AddRefed CreateImageLayer(); - - virtual already_AddRefed CreateColorLayer(); - - virtual already_AddRefed CreateCanvasLayer(); - - virtual already_AddRefed CreateReadbackLayer(); - - virtual LayersBackend GetBackendType() { return LayersBackend::LAYERS_D3D9; } - virtual void GetBackendName(nsAString& name) { name.AssignLiteral("Direct3D 9"); } - bool DeviceWasRemoved() { return deviceManager()->DeviceWasRemoved(); } - - /* - * Helper methods. - */ - void SetClippingEnabled(bool aEnabled); - - void SetShaderMode(DeviceManagerD3D9::ShaderMode aMode, - Layer* aMask, bool aIs2D = true) - { mDeviceManager->SetShaderMode(aMode, aMask, aIs2D); } - - IDirect3DDevice9 *device() const { return mDeviceManager->device(); } - DeviceManagerD3D9 *deviceManager() const { return mDeviceManager; } - - /** - * Return pointer to the Nv3DVUtils instance. Re-direct to mDeviceManager. - */ - Nv3DVUtils *GetNv3DVUtils() { return mDeviceManager ? mDeviceManager->GetNv3DVUtils() : nullptr; } - - virtual const char* Name() const { return "D3D9"; } - - void ReportFailure(const nsACString &aMsg, HRESULT aCode); - - bool CompositingDisabled() { return mCompositingDisabled; } - void SetCompositingDisabled(bool aCompositingDisabled) { mCompositingDisabled = aCompositingDisabled; } - -private: - /* Device manager instance for this layer manager */ - nsRefPtr mDeviceManager; - - /* Swap chain associated with this layer manager */ - nsRefPtr mSwapChain; - - /* Widget associated with this layer manager */ - nsIWidget *mWidget; - - /* - * Context target, nullptr when drawing directly to our swap chain. - */ - nsRefPtr mTarget; - - /* Callback info for current transaction */ - CallbackInfo mCurrentCallbackInfo; - - /* - * Region we're clipping our current drawing to. - */ - nsIntRegion mClippingRegion; - - /* - * Device reset count at last paint. Whenever this changes, we need to - * do a full layer tree update. - */ - uint32_t mDeviceResetCount; - - /* - * True if we should only be drawing layer contents, not - * compositing them to the target. - */ - bool mCompositingDisabled; - - /* - * Render the current layer tree to the active target. - */ - void Render(); - - /* - * Setup the pipeline. - */ - void SetupPipeline(); - - /* - * Copies the content of our backbuffer to the set transaction target. - */ - void PaintToTarget(); - -}; - -/* - * General information and tree management for OGL layers. - */ -class LayerD3D9 -{ -public: - LayerD3D9(LayerManagerD3D9 *aManager); - - virtual LayerD3D9 *GetFirstChildD3D9() { return nullptr; } - - void SetFirstChild(LayerD3D9 *aParent); - - virtual Layer* GetLayer() = 0; - - virtual void RenderLayer() = 0; - - /** - /* This function may be used on device resets to clear all VRAM resources - * that a layer might be using. - */ - virtual void CleanResources() {} - - IDirect3DDevice9 *device() const { return mD3DManager->device(); } - - /* Called by the layer manager when it's destroyed */ - virtual void LayerManagerDestroyed() {} - - void ReportFailure(const nsACString &aMsg, HRESULT aCode) { - return mD3DManager->ReportFailure(aMsg, aCode); - } - - void SetShaderTransformAndOpacity() - { - Layer* layer = GetLayer(); - const gfx::Matrix4x4& transform = layer->GetEffectiveTransform(); - device()->SetVertexShaderConstantF(CBmLayerTransform, &transform._11, 4); - - float opacity[4]; - /* - * We always upload a 4 component float, but the shader will use only the - * first component since it's declared as a 'float'. - */ - opacity[0] = layer->GetEffectiveOpacity(); - device()->SetPixelShaderConstantF(CBfLayerOpacity, opacity, 1); - } - - /* - * Returns a texture containing the contents of this - * layer. Will try to return an existing texture if possible, or a temporary - * one if not. It is the callee's responsibility to release the shader - * resource view. Will return null if a texture could not be constructed. - * The texture will not be transformed, i.e., it will be in the same coord - * space as this. - * Any layer that can be used as a mask layer should override this method. - * If aSize is non-null and a texture is successfully returned, aSize will - * contain the size of the texture. - */ - virtual already_AddRefed GetAsTexture(gfx::IntSize* aSize) - { - return nullptr; - } - -protected: - LayerManagerD3D9 *mD3DManager; -}; - -/* - * RAII helper for locking D3D9 textures. - */ -class LockTextureRectD3D9 -{ -public: - LockTextureRectD3D9(IDirect3DTexture9* aTexture) - : mTexture(aTexture) - { - mLockResult = mTexture->LockRect(0, &mR, nullptr, 0); - } - - ~LockTextureRectD3D9() - { - mTexture->UnlockRect(0); - } - - bool HasLock() { - return SUCCEEDED(mLockResult); - } - - D3DLOCKED_RECT GetLockRect() - { - return mR; - } -private: - LockTextureRectD3D9 (const LockTextureRectD3D9&); - LockTextureRectD3D9& operator= (const LockTextureRectD3D9&); - - IDirect3DTexture9* mTexture; - D3DLOCKED_RECT mR; - HRESULT mLockResult; -}; - -} /* layers */ -} /* mozilla */ - -#endif /* GFX_LAYERMANAGERD3D9_H */ diff --git a/gfx/layers/d3d9/PaintedLayerD3D9.cpp b/gfx/layers/d3d9/PaintedLayerD3D9.cpp deleted file mode 100644 index b49a59a9c0b1..000000000000 --- a/gfx/layers/d3d9/PaintedLayerD3D9.cpp +++ /dev/null @@ -1,656 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "mozilla/layers/PLayerTransaction.h" - -// This must occur *after* layers/PLayerTransaction.h to avoid -// typedefs conflicts. -#include "mozilla/ArrayUtils.h" - -#include "PaintedLayerD3D9.h" -#include "gfxPlatform.h" - -#include "gfxWindowsPlatform.h" -#include "gfxTeeSurface.h" -#include "gfxUtils.h" -#include "ReadbackProcessor.h" -#include "ReadbackLayer.h" -#include "mozilla/gfx/2D.h" - -namespace mozilla { -namespace layers { - -using namespace gfx; - -PaintedLayerD3D9::PaintedLayerD3D9(LayerManagerD3D9 *aManager) - : PaintedLayer(aManager, nullptr) - , LayerD3D9(aManager) -{ - mImplData = static_cast(this); - aManager->deviceManager()->mLayersWithResources.AppendElement(this); -} - -PaintedLayerD3D9::~PaintedLayerD3D9() -{ - if (mD3DManager) { - mD3DManager->deviceManager()->mLayersWithResources.RemoveElement(this); - } -} - -/** - * Retention threshold - amount of pixels intersection required to enable - * layer content retention. This is a guesstimate. Profiling could be done to - * figure out the optimal threshold. - */ -#define RETENTION_THRESHOLD 16384 - -void -PaintedLayerD3D9::InvalidateRegion(const nsIntRegion &aRegion) -{ - mInvalidRegion.Or(mInvalidRegion, aRegion); - mInvalidRegion.SimplifyOutward(20); - mValidRegion.Sub(mValidRegion, mInvalidRegion); -} - -void -PaintedLayerD3D9::CopyRegion(IDirect3DTexture9* aSrc, const nsIntPoint &aSrcOffset, - IDirect3DTexture9* aDest, const nsIntPoint &aDestOffset, - const nsIntRegion &aCopyRegion, nsIntRegion* aValidRegion) -{ - nsRefPtr srcSurface, dstSurface; - aSrc->GetSurfaceLevel(0, getter_AddRefs(srcSurface)); - aDest->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - - nsIntRegion retainedRegion; - nsIntRegionRectIterator iter(aCopyRegion); - const nsIntRect *r; - while ((r = iter.Next())) { - if (r->width * r->height > RETENTION_THRESHOLD) { - RECT oldRect, newRect; - - // Calculate the retained rectangle's position on the old and the new - // surface. - oldRect.left = r->x - aSrcOffset.x; - oldRect.top = r->y - aSrcOffset.y; - oldRect.right = oldRect.left + r->width; - oldRect.bottom = oldRect.top + r->height; - - newRect.left = r->x - aDestOffset.x; - newRect.top = r->y - aDestOffset.y; - newRect.right = newRect.left + r->width; - newRect.bottom = newRect.top + r->height; - - // Copy data from our old texture to the new one - HRESULT hr = device()-> - StretchRect(srcSurface, &oldRect, dstSurface, &newRect, D3DTEXF_NONE); - - if (SUCCEEDED(hr)) { - retainedRegion.Or(retainedRegion, *r); - } - } - } - - // Areas which were valid and were retained are still valid - aValidRegion->And(*aValidRegion, retainedRegion); -} - -void -PaintedLayerD3D9::UpdateTextures(SurfaceMode aMode) -{ - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - - if (HaveTextures(aMode)) { - if (!mTextureRect.IsEqualInterior(visibleRect)) { - nsRefPtr oldTexture = mTexture; - nsRefPtr oldTextureOnWhite = mTextureOnWhite; - - NS_ASSERTION(mTextureRect.Contains(mValidRegion.GetBounds()), - "How can we have valid data outside the texture?"); - nsIntRegion retainRegion; - // The region we want to retain is the valid data that is inside - // the new visible region - retainRegion.And(mValidRegion, mVisibleRegion); - - CreateNewTextures(gfx::IntSize(visibleRect.width, visibleRect.height), aMode); - - // If our texture creation failed this can mean a device reset is pending and we - // should silently ignore the failure. In the future when device failures - // are properly handled we should test for the type of failure and gracefully - // handle different failures. See bug 569081. - if (!HaveTextures(aMode)) { - mValidRegion.SetEmpty(); - } else { - CopyRegion(oldTexture, mTextureRect.TopLeft(), mTexture, visibleRect.TopLeft(), - retainRegion, &mValidRegion); - if (aMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { - CopyRegion(oldTextureOnWhite, mTextureRect.TopLeft(), mTextureOnWhite, visibleRect.TopLeft(), - retainRegion, &mValidRegion); - } - } - - mTextureRect = visibleRect; - } - } else { - CreateNewTextures(gfx::IntSize(visibleRect.width, visibleRect.height), aMode); - mTextureRect = visibleRect; - - NS_ASSERTION(mValidRegion.IsEmpty(), "Someone forgot to empty the region"); - } -} - -void -PaintedLayerD3D9::RenderRegion(const nsIntRegion& aRegion) -{ - nsIntRegionRectIterator iter(aRegion); - - const nsIntRect *iterRect; - while ((iterRect = iter.Next())) { - device()->SetVertexShaderConstantF(CBvLayerQuad, - ShaderConstantRect(iterRect->x, - iterRect->y, - iterRect->width, - iterRect->height), - 1); - - device()->SetVertexShaderConstantF(CBvTextureCoords, - ShaderConstantRect( - (float)(iterRect->x - mTextureRect.x) / (float)mTextureRect.width, - (float)(iterRect->y - mTextureRect.y) / (float)mTextureRect.height, - (float)iterRect->width / (float)mTextureRect.width, - (float)iterRect->height / (float)mTextureRect.height), 1); - - device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - } -} - -void -PaintedLayerD3D9::RenderPaintedLayer(ReadbackProcessor* aReadback) -{ - if (mVisibleRegion.IsEmpty()) { - return; - } - - nsIntRect newTextureRect = mVisibleRegion.GetBounds(); - - SurfaceMode mode = GetSurfaceMode(); - if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA && - (!mParent || !mParent->SupportsComponentAlphaChildren())) { - mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA; - } - // If we have a transform that requires resampling of our texture, then - // we need to make sure we don't sample pixels that haven't been drawn. - // We clamp sample coordinates to the texture rect, but when the visible region - // doesn't fill the entire texture rect we need to make sure we draw all the - // pixels in the texture rect anyway in case they get sampled. - nsIntRegion neededRegion = mVisibleRegion; - if (!neededRegion.GetBounds().IsEqualInterior(newTextureRect) || - neededRegion.GetNumRects() > 1) { - if (MayResample()) { - neededRegion = newTextureRect; - if (mode == SurfaceMode::SURFACE_OPAQUE) { - // We're going to paint outside the visible region, but layout hasn't - // promised that it will paint opaquely there, so we'll have to - // treat this layer as transparent. - mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA; - } - } - } - - VerifyContentType(mode); - UpdateTextures(mode); - if (!HaveTextures(mode)) { - NS_WARNING("Texture creation failed"); - return; - } - - nsTArray readbackUpdates; - nsIntRegion readbackRegion; - if (aReadback && UsedForReadback()) { - aReadback->GetPaintedLayerUpdates(this, &readbackUpdates, &readbackRegion); - } - - // Because updates to D3D9 PaintedLayers are rendered with the CPU, we don't - // have to do readback from D3D9 surfaces. Instead we make sure that any area - // needed for readback is included in the drawRegion we ask layout to render. - // Then the readback areas we need can be copied out of the temporary - // destinationSurface in DrawRegion. - nsIntRegion drawRegion; - drawRegion.Sub(neededRegion, mValidRegion); - drawRegion.Or(drawRegion, readbackRegion); - // NS_ASSERTION(mVisibleRegion.Contains(region), "Bad readback region!"); - - if (!drawRegion.IsEmpty()) { - LayerManagerD3D9::CallbackInfo cbInfo = mD3DManager->GetCallbackInfo(); - if (!cbInfo.Callback) { - NS_ERROR("D3D9 should never need to update PaintedLayers in an empty transaction"); - return; - } - - DrawRegion(drawRegion, mode, readbackUpdates); - - mValidRegion = neededRegion; - } - - if (mD3DManager->CompositingDisabled()) { - return; - } - - SetShaderTransformAndOpacity(); - - if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { - mD3DManager->SetShaderMode(DeviceManagerD3D9::COMPONENTLAYERPASS1, - GetMaskLayer()); - device()->SetTexture(0, mTexture); - device()->SetTexture(1, mTextureOnWhite); - device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); - device()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); - RenderRegion(neededRegion); - - mD3DManager->SetShaderMode(DeviceManagerD3D9::COMPONENTLAYERPASS2, - GetMaskLayer()); - device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); - device()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); - RenderRegion(neededRegion); - - // Restore defaults - device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); - device()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - device()->SetTexture(1, nullptr); - } else { - mD3DManager->SetShaderMode(DeviceManagerD3D9::RGBALAYER, - GetMaskLayer()); - device()->SetTexture(0, mTexture); - RenderRegion(neededRegion); - } - - // Set back to default. - device()->SetVertexShaderConstantF(CBvTextureCoords, - ShaderConstantRect(0, 0, 1.0f, 1.0f), - 1); -} - -void -PaintedLayerD3D9::CleanResources() -{ - mTexture = nullptr; - mTextureOnWhite = nullptr; - mValidRegion.SetEmpty(); -} - -void -PaintedLayerD3D9::LayerManagerDestroyed() -{ - mD3DManager->deviceManager()->mLayersWithResources.RemoveElement(this); - mD3DManager = nullptr; -} - -Layer* -PaintedLayerD3D9::GetLayer() -{ - return this; -} - -bool -PaintedLayerD3D9::IsEmpty() -{ - return !mTexture; -} - -void -PaintedLayerD3D9::VerifyContentType(SurfaceMode aMode) -{ - if (!mTexture) - return; - - D3DSURFACE_DESC desc; - mTexture->GetLevelDesc(0, &desc); - - switch (aMode) { - case SurfaceMode::SURFACE_OPAQUE: - if (desc.Format == D3DFMT_X8R8G8B8 && !mTextureOnWhite) - return; - break; - - case SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA: - if (desc.Format == D3DFMT_A8R8G8B8 && !mTextureOnWhite) - return; - break; - - case SurfaceMode::SURFACE_COMPONENT_ALPHA: - if (mTextureOnWhite) { - NS_ASSERTION(desc.Format == D3DFMT_X8R8G8B8, "Wrong format for component alpha texture"); - return; - } - break; - } - - // The new format isn't compatible with the old texture(s), toss out the old - // texture(s). - mTexture = nullptr; - mTextureOnWhite = nullptr; - mValidRegion.SetEmpty(); -} - -class OpaqueRenderer { -public: - OpaqueRenderer(const nsIntRegion& aUpdateRegion) : - mUpdateRegion(aUpdateRegion) {} - ~OpaqueRenderer() { End(); } - already_AddRefed Begin(LayerD3D9* aLayer); - void End(); - IDirect3DTexture9* GetTexture() { return mTmpTexture; } - -private: - const nsIntRegion& mUpdateRegion; - nsRefPtr mTmpTexture; - nsRefPtr mSurface; - nsRefPtr mD3D9ThebesSurface; -}; - -already_AddRefed -OpaqueRenderer::Begin(LayerD3D9* aLayer) -{ - nsIntRect bounds = mUpdateRegion.GetBounds(); - - HRESULT hr = aLayer->device()-> - CreateTexture(bounds.width, bounds.height, 1, 0, D3DFMT_X8R8G8B8, - D3DPOOL_SYSTEMMEM, getter_AddRefs(mTmpTexture), nullptr); - - if (FAILED(hr)) { - aLayer->ReportFailure(NS_LITERAL_CSTRING("Failed to create temporary texture in system memory."), hr); - return nullptr; - } - - hr = mTmpTexture->GetSurfaceLevel(0, getter_AddRefs(mSurface)); - - if (FAILED(hr)) { - // Uh-oh, bail. - NS_WARNING("Failed to get texture surface level."); - return nullptr; - } - - nsRefPtr result = new gfxWindowsSurface(mSurface); - if (!result || result->CairoStatus()) { - NS_WARNING("Failed to d3d9 cairo surface."); - return nullptr; - } - mD3D9ThebesSurface = result; - - return result.forget(); -} - -void -OpaqueRenderer::End() -{ - mSurface = nullptr; - // gfxWindowsSurface returned from ::Begin() should be released before the - // texture is used. This will assert that this is the case -#if 1 - if (mD3D9ThebesSurface) { - mD3D9ThebesSurface->AddRef(); - nsrefcnt c = mD3D9ThebesSurface->Release(); - if (c != 1) - NS_RUNTIMEABORT("Reference mD3D9ThebesSurface must be released by caller of Begin() before calling End()"); - } -#endif - mD3D9ThebesSurface = nullptr; - -} -class TransparentRenderer { -public: - TransparentRenderer(const nsIntRegion& aUpdateRegion) : - mUpdateRegion(aUpdateRegion) {} - ~TransparentRenderer() { End(); } - already_AddRefed Begin(LayerD3D9* aLayer); - void End(); - IDirect3DTexture9* GetTexture() { return mTmpTexture; } - -private: - const nsIntRegion& mUpdateRegion; - nsRefPtr mTmpTexture; - nsRefPtr mD3D9ThebesSurface; -}; - -already_AddRefed -TransparentRenderer::Begin(LayerD3D9* aLayer) -{ - nsIntRect bounds = mUpdateRegion.GetBounds(); - - HRESULT hr = aLayer->device()-> - CreateTexture(bounds.width, bounds.height, 1, 0, D3DFMT_A8R8G8B8, - D3DPOOL_SYSTEMMEM, getter_AddRefs(mTmpTexture), nullptr); - - if (FAILED(hr)) { - aLayer->ReportFailure(NS_LITERAL_CSTRING("Failed to create temporary texture in system memory."), hr); - return nullptr; - } - - D3DLOCKED_RECT r; - hr = mTmpTexture->LockRect(0, &r, nullptr, 0); - if (FAILED(hr)) { - // Uh-oh, bail. - NS_WARNING("Failed to lock the texture"); - return nullptr; - } - nsRefPtr result = - new gfxImageSurface((unsigned char *)r.pBits, - bounds.Size(), - r.Pitch, - gfxImageFormat::ARGB32); - - if (!result || result->CairoStatus()) { - NS_WARNING("Failed to d3d9 cairo surface."); - return nullptr; - } - mD3D9ThebesSurface = result; - - return result.forget(); -} - -void -TransparentRenderer::End() -{ - // gfxImageSurface returned from ::Begin() should be released before the - // texture is used. This will assert that this is the case -#if 1 - if (mD3D9ThebesSurface) { - mD3D9ThebesSurface->AddRef(); - nsrefcnt c = mD3D9ThebesSurface->Release(); - if (c != 1) - NS_RUNTIMEABORT("Reference mD3D9ThebesSurface must be released by caller of Begin() before calling End()"); - } -#endif - mD3D9ThebesSurface = nullptr; - if (mTmpTexture) - mTmpTexture->UnlockRect(0); -} - -static void -FillSurface(gfxASurface* aSurface, const nsIntRegion& aRegion, - const nsIntPoint& aOffset, const gfxRGBA& aColor) -{ - nsIntRegionRectIterator iter(aRegion); - const nsIntRect* r; - while ((r = iter.Next()) != nullptr) { - nsIntRect rect = *r + aOffset; - gfxUtils::ClearThebesSurface(aSurface, &rect, aColor); - } -} - -void -PaintedLayerD3D9::DrawRegion(nsIntRegion &aRegion, SurfaceMode aMode, - const nsTArray& aReadbackUpdates) -{ - nsIntRect visibleRect = mVisibleRegion.GetBounds(); - - nsRefPtr destinationSurface; - nsIntRect bounds = aRegion.GetBounds(); - nsRefPtr tmpTexture; - OpaqueRenderer opaqueRenderer(aRegion); - TransparentRenderer transparentRenderer(aRegion); - OpaqueRenderer opaqueRendererOnWhite(aRegion); - - switch (aMode) - { - case SurfaceMode::SURFACE_OPAQUE: - destinationSurface = opaqueRenderer.Begin(this); - break; - - case SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA: { - destinationSurface = transparentRenderer.Begin(this); - // If the contents of this layer don't require component alpha in the - // end of rendering, it's safe to enable Cleartype since all the Cleartype - // glyphs must be over (or under) opaque pixels. - destinationSurface->SetSubpixelAntialiasingEnabled(!(mContentFlags & CONTENT_COMPONENT_ALPHA)); - break; - } - - case SurfaceMode::SURFACE_COMPONENT_ALPHA: { - nsRefPtr onBlack = opaqueRenderer.Begin(this); - nsRefPtr onWhite = opaqueRendererOnWhite.Begin(this); - if (onBlack && onWhite) { - FillSurface(onBlack, aRegion, bounds.TopLeft(), gfxRGBA(0.0, 0.0, 0.0, 1.0)); - FillSurface(onWhite, aRegion, bounds.TopLeft(), gfxRGBA(1.0, 1.0, 1.0, 1.0)); - gfxASurface* surfaces[2] = { onBlack.get(), onWhite.get() }; - destinationSurface = new gfxTeeSurface(surfaces, ArrayLength(surfaces)); - // Using this surface as a source will likely go horribly wrong, since - // only the onBlack surface will really be used, so alpha information will - // be incorrect. - destinationSurface->SetAllowUseAsSource(false); - } - break; - } - } - - if (!destinationSurface) - return; - - MOZ_ASSERT(gfxPlatform::GetPlatform()->SupportsAzureContentForType(BackendType::CAIRO)); - RefPtr dt = - gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(destinationSurface, - IntSize(destinationSurface->GetSize().width, - destinationSurface->GetSize().height)); - - nsRefPtr context = new gfxContext(dt); - - context->SetMatrix(context->CurrentMatrix().Translate(-bounds.x, -bounds.y)); - LayerManagerD3D9::CallbackInfo cbInfo = mD3DManager->GetCallbackInfo(); - cbInfo.Callback(this, context, aRegion, DrawRegionClip::NONE, nsIntRegion(), cbInfo.CallbackData); - - for (uint32_t i = 0; i < aReadbackUpdates.Length(); ++i) { - NS_ASSERTION(aMode == SurfaceMode::SURFACE_OPAQUE, - "Transparent surfaces should not be used for readback"); - const ReadbackProcessor::Update& update = aReadbackUpdates[i]; - nsIntPoint offset = update.mLayer->GetBackgroundLayerOffset(); - nsRefPtr ctx = - update.mLayer->GetSink()->BeginUpdate(update.mUpdateRect + offset, - update.mSequenceCounter); - if (ctx) { - ctx->SetMatrix(ctx->CurrentMatrix().Translate(offset.x, offset.y)); - ctx->SetSource(destinationSurface, gfxPoint(bounds.x, bounds.y)); - ctx->Paint(); - update.mLayer->GetSink()->EndUpdate(ctx, update.mUpdateRect + offset); - } - } - - // Release the cairo d3d9 surface before we try to composite it - context = nullptr; - - nsAutoTArray srcTextures; - nsAutoTArray destTextures; - switch (aMode) - { - case SurfaceMode::SURFACE_OPAQUE: - // Must release reference to dest surface before ending drawing - destinationSurface = nullptr; - opaqueRenderer.End(); - srcTextures.AppendElement(opaqueRenderer.GetTexture()); - destTextures.AppendElement(mTexture); - break; - - case SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA: - // Must release reference to dest surface before ending drawing - destinationSurface = nullptr; - transparentRenderer.End(); - srcTextures.AppendElement(transparentRenderer.GetTexture()); - destTextures.AppendElement(mTexture); - break; - - case SurfaceMode::SURFACE_COMPONENT_ALPHA: { - // Must release reference to dest surface before ending drawing - destinationSurface = nullptr; - opaqueRenderer.End(); - opaqueRendererOnWhite.End(); - srcTextures.AppendElement(opaqueRenderer.GetTexture()); - destTextures.AppendElement(mTexture); - srcTextures.AppendElement(opaqueRendererOnWhite.GetTexture()); - destTextures.AppendElement(mTextureOnWhite); - break; - } - } - NS_ASSERTION(srcTextures.Length() == destTextures.Length(), "Mismatched lengths"); - - - // Copy to the texture. - for (uint32_t i = 0; i < srcTextures.Length(); ++i) { - nsRefPtr srcSurface; - nsRefPtr dstSurface; - - destTextures[i]->GetSurfaceLevel(0, getter_AddRefs(dstSurface)); - srcTextures[i]->GetSurfaceLevel(0, getter_AddRefs(srcSurface)); - - nsIntRegionRectIterator iter(aRegion); - const nsIntRect *iterRect; - while ((iterRect = iter.Next())) { - RECT rect; - rect.left = iterRect->x - bounds.x; - rect.top = iterRect->y - bounds.y; - rect.right = iterRect->XMost() - bounds.x; - rect.bottom = iterRect->YMost() - bounds.y; - - POINT point; - point.x = iterRect->x - visibleRect.x; - point.y = iterRect->y - visibleRect.y; - device()->UpdateSurface(srcSurface, &rect, dstSurface, &point); - } - } -} - -void -PaintedLayerD3D9::CreateNewTextures(const gfx::IntSize &aSize, - SurfaceMode aMode) -{ - if (aSize.width == 0 || aSize.height == 0) { - // Nothing to do. - return; - } - - mTexture = nullptr; - mTextureOnWhite = nullptr; - HRESULT hr = device()->CreateTexture(aSize.width, aSize.height, 1, - D3DUSAGE_RENDERTARGET, - aMode != SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA ? D3DFMT_X8R8G8B8 : D3DFMT_A8R8G8B8, - D3DPOOL_DEFAULT, getter_AddRefs(mTexture), nullptr); - if (FAILED(hr)) { - ReportFailure(NS_LITERAL_CSTRING("PaintedLayerD3D9::CreateNewTextures(): Failed to create texture"), - hr); - return; - } - - if (aMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) { - hr = device()->CreateTexture(aSize.width, aSize.height, 1, - D3DUSAGE_RENDERTARGET, - D3DFMT_X8R8G8B8, - D3DPOOL_DEFAULT, getter_AddRefs(mTextureOnWhite), nullptr); - if (FAILED(hr)) { - ReportFailure(NS_LITERAL_CSTRING("PaintedLayerD3D9::CreateNewTextures(): Failed to create texture (2)"), - hr); - return; - } - } -} - -} /* namespace layers */ -} /* namespace mozilla */ diff --git a/gfx/layers/d3d9/PaintedLayerD3D9.h b/gfx/layers/d3d9/PaintedLayerD3D9.h deleted file mode 100644 index 4c6b3b3f142c..000000000000 --- a/gfx/layers/d3d9/PaintedLayerD3D9.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * 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 GFX_PAINTEDLAYERD3D9_H -#define GFX_PAINTEDLAYERD3D9_H - -#include "Layers.h" -#include "LayerManagerD3D9.h" -#include "ReadbackProcessor.h" - -namespace mozilla { -namespace layers { - -class ReadbackProcessor; - -class PaintedLayerD3D9 : public PaintedLayer, - public LayerD3D9 -{ -public: - PaintedLayerD3D9(LayerManagerD3D9 *aManager); - virtual ~PaintedLayerD3D9(); - - /* PaintedLayer implementation */ - void InvalidateRegion(const nsIntRegion& aRegion); - - /* LayerD3D9 implementation */ - Layer* GetLayer(); - virtual bool IsEmpty(); - virtual void RenderLayer() { RenderPaintedLayer(nullptr); } - virtual void CleanResources(); - virtual void LayerManagerDestroyed(); - - void RenderPaintedLayer(ReadbackProcessor* aReadback); - -private: - /* - * D3D9 texture - */ - nsRefPtr mTexture; - /* - * D3D9 texture for render-on-white when doing component alpha - */ - nsRefPtr mTextureOnWhite; - /** - * Visible region bounds used when we drew the contents of the textures - */ - nsIntRect mTextureRect; - - bool HaveTextures(SurfaceMode aMode) - { - return mTexture && (aMode != SurfaceMode::SURFACE_COMPONENT_ALPHA || mTextureOnWhite); - } - - /* Checks if our surface has the right content type */ - void VerifyContentType(SurfaceMode aMode); - - /* Ensures we have the necessary texture object(s) and that they correspond - * to mVisibleRegion.GetBounds(). This creates new texture objects as - * necessary and also copies existing valid texture data if necessary. - */ - void UpdateTextures(SurfaceMode aMode); - - /* Render the rectangles of mVisibleRegion with D3D9 using the currently - * bound textures, target, shaders, etc. - */ - void RenderRegion(const nsIntRegion& aRegion); - - /* Have a region of our layer drawn */ - void DrawRegion(nsIntRegion &aRegion, SurfaceMode aMode, - const nsTArray& aReadbackUpdates); - - /* Create a new texture */ - void CreateNewTextures(const gfx::IntSize &aSize, SurfaceMode aMode); - - void CopyRegion(IDirect3DTexture9* aSrc, const nsIntPoint &aSrcOffset, - IDirect3DTexture9* aDest, const nsIntPoint &aDestOffset, - const nsIntRegion &aCopyRegion, nsIntRegion* aValidRegion); -}; - -} /* layers */ -} /* mozilla */ -#endif /* GFX_PAINTEDLAYERD3D9_H */ diff --git a/gfx/layers/ipc/ShadowLayerUtils.h b/gfx/layers/ipc/ShadowLayerUtils.h index acbc1bfb97cb..868dd78431f3 100644 --- a/gfx/layers/ipc/ShadowLayerUtils.h +++ b/gfx/layers/ipc/ShadowLayerUtils.h @@ -13,10 +13,6 @@ #include "SurfaceTypes.h" #include "mozilla/WidgetUtils.h" -#if defined(MOZ_ENABLE_D3D10_LAYER) -# include "mozilla/layers/ShadowLayerUtilsD3D10.h" -#endif - #if defined(XP_MACOSX) #define MOZ_HAVE_PLATFORM_SPECIFIC_LAYER_BUFFERS #endif diff --git a/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp b/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp deleted file mode 100644 index 9dbd596e4a04..000000000000 --- a/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp +++ /dev/null @@ -1,68 +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 -#include - -#include "mozilla/gfx/Point.h" -#include "mozilla/layers/LayerManagerComposite.h" -#include "mozilla/layers/PLayerTransaction.h" -#include "ShadowLayers.h" - -using namespace mozilla::gl; - -namespace mozilla { -namespace layers { - - -/*static*/ void -ShadowLayerForwarder::PlatformSyncBeforeUpdate() -{ -} - -/*static*/ bool -LayerManagerComposite::SupportsDirectTexturing() -{ - return true; -} - -/*static*/ void -LayerManagerComposite::PlatformSyncBeforeReplyUpdate() -{ -} - -bool -GetDescriptor(ID3D10Texture2D* aTexture, SurfaceDescriptorD3D10* aDescr) -{ - NS_ABORT_IF_FALSE(aTexture && aDescr, "Params must be nonnull"); - - HRESULT hr; - IDXGIResource* dr = nullptr; - hr = aTexture->QueryInterface(__uuidof(IDXGIResource), (void**)&dr); - if (!SUCCEEDED(hr) || !dr) - return false; - - hr = dr->GetSharedHandle(reinterpret_cast(&aDescr->handle())); - return !!SUCCEEDED(hr); -} - -already_AddRefed -OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr) -{ - HRESULT hr; - ID3D10Texture2D* tex = nullptr; - hr = aDevice->OpenSharedResource(reinterpret_cast(aDescr.handle()), - __uuidof(ID3D10Texture2D), - (void**)&tex); - if (!SUCCEEDED(hr) || !tex) - return nullptr; - - return nsRefPtr(tex).forget(); -} - -} // namespace layers -} // namespace mozilla diff --git a/gfx/layers/ipc/ShadowLayerUtilsD3D10.h b/gfx/layers/ipc/ShadowLayerUtilsD3D10.h deleted file mode 100644 index b90269ec9737..000000000000 --- a/gfx/layers/ipc/ShadowLayerUtilsD3D10.h +++ /dev/null @@ -1,34 +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/. */ - -#ifndef mozilla_layers_ShadowLayerUtilsD3D10_h -#define mozilla_layers_ShadowLayerUtilsD3D10_h - -#define MOZ_HAVE_PLATFORM_SPECIFIC_LAYER_BUFFERS - -struct ID3D10Device; -struct ID3D10Texture2D; - -namespace mozilla { -namespace layers { - -class SurfaceDescriptorD3D10; - -/** - * Write into |aDescr| a cross-process descriptor of |aTexture|, if - * possible. Return true iff |aDescr| was successfully set. - */ -bool -GetDescriptor(ID3D10Texture2D* aTexture, SurfaceDescriptorD3D10* aDescr); - -already_AddRefed -OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr); - -} // namespace layers -} // namespace mozilla - -#endif // mozilla_layers_ShadowLayerUtilsD3D10_h diff --git a/gfx/layers/moz.build b/gfx/layers/moz.build index bfb6829cdbaa..fd3f6389e82b 100644 --- a/gfx/layers/moz.build +++ b/gfx/layers/moz.build @@ -52,19 +52,12 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': if CONFIG['MOZ_ENABLE_D3D9_LAYER']: EXPORTS += [ 'd3d9/DeviceManagerD3D9.h', - 'd3d9/LayerManagerD3D9.h', ] EXPORTS.mozilla.layers += [ 'd3d9/CompositorD3D9.h', 'd3d9/TextureD3D9.h', ] UNIFIED_SOURCES += [ - 'd3d9/CanvasLayerD3D9.cpp', - 'd3d9/ColorLayerD3D9.cpp', - 'd3d9/ContainerLayerD3D9.cpp', - 'd3d9/ImageLayerD3D9.cpp', - 'd3d9/LayerManagerD3D9.cpp', - 'd3d9/PaintedLayerD3D9.cpp', 'd3d9/TextureD3D9.cpp', ] SOURCES += [ @@ -73,26 +66,13 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': 'd3d9/Nv3DVUtils.cpp', ] if CONFIG['MOZ_ENABLE_D3D10_LAYER']: - EXPORTS += [ - 'd3d10/LayerManagerD3D10.h', - 'd3d10/ReadbackManagerD3D10.h', - ] EXPORTS.mozilla.layers += [ 'd3d11/CompositorD3D11.h', 'd3d11/ReadbackManagerD3D11.h', 'd3d11/TextureD3D11.h', - 'ipc/ShadowLayerUtilsD3D10.h', ] UNIFIED_SOURCES += [ - 'd3d10/CanvasLayerD3D10.cpp', - 'd3d10/ColorLayerD3D10.cpp', - 'd3d10/ContainerLayerD3D10.cpp', - 'd3d10/ImageLayerD3D10.cpp', - 'd3d10/LayerManagerD3D10.cpp', - 'd3d10/PaintedLayerD3D10.cpp', - 'd3d10/ReadbackManagerD3D10.cpp', 'd3d11/TextureD3D11.cpp', - 'ipc/ShadowLayerUtilsD3D10.cpp', ] SOURCES += [ 'd3d11/CompositorD3D11.cpp', diff --git a/gfx/src/nsCoord.h b/gfx/src/nsCoord.h index 8dff58c97674..c38aba054dc0 100644 --- a/gfx/src/nsCoord.h +++ b/gfx/src/nsCoord.h @@ -213,8 +213,8 @@ NSCoordSaturatingSubtract(nscoord a, nscoord b, // Cap the result, in case we're dealing with numbers near nscoord_MAX return std::min(nscoord_MAX, a - b); } - } #endif + } } inline float NSCoordToFloat(nscoord aCoord) { diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index 056500c4bab3..f757e5911d65 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -442,34 +442,37 @@ LookupAlternateValues(gfxFontFeatureValueSet *featureLookup, } } -/* static */ bool +/* static */ void gfxFontShaper::MergeFontFeatures( const gfxFontStyle *aStyle, const nsTArray& aFontFeatures, bool aDisableLigatures, const nsAString& aFamilyName, bool aAddSmallCaps, - nsDataHashtable& aMergedFeatures) + PLDHashOperator (*aHandleFeature)(const uint32_t&, uint32_t&, void*), + void* aHandleFeatureData) { uint32_t numAlts = aStyle->alternateValues.Length(); const nsTArray& styleRuleFeatures = aStyle->featureSettings; - // bail immediately if nothing to do + // Bail immediately if nothing to do, which is the common case. if (styleRuleFeatures.IsEmpty() && aFontFeatures.IsEmpty() && !aDisableLigatures && aStyle->variantCaps == NS_FONT_VARIANT_CAPS_NORMAL && aStyle->variantSubSuper == NS_FONT_VARIANT_POSITION_NORMAL && numAlts == 0) { - return false; + return; } + nsDataHashtable mergedFeatures; + // Ligature features are enabled by default in the generic shaper, // so we explicitly turn them off if necessary (for letter-spacing) if (aDisableLigatures) { - aMergedFeatures.Put(HB_TAG('l','i','g','a'), 0); - aMergedFeatures.Put(HB_TAG('c','l','i','g'), 0); + mergedFeatures.Put(HB_TAG('l','i','g','a'), 0); + mergedFeatures.Put(HB_TAG('c','l','i','g'), 0); } // add feature values from font @@ -478,7 +481,7 @@ gfxFontShaper::MergeFontFeatures( count = aFontFeatures.Length(); for (i = 0; i < count; i++) { const gfxFontFeature& feature = aFontFeatures.ElementAt(i); - aMergedFeatures.Put(feature.mTag, feature.mValue); + mergedFeatures.Put(feature.mTag, feature.mValue); } // font-variant-caps - handled here due to the need for fallback handling @@ -486,27 +489,27 @@ gfxFontShaper::MergeFontFeatures( uint32_t variantCaps = aStyle->variantCaps; switch (variantCaps) { case NS_FONT_VARIANT_CAPS_ALLSMALL: - aMergedFeatures.Put(HB_TAG('c','2','s','c'), 1); + mergedFeatures.Put(HB_TAG('c','2','s','c'), 1); // fall through to the small-caps case case NS_FONT_VARIANT_CAPS_SMALLCAPS: - aMergedFeatures.Put(HB_TAG('s','m','c','p'), 1); + mergedFeatures.Put(HB_TAG('s','m','c','p'), 1); break; case NS_FONT_VARIANT_CAPS_ALLPETITE: - aMergedFeatures.Put(aAddSmallCaps ? HB_TAG('c','2','s','c') : - HB_TAG('c','2','p','c'), 1); + mergedFeatures.Put(aAddSmallCaps ? HB_TAG('c','2','s','c') : + HB_TAG('c','2','p','c'), 1); // fall through to the petite-caps case case NS_FONT_VARIANT_CAPS_PETITECAPS: - aMergedFeatures.Put(aAddSmallCaps ? HB_TAG('s','m','c','p') : - HB_TAG('p','c','a','p'), 1); + mergedFeatures.Put(aAddSmallCaps ? HB_TAG('s','m','c','p') : + HB_TAG('p','c','a','p'), 1); break; case NS_FONT_VARIANT_CAPS_TITLING: - aMergedFeatures.Put(HB_TAG('t','i','t','l'), 1); + mergedFeatures.Put(HB_TAG('t','i','t','l'), 1); break; case NS_FONT_VARIANT_CAPS_UNICASE: - aMergedFeatures.Put(HB_TAG('u','n','i','c'), 1); + mergedFeatures.Put(HB_TAG('u','n','i','c'), 1); break; default: @@ -516,10 +519,10 @@ gfxFontShaper::MergeFontFeatures( // font-variant-position - handled here due to the need for fallback switch (aStyle->variantSubSuper) { case NS_FONT_VARIANT_POSITION_SUPER: - aMergedFeatures.Put(HB_TAG('s','u','p','s'), 1); + mergedFeatures.Put(HB_TAG('s','u','p','s'), 1); break; case NS_FONT_VARIANT_POSITION_SUB: - aMergedFeatures.Put(HB_TAG('s','u','b','s'), 1); + mergedFeatures.Put(HB_TAG('s','u','b','s'), 1); break; default: break; @@ -536,7 +539,7 @@ gfxFontShaper::MergeFontFeatures( count = featureList.Length(); for (i = 0; i < count; i++) { const gfxFontFeature& feature = featureList.ElementAt(i); - aMergedFeatures.Put(feature.mTag, feature.mValue); + mergedFeatures.Put(feature.mTag, feature.mValue); } } @@ -544,10 +547,12 @@ gfxFontShaper::MergeFontFeatures( count = styleRuleFeatures.Length(); for (i = 0; i < count; i++) { const gfxFontFeature& feature = styleRuleFeatures.ElementAt(i); - aMergedFeatures.Put(feature.mTag, feature.mValue); + mergedFeatures.Put(feature.mTag, feature.mValue); } - return aMergedFeatures.Count() != 0; + if (mergedFeatures.Count() != 0) { + mergedFeatures.Enumerate(aHandleFeature, aHandleFeatureData); + } } void diff --git a/gfx/thebes/gfxFont.h b/gfx/thebes/gfxFont.h index dbb535ef0f6d..d28f1f331e73 100644 --- a/gfx/thebes/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -636,14 +636,15 @@ public: gfxFont *GetFont() const { return mFont; } - // returns true if features exist in output, false otherwise - static bool + static void MergeFontFeatures(const gfxFontStyle *aStyle, const nsTArray& aFontFeatures, bool aDisableLigatures, const nsAString& aFamilyName, bool aAddSmallCaps, - nsDataHashtable& aMergedFeatures); + PLDHashOperator (*aHandleFeature)(const uint32_t&, + uint32_t&, void*), + void* aHandleFeatureData); protected: // the font this shaper is working with diff --git a/gfx/thebes/gfxGraphiteShaper.cpp b/gfx/thebes/gfxGraphiteShaper.cpp index a31b24cf850c..5088068a33f0 100644 --- a/gfx/thebes/gfxGraphiteShaper.cpp +++ b/gfx/thebes/gfxGraphiteShaper.cpp @@ -152,20 +152,15 @@ gfxGraphiteShaper::ShapeText(gfxContext *aContext, } gr_feature_val *grFeatures = gr_face_featureval_for_lang(mGrFace, grLang); - // if style contains font-specific features - nsDataHashtable mergedFeatures; - - if (MergeFontFeatures(style, - mFont->GetFontEntry()->mFeatureSettings, - aShapedText->DisableLigatures(), - mFont->GetFontEntry()->FamilyName(), - mFallbackToSmallCaps, - mergedFeatures)) - { - // enumerate result and insert into Graphite feature list - GrFontFeatures f = {mGrFace, grFeatures}; - mergedFeatures.Enumerate(AddFeature, &f); - } + // insert any merged features into Graphite feature list + GrFontFeatures f = {mGrFace, grFeatures}; + MergeFontFeatures(style, + mFont->GetFontEntry()->mFeatureSettings, + aShapedText->DisableLigatures(), + mFont->GetFontEntry()->FamilyName(), + mFallbackToSmallCaps, + AddFeature, + &f); size_t numChars = gr_count_unicode_characters(gr_utf16, aText, aText + aLength, diff --git a/gfx/thebes/gfxHarfBuzzShaper.cpp b/gfx/thebes/gfxHarfBuzzShaper.cpp index 7df10a42b309..3868cdb97318 100644 --- a/gfx/thebes/gfxHarfBuzzShaper.cpp +++ b/gfx/thebes/gfxHarfBuzzShaper.cpp @@ -1272,9 +1272,6 @@ gfxHarfBuzzShaper::ShapeText(gfxContext *aContext, const gfxFontStyle *style = mFont->GetStyle(); - nsAutoTArray features; - nsDataHashtable mergedFeatures; - // determine whether petite-caps falls back to small-caps bool addSmallCaps = false; if (style->variantCaps != NS_FONT_VARIANT_CAPS_NORMAL) { @@ -1291,16 +1288,16 @@ gfxHarfBuzzShaper::ShapeText(gfxContext *aContext, } gfxFontEntry *entry = mFont->GetFontEntry(); - if (MergeFontFeatures(style, - entry->mFeatureSettings, - aShapedText->DisableLigatures(), - entry->FamilyName(), - addSmallCaps, - mergedFeatures)) - { - // enumerate result and insert into hb_feature array - mergedFeatures.Enumerate(AddOpenTypeFeature, &features); - } + + // insert any merged features into hb_feature array + nsAutoTArray features; + MergeFontFeatures(style, + entry->mFeatureSettings, + aShapedText->DisableLigatures(), + entry->FamilyName(), + addSmallCaps, + AddOpenTypeFeature, + &features); bool isRightToLeft = aShapedText->IsRightToLeft(); hb_buffer_t *buffer = hb_buffer_create(); diff --git a/image/src/imgFrame.h b/image/src/imgFrame.h index 5c808aab652c..e7ef6d38d2db 100644 --- a/image/src/imgFrame.h +++ b/image/src/imgFrame.h @@ -295,7 +295,7 @@ private: // methods uint32_t PaletteDataLength() const { - return mPaletteDepth ? (1 << mPaletteDepth) * sizeof(uint32_t) + return mPaletteDepth ? (size_t(1) << mPaletteDepth) * sizeof(uint32_t) : 0; } diff --git a/ipc/glue/GeckoChildProcessHost.cpp b/ipc/glue/GeckoChildProcessHost.cpp index 6e7733f24492..4a3e8d286103 100644 --- a/ipc/glue/GeckoChildProcessHost.cpp +++ b/ipc/glue/GeckoChildProcessHost.cpp @@ -97,6 +97,7 @@ GeckoChildProcessHost::GeckoChildProcessHost(GeckoProcessType aProcessType, mDelegate(nullptr), #if defined(MOZ_SANDBOX) && defined(XP_WIN) mEnableSandboxLogging(false), + mEnableNPAPISandbox(false), #if defined(MOZ_CONTENT_SANDBOX) mMoreStrictContentSandbox(false), #endif @@ -800,7 +801,7 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt } } -#if defined(XP_WIN) +#if defined(XP_WIN) && defined(MOZ_SANDBOX) bool shouldSandboxCurrentProcess = false; switch (mProcessType) { case GeckoProcessType_Content: @@ -813,10 +814,12 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt #endif // MOZ_CONTENT_SANDBOX break; case GeckoProcessType_Plugin: - // XXX: We don't sandbox this process type yet - // mSandboxBroker.SetSecurityLevelForPluginProcess(); - // cmdLine.AppendLooseValue(UTF8ToWide("-sandbox")); - // shouldSandboxCurrentProcess = true; + if (mEnableNPAPISandbox && + !PR_GetEnv("MOZ_DISABLE_NPAPI_SANDBOX")) { + mSandboxBroker.SetSecurityLevelForPluginProcess(); + cmdLine.AppendLooseValue(UTF8ToWide("-sandbox")); + shouldSandboxCurrentProcess = true; + } break; case GeckoProcessType_IPDLUnitTest: // XXX: We don't sandbox this process type yet @@ -825,13 +828,11 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt // shouldSandboxCurrentProcess = true; break; case GeckoProcessType_GMPlugin: -#ifdef MOZ_SANDBOX if (!PR_GetEnv("MOZ_DISABLE_GMP_SANDBOX")) { mSandboxBroker.SetSecurityLevelForGMPlugin(); cmdLine.AppendLooseValue(UTF8ToWide("-sandbox")); shouldSandboxCurrentProcess = true; } -#endif break; case GeckoProcessType_Default: default: @@ -839,7 +840,6 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt break; }; -#ifdef MOZ_SANDBOX if (shouldSandboxCurrentProcess) { for (auto it = mAllowedFilesRead.begin(); it != mAllowedFilesRead.end(); @@ -847,9 +847,7 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt mSandboxBroker.AllowReadFile(it->c_str()); } } -#endif - -#endif // XP_WIN +#endif // XP_WIN && MOZ_SANDBOX // Add the application directory path (-appdir path) AddAppDirToCommandLine(cmdLine); diff --git a/ipc/glue/GeckoChildProcessHost.h b/ipc/glue/GeckoChildProcessHost.h index d5917de0197a..a32397e97972 100644 --- a/ipc/glue/GeckoChildProcessHost.h +++ b/ipc/glue/GeckoChildProcessHost.h @@ -172,6 +172,11 @@ protected: SandboxBroker mSandboxBroker; std::vector mAllowedFilesRead; bool mEnableSandboxLogging; + + // XXX: Bug 1124167: We should get rid of the process specific logic for + // sandboxing in this class at some point. Unfortunately it will take a bit + // of reorganizing so I don't think this patch is the right time. + bool mEnableNPAPISandbox; #if defined(MOZ_CONTENT_SANDBOX) bool mMoreStrictContentSandbox; #endif diff --git a/ipc/testshell/TestShellParent.cpp b/ipc/testshell/TestShellParent.cpp index 543faf1baa4a..32b84f60334e 100644 --- a/ipc/testshell/TestShellParent.cpp +++ b/ipc/testshell/TestShellParent.cpp @@ -54,8 +54,9 @@ bool TestShellCommandParent::SetCallback(JSContext* aCx, JS::Value aCallback) { - if (!mCallback.Hold(aCx)) { - return false; + if (!mCallback.initialized()) { + mCallback.init(aCx, aCallback); + return true; } mCallback = aCallback; @@ -66,11 +67,12 @@ TestShellCommandParent::SetCallback(JSContext* aCx, bool TestShellCommandParent::RunCallback(const nsString& aResponse) { - NS_ENSURE_TRUE(mCallback.ToJSObject(), false); + NS_ENSURE_TRUE(mCallback.isObject(), false); // We're about to run script via JS_CallFunctionValue, so we need an // AutoEntryScript. This is just for testing and not in any spec. - dom::AutoEntryScript aes(xpc::NativeGlobal(js::GetGlobalForObjectCrossCompartment(mCallback.ToJSObject()))); + dom::AutoEntryScript aes( + xpc::NativeGlobal(js::GetGlobalForObjectCrossCompartment(&mCallback.toObject()))); JSContext* cx = aes.cx(); JS::Rooted global(cx, JS::CurrentGlobalOrNull(cx)); @@ -90,7 +92,7 @@ TestShellCommandParent::RunCallback(const nsString& aResponse) void TestShellCommandParent::ReleaseCallback() { - mCallback.Release(); + mCallback.reset(); } bool diff --git a/ipc/testshell/TestShellParent.h b/ipc/testshell/TestShellParent.h index dd394c5eb4ed..46c3eb3f206a 100644 --- a/ipc/testshell/TestShellParent.h +++ b/ipc/testshell/TestShellParent.h @@ -12,7 +12,7 @@ #include "mozilla/ipc/PTestShellCommandParent.h" #include "js/TypeDecls.h" -#include "nsAutoJSValHolder.h" +#include "js/RootingAPI.h" #include "nsString.h" namespace mozilla { @@ -58,7 +58,7 @@ protected: } private: - nsAutoJSValHolder mCallback; + JS::PersistentRooted mCallback; }; diff --git a/ipc/testshell/XPCShellEnvironment.cpp b/ipc/testshell/XPCShellEnvironment.cpp index efd2e1665c73..f1ad26dbf1b5 100644 --- a/ipc/testshell/XPCShellEnvironment.cpp +++ b/ipc/testshell/XPCShellEnvironment.cpp @@ -469,7 +469,7 @@ XPCShellEnvironment::~XPCShellEnvironment() JSAutoCompartment ac(cx, global); JS_SetAllNonReservedSlotsToUndefined(cx, global); } - mGlobalHolder.Release(); + mGlobalHolder.reset(); JSRuntime *rt = JS_GetRuntime(cx); JS_GC(rt); @@ -498,10 +498,7 @@ XPCShellEnvironment::Init() return false; } - if (!mGlobalHolder.Hold(rt)) { - NS_ERROR("Can't protect global object!"); - return false; - } + mGlobalHolder.init(rt); AutoSafeJSContext cx; diff --git a/ipc/testshell/XPCShellEnvironment.h b/ipc/testshell/XPCShellEnvironment.h index d120a23e43ce..a29e5f1736e1 100644 --- a/ipc/testshell/XPCShellEnvironment.h +++ b/ipc/testshell/XPCShellEnvironment.h @@ -10,12 +10,12 @@ #include #include -#include "nsAutoJSValHolder.h" #include "nsCOMPtr.h" #include "nsDebug.h" #include "nsString.h" #include "nsJSPrincipals.h" #include "nsContentUtils.h" +#include "js/RootingAPI.h" #include "js/TypeDecls.h" struct JSPrincipals; @@ -39,7 +39,7 @@ public: } JSObject* GetGlobalObject() { - return mGlobalHolder.ToJSObject(); + return mGlobalHolder; } void SetIsQuitting() { @@ -54,7 +54,7 @@ protected: bool Init(); private: - nsAutoJSValHolder mGlobalHolder; + JS::PersistentRooted mGlobalHolder; bool mQuitting; }; diff --git a/js/public/RootingAPI.h b/js/public/RootingAPI.h index 8fe10725172c..6069b155b03f 100644 --- a/js/public/RootingAPI.h +++ b/js/public/RootingAPI.h @@ -118,6 +118,9 @@ class MutableHandleBase {}; template class HeapBase {}; +template +class PersistentRootedBase {}; + /* * js::NullPtr acts like a nullptr pointer in contexts that require a Handle. * @@ -1070,7 +1073,9 @@ MutableHandle::MutableHandle(PersistentRooted *root) * These roots can be used in heap-allocated data structures, so they are not * associated with any particular JSContext or stack. They are registered with * the JSRuntime itself, without locking, so they require a full JSContext to be - * constructed, not one of its more restricted superclasses. + * initialized, not one of its more restricted superclasses. Initialization may + * take place on construction, or in two phases if the no-argument constructor + * is called followed by init(). * * Note that you must not use an PersistentRooted in an object owned by a JS * object: @@ -1096,40 +1101,45 @@ MutableHandle::MutableHandle(PersistentRooted *root) * marked when the object itself is marked. */ template -class PersistentRooted : private mozilla::LinkedListElement > { +class PersistentRooted : public js::PersistentRootedBase, + private mozilla::LinkedListElement> +{ + typedef mozilla::LinkedListElement> ListBase; + friend class mozilla::LinkedList; friend class mozilla::LinkedListElement; friend struct js::gc::PersistentRootedMarker; + friend void js::gc::FinishPersistentRootedChains(JSRuntime *rt); + void registerWithRuntime(JSRuntime *rt) { + MOZ_ASSERT(!initialized()); JS::shadow::Runtime *srt = JS::shadow::Runtime::asShadowRuntime(rt); srt->getPersistentRootedList().insertBack(this); } public: - explicit PersistentRooted(JSContext *cx) : ptr(js::GCMethods::initial()) - { - registerWithRuntime(js::GetRuntime(cx)); + PersistentRooted() : ptr(js::GCMethods::initial()) {} + + explicit PersistentRooted(JSContext *cx) { + init(cx); } - PersistentRooted(JSContext *cx, T initial) : ptr(initial) - { - registerWithRuntime(js::GetRuntime(cx)); + PersistentRooted(JSContext *cx, T initial) { + init(cx, initial); } - explicit PersistentRooted(JSRuntime *rt) : ptr(js::GCMethods::initial()) - { - registerWithRuntime(rt); + explicit PersistentRooted(JSRuntime *rt) { + init(rt); } - PersistentRooted(JSRuntime *rt, T initial) : ptr(initial) - { - registerWithRuntime(rt); + PersistentRooted(JSRuntime *rt, T initial) { + init(rt, initial); } PersistentRooted(const PersistentRooted &rhs) - : mozilla::LinkedListElement >(), + : mozilla::LinkedListElement>(), ptr(rhs.ptr) { /* @@ -1143,6 +1153,37 @@ class PersistentRooted : private mozilla::LinkedListElement const_cast(rhs).setNext(this); } + bool initialized() { + return ListBase::isInList(); + } + + void init(JSContext *cx) { + init(cx, js::GCMethods::initial()); + } + + void init(JSContext *cx, T initial) + { + ptr = initial; + registerWithRuntime(js::GetRuntime(cx)); + } + + void init(JSRuntime *rt) { + init(rt, js::GCMethods::initial()); + } + + void init(JSRuntime *rt, T initial) + { + ptr = initial; + registerWithRuntime(rt); + } + + void reset() { + if (initialized()) { + set(js::GCMethods::initial()); + ListBase::remove(); + } + } + /* * Important: Return a reference here so passing a Rooted to * something that takes a |const T&| is not a GC hazard. @@ -1155,17 +1196,17 @@ class PersistentRooted : private mozilla::LinkedListElement const T &get() const { return ptr; } T &operator=(T value) { - MOZ_ASSERT(!js::GCMethods::poisoned(value)); - ptr = value; + set(value); return ptr; } - T &operator=(const PersistentRooted &value) { - ptr = value; + T &operator=(const PersistentRooted &other) { + set(other.ptr); return ptr; } void set(T value) { + MOZ_ASSERT(initialized()); MOZ_ASSERT(!js::GCMethods::poisoned(value)); ptr = value; } diff --git a/js/public/Value.h b/js/public/Value.h index 9f967edd7c81..9dd2f95ab25c 100644 --- a/js/public/Value.h +++ b/js/public/Value.h @@ -1850,6 +1850,24 @@ class RootedBase : public MutableValueOperations interface when T = Value with type-querying, + * value-extracting, and mutating operations. + */ +template <> +class PersistentRootedBase : public MutableValueOperations> +{ + friend class ValueOperations>; + const JS::Value * extract() const { + return static_cast*>(this)->address(); + } + + friend class MutableValueOperations>; + JS::Value * extractMutable() { + return static_cast*>(this)->address(); + } +}; + } // namespace js inline jsval_layout diff --git a/js/src/ctypes/CTypes.cpp b/js/src/ctypes/CTypes.cpp index 971b22419799..ecedba74b9f2 100644 --- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -2583,7 +2583,7 @@ ImplicitConvert(JSContext* cx, // Convert into an intermediate, in case of failure. size_t elementSize = CType::GetSize(baseType); size_t arraySize = elementSize * targetLength; - AutoPtr intermediate(cx->pod_malloc(arraySize)); + auto intermediate = cx->make_pod_array(arraySize); if (!intermediate) { JS_ReportAllocationOverflow(cx); return false; @@ -2648,7 +2648,7 @@ ImplicitConvert(JSContext* cx, // Convert into an intermediate, in case of failure. size_t structSize = CType::GetSize(targetType); - AutoPtr intermediate(cx->pod_malloc(structSize)); + auto intermediate = cx->make_pod_array(structSize); if (!intermediate) { JS_ReportAllocationOverflow(cx); return false; @@ -3632,7 +3632,7 @@ CType::GetFFIType(JSContext* cx, JSObject* obj) return static_cast(slot.toPrivate()); } - AutoPtr result; + UniquePtrFFIType result; switch (CType::GetTypeCode(obj)) { case TYPE_array: result = ArrayType::BuildFFIType(cx, obj); @@ -3649,7 +3649,7 @@ CType::GetFFIType(JSContext* cx, JSObject* obj) if (!result) return nullptr; JS_SetReservedSlot(obj, SLOT_FFITYPE, PRIVATE_TO_JSVAL(result.get())); - return result.forget(); + return result.release(); } JSString* @@ -4496,7 +4496,7 @@ ArrayType::GetLength(JSObject* obj) return Convert(length.toDouble()); } -ffi_type* +UniquePtrFFIType ArrayType::BuildFFIType(JSContext* cx, JSObject* obj) { MOZ_ASSERT(CType::IsCType(obj)); @@ -4517,7 +4517,7 @@ ArrayType::BuildFFIType(JSContext* cx, JSObject* obj) // values. It would be nice to not do all the work of setting up 'elements', // but some libffi platforms currently require that it be meaningful. I'm // looking at you, x86_64. - AutoPtr ffiType(cx->new_()); + auto ffiType = cx->make_unique(); if (!ffiType) { JS_ReportOutOfMemory(cx); return nullptr; @@ -4536,7 +4536,7 @@ ArrayType::BuildFFIType(JSContext* cx, JSObject* obj) ffiType->elements[i] = ffiBaseType; ffiType->elements[length] = nullptr; - return ffiType.forget(); + return Move(ffiType); } bool @@ -4880,7 +4880,7 @@ StructType::DefineInternal(JSContext* cx, JSObject* typeObj_, JSObject* fieldsOb // its constituents. (We cannot simply stash the hash in a reserved slot now // to get GC safety for free, since if anything in this function fails we // do not want to mutate 'typeObj'.) - AutoPtr fields(cx->new_()); + auto fields = cx->make_unique(); if (!fields || !fields->init(len)) { JS_ReportOutOfMemory(cx); return false; @@ -4973,7 +4973,7 @@ StructType::DefineInternal(JSContext* cx, JSObject* typeObj_, JSObject* fieldsOb if (!SizeTojsval(cx, structSize, &sizeVal)) return false; - JS_SetReservedSlot(typeObj, SLOT_FIELDINFO, PRIVATE_TO_JSVAL(fields.forget())); + JS_SetReservedSlot(typeObj, SLOT_FIELDINFO, PRIVATE_TO_JSVAL(fields.release())); JS_SetReservedSlot(typeObj, SLOT_SIZE, sizeVal); JS_SetReservedSlot(typeObj, SLOT_ALIGN, INT_TO_JSVAL(structAlign)); @@ -4983,7 +4983,7 @@ StructType::DefineInternal(JSContext* cx, JSObject* typeObj_, JSObject* fieldsOb return true; } -ffi_type* +UniquePtrFFIType StructType::BuildFFIType(JSContext* cx, JSObject* obj) { MOZ_ASSERT(CType::IsCType(obj)); @@ -4996,20 +4996,21 @@ StructType::BuildFFIType(JSContext* cx, JSObject* obj) size_t structSize = CType::GetSize(obj); size_t structAlign = CType::GetAlignment(obj); - AutoPtr ffiType(cx->new_()); + auto ffiType = cx->make_unique(); if (!ffiType) { JS_ReportOutOfMemory(cx); return nullptr; } ffiType->type = FFI_TYPE_STRUCT; - AutoPtr elements; + size_t count = len != 0 ? len + 1 : 2; + auto elements = cx->make_pod_array(count); + if (!elements) { + JS_ReportOutOfMemory(cx); + return nullptr; + } + if (len != 0) { - elements = cx->pod_malloc(len + 1); - if (!elements) { - JS_ReportOutOfMemory(cx); - return nullptr; - } elements[len] = nullptr; for (FieldInfoHash::Range r = fields->all(); !r.empty(); r.popFront()) { @@ -5019,21 +5020,15 @@ StructType::BuildFFIType(JSContext* cx, JSObject* obj) return nullptr; elements[entry.value().mIndex] = fieldType; } - } else { // Represent an empty struct as having a size of 1 byte, just like C++. MOZ_ASSERT(structSize == 1); MOZ_ASSERT(structAlign == 1); - elements = cx->pod_malloc(2); - if (!elements) { - JS_ReportOutOfMemory(cx); - return nullptr; - } elements[0] = &ffi_type_uint8; elements[1] = nullptr; } - ffiType->elements = elements.get(); + ffiType->elements = elements.release(); #ifdef DEBUG // Perform a sanity check: the result of our struct size and alignment @@ -5055,8 +5050,7 @@ StructType::BuildFFIType(JSContext* cx, JSObject* obj) ffiType->alignment = structAlign; #endif - elements.forget(); - return ffiType.forget(); + return Move(ffiType); } bool @@ -6090,12 +6084,6 @@ CClosure::Create(JSContext* cx, MOZ_ASSERT(!fninfo->mIsVariadic); MOZ_ASSERT(GetABICode(fninfo->mABI) != ABI_WINAPI); - AutoPtr cinfo(cx->new_(JS_GetRuntime(cx))); - if (!cinfo) { - JS_ReportOutOfMemory(cx); - return nullptr; - } - // Get the prototype of the FunctionType object, of class CTypeProto, // which stores our JSContext for use with the closure. RootedObject proto(cx); @@ -6105,12 +6093,13 @@ CClosure::Create(JSContext* cx, MOZ_ASSERT(CType::IsCTypeProto(proto)); // Get a JSContext for use with the closure. - cinfo->cx = js::DefaultJSContext(JS_GetRuntime(cx)); + JSContext *closeureCx = js::DefaultJSContext(JS_GetRuntime(cx)); // Prepare the error sentinel value. It's important to do this now, because // we might be unable to convert the value to the proper type. If so, we want // the caller to know about it _now_, rather than some uncertain time in the // future when the error sentinel is actually needed. + mozilla::UniquePtr errResult; if (!errVal.isUndefined()) { // Make sure the callback returns something. @@ -6125,24 +6114,32 @@ CClosure::Create(JSContext* cx, // Allocate a buffer for the return value. size_t rvSize = CType::GetSize(fninfo->mReturnType); - cinfo->errResult = result->zone()->pod_malloc(rvSize); - if (!cinfo->errResult) + errResult = result->zone()->make_pod_array(rvSize); + if (!errResult) return nullptr; // Do the value conversion. This might fail, in which case we throw. - if (!ImplicitConvert(cx, errVal, fninfo->mReturnType, cinfo->errResult, - false, nullptr)) + if (!ImplicitConvert(cx, errVal, fninfo->mReturnType, errResult.get(), false, nullptr)) return nullptr; - } else { - cinfo->errResult = nullptr; + } + + ClosureInfo* cinfo = cx->new_(JS_GetRuntime(cx)); + if (!cinfo) { + JS_ReportOutOfMemory(cx); + return nullptr; } // Copy the important bits of context into cinfo. + cinfo->cx = closeureCx; + cinfo->errResult = errResult.release(); cinfo->closureObj = result; cinfo->typeObj = typeObj; cinfo->thisObj = thisObj; cinfo->jsfnObj = fnObj; + // Stash the ClosureInfo struct on our new object. + JS_SetReservedSlot(result, SLOT_CLOSUREINFO, PRIVATE_TO_JSVAL(cinfo)); + // Create an ffi_closure object and initialize it. void* code; cinfo->closure = @@ -6153,15 +6150,12 @@ CClosure::Create(JSContext* cx, } ffi_status status = ffi_prep_closure_loc(cinfo->closure, &fninfo->mCIF, - CClosure::ClosureStub, cinfo.get(), code); + CClosure::ClosureStub, cinfo, code); if (status != FFI_OK) { JS_ReportError(cx, "couldn't create closure - libffi error"); return nullptr; } - // Stash the ClosureInfo struct on our new object. - JS_SetReservedSlot(result, SLOT_CLOSUREINFO, PRIVATE_TO_JSVAL(cinfo.forget())); - // Casting between void* and a function pointer is forbidden in C and C++. // Do it via an integral type. *fnptr = reinterpret_cast(reinterpret_cast(code)); diff --git a/js/src/ctypes/CTypes.h b/js/src/ctypes/CTypes.h index dee4a5cd1099..a530c6889aa1 100644 --- a/js/src/ctypes/CTypes.h +++ b/js/src/ctypes/CTypes.h @@ -6,6 +6,8 @@ #ifndef ctypes_CTypes_h #define ctypes_CTypes_h +#include "mozilla/UniquePtr.h" + #include "ffi.h" #include "jsalloc.h" #include "prlink.h" @@ -22,39 +24,6 @@ namespace ctypes { ** Utility classes *******************************************************************************/ -// Class that takes ownership of a pointer T*, and calls cx->delete_() or -// cx->array_delete() upon destruction. -template -class AutoPtr { -private: - typedef AutoPtr self_type; - -public: - AutoPtr() : mPtr(nullptr) { } - explicit AutoPtr(T* ptr) : mPtr(ptr) { } - ~AutoPtr() { js_delete(mPtr); } - - T* operator->() { return mPtr; } - bool operator!() { return mPtr == nullptr; } - T& operator[](size_t i) { return *(mPtr + i); } - // Note: we cannot safely provide an 'operator T*()', since this would allow - // the compiler to perform implicit conversion from one AutoPtr to another - // via the constructor AutoPtr(T*). - - T* get() { return mPtr; } - void set(T* other) { MOZ_ASSERT(mPtr == nullptr); mPtr = other; } - T* forget() { T* result = mPtr; mPtr = nullptr; return result; } - - self_type& operator=(T* rhs) { mPtr = rhs; return *this; } - -private: - // Do not allow copy construction or assignment from another AutoPtr. - AutoPtr(AutoPtr&); - self_type& operator=(AutoPtr& rhs); - - T* mPtr; -}; - // Container class for Vector, using SystemAllocPolicy. template class Array : public Vector @@ -472,6 +441,8 @@ namespace PointerType { JSObject* GetBaseType(JSObject* obj); } +typedef mozilla::UniquePtr> UniquePtrFFIType; + namespace ArrayType { JSObject* CreateInternal(JSContext* cx, HandleObject baseType, size_t length, bool lengthDefined); @@ -479,7 +450,7 @@ namespace ArrayType { JSObject* GetBaseType(JSObject* obj); size_t GetLength(JSObject* obj); bool GetSafeLength(JSObject* obj, size_t* result); - ffi_type* BuildFFIType(JSContext* cx, JSObject* obj); + UniquePtrFFIType BuildFFIType(JSContext* cx, JSObject* obj); } namespace StructType { @@ -488,7 +459,7 @@ namespace StructType { const FieldInfoHash* GetFieldInfo(JSObject* obj); const FieldInfo* LookupField(JSContext* cx, JSObject* obj, JSFlatString *name); JSObject* BuildFieldsArray(JSContext* cx, JSObject* obj); - ffi_type* BuildFFIType(JSContext* cx, JSObject* obj); + UniquePtrFFIType BuildFFIType(JSContext* cx, JSObject* obj); } namespace FunctionType { diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index a57ae2464813..099512ef37a9 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -1626,6 +1626,7 @@ Parser::functionArguments(FunctionSyntaxKind kind, FunctionType ty bool hasDefaults = false; Node duplicatedArg = null(); Node list = null(); + bool disallowDuplicateArgs = false; if (type == Getter) { report(ParseError, false, null(), JSMSG_ACCESSOR_WRONG_ARGS, "getter", "no", "s"); @@ -1647,6 +1648,7 @@ Parser::functionArguments(FunctionSyntaxKind kind, FunctionType ty case TOK_LC: { /* See comment below in the TOK_NAME case. */ + disallowDuplicateArgs = true; if (duplicatedArg) { report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS); return false; @@ -1719,6 +1721,12 @@ Parser::functionArguments(FunctionSyntaxKind kind, FunctionType ty report(ParseError, false, null(), JSMSG_NO_REST_NAME); return false; } + disallowDuplicateArgs = true; + if (duplicatedArg) { + // Has duplicated args before the rest parameter. + report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS); + return false; + } goto TOK_NAME; } @@ -1729,7 +1737,6 @@ Parser::functionArguments(FunctionSyntaxKind kind, FunctionType ty funbox->setStart(tokenStream); RootedPropertyName name(context, tokenStream.currentName()); - bool disallowDuplicateArgs = funbox->hasDestructuringArgs || hasDefaults; if (!defineArg(funcpn, name, disallowDuplicateArgs, &duplicatedArg)) return false; @@ -1747,6 +1754,7 @@ Parser::functionArguments(FunctionSyntaxKind kind, FunctionType ty report(ParseError, false, null(), JSMSG_REST_WITH_DEFAULT); return false; } + disallowDuplicateArgs = true; if (duplicatedArg) { report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS); return false; diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index f71effabace4..be3a852c5e20 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -272,19 +272,25 @@ class ChainedIter T operator->() const { return get(); } }; +typedef js::HashMap, + js::SystemAllocPolicy> RootedValueMap; + class GCRuntime { public: explicit GCRuntime(JSRuntime *rt); bool init(uint32_t maxbytes, uint32_t maxNurseryBytes); + void finishRoots(); void finish(); inline int zeal(); inline bool upcomingZealousGC(); inline bool needZealousGC(); - template bool addRoot(T *rp, const char *name, JSGCRootType rootType); - void removeRoot(void *rp); + bool addRoot(Value *vp, const char *name); + void removeRoot(Value *vp); void setMarkStackLimit(size_t limit); void setParameter(JSGCParamKey key, uint32_t value); @@ -664,7 +670,7 @@ class GCRuntime // so as to reduce the cost of operations on the available lists. ChunkPool fullChunks_; - js::RootedValueMap rootsHash; + RootedValueMap rootsHash; size_t maxMallocBytes; diff --git a/js/src/gc/RootMarking.cpp b/js/src/gc/RootMarking.cpp index 1db4313cac61..6b593b784f5d 100644 --- a/js/src/gc/RootMarking.cpp +++ b/js/src/gc/RootMarking.cpp @@ -445,21 +445,7 @@ js::gc::GCRuntime::markRuntime(JSTracer *trc, for (RootRange r = rootsHash.all(); !r.empty(); r.popFront()) { const RootEntry &entry = r.front(); - const char *name = entry.value().name ? entry.value().name : "root"; - JSGCRootType type = entry.value().type; - void *key = entry.key(); - if (type == JS_GC_ROOT_VALUE_PTR) { - MarkValueRoot(trc, reinterpret_cast(key), name); - } else if (*reinterpret_cast(key)){ - if (type == JS_GC_ROOT_STRING_PTR) - MarkStringRoot(trc, reinterpret_cast(key), name); - else if (type == JS_GC_ROOT_OBJECT_PTR) - MarkObjectRoot(trc, reinterpret_cast(key), name); - else if (type == JS_GC_ROOT_SCRIPT_PTR) - MarkScriptRoot(trc, reinterpret_cast(key), name); - else - MOZ_CRASH("unexpected js::RootInfo::type value"); - } + MarkValueRoot(trc, entry.key(), entry.value()); } MarkPersistentRootedChains(trc); diff --git a/js/src/jit-test/tests/debug/execution-observability-04.js b/js/src/jit-test/tests/debug/execution-observability-04.js new file mode 100644 index 000000000000..472820b3f6ab --- /dev/null +++ b/js/src/jit-test/tests/debug/execution-observability-04.js @@ -0,0 +1,21 @@ +// Test that we can do debug mode OSR from the interrupt handler. + +var global = this; +var hits = 0; +setInterruptCallback(function() { + print("Interrupt!"); + hits++; + var g = newGlobal(); + g.parent = global; + g.eval("var dbg = new Debugger(parent); dbg.onEnterFrame = function(frame) {};"); + return true; +}); + +function f(x) { + if (x > 200) + return; + interruptIf(x == 100); + f(x + 1); +} +f(0); +assertEq(hits, 1); diff --git a/js/src/jit-test/tests/debug/execution-observability-05.js b/js/src/jit-test/tests/debug/execution-observability-05.js new file mode 100644 index 000000000000..ba0a3efa69c3 --- /dev/null +++ b/js/src/jit-test/tests/debug/execution-observability-05.js @@ -0,0 +1,23 @@ +// Test that we can do debug mode OSR from the interrupt handler through an +// on->off->on cycle. + +var global = this; +var hits = 0; +setInterruptCallback(function() { + print("Interrupt!"); + hits++; + var g = newGlobal(); + g.parent = global; + g.eval("var dbg = new Debugger(parent); dbg.onEnterFrame = function(frame) {};"); + g.eval("dbg.removeDebuggee(parent);"); + return true; +}); + +function f(x) { + if (x > 200) + return; + interruptIf(x == 100); + f(x + 1); +} +f(0); +assertEq(hits, 1); diff --git a/js/src/jit-test/tests/gc/bug-1108007.js b/js/src/jit-test/tests/gc/bug-1108007.js new file mode 100644 index 000000000000..937fa1cb394d --- /dev/null +++ b/js/src/jit-test/tests/gc/bug-1108007.js @@ -0,0 +1,24 @@ +// |jit-test| --no-threads; --no-ion; --no-baseline +if (!("gczeal" in this)) + quit(); +gczeal(2); +(function() { + evaluate(cacheEntry((function() { + return "".toSource() + })()), Object.create({}, { + saveBytecode: { + value: true + } + })) +})(); +[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], + [0], [0], [0], [0]]; diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 01edc4b48b56..18997cad903f 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -559,6 +559,10 @@ BaselineCompiler::emitStackCheck(bool earlyCheck) if (!callVMNonOp(CheckOverRecursedWithExtraInfo, phase)) return false; + icEntries_.back().setFakeKind(earlyCheck + ? ICEntry::Kind_EarlyStackCheck + : ICEntry::Kind_StackCheck); + masm.bind(&skipCall); return true; } @@ -580,7 +584,7 @@ BaselineCompiler::emitDebugPrologue() return false; // Fix up the fake ICEntry appended by callVM for on-stack recompilation. - icEntries_.back().setForDebugPrologue(); + icEntries_.back().setFakeKind(ICEntry::Kind_DebugPrologue); // If the stub returns |true|, we have to return the value stored in the // frame's return value slot. @@ -770,12 +774,7 @@ BaselineCompiler::emitDebugTrap() #endif // Add an IC entry for the return offset -> pc mapping. - ICEntry icEntry(script->pcToOffset(pc), ICEntry::Kind_DebugTrap); - icEntry.setReturnOffset(CodeOffsetLabel(masm.currentOffset())); - if (!icEntries_.append(icEntry)) - return false; - - return true; + return appendICEntry(ICEntry::Kind_DebugTrap, masm.currentOffset()); } #ifdef JS_TRACE_LOGGING @@ -3139,7 +3138,7 @@ BaselineCompiler::emitReturn() return false; // Fix up the fake ICEntry appended by callVM for on-stack recompilation. - icEntries_.back().setForDebugEpilogue(); + icEntries_.back().setFakeKind(ICEntry::Kind_DebugEpilogue); masm.loadValue(frame.addressOfReturnValue(), JSReturnOperand); } @@ -3632,9 +3631,7 @@ BaselineCompiler::emit_JSOP_RESUME() masm.callAndPushReturnAddress(&genStart); // Add an IC entry so the return offset -> pc mapping works. - ICEntry icEntry(script->pcToOffset(pc), ICEntry::Kind_Op); - icEntry.setReturnOffset(CodeOffsetLabel(masm.currentOffset())); - if (!icEntries_.append(icEntry)) + if (!appendICEntry(ICEntry::Kind_Op, masm.currentOffset())) return false; masm.jump(&returnTarget); diff --git a/js/src/jit/BaselineDebugModeOSR.cpp b/js/src/jit/BaselineDebugModeOSR.cpp index 060082ce98f8..c3199f0c9343 100644 --- a/js/src/jit/BaselineDebugModeOSR.cpp +++ b/js/src/jit/BaselineDebugModeOSR.cpp @@ -99,6 +99,8 @@ struct DebugModeOSREntry bool needsRecompileInfo() const { return frameKind == ICEntry::Kind_CallVM || + frameKind == ICEntry::Kind_StackCheck || + frameKind == ICEntry::Kind_EarlyStackCheck || frameKind == ICEntry::Kind_DebugTrap || frameKind == ICEntry::Kind_DebugPrologue || frameKind == ICEntry::Kind_DebugEpilogue; @@ -293,6 +295,10 @@ ICEntryKindToString(ICEntry::Kind kind) return "non-op IC"; case ICEntry::Kind_CallVM: return "callVM"; + case ICEntry::Kind_StackCheck: + return "stack check"; + case ICEntry::Kind_EarlyStackCheck: + return "early stack check"; case ICEntry::Kind_DebugTrap: return "debug trap"; case ICEntry::Kind_DebugPrologue: @@ -348,6 +354,7 @@ PatchBaselineFramesForDebugMode(JSContext *cx, const Debugger::ExecutionObservab // A. From a "can call" stub. // B. From a VM call. // H. From inside HandleExceptionBaseline. + // I. From inside the interrupt handler via the prologue stack check. // // On to Off: // - All the ways above. @@ -356,10 +363,10 @@ PatchBaselineFramesForDebugMode(JSContext *cx, const Debugger::ExecutionObservab // E. From the debug epilogue. // // Off to On to Off: - // F. Undo case B above on previously patched yet unpopped frames. + // F. Undo case B or I above on previously patched yet unpopped frames. // // On to Off to On: - // G. Undo cases B, C, D, or E above on previously patched yet unpopped + // G. Undo cases B, C, D, E, or I above on previously patched yet unpopped // frames. // // In general, we patch the return address from the VM call to return to a @@ -438,23 +445,27 @@ PatchBaselineFramesForDebugMode(JSContext *cx, const Debugger::ExecutionObservab // Cases F and G above. // - // We undo a previous recompile by handling cases B, C, D, and E - // like normal, except that we retrieved the pc information via + // We undo a previous recompile by handling cases B, C, D, E, or I + // like normal, except that we retrieve the pc information via // the previous OSR debug info stashed on the frame. BaselineDebugModeOSRInfo *info = iter.baselineFrame()->getDebugModeOSRInfo(); if (info) { MOZ_ASSERT(info->pc == pc); MOZ_ASSERT(info->frameKind == kind); - // Case G, might need to undo B, C, D, or E. + // Case G, might need to undo B, C, D, E, or I. MOZ_ASSERT_IF(script->baselineScript()->hasDebugInstrumentation(), kind == ICEntry::Kind_CallVM || + kind == ICEntry::Kind_StackCheck || + kind == ICEntry::Kind_EarlyStackCheck || kind == ICEntry::Kind_DebugTrap || kind == ICEntry::Kind_DebugPrologue || kind == ICEntry::Kind_DebugEpilogue); - // Case F, should only need to undo case B. + // Case F, should only need to undo case B or I. MOZ_ASSERT_IF(!script->baselineScript()->hasDebugInstrumentation(), - kind == ICEntry::Kind_CallVM); + kind == ICEntry::Kind_CallVM || + kind == ICEntry::Kind_StackCheck || + kind == ICEntry::Kind_EarlyStackCheck); // We will have allocated a new recompile info, so delete the // existing one. @@ -483,6 +494,20 @@ PatchBaselineFramesForDebugMode(JSContext *cx, const Debugger::ExecutionObservab break; } + case ICEntry::Kind_StackCheck: + case ICEntry::Kind_EarlyStackCheck: { + // Case I above. + // + // Patching mechanism is identical to a CallVM. This is + // handled especially only because the stack check VM call is + // part of the prologue, and not tied an opcode. + bool earlyCheck = kind == ICEntry::Kind_EarlyStackCheck; + ICEntry &stackCheckEntry = bl->stackCheckICEntry(earlyCheck); + recompInfo->resumeAddr = bl->returnAddressForIC(stackCheckEntry); + popFrameReg = false; + break; + } + case ICEntry::Kind_DebugTrap: // Case C above. // @@ -906,6 +931,35 @@ HasForcedReturn(BaselineDebugModeOSRInfo *info, bool rv) return false; } +static inline bool +IsReturningFromCallVM(BaselineDebugModeOSRInfo *info) +{ + // Keep this in sync with EmitBranchIsReturningFromCallVM. + // + // The stack check entries are returns from a callVM, but have a special + // kind because they do not exist in a 1-1 relationship with a pc offset. + return info->frameKind == ICEntry::Kind_CallVM || + info->frameKind == ICEntry::Kind_StackCheck || + info->frameKind == ICEntry::Kind_EarlyStackCheck; +} + +static void +EmitBranchICEntryKind(MacroAssembler &masm, Register entry, ICEntry::Kind kind, Label *label) +{ + masm.branch32(MacroAssembler::Equal, + Address(entry, offsetof(BaselineDebugModeOSRInfo, frameKind)), + Imm32(kind), label); +} + +static void +EmitBranchIsReturningFromCallVM(MacroAssembler &masm, Register entry, Label *label) +{ + // Keep this in sync with IsReturningFromCallVM. + EmitBranchICEntryKind(masm, entry, ICEntry::Kind_CallVM, label); + EmitBranchICEntryKind(masm, entry, ICEntry::Kind_StackCheck, label); + EmitBranchICEntryKind(masm, entry, ICEntry::Kind_EarlyStackCheck, label); +} + static void SyncBaselineDebugModeOSRInfo(BaselineFrame *frame, Value *vp, bool rv) { @@ -927,7 +981,7 @@ SyncBaselineDebugModeOSRInfo(BaselineFrame *frame, Value *vp, bool rv) // // In the case of returning from a callVM, we don't need to restore R0 and // R1 ourself since we'll return into code that does it if needed. - if (info->frameKind != ICEntry::Kind_CallVM) { + if (!IsReturningFromCallVM(info)) { unsigned numUnsynced = info->slotInfo.numUnsynced(); MOZ_ASSERT(numUnsynced <= 2); if (numUnsynced > 0) @@ -1072,10 +1126,7 @@ JitRuntime::generateBaselineDebugModeOSRHandler(JSContext *cx, uint32_t *noFrame // Emit two tails for the case of returning from a callVM and all other // cases, as the state we need to restore differs depending on the case. Label returnFromCallVM, end; - masm.branch32(MacroAssembler::Equal, - Address(temp, offsetof(BaselineDebugModeOSRInfo, frameKind)), - Imm32(ICEntry::Kind_CallVM), - &returnFromCallVM); + EmitBranchIsReturningFromCallVM(masm, temp, &returnFromCallVM); EmitBaselineDebugModeOSRHandlerTail(masm, temp, /* returnFromCallVM = */ false); masm.jump(&end); diff --git a/js/src/jit/BaselineIC.h b/js/src/jit/BaselineIC.h index 8da23b04f56c..5a85c5ec8bd8 100644 --- a/js/src/jit/BaselineIC.h +++ b/js/src/jit/BaselineIC.h @@ -212,7 +212,7 @@ class ICEntry uint32_t returnOffset_; // The PC of this IC's bytecode op within the JSScript. - uint32_t pcOffset_ : 29; + uint32_t pcOffset_ : 28; public: enum Kind { @@ -229,6 +229,13 @@ class ICEntry // the prologue). Kind_NonOpCallVM, + // A fake IC entry for returning from a callVM to the interrupt + // handler via the over-recursion check on function entry. + Kind_StackCheck, + + // As above, but for the early check. See emitStackCheck. + Kind_EarlyStackCheck, + // A fake IC entry for returning from DebugTrapHandler. Kind_DebugTrap, @@ -242,7 +249,7 @@ class ICEntry private: // What this IC is for. - Kind kind_ : 3; + Kind kind_ : 4; // Set the kind and asserts that it's sane. void setKind(Kind kind) { @@ -255,10 +262,10 @@ class ICEntry ICEntry(uint32_t pcOffset, Kind kind) : firstStub_(nullptr), returnOffset_(), pcOffset_(pcOffset) { - // The offset must fit in at least 29 bits, since we shave off 3 for + // The offset must fit in at least 28 bits, since we shave off 4 for // the Kind enum. MOZ_ASSERT(pcOffset_ == pcOffset); - JS_STATIC_ASSERT(BaselineScript::MAX_JSSCRIPT_LENGTH < 0x1fffffffu); + JS_STATIC_ASSERT(BaselineScript::MAX_JSSCRIPT_LENGTH <= (1u << 28) - 1); MOZ_ASSERT(pcOffset <= BaselineScript::MAX_JSSCRIPT_LENGTH); setKind(kind); } @@ -289,23 +296,15 @@ class ICEntry Kind kind() const { // MSVC compiles enums as signed. - return (Kind)(kind_ & 0x7); + return Kind(kind_ & 0xf); } bool isForOp() const { return kind() == Kind_Op; } - void setForDebugPrologue() { - MOZ_ASSERT(kind() == Kind_CallVM); - setKind(Kind_DebugPrologue); - } - void setForDebugEpilogue() { - MOZ_ASSERT(kind() == Kind_CallVM); - setKind(Kind_DebugEpilogue); - } - void setForNonOpCallVM() { - MOZ_ASSERT(kind() == Kind_CallVM); - setKind(Kind_NonOpCallVM); + void setFakeKind(Kind kind) { + MOZ_ASSERT(kind != Kind_Op && kind != Kind_NonOp); + setKind(kind); } bool hasStub() const { diff --git a/js/src/jit/BaselineJIT.cpp b/js/src/jit/BaselineJIT.cpp index 2765e393827e..0270da9f2597 100644 --- a/js/src/jit/BaselineJIT.cpp +++ b/js/src/jit/BaselineJIT.cpp @@ -626,6 +626,21 @@ BaselineScript::callVMEntryFromPCOffset(uint32_t pcOffset) MOZ_CRASH("Invalid PC offset for callVM entry."); } +ICEntry & +BaselineScript::stackCheckICEntry(bool earlyCheck) +{ + // The stack check will always be at offset 0, so just do a linear search + // from the beginning. This is only needed for debug mode OSR, when + // patching a frame that has invoked a Debugger hook via the interrupt + // handler via the stack check, which is part of the prologue. + ICEntry::Kind kind = earlyCheck ? ICEntry::Kind_EarlyStackCheck : ICEntry::Kind_StackCheck; + for (size_t i = 0; i < numICEntries() && icEntry(i).pcOffset() == 0; i++) { + if (icEntry(i).kind() == kind) + return icEntry(i); + } + MOZ_CRASH("No stack check ICEntry found."); +} + ICEntry & BaselineScript::icEntryFromReturnAddress(uint8_t *returnAddr) { diff --git a/js/src/jit/BaselineJIT.h b/js/src/jit/BaselineJIT.h index b0a5218b9bab..171bef3efddb 100644 --- a/js/src/jit/BaselineJIT.h +++ b/js/src/jit/BaselineJIT.h @@ -353,6 +353,7 @@ struct BaselineScript ICEntry &icEntryFromPCOffset(uint32_t pcOffset); ICEntry &icEntryFromPCOffset(uint32_t pcOffset, ICEntry *prevLookedUpEntry); ICEntry &callVMEntryFromPCOffset(uint32_t pcOffset); + ICEntry &stackCheckICEntry(bool earlyCheck); ICEntry &icEntryFromReturnAddress(uint8_t *returnAddr); uint8_t *returnAddressForIC(const ICEntry &ent); diff --git a/js/src/jit/MIR.cpp b/js/src/jit/MIR.cpp index d762b934d9d7..a431ef2c1c6e 100644 --- a/js/src/jit/MIR.cpp +++ b/js/src/jit/MIR.cpp @@ -144,10 +144,16 @@ EvaluateConstantOperands(TempAllocator &alloc, MBinaryInstruction *ins, bool *pt ret.setNumber(lhs.toNumber() * rhs.toNumber()); break; case MDefinition::Op_Div: - ret.setNumber(NumberDiv(lhs.toNumber(), rhs.toNumber())); + if (ins->toDiv()->isUnsigned()) + ret.setInt32(rhs.isInt32(0) ? 0 : uint32_t(lhs.toInt32()) / uint32_t(rhs.toInt32())); + else + ret.setNumber(NumberDiv(lhs.toNumber(), rhs.toNumber())); break; case MDefinition::Op_Mod: - ret.setNumber(NumberMod(lhs.toNumber(), rhs.toNumber())); + if (ins->toMod()->isUnsigned()) + ret.setInt32(rhs.isInt32(0) ? 0 : uint32_t(lhs.toInt32()) % uint32_t(rhs.toInt32())); + else + ret.setNumber(NumberMod(lhs.toNumber(), rhs.toNumber())); break; default: MOZ_CRASH("NYI"); @@ -621,14 +627,20 @@ MConstant::New(TempAllocator &alloc, const Value &v, types::CompilerConstraintLi } MConstant * -MConstant::NewAsmJS(TempAllocator &alloc, const Value &v, MIRType type) +MConstant::NewTypedValue(TempAllocator &alloc, const Value &v, MIRType type, types::CompilerConstraintList *constraints) { MOZ_ASSERT(!IsSimdType(type)); - MConstant *constant = new(alloc) MConstant(v, nullptr); + MConstant *constant = new(alloc) MConstant(v, constraints); constant->setResultType(type); return constant; } +MConstant * +MConstant::NewAsmJS(TempAllocator &alloc, const Value &v, MIRType type) +{ + return NewTypedValue(alloc, v, type); +} + MConstant * MConstant::NewConstraintlessObject(TempAllocator &alloc, JSObject *v) { @@ -964,6 +976,101 @@ MMathFunction::printOpcode(FILE *fp) const fprintf(fp, " %s", FunctionName(function())); } +MDefinition * +MMathFunction::foldsTo(TempAllocator &alloc) +{ + MDefinition *input = getOperand(0); + if (!input->isConstant()) + return this; + + Value val = input->toConstant()->value(); + if (!val.isNumber()) + return this; + + double in = val.toNumber(); + double out; + switch (function_) { + case Log: + out = js::math_log_uncached(in); + break; + case Sin: + out = js::math_sin_uncached(in); + break; + case Cos: + out = js::math_cos_uncached(in); + break; + case Exp: + out = js::math_exp_uncached(in); + break; + case Tan: + out = js::math_tan_uncached(in); + break; + case ACos: + out = js::math_acos_uncached(in); + break; + case ASin: + out = js::math_asin_uncached(in); + break; + case ATan: + out = js::math_atan_uncached(in); + break; + case Log10: + out = js::math_log10_uncached(in); + break; + case Log2: + out = js::math_log2_uncached(in); + break; + case Log1P: + out = js::math_log1p_uncached(in); + break; + case ExpM1: + out = js::math_expm1_uncached(in); + break; + case CosH: + out = js::math_cosh_uncached(in); + break; + case SinH: + out = js::math_sinh_uncached(in); + break; + case TanH: + out = js::math_tanh_uncached(in); + break; + case ACosH: + out = js::math_acosh_uncached(in); + break; + case ASinH: + out = js::math_asinh_uncached(in); + break; + case ATanH: + out = js::math_atanh_uncached(in); + break; + case Sign: + out = js::math_sign_uncached(in); + break; + case Trunc: + out = js::math_trunc_uncached(in); + break; + case Cbrt: + out = js::math_cbrt_uncached(in); + break; + case Floor: + out = js::math_floor_impl(in); + break; + case Ceil: + out = js::math_ceil_impl(in); + break; + case Round: + out = js::math_round_impl(in); + break; + default: + return this; + } + + if (input->type() == MIRType_Float32) + return MConstant::NewTypedValue(alloc, DoubleValue(out), MIRType_Float32); + return MConstant::New(alloc, DoubleValue(out)); +} + MParameter * MParameter::New(TempAllocator &alloc, int32_t index, types::TemporaryTypeSet *types) { diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index c4d08df89515..92dc4fdf6729 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -1279,6 +1279,8 @@ class MConstant : public MNullaryInstruction INSTRUCTION_HEADER(Constant) static MConstant *New(TempAllocator &alloc, const Value &v, types::CompilerConstraintList *constraints = nullptr); + static MConstant *NewTypedValue(TempAllocator &alloc, const Value &v, MIRType type, + types::CompilerConstraintList *constraints = nullptr); static MConstant *NewAsmJS(TempAllocator &alloc, const Value &v, MIRType type); static MConstant *NewConstraintlessObject(TempAllocator &alloc, JSObject *v); @@ -5703,6 +5705,8 @@ class MMathFunction return true; } + MDefinition *foldsTo(TempAllocator &alloc); + void printOpcode(FILE *fp) const MOZ_OVERRIDE; static const char *FunctionName(Function function); diff --git a/js/src/jit/shared/Assembler-shared.h b/js/src/jit/shared/Assembler-shared.h index 2b4c064e603f..6eb1c36c8e23 100644 --- a/js/src/jit/shared/Assembler-shared.h +++ b/js/src/jit/shared/Assembler-shared.h @@ -929,11 +929,11 @@ class AssemblerShared ImmGCPtr noteMaybeNurseryPtr(ImmMaybeNurseryPtr ptr) { if (ptr.value && gc::IsInsideNursery(ptr.value)) { - // PJS FIXME bug 1121435 - // FIXME: Ideally we'd assert this in all cases, but PJS needs to - // compile IC's from off-main-thread; it will not touch - // nursery pointers, however. + // noteMaybeNurseryPtr can be reached from off-thread compilation, + // though not with an actual nursery pointer argument in that case. MOZ_ASSERT(GetJitContext()->runtime->onMainThread()); + // Do not be ion-compiling on the main thread. + MOZ_ASSERT(!GetJitContext()->runtime->mainThread()->ionCompiling); embedsNurseryPointers_ = true; } return ImmGCPtr(ptr); diff --git a/js/src/jit/shared/BaselineCompiler-shared.cpp b/js/src/jit/shared/BaselineCompiler-shared.cpp index 5d75980e9622..b0b0073a1af1 100644 --- a/js/src/jit/shared/BaselineCompiler-shared.cpp +++ b/js/src/jit/shared/BaselineCompiler-shared.cpp @@ -125,8 +125,5 @@ BaselineCompilerShared::callVM(const VMFunction &fun, CallVMPhase phase) // Add a fake ICEntry (without stubs), so that the return offset to // pc mapping works. - ICEntry entry(script->pcToOffset(pc), ICEntry::Kind_CallVM); - entry.setReturnOffset(CodeOffsetLabel(callOffset)); - - return icEntries_.append(entry); + return appendICEntry(ICEntry::Kind_CallVM, callOffset); } diff --git a/js/src/jit/shared/BaselineCompiler-shared.h b/js/src/jit/shared/BaselineCompiler-shared.h index 425597865d71..65a623ac929e 100644 --- a/js/src/jit/shared/BaselineCompiler-shared.h +++ b/js/src/jit/shared/BaselineCompiler-shared.h @@ -92,6 +92,13 @@ class BaselineCompilerShared return &vecEntry; } + // Append an ICEntry without a stub. + bool appendICEntry(ICEntry::Kind kind, uint32_t returnOffset) { + ICEntry entry(script->pcToOffset(pc), kind); + entry.setReturnOffset(CodeOffsetLabel(returnOffset)); + return icEntries_.append(entry); + } + bool addICLoadLabel(CodeOffsetLabel label) { MOZ_ASSERT(!icEntries_.empty()); ICLoadLabel loadLabel; @@ -145,7 +152,7 @@ class BaselineCompilerShared bool callVMNonOp(const VMFunction &fun, CallVMPhase phase=POST_INITIALIZE) { if (!callVM(fun, phase)) return false; - icEntries_.back().setForNonOpCallVM(); + icEntries_.back().setFakeKind(ICEntry::Kind_NonOpCallVM); return true; } diff --git a/js/src/jsapi-tests/testChromeBuffer.cpp b/js/src/jsapi-tests/testChromeBuffer.cpp index 2af324059438..ec2da6aebac2 100644 --- a/js/src/jsapi-tests/testChromeBuffer.cpp +++ b/js/src/jsapi-tests/testChromeBuffer.cpp @@ -25,8 +25,8 @@ static const JSClass global_class = { JS_GlobalObjectTraceHook }; -static JS::Heap trusted_glob; -static JS::Heap trusted_fun; +static JS::PersistentRootedObject trusted_glob; +static JS::PersistentRootedObject trusted_fun; static bool CallTrusted(JSContext *cx, unsigned argc, jsval *vp) @@ -50,12 +50,10 @@ BEGIN_TEST(testChromeBuffer) { JS_SetTrustedPrincipals(rt, &system_principals); - trusted_glob = JS_NewGlobalObject(cx, &global_class, &system_principals, JS::FireOnNewGlobalHook); + trusted_glob.init(cx, JS_NewGlobalObject(cx, &global_class, &system_principals, + JS::FireOnNewGlobalHook)); CHECK(trusted_glob); - if (!JS::AddNamedObjectRoot(cx, &trusted_glob, "trusted-global")) - return false; - JS::RootedFunction fun(cx); /* @@ -68,16 +66,13 @@ BEGIN_TEST(testChromeBuffer) JSAutoCompartment ac(cx, trusted_glob); const char *paramName = "x"; const char *bytes = "return x ? 1 + trusted(x-1) : 0"; - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(trusted_glob.unsafeGet()); JS::CompileOptions options(cx); options.setFileAndLine("", 0); JS::AutoObjectVector emptyScopeChain(cx); CHECK(JS::CompileFunction(cx, emptyScopeChain, options, "trusted", 1, ¶mName, bytes, strlen(bytes), &fun)); - CHECK(JS_DefineProperty(cx, global, "trusted", fun, JSPROP_ENUMERATE)); - trusted_fun = JS_GetFunctionObject(fun); - if (!JS::AddNamedObjectRoot(cx, &trusted_fun, "trusted-function")) - return false; + CHECK(JS_DefineProperty(cx, trusted_glob, "trusted", fun, JSPROP_ENUMERATE)); + trusted_fun.init(cx, JS_GetFunctionObject(fun)); } JS::RootedValue v(cx, JS::ObjectValue(*trusted_fun)); @@ -123,13 +118,12 @@ BEGIN_TEST(testChromeBuffer) " return 'From trusted: ' + " " e.name + ': ' + e.message; " "} "; - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(trusted_glob.unsafeGet()); JS::CompileOptions options(cx); options.setFileAndLine("", 0); JS::AutoObjectVector emptyScopeChain(cx); CHECK(JS::CompileFunction(cx, emptyScopeChain, options, "trusted", 1, ¶mName, bytes, strlen(bytes), &fun)); - CHECK(JS_DefineProperty(cx, global, "trusted", fun, JSPROP_ENUMERATE)); + CHECK(JS_DefineProperty(cx, trusted_glob, "trusted", fun, JSPROP_ENUMERATE)); trusted_fun = JS_GetFunctionObject(fun); } @@ -164,13 +158,12 @@ BEGIN_TEST(testChromeBuffer) { JSAutoCompartment ac(cx, trusted_glob); const char *bytes = "return 42"; - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(trusted_glob.unsafeGet()); JS::CompileOptions options(cx); options.setFileAndLine("", 0); JS::AutoObjectVector emptyScopeChain(cx); CHECK(JS::CompileFunction(cx, emptyScopeChain, options, "trusted", 0, nullptr, bytes, strlen(bytes), &fun)); - CHECK(JS_DefineProperty(cx, global, "trusted", fun, JSPROP_ENUMERATE)); + CHECK(JS_DefineProperty(cx, trusted_glob, "trusted", fun, JSPROP_ENUMERATE)); trusted_fun = JS_GetFunctionObject(fun); } @@ -198,11 +191,4 @@ BEGIN_TEST(testChromeBuffer) return true; } -virtual void uninit() MOZ_OVERRIDE { - trusted_glob = nullptr; - trusted_fun = nullptr; - JS::RemoveObjectRoot(cx, &trusted_glob); - JS::RemoveObjectRoot(cx, &trusted_fun); - JSAPITest::uninit(); -} END_TEST(testChromeBuffer) diff --git a/js/src/jsapi-tests/testJitFoldsTo.cpp b/js/src/jsapi-tests/testJitFoldsTo.cpp index 88c2479608b4..6598e53f2d06 100644 --- a/js/src/jsapi-tests/testJitFoldsTo.cpp +++ b/js/src/jsapi-tests/testJitFoldsTo.cpp @@ -201,3 +201,53 @@ BEGIN_TEST(testJitNotNotTest) return true; } END_TEST(testJitNotNotTest) + +BEGIN_TEST(testJitFoldsTo_UnsignedDiv) +{ + MinimalFunc func; + MBasicBlock *block = func.createEntryBlock(); + + // return 1.0 / 0xffffffff + MConstant *c0 = MConstant::New(func.alloc, Int32Value(1)); + block->add(c0); + MConstant *c1 = MConstant::New(func.alloc, Int32Value(0xffffffff)); + block->add(c1); + MDiv *div = MDiv::NewAsmJS(func.alloc, c0, c1, MIRType_Int32, /*unsignd=*/true); + block->add(div); + MReturn *ret = MReturn::New(func.alloc, div); + block->end(ret); + + if (!func.runGVN()) + return false; + + // Test that the div got folded to 0. + MConstant *op = ret->getOperand(0)->toConstant(); + CHECK(mozilla::NumbersAreIdentical(op->value().toNumber(), 0.0)); + return true; +} +END_TEST(testJitFoldsTo_UnsignedDiv) + +BEGIN_TEST(testJitFoldsTo_UnsignedMod) +{ + MinimalFunc func; + MBasicBlock *block = func.createEntryBlock(); + + // return 1.0 % 0xffffffff + MConstant *c0 = MConstant::New(func.alloc, Int32Value(1)); + block->add(c0); + MConstant *c1 = MConstant::New(func.alloc, Int32Value(0xffffffff)); + block->add(c1); + MMod *mod = MMod::NewAsmJS(func.alloc, c0, c1, MIRType_Int32, /*unsignd=*/true); + block->add(mod); + MReturn *ret = MReturn::New(func.alloc, mod); + block->end(ret); + + if (!func.runGVN()) + return false; + + // Test that the mod got folded to 1. + MConstant *op = ret->getOperand(0)->toConstant(); + CHECK(mozilla::NumbersAreIdentical(op->value().toNumber(), 1.0)); + return true; +} +END_TEST(testJitFoldsTo_UnsignedMod) diff --git a/js/src/jsapi-tests/testNullRoot.cpp b/js/src/jsapi-tests/testNullRoot.cpp index 5db2d29128be..60ccbe5ce9a8 100644 --- a/js/src/jsapi-tests/testNullRoot.cpp +++ b/js/src/jsapi-tests/testNullRoot.cpp @@ -9,25 +9,17 @@ BEGIN_TEST(testNullRoot) { - obj = nullptr; - CHECK(JS::AddObjectRoot(cx, &obj)); - - str = nullptr; - CHECK(JS::AddStringRoot(cx, &str)); - - script = nullptr; - CHECK(JS::AddNamedScriptRoot(cx, &script, "testNullRoot's script")); + obj.init(cx, nullptr); + str.init(cx, nullptr); + script.init(cx, nullptr); // This used to crash because obj was nullptr. JS_GC(cx->runtime()); - JS::RemoveObjectRoot(cx, &obj); - JS::RemoveStringRoot(cx, &str); - JS::RemoveScriptRoot(cx, &script); return true; } -JS::Heap obj; -JS::Heap str; -JS::Heap script; +JS::PersistentRootedObject obj; +JS::PersistentRootedString str; +JS::PersistentRootedScript script; END_TEST(testNullRoot) diff --git a/js/src/jsapi-tests/testPersistentRooted.cpp b/js/src/jsapi-tests/testPersistentRooted.cpp index 3ebdb592aba7..8cc328827c76 100644 --- a/js/src/jsapi-tests/testPersistentRooted.cpp +++ b/js/src/jsapi-tests/testPersistentRooted.cpp @@ -38,8 +38,15 @@ const JSClass BarkWhenTracedClass::class_ = { struct Kennel { PersistentRootedObject obj; + Kennel() { } explicit Kennel(JSContext *cx) : obj(cx) { } Kennel(JSContext *cx, const HandleObject &woof) : obj(cx, woof) { } + void init(JSContext *cx, const HandleObject &woof) { + obj.init(cx, woof); + } + void clear() { + obj = nullptr; + } }; // A function for allocating a Kennel and a barker. Only allocating @@ -178,3 +185,35 @@ BEGIN_TEST(test_PersistentRootedAssign) return true; } END_TEST(test_PersistentRootedAssign) + +static PersistentRootedObject gGlobalRoot; + +// PersistentRooted instances can initialized in a separate step to allow for global PersistentRooteds. +BEGIN_TEST(test_GlobalPersistentRooted) +{ + BarkWhenTracedClass::reset(); + + CHECK(!gGlobalRoot.initialized()); + + { + RootedObject barker(cx, JS_NewObject(cx, &BarkWhenTracedClass::class_, JS::NullPtr(), JS::NullPtr())); + CHECK(barker); + + gGlobalRoot.init(cx, barker); + } + + CHECK(gGlobalRoot.initialized()); + + // GC should be able to find our barker. + CHECK(GCFinalizesNBarkers(cx, 0)); + + gGlobalRoot.reset(); + CHECK(!gGlobalRoot.initialized()); + + // Now GC should not be able to find the barker. + JS_GC(JS_GetRuntime(cx)); + CHECK(BarkWhenTracedClass::finalizeCount == 1); + + return true; +} +END_TEST(test_GlobalPersistentRooted) diff --git a/js/src/jsapi-tests/testResolveRecursion.cpp b/js/src/jsapi-tests/testResolveRecursion.cpp index 9caa06b2b26e..ee5fde890d80 100644 --- a/js/src/jsapi-tests/testResolveRecursion.cpp +++ b/js/src/jsapi-tests/testResolveRecursion.cpp @@ -25,13 +25,9 @@ BEGIN_TEST(testResolveRecursion) my_resolve }; - obj1 = obj2 = nullptr; - JS::AddObjectRoot(cx, &obj1); - JS::AddObjectRoot(cx, &obj2); - - obj1 = JS_NewObject(cx, &my_resolve_class, JS::NullPtr(), JS::NullPtr()); + obj1.init(cx, JS_NewObject(cx, &my_resolve_class, JS::NullPtr(), JS::NullPtr())); CHECK(obj1); - obj2 = JS_NewObject(cx, &my_resolve_class, JS::NullPtr(), JS::NullPtr()); + obj2.init(cx, JS_NewObject(cx, &my_resolve_class, JS::NullPtr(), JS::NullPtr())); CHECK(obj2); JS_SetPrivate(obj1, this); JS_SetPrivate(obj2, this); @@ -53,13 +49,11 @@ BEGIN_TEST(testResolveRecursion) obj1 = nullptr; obj2 = nullptr; - JS::RemoveObjectRoot(cx, &obj1); - JS::RemoveObjectRoot(cx, &obj2); return true; } -JS::Heap obj1; -JS::Heap obj2; +JS::PersistentRootedObject obj1; +JS::PersistentRootedObject obj2; int resolveEntryCount; int resolveExitCount; diff --git a/js/src/jsapi-tests/tests.cpp b/js/src/jsapi-tests/tests.cpp index b0da687a325c..63f989340b2f 100644 --- a/js/src/jsapi-tests/tests.cpp +++ b/js/src/jsapi-tests/tests.cpp @@ -21,7 +21,8 @@ bool JSAPITest::init() if (!cx) return false; JS_BeginRequest(cx); - JS::RootedObject global(cx, createGlobal()); + global.init(rt); + createGlobal(); if (!global) return false; JS_EnterCompartment(cx, global); @@ -36,7 +37,6 @@ void JSAPITest::uninit() } if (global) { JS_LeaveCompartment(cx, nullptr); - JS::RemoveObjectRoot(cx, &global); global = nullptr; } if (cx) { @@ -53,7 +53,6 @@ void JSAPITest::uninit() bool JSAPITest::exec(const char *bytes, const char *filename, int lineno) { JS::RootedValue v(cx); - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); JS::CompileOptions opts(cx); opts.setFileAndLine(filename, lineno); return JS::Evaluate(cx, global, opts, bytes, strlen(bytes), &v) || @@ -63,7 +62,6 @@ bool JSAPITest::exec(const char *bytes, const char *filename, int lineno) bool JSAPITest::evaluate(const char *bytes, const char *filename, int lineno, JS::MutableHandleValue vp) { - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); JS::CompileOptions opts(cx); opts.setFileAndLine(filename, lineno); return JS::Evaluate(cx, global, opts, bytes, strlen(bytes), vp) || @@ -72,7 +70,6 @@ bool JSAPITest::evaluate(const char *bytes, const char *filename, int lineno, bool JSAPITest::definePrint() { - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(this->global.unsafeGet()); return JS_DefineFunction(cx, global, "print", (JSNative) print, 0, 0); } @@ -84,16 +81,13 @@ JSObject * JSAPITest::createGlobal(JSPrincipals *principals) global = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook, options); if (!global) return nullptr; - JS::AddNamedObjectRoot(cx, &global, "test-global"); - JS::HandleObject globalHandle = JS::HandleObject::fromMarkedLocation(global.unsafeGet()); - JSAutoCompartment ac(cx, globalHandle); + + JSAutoCompartment ac(cx, global); /* Populate the global object with the standard globals, like Object and Array. */ - if (!JS_InitStandardClasses(cx, globalHandle)) { + if (!JS_InitStandardClasses(cx, global)) global = nullptr; - JS::RemoveObjectRoot(cx, &global); - } return global; } @@ -124,8 +118,7 @@ int main(int argc, char *argv[]) continue; } - JS::HandleObject global = JS::HandleObject::fromMarkedLocation(test->global.unsafeGet()); - if (test->run(global)) { + if (test->run(test->global)) { printf("TEST-PASS | %s | ok\n", name); } else { JSAPITestString messages = test->messages(); diff --git a/js/src/jsapi-tests/tests.h b/js/src/jsapi-tests/tests.h index 816b9b67f5e0..fd5fe16ea7eb 100644 --- a/js/src/jsapi-tests/tests.h +++ b/js/src/jsapi-tests/tests.h @@ -56,13 +56,12 @@ class JSAPITest JSRuntime *rt; JSContext *cx; - JS::Heap global; + JS::PersistentRootedObject global; bool knownFail; JSAPITestString msgs; JSCompartment *oldCompartment; - JSAPITest() : rt(nullptr), cx(nullptr), global(nullptr), - knownFail(false), oldCompartment(nullptr) { + JSAPITest() : rt(nullptr), cx(nullptr), knownFail(false), oldCompartment(nullptr) { next = list; list = this; } diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 000be9d8e477..7f36f5beaa6f 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1500,130 +1500,6 @@ JS_strdup(JSRuntime *rt, const char *s) #undef JS_AddRoot -JS_PUBLIC_API(bool) -JS::AddValueRoot(JSContext *cx, JS::Heap *vp) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddValueRoot(cx, vp->unsafeGet(), nullptr); -} - -JS_PUBLIC_API(bool) -JS::AddStringRoot(JSContext *cx, JS::Heap *rp) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddStringRoot(cx, rp->unsafeGet(), nullptr); -} - -JS_PUBLIC_API(bool) -JS::AddObjectRoot(JSContext *cx, JS::Heap *rp) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddObjectRoot(cx, rp->unsafeGet(), nullptr); -} - -JS_PUBLIC_API(bool) -JS::AddNamedValueRoot(JSContext *cx, JS::Heap *vp, const char *name) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddValueRoot(cx, vp->unsafeGet(), name); -} - -JS_PUBLIC_API(bool) -JS::AddNamedValueRootRT(JSRuntime *rt, JS::Heap *vp, const char *name) -{ - return AddValueRootRT(rt, vp->unsafeGet(), name); -} - -JS_PUBLIC_API(bool) -JS::AddNamedStringRoot(JSContext *cx, JS::Heap *rp, const char *name) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddStringRoot(cx, rp->unsafeGet(), name); -} - -JS_PUBLIC_API(bool) -JS::AddNamedObjectRoot(JSContext *cx, JS::Heap *rp, const char *name) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddObjectRoot(cx, rp->unsafeGet(), name); -} - -JS_PUBLIC_API(bool) -JS::AddNamedScriptRoot(JSContext *cx, JS::Heap *rp, const char *name) -{ - AssertHeapIsIdle(cx); - CHECK_REQUEST(cx); - return AddScriptRoot(cx, rp->unsafeGet(), name); -} - -/* We allow unrooting from finalizers within the GC */ - -JS_PUBLIC_API(void) -JS::RemoveValueRoot(JSContext *cx, JS::Heap *vp) -{ - CHECK_REQUEST(cx); - RemoveRoot(cx->runtime(), (void *)vp); - *vp = UndefinedValue(); -} - -JS_PUBLIC_API(void) -JS::RemoveStringRoot(JSContext *cx, JS::Heap *rp) -{ - CHECK_REQUEST(cx); - RemoveRoot(cx->runtime(), (void *)rp); - *rp = nullptr; -} - -JS_PUBLIC_API(void) -JS::RemoveObjectRoot(JSContext *cx, JS::Heap *rp) -{ - CHECK_REQUEST(cx); - RemoveRoot(cx->runtime(), (void *)rp); - *rp = nullptr; -} - -JS_PUBLIC_API(void) -JS::RemoveScriptRoot(JSContext *cx, JS::Heap *rp) -{ - CHECK_REQUEST(cx); - RemoveRoot(cx->runtime(), (void *)rp); - *rp = nullptr; -} - -JS_PUBLIC_API(void) -JS::RemoveValueRootRT(JSRuntime *rt, JS::Heap *vp) -{ - RemoveRoot(rt, (void *)vp); - *vp = UndefinedValue(); -} - -JS_PUBLIC_API(void) -JS::RemoveStringRootRT(JSRuntime *rt, JS::Heap *rp) -{ - RemoveRoot(rt, (void *)rp); - *rp = nullptr; -} - -JS_PUBLIC_API(void) -JS::RemoveObjectRootRT(JSRuntime *rt, JS::Heap *rp) -{ - RemoveRoot(rt, (void *)rp); - *rp = nullptr; -} - -JS_PUBLIC_API(void) -JS::RemoveScriptRootRT(JSRuntime *rt, JS::Heap *rp) -{ - RemoveRoot(rt, (void *)rp); - *rp = nullptr; -} - JS_PUBLIC_API(bool) JS_AddExtraGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data) { @@ -5687,8 +5563,9 @@ JS::AutoSaveExceptionState::~AutoSaveExceptionState() } struct JSExceptionState { + explicit JSExceptionState(JSContext *cx) : exception(cx) {} bool throwing; - jsval exception; + PersistentRootedValue exception; }; JS_PUBLIC_API(JSExceptionState *) @@ -5698,13 +5575,9 @@ JS_SaveExceptionState(JSContext *cx) AssertHeapIsIdle(cx); CHECK_REQUEST(cx); - state = cx->pod_malloc(); - if (state) { - state->throwing = - JS_GetPendingException(cx, MutableHandleValue::fromMarkedLocation(&state->exception)); - if (state->throwing && state->exception.isGCThing()) - AddValueRoot(cx, &state->exception, "JSExceptionState.exception"); - } + state = cx->new_(cx); + if (state) + state->throwing = JS_GetPendingException(cx, &state->exception); return state; } @@ -5715,7 +5588,7 @@ JS_RestoreExceptionState(JSContext *cx, JSExceptionState *state) CHECK_REQUEST(cx); if (state) { if (state->throwing) - JS_SetPendingException(cx, HandleValue::fromMarkedLocation(&state->exception)); + JS_SetPendingException(cx, state->exception); else JS_ClearPendingException(cx); JS_DropExceptionState(cx, state); @@ -5727,13 +5600,7 @@ JS_DropExceptionState(JSContext *cx, JSExceptionState *state) { AssertHeapIsIdle(cx); CHECK_REQUEST(cx); - if (state) { - if (state->throwing && state->exception.isGCThing()) { - assertSameCompartment(cx, state->exception); - RemoveRoot(cx->runtime(), &state->exception); - } - js_free(state); - } + js_delete(state); } JS_PUBLIC_API(JSErrorReport *) diff --git a/js/src/jsapi.h b/js/src/jsapi.h index a69b6edf1cb9..2b099979263b 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -1996,83 +1996,6 @@ JS_strdup(JSContext *cx, const char *s); extern JS_PUBLIC_API(char *) JS_strdup(JSRuntime *rt, const char *s); -namespace JS { - -/* - * A GC root is a pointer to a jsval, JSObject * or JSString * that itself - * points into the GC heap. JS_AddValueRoot takes a pointer to a jsval and - * JS_AddGCThingRoot takes a pointer to a JSObject * or JString *. - * - * Note that, since JS_Add*Root stores the address of a variable (of type - * jsval, JSString *, or JSObject *), that variable must live until - * JS_Remove*Root is called to remove that variable. For example, after: - * - * void some_function() { - * jsval v; - * JS_AddNamedValueRoot(cx, &v, "name"); - * - * the caller must perform - * - * JS_RemoveValueRoot(cx, &v); - * - * before some_function() returns. - * - * Also, use JS_AddNamed*Root(cx, &structPtr->memberObj, "structPtr->memberObj") - * in preference to JS_Add*Root(cx, &structPtr->memberObj), in order to identify - * roots by their source callsites. This way, you can find the callsite while - * debugging if you should fail to do JS_Remove*Root(cx, &structPtr->memberObj) - * before freeing structPtr's memory. - */ -extern JS_PUBLIC_API(bool) -AddValueRoot(JSContext *cx, JS::Heap *vp); - -extern JS_PUBLIC_API(bool) -AddStringRoot(JSContext *cx, JS::Heap *rp); - -extern JS_PUBLIC_API(bool) -AddObjectRoot(JSContext *cx, JS::Heap *rp); - -extern JS_PUBLIC_API(bool) -AddNamedValueRoot(JSContext *cx, JS::Heap *vp, const char *name); - -extern JS_PUBLIC_API(bool) -AddNamedValueRootRT(JSRuntime *rt, JS::Heap *vp, const char *name); - -extern JS_PUBLIC_API(bool) -AddNamedStringRoot(JSContext *cx, JS::Heap *rp, const char *name); - -extern JS_PUBLIC_API(bool) -AddNamedObjectRoot(JSContext *cx, JS::Heap *rp, const char *name); - -extern JS_PUBLIC_API(bool) -AddNamedScriptRoot(JSContext *cx, JS::Heap *rp, const char *name); - -extern JS_PUBLIC_API(void) -RemoveValueRoot(JSContext *cx, JS::Heap *vp); - -extern JS_PUBLIC_API(void) -RemoveStringRoot(JSContext *cx, JS::Heap *rp); - -extern JS_PUBLIC_API(void) -RemoveObjectRoot(JSContext *cx, JS::Heap *rp); - -extern JS_PUBLIC_API(void) -RemoveScriptRoot(JSContext *cx, JS::Heap *rp); - -extern JS_PUBLIC_API(void) -RemoveValueRootRT(JSRuntime *rt, JS::Heap *vp); - -extern JS_PUBLIC_API(void) -RemoveStringRootRT(JSRuntime *rt, JS::Heap *rp); - -extern JS_PUBLIC_API(void) -RemoveObjectRootRT(JSRuntime *rt, JS::Heap *rp); - -extern JS_PUBLIC_API(void) -RemoveScriptRootRT(JSRuntime *rt, JS::Heap *rp); - -} /* namespace JS */ - /* * Register externally maintained GC roots. * diff --git a/js/src/jsast.tbl b/js/src/jsast.tbl index e139ea198283..2bb89f636f05 100644 --- a/js/src/jsast.tbl +++ b/js/src/jsast.tbl @@ -67,6 +67,7 @@ ASTDEF(AST_EXPORT_BATCH_SPEC, "ExportBatchSpecifier", "exportBatch ASTDEF(AST_CASE, "SwitchCase", "switchCase") ASTDEF(AST_CATCH, "CatchClause", "catchClause") ASTDEF(AST_COMP_BLOCK, "ComprehensionBlock", "comprehensionBlock") +ASTDEF(AST_COMP_IF, "ComprehensionIf", "comprehensionIf") ASTDEF(AST_ARRAY_PATT, "ArrayPattern", "arrayPattern") ASTDEF(AST_OBJECT_PATT, "ObjectPattern", "objectPattern") diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp index b7afc77d8e53..a22148a6ff0c 100644 --- a/js/src/jsexn.cpp +++ b/js/src/jsexn.cpp @@ -854,7 +854,11 @@ ErrorReport::init(JSContext *cx, HandleValue exn) // // but without the reporting bits. Instead it just puts all // the stuff we care about in our ownedReport and message_. - populateUncaughtExceptionReport(cx, message_); + if (!populateUncaughtExceptionReport(cx, message_)) { + // Just give up. We're out of memory or something; not much we can + // do here. + return false; + } } else { /* Flag the error as an exception. */ reportp->flags |= JSREPORT_EXCEPTION; @@ -863,16 +867,17 @@ ErrorReport::init(JSContext *cx, HandleValue exn) return true; } -void +bool ErrorReport::populateUncaughtExceptionReport(JSContext *cx, ...) { va_list ap; va_start(ap, cx); - populateUncaughtExceptionReportVA(cx, ap); + bool ok = populateUncaughtExceptionReportVA(cx, ap); va_end(ap); + return ok; } -void +bool ErrorReport::populateUncaughtExceptionReportVA(JSContext *cx, va_list ap) { new (&ownedReport) JSErrorReport(); @@ -891,12 +896,13 @@ ErrorReport::populateUncaughtExceptionReportVA(JSContext *cx, va_list ap) if (!js_ExpandErrorArguments(cx, js_GetErrorMessage, nullptr, JSMSG_UNCAUGHT_EXCEPTION, &ownedMessage, &ownedReport, ArgumentsAreASCII, ap)) { - return; + return false; } reportp = &ownedReport; message_ = ownedMessage; ownsMessageAndReport = true; + return true; } JSObject * diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 5f33604c23e5..128a5656bc86 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -1367,8 +1367,11 @@ struct MOZ_STACK_CLASS JS_FRIEND_API(ErrorReport) // More or less an equivalent of JS_ReportErrorNumber/js_ReportErrorNumberVA // but fills in an ErrorReport instead of reporting it. Uses varargs to // make it simpler to call js_ExpandErrorArguments. - void populateUncaughtExceptionReport(JSContext *cx, ...); - void populateUncaughtExceptionReportVA(JSContext *cx, va_list ap); + // + // Returns false if we fail to actually populate the ErrorReport + // for some reason (probably out of memory). + bool populateUncaughtExceptionReport(JSContext *cx, ...); + bool populateUncaughtExceptionReportVA(JSContext *cx, va_list ap); // We may have a provided JSErrorReport, so need a way to represent that. JSErrorReport *reportp; diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 7cfca76cd795..937052ad06b0 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -1312,11 +1312,6 @@ GCRuntime::finish() FreeChunkPool(rt, availableChunks_); FreeChunkPool(rt, emptyChunks_); - if (rootsHash.initialized()) - rootsHash.clear(); - - FinishPersistentRootedChains(rt); - if (lock) { PR_DestroyLock(lock); lock = nullptr; @@ -1325,16 +1320,33 @@ GCRuntime::finish() FinishTrace(); } +template +static void +FinishPersistentRootedChain(mozilla::LinkedList>& list) +{ + while (!list.isEmpty()) + list.getFirst()->reset(); +} + void js::gc::FinishPersistentRootedChains(JSRuntime *rt) { /* The lists of persistent roots are stored on the shadow runtime. */ - rt->functionPersistentRooteds.clear(); - rt->idPersistentRooteds.clear(); - rt->objectPersistentRooteds.clear(); - rt->scriptPersistentRooteds.clear(); - rt->stringPersistentRooteds.clear(); - rt->valuePersistentRooteds.clear(); + FinishPersistentRootedChain(rt->functionPersistentRooteds); + FinishPersistentRootedChain(rt->idPersistentRooteds); + FinishPersistentRootedChain(rt->objectPersistentRooteds); + FinishPersistentRootedChain(rt->scriptPersistentRooteds); + FinishPersistentRootedChain(rt->stringPersistentRooteds); + FinishPersistentRootedChain(rt->valuePersistentRooteds); +} + +void +GCRuntime::finishRoots() +{ + if (rootsHash.initialized()) + rootsHash.clear(); + + FinishPersistentRootedChains(rt); } void @@ -1483,10 +1495,6 @@ GCRuntime::setMarkStackLimit(size_t limit) marker.setMaxCapacity(limit); } -template struct BarrierOwner {}; -template struct BarrierOwner { typedef T result; }; -template <> struct BarrierOwner { typedef HeapValue result; }; - bool GCRuntime::addBlackRootsTracer(JSTraceDataOp traceOp, void *data) { @@ -1584,9 +1592,8 @@ GCRuntime::setSliceCallback(JS::GCSliceCallback callback) { return stats.setSliceCallback(callback); } -template bool -GCRuntime::addRoot(T *rp, const char *name, JSGCRootType rootType) +GCRuntime::addRoot(Value *vp, const char *name) { /* * Sometimes Firefox will hold weak references to objects and then convert @@ -1595,87 +1602,33 @@ GCRuntime::addRoot(T *rp, const char *name, JSGCRootType rootType) * cases. */ if (isIncrementalGCInProgress()) - BarrierOwner::result::writeBarrierPre(*rp); + HeapValue::writeBarrierPre(*vp); - return rootsHash.put((void *)rp, RootInfo(name, rootType)); + return rootsHash.put(vp, name); } void -GCRuntime::removeRoot(void *rp) +GCRuntime::removeRoot(Value *vp) { - rootsHash.remove(rp); + rootsHash.remove(vp); poke(); } -template -static bool -AddRoot(JSRuntime *rt, T *rp, const char *name, JSGCRootType rootType) -{ - return rt->gc.addRoot(rp, name, rootType); -} - -template -static bool -AddRoot(JSContext *cx, T *rp, const char *name, JSGCRootType rootType) -{ - bool ok = cx->runtime()->gc.addRoot(rp, name, rootType); - if (!ok) - JS_ReportOutOfMemory(cx); - return ok; -} - -bool -js::AddValueRoot(JSContext *cx, Value *vp, const char *name) -{ - return AddRoot(cx, vp, name, JS_GC_ROOT_VALUE_PTR); -} - -extern bool -js::AddValueRootRT(JSRuntime *rt, js::Value *vp, const char *name) -{ - return AddRoot(rt, vp, name, JS_GC_ROOT_VALUE_PTR); -} - -extern bool -js::AddStringRoot(JSContext *cx, JSString **rp, const char *name) -{ - return AddRoot(cx, rp, name, JS_GC_ROOT_STRING_PTR); -} - -extern bool -js::AddObjectRoot(JSContext *cx, JSObject **rp, const char *name) -{ - return AddRoot(cx, rp, name, JS_GC_ROOT_OBJECT_PTR); -} - -extern bool -js::AddObjectRoot(JSRuntime *rt, JSObject **rp, const char *name) -{ - return AddRoot(rt, rp, name, JS_GC_ROOT_OBJECT_PTR); -} - -extern bool -js::AddScriptRoot(JSContext *cx, JSScript **rp, const char *name) -{ - return AddRoot(cx, rp, name, JS_GC_ROOT_SCRIPT_PTR); -} - extern JS_FRIEND_API(bool) js::AddRawValueRoot(JSContext *cx, Value *vp, const char *name) { - return AddRoot(cx, vp, name, JS_GC_ROOT_VALUE_PTR); + MOZ_ASSERT(vp); + MOZ_ASSERT(name); + bool ok = cx->runtime()->gc.addRoot(vp, name); + if (!ok) + JS_ReportOutOfMemory(cx); + return ok; } extern JS_FRIEND_API(void) js::RemoveRawValueRoot(JSContext *cx, Value *vp) { - RemoveRoot(cx->runtime(), vp); -} - -void -js::RemoveRoot(JSRuntime *rt, void *rp) -{ - rt->gc.removeRoot(rp); + cx->runtime()->gc.removeRoot(vp); } void @@ -2537,8 +2490,8 @@ GCRuntime::updateAllCellPointersParallel(MovingTracer *trc) const size_t minTasks = 2; const size_t maxTasks = 8; - unsigned taskCount = Min(Max(HelperThreadState().cpuCount / 2, minTasks), - maxTasks) + 1; + unsigned taskCount = Min(Max(HelperThreadState().cpuCount / 2, minTasks) + 1, + maxTasks); UpdateCellPointersTask updateTasks[maxTasks]; ArenasToUpdate fgArenas(rt, ArenasToUpdate::FOREGROUND); diff --git a/js/src/jsgc.h b/js/src/jsgc.h index 7cb3c6ed1649..f8e92abff5a6 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -832,46 +832,6 @@ const size_t MAX_EMPTY_CHUNK_AGE = 4; } /* namespace gc */ -typedef enum JSGCRootType { - JS_GC_ROOT_VALUE_PTR, - JS_GC_ROOT_STRING_PTR, - JS_GC_ROOT_OBJECT_PTR, - JS_GC_ROOT_SCRIPT_PTR -} JSGCRootType; - -struct RootInfo { - RootInfo() {} - RootInfo(const char *name, JSGCRootType type) : name(name), type(type) {} - const char *name; - JSGCRootType type; -}; - -typedef js::HashMap, - js::SystemAllocPolicy> RootedValueMap; - -extern bool -AddValueRoot(JSContext *cx, js::Value *vp, const char *name); - -extern bool -AddValueRootRT(JSRuntime *rt, js::Value *vp, const char *name); - -extern bool -AddStringRoot(JSContext *cx, JSString **rp, const char *name); - -extern bool -AddObjectRoot(JSContext *cx, JSObject **rp, const char *name); - -extern bool -AddObjectRoot(JSRuntime *rt, JSObject **rp, const char *name); - -extern bool -AddScriptRoot(JSContext *cx, JSScript **rp, const char *name); - -extern void -RemoveRoot(JSRuntime *rt, void *rp); - } /* namespace js */ extern bool diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index e6c1fd854fe6..48650a302c23 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1781,12 +1781,8 @@ js::DeepCloneObjectLiteral(JSContext *cx, HandleNativeObject obj, NewObjectKind if (!clone || !clone->ensureElements(cx, obj->getDenseCapacity())) return nullptr; - // Copy the number of initialized elements. - uint32_t initialized = obj->getDenseInitializedLength(); - if (initialized) - clone->setDenseInitializedLength(initialized); - // Recursive copy of dense element. + uint32_t initialized = obj->getDenseInitializedLength(); for (uint32_t i = 0; i < initialized; ++i) { v = obj->getDenseElement(i); if (v.isObject()) { @@ -1798,6 +1794,7 @@ js::DeepCloneObjectLiteral(JSContext *cx, HandleNativeObject obj, NewObjectKind } v.setObject(*deepObj); } + clone->setDenseInitializedLength(i + 1); clone->initDenseElement(i, v); } diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index bc27caf117f9..6d7880e12ebe 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -668,6 +668,7 @@ class NodeBuilder bool comprehensionBlock(HandleValue patt, HandleValue src, bool isForEach, bool isForOf, TokenPos *pos, MutableHandleValue dst); + bool comprehensionIf(HandleValue test, TokenPos *pos, MutableHandleValue dst); bool comprehensionExpression(HandleValue body, NodeVector &blocks, HandleValue filter, bool isLegacy, TokenPos *pos, MutableHandleValue dst); @@ -1409,6 +1410,18 @@ NodeBuilder::comprehensionBlock(HandleValue patt, HandleValue src, bool isForEac dst); } +bool +NodeBuilder::comprehensionIf(HandleValue test, TokenPos *pos, MutableHandleValue dst) +{ + RootedValue cb(cx, callbacks[AST_COMP_IF]); + if (!cb.isNull()) + return callback(cb, test, pos, dst); + + return newNode(AST_COMP_IF, pos, + "test", test, + dst); +} + bool NodeBuilder::comprehensionExpression(HandleValue body, NodeVector &blocks, HandleValue filter, bool isLegacy, TokenPos *pos, MutableHandleValue dst) @@ -1795,6 +1808,7 @@ class ASTSerializer bool functionBody(ParseNode *pn, TokenPos *pos, MutableHandleValue dst); bool comprehensionBlock(ParseNode *pn, MutableHandleValue dst); + bool comprehensionIf(ParseNode *pn, MutableHandleValue dst); bool comprehension(ParseNode *pn, MutableHandleValue dst); bool generatorExpression(ParseNode *pn, MutableHandleValue dst); @@ -2607,6 +2621,17 @@ ASTSerializer::comprehensionBlock(ParseNode *pn, MutableHandleValue dst) builder.comprehensionBlock(patt, src, isForEach, isForOf, &in->pn_pos, dst); } +bool +ASTSerializer::comprehensionIf(ParseNode *pn, MutableHandleValue dst) +{ + LOCAL_ASSERT(pn->isKind(PNK_IF)); + LOCAL_ASSERT(!pn->pn_kid3); + + RootedValue patt(cx); + return pattern(pn->pn_kid1, &patt) && + builder.comprehensionIf(patt, &pn->pn_pos, dst); +} + bool ASTSerializer::comprehension(ParseNode *pn, MutableHandleValue dst) { @@ -2619,24 +2644,28 @@ ASTSerializer::comprehension(ParseNode *pn, MutableHandleValue dst) LOCAL_ASSERT(next->isKind(PNK_FOR)); NodeVector blocks(cx); - - while (next->isKind(PNK_FOR)) { - RootedValue block(cx); - if (!comprehensionBlock(next, &block) || !blocks.append(block)) - return false; - next = next->pn_right; - } - RootedValue filter(cx, MagicValue(JS_SERIALIZE_NO_NODE)); - - if (next->isKind(PNK_IF)) { - if (!optExpression(next->pn_kid1, &filter)) - return false; - next = next->pn_kid2; - } else if (next->isKind(PNK_STATEMENTLIST) && next->pn_count == 0) { - /* FoldConstants optimized away the push. */ - NodeVector empty(cx); - return builder.arrayExpression(empty, &pn->pn_pos, dst); + while (true) { + if (next->isKind(PNK_FOR)) { + RootedValue block(cx); + if (!comprehensionBlock(next, &block) || !blocks.append(block)) + return false; + next = next->pn_right; + } else if (next->isKind(PNK_IF)) { + if (isLegacy) { + MOZ_ASSERT(filter.isMagic(JS_SERIALIZE_NO_NODE)); + if (!optExpression(next->pn_kid1, &filter)) + return false; + } else { + // ES7 comprehension can contain multiple ComprehensionIfs. + RootedValue compif(cx); + if (!comprehensionIf(next, &compif) || !blocks.append(compif)) + return false; + } + next = next->pn_kid2; + } else { + break; + } } LOCAL_ASSERT(next->isKind(PNK_ARRAYPUSH)); @@ -2658,20 +2687,28 @@ ASTSerializer::generatorExpression(ParseNode *pn, MutableHandleValue dst) LOCAL_ASSERT(next->isKind(PNK_FOR)); NodeVector blocks(cx); - - while (next->isKind(PNK_FOR)) { - RootedValue block(cx); - if (!comprehensionBlock(next, &block) || !blocks.append(block)) - return false; - next = next->pn_right; - } - RootedValue filter(cx, MagicValue(JS_SERIALIZE_NO_NODE)); - - if (next->isKind(PNK_IF)) { - if (!optExpression(next->pn_kid1, &filter)) - return false; - next = next->pn_kid2; + while (true) { + if (next->isKind(PNK_FOR)) { + RootedValue block(cx); + if (!comprehensionBlock(next, &block) || !blocks.append(block)) + return false; + next = next->pn_right; + } else if (next->isKind(PNK_IF)) { + if (isLegacy) { + MOZ_ASSERT(filter.isMagic(JS_SERIALIZE_NO_NODE)); + if (!optExpression(next->pn_kid1, &filter)) + return false; + } else { + // ES7 comprehension can contain multiple ComprehensionIfs. + RootedValue compif(cx); + if (!comprehensionIf(next, &compif) || !blocks.append(compif)) + return false; + } + next = next->pn_kid2; + } else { + break; + } } LOCAL_ASSERT(next->isKind(PNK_SEMI) && diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 59a6ef3a5f2a..aff3871275ba 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -129,7 +129,7 @@ static size_t gMaxStackSize = 128 * sizeof(size_t) * 1024; static double MAX_TIMEOUT_INTERVAL = 1800.0; static double gTimeoutInterval = -1.0; static volatile bool gServiceInterrupt = false; -static Maybe gInterruptFunc; +static JS::PersistentRootedValue gInterruptFunc; static bool enableDisassemblyDumps = false; @@ -364,7 +364,7 @@ ShellInterruptCallback(JSContext *cx) gServiceInterrupt = false; bool result; - RootedValue interruptFunc(cx, *gInterruptFunc); + RootedValue interruptFunc(cx, gInterruptFunc); if (!interruptFunc.isNull()) { JS::AutoSaveExceptionState savedExc(cx); JSAutoCompartment ac(cx, &interruptFunc.toObject()); @@ -1651,8 +1651,21 @@ Quit(JSContext *cx, unsigned argc, jsval *vp) #endif CallArgs args = CallArgsFromVp(argc, vp); - JS_ConvertArguments(cx, args, "/ i", &gExitCode); + int32_t code; + if (!ToInt32(cx, args.get(0), &code)) + return false; + // The fuzzers check the shell's exit code and assume a value >= 128 means + // the process crashed (for instance, SIGSEGV will result in code 139). On + // POSIX platforms, the exit code is 8-bit and negative values can also + // result in an exit code >= 128. We restrict the value to range [0, 127] to + // avoid false positives. + if (code < 0 || code >= 128) { + JS_ReportError(cx, "quit exit code should be in range 0-127"); + return false; + } + + gExitCode = code; gQuitting = true; return false; } @@ -3023,7 +3036,7 @@ CancelExecution(JSRuntime *rt) gServiceInterrupt = true; JS_RequestInterruptCallback(rt); - if (!gInterruptFunc->get().isNull()) { + if (!gInterruptFunc.isNull()) { static const char msg[] = "Script runs for too long, terminating.\n"; fputs(msg, stderr); } @@ -3070,7 +3083,7 @@ Timeout(JSContext *cx, unsigned argc, Value *vp) JS_ReportError(cx, "Second argument must be a timeout function"); return false; } - *gInterruptFunc = value; + gInterruptFunc = value; } args.rval().setUndefined(); @@ -3141,7 +3154,7 @@ SetInterruptCallback(JSContext *cx, unsigned argc, Value *vp) JS_ReportError(cx, "Argument must be a function"); return false; } - *gInterruptFunc = value; + gInterruptFunc = value; args.rval().setUndefined(); return true; @@ -6026,7 +6039,7 @@ main(int argc, char **argv, char **envp) if (!SetRuntimeOptions(rt, op)) return 1; - gInterruptFunc.emplace(rt, NullValue()); + gInterruptFunc.init(rt, NullValue()); JS_SetGCParameter(rt, JSGC_MAX_BYTES, 0xffffffff); Maybe noggc; @@ -6089,8 +6102,6 @@ main(int argc, char **argv, char **envp) KillWatchdog(); - gInterruptFunc.reset(); - MOZ_ASSERT_IF(!CanUseExtraThreads(), workerThreads.empty()); for (size_t i = 0; i < workerThreads.length(); i++) PR_JoinThread(workerThreads[i]); diff --git a/js/src/tests/ecma_6/Function/rest-has-duplicated.js b/js/src/tests/ecma_6/Function/rest-has-duplicated.js new file mode 100644 index 000000000000..67577ab4e343 --- /dev/null +++ b/js/src/tests/ecma_6/Function/rest-has-duplicated.js @@ -0,0 +1,17 @@ +// Make sure duplicated name is allowed in non-strict. +function f0(a, a) { +} + +// SyntaxError should be thrown if rest parameter name is duplicated. +assertThrowsInstanceOf(() => eval(` +function f1(a, ...a) { +} +`), SyntaxError); + +// SyntaxError should be thrown if there is a duplicated parameter. +assertThrowsInstanceOf(() => eval(` +function f2(a, a, ...b) { +} +`), SyntaxError); + +reportCompare(0, 0, 'ok'); diff --git a/js/src/tests/js1_8_5/extensions/reflect-parse.js b/js/src/tests/js1_8_5/extensions/reflect-parse.js index d3cade96f0e1..3c49aac34df8 100644 --- a/js/src/tests/js1_8_5/extensions/reflect-parse.js +++ b/js/src/tests/js1_8_5/extensions/reflect-parse.js @@ -99,8 +99,18 @@ function taggedTemplate(tagPart, templatePart) Pattern({ type: "TaggedTemplate", arguments : templatePart }) function template(raw, cooked, ...args) Pattern([{ type: "CallSiteObject", raw: raw, cooked: cooked}, ...args]) -function compExpr(body, blocks, filter, style) Pattern({ type: "ComprehensionExpression", body, blocks, filter, style }) -function genExpr(body, blocks, filter, style) Pattern({ type: "GeneratorExpression", body, blocks, filter, style }) +function compExpr(body, blocks, filter, style) { + if (style == "legacy" || !filter) + return Pattern({ type: "ComprehensionExpression", body, blocks, filter, style }); + else + return Pattern({ type: "ComprehensionExpression", body, blocks: blocks.concat(compIf(filter)), filter: null, style }); +} +function genExpr(body, blocks, filter, style) { + if (style == "legacy" || !filter) + return Pattern({ type: "GeneratorExpression", body, blocks, filter, style }); + else + return Pattern({ type: "GeneratorExpression", body, blocks: blocks.concat(compIf(filter)), filter: null, style }); +} function graphExpr(idx, body) Pattern({ type: "GraphExpression", index: idx, expression: body }) function letExpr(head, body) Pattern({ type: "LetExpression", head: head, body: body }) function idxExpr(idx) Pattern({ type: "GraphIndexExpression", index: idx }) @@ -108,6 +118,7 @@ function idxExpr(idx) Pattern({ type: "GraphIndexExpression", index: idx }) function compBlock(left, right) Pattern({ type: "ComprehensionBlock", left: left, right: right, each: false, of: false }) function compEachBlock(left, right) Pattern({ type: "ComprehensionBlock", left: left, right: right, each: true, of: false }) function compOfBlock(left, right) Pattern({ type: "ComprehensionBlock", left: left, right: right, each: false, of: true }) +function compIf(test) Pattern({ type: "ComprehensionIf", test: test }) function arrPatt(elts) Pattern({ type: "ArrayPattern", elements: elts }) function objPatt(elts) Pattern({ type: "ObjectPattern", properties: elts }) @@ -919,6 +930,38 @@ assertLegacyAndModernArrayComp("[ [x,y,z] for (x of foo) for (y of bar) for (z o [compOfBlock(ident("x"), ident("foo")), compOfBlock(ident("y"), ident("bar")), compOfBlock(ident("z"), ident("baz"))], ident("p")); +// Modern comprehensions with multiple ComprehensionIf. + +assertExpr("[for (x of foo) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo"))], null, "modern")); +assertExpr("[for (x of foo) if (c1) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1"))], null, "modern")); +assertExpr("[for (x of foo) if (c1) if (c2) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), compIf(ident("c2"))], null, "modern")); + +assertExpr("[for (x of foo) if (c1) for (y of bar) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), + compOfBlock(ident("y"), ident("bar"))], null, "modern")); +assertExpr("[for (x of foo) if (c1) for (y of bar) if (c2) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), + compOfBlock(ident("y"), ident("bar")), + compIf(ident("c2"))], null, "modern")); +assertExpr("[for (x of foo) if (c1) if (c2) for (y of bar) if (c3) if (c4) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), compIf(ident("c2")), + compOfBlock(ident("y"), ident("bar")), + compIf(ident("c3")), compIf(ident("c4"))], null, "modern")); + +assertExpr("[for (x of y) if (false) for (z of w) if (0) x]", + compExpr(ident("x"), [compOfBlock(ident("x"), ident("y")), + compIf(lit(false)), + compOfBlock(ident("z"), ident("w")), + compIf(lit(0))], null, "modern")); + // generator expressions assertExpr("( x for (x in foo))", @@ -991,6 +1034,32 @@ assertLegacyAndModernGenExpr("( [x,y,z] for (x of foo) for (y of bar) for (z of [compOfBlock(ident("x"), ident("foo")), compOfBlock(ident("y"), ident("bar")), compOfBlock(ident("z"), ident("baz"))], ident("p")); +// Modern generator comprehension with multiple ComprehensionIf. + +assertExpr("(for (x of foo) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo"))], null, "modern")); +assertExpr("(for (x of foo) if (c1) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1"))], null, "modern")); +assertExpr("(for (x of foo) if (c1) if (c2) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), compIf(ident("c2"))], null, "modern")); + +assertExpr("(for (x of foo) if (c1) for (y of bar) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), + compOfBlock(ident("y"), ident("bar"))], null, "modern")); +assertExpr("(for (x of foo) if (c1) for (y of bar) if (c2) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), + compOfBlock(ident("y"), ident("bar")), + compIf(ident("c2"))], null, "modern")); +assertExpr("(for (x of foo) if (c1) if (c2) for (y of bar) if (c3) if (c4) x)", + genExpr(ident("x"), [compOfBlock(ident("x"), ident("foo")), + compIf(ident("c1")), compIf(ident("c2")), + compOfBlock(ident("y"), ident("bar")), + compIf(ident("c3")), compIf(ident("c4"))], null, "modern")); + // NOTE: it would be good to test generator expressions both with and without upvars, just like functions above. diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index 1f15f14cb609..e2a7022dd36c 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -371,6 +371,9 @@ JSRuntime::~JSRuntime() /* Clear atoms to remove GC roots and heap allocations. */ finishAtoms(); + /* Remove persistent GC roots. */ + gc.finishRoots(); + /* * Flag us as being destroyed. This allows the GC to free things like * interned atoms and Ion trampolines. diff --git a/js/xpconnect/idl/nsIXPConnect.idl b/js/xpconnect/idl/nsIXPConnect.idl index a42c9517299b..f2fcfc3b1920 100644 --- a/js/xpconnect/idl/nsIXPConnect.idl +++ b/js/xpconnect/idl/nsIXPConnect.idl @@ -11,6 +11,8 @@ %{ C++ #include "jspubtd.h" #include "js/TypeDecls.h" +#include "mozilla/Attributes.h" +#include "nsCOMPtr.h" struct JSFreeOp; @@ -89,13 +91,12 @@ interface nsIXPConnectWrappedNative : nsIXPConnectJSObjectHolder nsISupports* Native() const { return mIdentity; } protected: - nsISupports *mIdentity; + nsCOMPtr mIdentity; public: %} }; %{C++ -#include "nsCOMPtr.h" inline const nsQueryInterface diff --git a/js/xpconnect/loader/mozJSComponentLoader.h b/js/xpconnect/loader/mozJSComponentLoader.h index e06265bc0115..c6b895a4f79f 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.h +++ b/js/xpconnect/loader/mozJSComponentLoader.h @@ -44,7 +44,7 @@ class mozJSComponentLoader : public mozilla::ModuleLoader, mozJSComponentLoader(); // ModuleLoader - const mozilla::Module* LoadModule(mozilla::FileLocation &aFile); + const mozilla::Module* LoadModule(mozilla::FileLocation &aFile) MOZ_OVERRIDE; nsresult FindTargetObject(JSContext* aCx, JS::MutableHandleObject aTargetObject); diff --git a/js/xpconnect/public/SandboxPrivate.h b/js/xpconnect/public/SandboxPrivate.h index cc1a2fc1a213..5d8323eeac5a 100644 --- a/js/xpconnect/public/SandboxPrivate.h +++ b/js/xpconnect/public/SandboxPrivate.h @@ -35,12 +35,12 @@ public: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(SandboxPrivate, nsIGlobalObject) - nsIPrincipal *GetPrincipal() + nsIPrincipal *GetPrincipal() MOZ_OVERRIDE { return mPrincipal; } - JSObject *GetGlobalJSObject() + JSObject *GetGlobalJSObject() MOZ_OVERRIDE { return GetWrapper(); } diff --git a/js/xpconnect/public/moz.build b/js/xpconnect/public/moz.build index 7188b5ac6e34..09255f0c9079 100644 --- a/js/xpconnect/public/moz.build +++ b/js/xpconnect/public/moz.build @@ -5,7 +5,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. EXPORTS += [ - 'nsAutoJSValHolder.h', 'nsAXPCNativeCallContext.h', 'nsTArrayHelpers.h', 'SandboxPrivate.h', diff --git a/js/xpconnect/public/nsAutoJSValHolder.h b/js/xpconnect/public/nsAutoJSValHolder.h deleted file mode 100644 index db01b3b19630..000000000000 --- a/js/xpconnect/public/nsAutoJSValHolder.h +++ /dev/null @@ -1,133 +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/. */ - -#ifndef __NSAUTOJSVALHOLDER_H__ -#define __NSAUTOJSVALHOLDER_H__ - -#include "nsDebug.h" -#include "jsapi.h" - -/** - * Simple class that looks and acts like a JS::Value except that it unroots - * itself automatically if Root() is ever called. Designed to be rooted on the - * context or runtime (but not both!). - */ -class nsAutoJSValHolder -{ -public: - nsAutoJSValHolder() - : mVal(JSVAL_NULL), mRt(nullptr) - { - // nothing to do - } - - /** - * Always release on destruction. - */ - virtual ~nsAutoJSValHolder() { - Release(); - } - - nsAutoJSValHolder(const nsAutoJSValHolder& aOther) - : mVal(JSVAL_NULL), mRt(nullptr) - { - *this = aOther; - } - - nsAutoJSValHolder& operator=(const nsAutoJSValHolder& aOther) { - if (this != &aOther) { - if (aOther.IsHeld()) { - // XXX No error handling here... - this->Hold(aOther.mRt); - } - else { - this->Release(); - } - *this = static_cast(aOther); - } - return *this; - } - - /** - * Hold by rooting on the context's runtime. - */ - bool Hold(JSContext* aCx) { - return Hold(JS_GetRuntime(aCx)); - } - - /** - * Hold by rooting on the runtime. - * Note that mVal may be JSVAL_NULL, which is not a problem. - */ - bool Hold(JSRuntime* aRt) { - MOZ_ASSERT_IF(mRt, mRt == aRt); - - if (!mRt && JS::AddNamedValueRootRT(aRt, &mVal, "nsAutoJSValHolder")) { - mRt = aRt; - } - - return !!mRt; - } - - /** - * Manually release, nullifying mVal, and mRt, but returning - * the original JS::Value. - */ - JS::Value Release() { - JS::Value oldval = mVal; - - if (mRt) { - JS::RemoveValueRootRT(mRt, &mVal); // infallible - mRt = nullptr; - } - - mVal = JSVAL_NULL; - - return oldval; - } - - /** - * Determine if Hold has been called. - */ - bool IsHeld() const { - return !!mRt; - } - - /** - * Explicit JSObject* conversion. - */ - JSObject* ToJSObject() const { - return mVal.isObject() - ? &mVal.toObject() - : nullptr; - } - - /** - * Pretend to be a JS::Value. - */ - operator JS::Value() const { return mVal; } - JS::Value get() const { return mVal; } - - nsAutoJSValHolder &operator=(JSObject* aOther) { - return *this = OBJECT_TO_JSVAL(aOther); - } - - nsAutoJSValHolder &operator=(JS::Value aOther) { -#ifdef DEBUG - if (aOther.isGCThing() && !aOther.isNull()) { - MOZ_ASSERT(IsHeld(), "Not rooted!"); - } -#endif - mVal = aOther; - return *this; - } - -private: - JS::Heap mVal; - JSRuntime* mRt; -}; - -#endif /* __NSAUTOJSVALHOLDER_H__ */ diff --git a/js/xpconnect/src/BackstagePass.h b/js/xpconnect/src/BackstagePass.h index 4a8ada36a16c..f968d0e2952b 100644 --- a/js/xpconnect/src/BackstagePass.h +++ b/js/xpconnect/src/BackstagePass.h @@ -28,17 +28,17 @@ public: NS_DECL_NSIXPCSCRIPTABLE NS_DECL_NSICLASSINFO - virtual nsIPrincipal* GetPrincipal() { + virtual nsIPrincipal* GetPrincipal() MOZ_OVERRIDE { return mPrincipal; } - virtual JSObject* GetGlobalJSObject(); + virtual JSObject* GetGlobalJSObject() MOZ_OVERRIDE; - virtual void ForgetGlobalObject() { + void ForgetGlobalObject() { mWrapper = nullptr; } - virtual void SetGlobalObject(JSObject* global); + void SetGlobalObject(JSObject* global); explicit BackstagePass(nsIPrincipal *prin) : mPrincipal(prin) diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index a2c0bda0eeff..03ded81f9272 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -1156,7 +1156,7 @@ class WatchdogManager : public nsIObserver public: NS_IMETHOD Observe(nsISupports* aSubject, const char* aTopic, - const char16_t* aData) + const char16_t* aData) MOZ_OVERRIDE { RefreshWatchdog(); return NS_OK; @@ -1792,7 +1792,7 @@ class JSMainRuntimeTemporaryPeakReporter MOZ_FINAL : public nsIMemoryReporter NS_DECL_ISUPPORTS NS_IMETHOD CollectReports(nsIHandleReportCallback* aHandleReport, - nsISupports* aData, bool aAnonymize) + nsISupports* aData, bool aAnonymize) MOZ_OVERRIDE { return MOZ_COLLECT_REPORT("js-main-runtime-temporary-peak", KIND_OTHER, UNITS_BYTES, @@ -2630,7 +2630,7 @@ class JSMainRuntimeCompartmentsReporter MOZ_FINAL : public nsIMemoryReporter } NS_IMETHOD CollectReports(nsIMemoryReporterCallback *cb, - nsISupports *closure, bool anonymize) + nsISupports *closure, bool anonymize) MOZ_OVERRIDE { // First we collect the compartment paths. Then we report them. Doing // the two steps interleaved is a bad idea, because calling |cb| @@ -2702,8 +2702,7 @@ class OrphanReporter : public JS::ObjectPrivateVisitor static bool StartsWithExplicit(nsACString& s) { - const char* e = "explicit/"; - return Substring(s, 0, strlen(e)).Equals(e); + return StringBeginsWith(s, NS_LITERAL_CSTRING("explicit/")); } #endif diff --git a/js/xpconnect/src/XPCShellImpl.cpp b/js/xpconnect/src/XPCShellImpl.cpp index 6b197de52d0e..eff1c30bed01 100644 --- a/js/xpconnect/src/XPCShellImpl.cpp +++ b/js/xpconnect/src/XPCShellImpl.cpp @@ -570,13 +570,13 @@ Btoa(JSContext *cx, unsigned argc, Value *vp) return xpc::Base64Encode(cx, args[0], args.rval()); } -static Maybe sScriptedInterruptCallback; +static PersistentRootedValue sScriptedInterruptCallback; static bool XPCShellInterruptCallback(JSContext *cx) { - MOZ_ASSERT(sScriptedInterruptCallback); - RootedValue callback(cx, *sScriptedInterruptCallback); + MOZ_ASSERT(sScriptedInterruptCallback.initialized()); + RootedValue callback(cx, sScriptedInterruptCallback); // If no interrupt callback was set by script, no-op. if (callback.isUndefined()) @@ -598,7 +598,7 @@ XPCShellInterruptCallback(JSContext *cx) static bool SetInterruptCallback(JSContext *cx, unsigned argc, jsval *vp) { - MOZ_ASSERT(sScriptedInterruptCallback); + MOZ_ASSERT(sScriptedInterruptCallback.initialized()); // Sanity-check args. JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -609,7 +609,7 @@ SetInterruptCallback(JSContext *cx, unsigned argc, jsval *vp) // Allow callers to remove the interrupt callback by passing undefined. if (args[0].isUndefined()) { - *sScriptedInterruptCallback = UndefinedValue(); + sScriptedInterruptCallback = UndefinedValue(); return true; } @@ -619,7 +619,7 @@ SetInterruptCallback(JSContext *cx, unsigned argc, jsval *vp) return false; } - *sScriptedInterruptCallback = args[0]; + sScriptedInterruptCallback = args[0]; return true; } @@ -1390,7 +1390,7 @@ XRE_XPCShellMain(int argc, char **argv, char **envp) // Override the default XPConnect interrupt callback. We could store the // old one and restore it before shutting down, but there's not really a // reason to bother. - sScriptedInterruptCallback.emplace(rt, UndefinedValue()); + sScriptedInterruptCallback.init(rt, UndefinedValue()); JS_SetInterruptCallback(rt, XPCShellInterruptCallback); JS_SetErrorReporter(rt, XPCShellErrorReporter); @@ -1525,8 +1525,6 @@ XRE_XPCShellMain(int argc, char **argv, char **envp) rv = NS_ShutdownXPCOM( nullptr ); MOZ_ASSERT(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed"); - sScriptedInterruptCallback.reset(); - #ifdef TEST_CALL_ON_WRAPPED_JS_AFTER_SHUTDOWN // test of late call and release (see above) JSContext* bogusCX; diff --git a/js/xpconnect/src/XPCWrappedNative.cpp b/js/xpconnect/src/XPCWrappedNative.cpp index e4ed25ce049d..83acdce19dbc 100644 --- a/js/xpconnect/src/XPCWrappedNative.cpp +++ b/js/xpconnect/src/XPCWrappedNative.cpp @@ -505,7 +505,6 @@ FinishCreate(XPCWrappedNativeScope* Scope, if (cache) cache->ClearWrapper(); - wrapper->Release(); return rv; } } @@ -573,7 +572,7 @@ XPCWrappedNative::XPCWrappedNative(already_AddRefed&& aIdentity, { MOZ_ASSERT(NS_IsMainThread()); - mIdentity = aIdentity.take(); + mIdentity = aIdentity; mFlatJSObject.setFlags(FLAT_JS_OBJECT_VALID); MOZ_ASSERT(mMaybeProto, "bad ctor param"); @@ -591,7 +590,7 @@ XPCWrappedNative::XPCWrappedNative(already_AddRefed&& aIdentity, { MOZ_ASSERT(NS_IsMainThread()); - mIdentity = aIdentity.take(); + mIdentity = aIdentity; mFlatJSObject.setFlags(FLAT_JS_OBJECT_VALID); MOZ_ASSERT(aScope, "bad ctor param"); @@ -627,10 +626,9 @@ XPCWrappedNative::Destroy() if (mIdentity) { XPCJSRuntime* rt = GetRuntime(); if (rt && rt->GetDoingFinalization()) { - cyclecollector::DeferredFinalize(mIdentity); - mIdentity = nullptr; + cyclecollector::DeferredFinalize(mIdentity.forget().take()); } else { - NS_RELEASE(mIdentity); + mIdentity = nullptr; } } @@ -968,8 +966,8 @@ XPCWrappedNative::FlatJSObjectFinalized() MOZ_ASSERT(mIdentity, "bad pointer!"); #ifdef XP_WIN // Try to detect free'd pointer - MOZ_ASSERT(*(int*)mIdentity != 0xdddddddd, "bad pointer!"); - MOZ_ASSERT(*(int*)mIdentity != 0, "bad pointer!"); + MOZ_ASSERT(*(int*)mIdentity.get() != 0xdddddddd, "bad pointer!"); + MOZ_ASSERT(*(int*)mIdentity.get() != 0, "bad pointer!"); #endif if (IsWrapperExpired()) { @@ -2493,7 +2491,7 @@ NS_IMETHODIMP XPCWrappedNative::DebugDump(int16_t depth) XPC_LOG_ALWAYS(("mSet @ %x", mSet)); XPC_LOG_ALWAYS(("mFlatJSObject of %x", mFlatJSObject.getPtr())); - XPC_LOG_ALWAYS(("mIdentity of %x", mIdentity)); + XPC_LOG_ALWAYS(("mIdentity of %x", mIdentity.get())); XPC_LOG_ALWAYS(("mScriptableInfo @ %x", mScriptableInfo)); if (depth && mScriptableInfo) { @@ -2562,7 +2560,7 @@ XPCWrappedNative::ToString(XPCWrappedNativeTearOff* to /* = nullptr */ ) const if (si) { fmt = "[object %s" FMT_ADDR FMT_STR(" (native") FMT_ADDR FMT_STR(")") "]"; } - sz = JS_smprintf(fmt, name PARAM_ADDR(this) PARAM_ADDR(mIdentity)); + sz = JS_smprintf(fmt, name PARAM_ADDR(this) PARAM_ADDR(mIdentity.get())); JS_smprintf_free(name); diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index 1e529ed0744c..7a3b6f3e5ef1 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -129,7 +129,6 @@ #include "nsString.h" #include "nsReadableUtils.h" #include "nsXPIDLString.h" -#include "nsAutoJSValHolder.h" #include "MainThreadUtils.h" @@ -305,12 +304,12 @@ public: nsresult GetInfoForName(const char * name, nsIInterfaceInfo** info); virtual nsIPrincipal* GetPrincipal(JSObject* obj, - bool allowShortCircuit) const; + bool allowShortCircuit) const MOZ_OVERRIDE; void RecordTraversal(void *p, nsISupports *s); virtual char* DebugPrintJSStack(bool showArgs, bool showLocals, - bool showThisProps); + bool showThisProps) MOZ_OVERRIDE; static bool ReportAllJSExceptions() @@ -2324,7 +2323,7 @@ class nsXPCWrappedJSClass : public nsIXPCWrappedJSClass { // all the interface method declarations... NS_DECL_ISUPPORTS - NS_IMETHOD DebugDump(int16_t depth); + NS_IMETHOD DebugDump(int16_t depth) MOZ_OVERRIDE; public: static already_AddRefed @@ -2430,7 +2429,7 @@ public: NS_IMETHOD CallMethod(uint16_t methodIndex, const XPTMethodDescriptor *info, - nsXPTCMiniVariant* params); + nsXPTCMiniVariant* params) MOZ_OVERRIDE; /* * This is rarely called directly. Instead one usually calls diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 0688ce43be92..f2c0680931a1 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -2968,7 +2968,7 @@ ElementRestyler::RestyleSelf(nsIFrame* aSelf, RestyleResult result; - if (aRestyleHint) { + if (aRestyleHint || true /* XXX bug 1092363 */) { result = eRestyleResult_Continue; } else { result = ComputeRestyleResultFromFrame(aSelf); @@ -3266,7 +3266,9 @@ ElementRestyler::RestyleSelf(nsIFrame* aSelf, // previous continuation, so newContext == oldContext. if (result != eRestyleResult_Stop) { - if (copyFromContinuation) { + if (true) { + // XXX bug 1092363 + } else if (copyFromContinuation) { LOG_RESTYLE("not swapping style structs, since we copied from a " "continuation"); } else if (oldContext->IsShared() && newContext->IsShared()) { diff --git a/layout/base/tests/bug1109968-1-ref.html b/layout/base/tests/bug1109968-1-ref.html new file mode 100644 index 000000000000..28bcf608a736 --- /dev/null +++ b/layout/base/tests/bug1109968-1-ref.html @@ -0,0 +1,17 @@ + + +
foobaz
+ + + diff --git a/layout/base/tests/bug1109968-1.html b/layout/base/tests/bug1109968-1.html new file mode 100644 index 000000000000..a8d0d216fa89 --- /dev/null +++ b/layout/base/tests/bug1109968-1.html @@ -0,0 +1,23 @@ + + + + + +
foobaz
+ + + diff --git a/layout/base/tests/bug1109968-2-ref.html b/layout/base/tests/bug1109968-2-ref.html new file mode 100644 index 000000000000..9638c35b3313 --- /dev/null +++ b/layout/base/tests/bug1109968-2-ref.html @@ -0,0 +1,17 @@ + + +
foo
bar
+ + + diff --git a/layout/base/tests/bug1109968-2.html b/layout/base/tests/bug1109968-2.html new file mode 100644 index 000000000000..159311ad39ac --- /dev/null +++ b/layout/base/tests/bug1109968-2.html @@ -0,0 +1,23 @@ + + + + + +
foo
bar
+ + + diff --git a/layout/base/tests/mochitest.ini b/layout/base/tests/mochitest.ini index 62e6c04cfbb9..8538c1a8d131 100644 --- a/layout/base/tests/mochitest.ini +++ b/layout/base/tests/mochitest.ini @@ -55,6 +55,10 @@ support-files = bug644768.html bug1061468.html bug1061468-ref.html + bug1109968-1-ref.html + bug1109968-1.html + bug1109968-2-ref.html + bug1109968-2.html [test_preserve3d_sorting_hit_testing.html] [test_after_paint_pref.html] diff --git a/layout/base/tests/test_reftests_with_caret.html b/layout/base/tests/test_reftests_with_caret.html index d3680d1099f0..762db5e94c96 100644 --- a/layout/base/tests/test_reftests_with_caret.html +++ b/layout/base/tests/test_reftests_with_caret.html @@ -146,7 +146,9 @@ var tests = [ [ 'bug746993-1.html' , 'bug746993-1-ref.html' ] , [ 'bug1007065-1.html' , 'bug1007065-1-ref.html' ] , [ 'bug1007067-1.html' , 'bug1007067-1-ref.html' ] , - [ 'bug1061468.html' , 'bug1061468-ref.html' ] , + [ 'bug1061468.html' , 'bug1061468-ref.html' ] , + [ 'bug1109968-1.html', 'bug1109968-1-ref.html'] , + [ 'bug1109968-2.html', 'bug1109968-2-ref.html'] , function() {SpecialPowers.clearUserPref("touchcaret.enabled");} , ]; diff --git a/layout/generic/nsFlexContainerFrame.cpp b/layout/generic/nsFlexContainerFrame.cpp index cb5d3174903b..4648e9dc4f41 100644 --- a/layout/generic/nsFlexContainerFrame.cpp +++ b/layout/generic/nsFlexContainerFrame.cpp @@ -292,6 +292,24 @@ public: nscoord GetCrossSize() const { return mCrossSize; } nscoord GetCrossPosition() const { return mCrossPosn; } + nscoord ResolvedAscent() const { + if (mAscent == nsHTMLReflowMetrics::ASK_FOR_BASELINE) { + // XXXdholbert We should probably be using the *container's* writing-mode + // here, instead of the item's -- though it doesn't much matter right + // now, because all of the baseline-handling code here essentially + // assumes that the container & items have the same writing-mode. This + // will matter more (& can be expanded/tested) once we officially support + // logical directions & vertical writing-modes in flexbox, in bug 1079155 + // or a dependency. + WritingMode wm = mFrame->GetWritingMode(); + // Use GetFirstLineBaseline(), or just GetBaseline() if that fails. + if (!nsLayoutUtils::GetFirstLineBaseline(wm, mFrame, &mAscent)) { + mAscent = mFrame->GetLogicalBaseline(wm); + } + } + return mAscent; + } + // Convenience methods to compute the main & cross size of our *margin-box*. // The caller is responsible for telling us the right axis, so that we can // pull out the appropriate components of our margin/border/padding structs. @@ -531,8 +549,15 @@ public: mCrossPosn = aPosn; } - void SetAscent(nscoord aAscent) { - mAscent = aAscent; + // After a FlexItem has had a reflow, this method can be used to cache its + // (possibly-unresolved) ascent, in case it's needed later for + // baseline-alignment or to establish the container's baseline. + // (NOTE: This can be marked 'const' even though it's modifying mAscent, + // because mAscent is mutable. It's nice for this to be 'const', because it + // means our final reflow can iterate over const FlexItem pointers, and we + // can be sure it's not modifying those FlexItems, except via this method.) + void SetAscent(nscoord aAscent) const { + mAscent = aAscent; // NOTE: this may be ASK_FOR_BASELINE } void SetHadMeasuringReflow() { @@ -586,7 +611,8 @@ protected: nscoord mMainPosn; nscoord mCrossSize; nscoord mCrossPosn; - nscoord mAscent; + mutable nscoord mAscent; // Mutable b/c it's set & resolved lazily, sometimes + // via const pointer. See comment above SetAscent(). // Temporary state, while we're resolving flexible widths (for our main size) // XXXdholbert To save space, we could use a union to make these variables @@ -1423,6 +1449,14 @@ nsFlexContainerFrame:: aFlexItem.SetHadMeasuringReflow(); + // If this is the first child, save its ascent, since it may be what + // establishes the container's baseline. Also save the ascent if this child + // needs to be baseline-aligned. (Else, we don't care about ascent/baseline.) + if (aFlexItem.Frame() == mFrames.FirstChild() || + aFlexItem.GetAlignSelf() == NS_STYLE_ALIGN_ITEMS_BASELINE) { + aFlexItem.SetAscent(childDesiredSize.BlockStartAscent()); + } + // Subtract border/padding in vertical axis, to get _just_ // the effective computed value of the "height" property. nscoord childDesiredHeight = childDesiredSize.Height() - @@ -1584,7 +1618,7 @@ FlexItem::GetBaselineOffsetFromOuterCrossEdge(AxisOrientationType aCrossAxis, mozilla::Side sideToMeasureFrom = kAxisOrientationToSidesMap[aCrossAxis][aEdge]; - nscoord marginTopToBaseline = mAscent + mMargin.top; + nscoord marginTopToBaseline = ResolvedAscent() + mMargin.top; if (sideToMeasureFrom == eSideTop) { // Measuring from top (normal case): the distance from the margin-box top @@ -3217,25 +3251,6 @@ FlexLine::PositionItemsInMainAxis(uint8_t aJustifyContent, } } -// Helper method to take care of children who ASK_FOR_BASELINE, when -// we need their baseline. -static void -ResolveReflowedChildAscent(nsIFrame* aFrame, - nsHTMLReflowMetrics& aChildDesiredSize) -{ - WritingMode wm = aChildDesiredSize.GetWritingMode(); - if (aChildDesiredSize.BlockStartAscent() == - nsHTMLReflowMetrics::ASK_FOR_BASELINE) { - // Use GetFirstLineBaseline(), or just GetBaseline() if that fails. - nscoord ascent; - if (nsLayoutUtils::GetFirstLineBaseline(wm, aFrame, &ascent)) { - aChildDesiredSize.SetBlockStartAscent(ascent); - } else { - aChildDesiredSize.SetBlockStartAscent(aFrame->GetLogicalBaseline(wm)); - } - } -} - /** * Given the flex container's "logical ascent" (i.e. distance from the * flex container's content-box cross-start edge to its baseline), returns @@ -3331,9 +3346,11 @@ nsFlexContainerFrame::SizeItemInCrossAxis( aItem.SetCrossSize(childDesiredSize.Height() - crossAxisBorderPadding); } - // If we need to do baseline-alignment, store the child's ascent. - if (aItem.GetAlignSelf() == NS_STYLE_ALIGN_ITEMS_BASELINE) { - ResolveReflowedChildAscent(aItem.Frame(), childDesiredSize); + // If this is the first child, save its ascent, since it may be what + // establishes the container's baseline. Also save the ascent if this child + // needs to be baseline-aligned. (Else, we don't care about baseline/ascent.) + if (aItem.Frame() == mFrames.FirstChild() || + aItem.GetAlignSelf() == NS_STYLE_ALIGN_ITEMS_BASELINE) { aItem.SetAscent(childDesiredSize.BlockStartAscent()); } } @@ -3662,6 +3679,10 @@ nsFlexContainerFrame::DoFlexLayout(nsPresContext* aPresContext, LogicalPoint framePos(outerWM, physicalPosn, containerWidth - item->Frame()->GetRect().width); + // (Intentionally snapshotting this before ApplyRelativePositioning, to + // maybe use for setting the flex container's baseline.) + const nscoord itemNormalBPos = framePos.B(outerWM); + WritingMode wm = item->Frame()->GetWritingMode(); LogicalSize availSize = aReflowState.ComputedSize(wm); availSize.BSize(wm) = NS_UNCONSTRAINEDSIZE; @@ -3741,20 +3762,25 @@ nsFlexContainerFrame::DoFlexLayout(nsPresContext* aPresContext, childDesiredSize, &childReflowState, outerWM, framePos, containerWidth, 0); + // Save the first child's ascent; it may establish container's baseline. + if (item->Frame() == mFrames.FirstChild()) { + // XXXdholbert (This clause may look a bit odd right now, split as it + // is from the code immediately after it, which *uses* |item|'s saved + // ascent. It may superficially look like these clauses should just be + // merged. The separation will make more sense once we change this flex + // item's final reflow to be *optional*, in bug 1054010. That bug will + // shift *this* clause to a different logic level -- conditional on + // whether |item| needs a final reflow -- whereas the subsequent clause + // will not be shifted.) + item->SetAscent(childDesiredSize.BlockStartAscent()); + } + // If this is our first child and we haven't established a baseline for // the container yet (i.e. if we don't have 'align-self: baseline' on any // children), then use this child's baseline as the container's baseline. if (item->Frame() == mFrames.FirstChild() && flexContainerAscent == nscoord_MIN) { - ResolveReflowedChildAscent(item->Frame(), childDesiredSize); - - // (We use GetNormalPosition() instead of physicalPosn because we don't - // want relative positioning on the child to affect the baseline that we - // read from it). - flexContainerAscent = item->Frame()->GetLogicalNormalPosition( - outerWM, - childDesiredSize.Width()).B(outerWM) + - childDesiredSize.BlockStartAscent(); + flexContainerAscent = itemNormalBPos + item->ResolvedAscent(); } } } diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index f6953c6d32d9..cec162551c5c 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -4908,17 +4908,16 @@ nsTextFrame::GetTextDecorations( break; } - if (compatMode == eCompatibility_NavQuirks) { - // In quirks mode, if we're on an HTML table element, we're done. - if (f->GetContent()->IsHTML(nsGkAtoms::table)) { - break; - } - } else { - // In standards/almost-standards mode, if we're on an - // absolutely-positioned element or a floating element, we're done. - if (f->IsFloating() || f->IsAbsolutelyPositioned()) { - break; - } + // In quirks mode, if we're on an HTML table element, we're done. + if (compatMode == eCompatibility_NavQuirks && + f->GetContent()->IsHTML(nsGkAtoms::table)) { + break; + } + + // If we're on an absolutely-positioned element or a floating + // element, we're done. + if (f->IsFloating() || f->IsAbsolutelyPositioned()) { + break; } } } diff --git a/layout/reftests/svg/as-image/reftest.list b/layout/reftests/svg/as-image/reftest.list index c2534abb6687..504298d9bc52 100644 --- a/layout/reftests/svg/as-image/reftest.list +++ b/layout/reftests/svg/as-image/reftest.list @@ -127,7 +127,7 @@ skip-if(B2G) == img-fragment-2a.html img-fragment-2-ref.html # bug 773482 skip-if(B2G) == img-fragment-2b.html img-fragment-2-ref.html # bug 773482 skip-if(B2G) == img-fragment-2c.html img-fragment-2-ref.html # bug 773482 -fuzzy-if(B2G,68,4) random-if(winWidget||cocoaWidget) == list-simple-1.html list-simple-1-ref.html +fuzzy-if(B2G,68,4) random == list-simple-1.html list-simple-1-ref.html == svg-image-simple-1.svg lime100x100.svg == svg-image-simple-2.svg lime100x100.svg diff --git a/layout/reftests/text-decoration/reftest.list b/layout/reftests/text-decoration/reftest.list index a737269a2d70..60227c8c48b0 100644 --- a/layout/reftests/text-decoration/reftest.list +++ b/layout/reftests/text-decoration/reftest.list @@ -76,8 +76,8 @@ fuzzy-if(B2G,255,1) == dynamic-underline-vertical-align-standards-2.html dynamic != underline-table-caption-quirks.html underline-table-caption-quirks-notref.html == underline-table-cell-quirks.html underline-table-cell-quirks-ref.html != underline-table-cell-quirks.html underline-table-cell-quirks-notref.html -fails == underline-block-propagation-quirks.html underline-block-propagation-quirks-ref.html # currently too quirky (bug 403524) -fails == underline-block-propagation-2-quirks.html underline-block-propagation-2-quirks-ref.html # same problem as previous line (bug 403524) +== underline-block-propagation-quirks.html underline-block-propagation-quirks-ref.html +== underline-block-propagation-2-quirks.html underline-block-propagation-2-quirks-ref.html == underline-block-standards.html underline-block-standards-ref.html != underline-block-standards.html underline-block-standards-notref.html == underline-inline-block-standards.html underline-inline-block-standards-ref.html diff --git a/layout/reftests/text-decoration/text-decoration-propagation-1-quirks-ref.html b/layout/reftests/text-decoration/text-decoration-propagation-1-quirks-ref.html index c1ccd27b636e..fae4ce658a0d 100644 --- a/layout/reftests/text-decoration/text-decoration-propagation-1-quirks-ref.html +++ b/layout/reftests/text-decoration/text-decoration-propagation-1-quirks-ref.html @@ -6,14 +6,14 @@
text in block
-
text in float
+
text in float
text in
inline-block
text in
inline-table
-
text in abs-pos
+
text in abs-pos

text-decoration on an inline

@@ -22,13 +22,13 @@
text in block
-
text in float
+
text in float
text in
inline-block
text in
inline-table
-
text in abs-pos
+
text in abs-pos
diff --git a/layout/reftests/text-decoration/underline-block-propagation-2-quirks-ref.html b/layout/reftests/text-decoration/underline-block-propagation-2-quirks-ref.html index 786239ed9ac4..6f4bc8ecd2a2 100644 --- a/layout/reftests/text-decoration/underline-block-propagation-2-quirks-ref.html +++ b/layout/reftests/text-decoration/underline-block-propagation-2-quirks-ref.html @@ -1,5 +1,9 @@ More tests of propagation of text-decoration + @@ -10,16 +14,18 @@ >This text should be struck out.

This text should also be underlined.

- +
- - underlined, overlined, and struck out - + overlined, and struck out +
diff --git a/layout/reftests/text-decoration/underline-block-propagation-2-quirks.html b/layout/reftests/text-decoration/underline-block-propagation-2-quirks.html index 7d1bf7e1c671..7e32b7581f53 100644 --- a/layout/reftests/text-decoration/underline-block-propagation-2-quirks.html +++ b/layout/reftests/text-decoration/underline-block-propagation-2-quirks.html @@ -1,5 +1,9 @@ More tests of propagation of text-decoration + @@ -10,11 +14,14 @@ This text should be underlined.
>This text should be struck out.

This text should also be underlined.

- +
- +
underlined, overlined, and struck outoverlined, and struck out
diff --git a/layout/style/Declaration.cpp b/layout/style/Declaration.cpp index 16fc8794ae63..c004e29539ab 100644 --- a/layout/style/Declaration.cpp +++ b/layout/style/Declaration.cpp @@ -423,6 +423,13 @@ Declaration::GetValue(nsCSSProperty aProperty, nsAString& aValue, data->ValueFor(eCSSProperty_background_size)-> GetPairListValue(); for (;;) { + // Serialize background-color at the beginning of the last item. + if (!image->mNext) { + AppendValueToString(eCSSProperty_background_color, aValue, + aSerialization); + aValue.Append(char16_t(' ')); + } + image->mValue.AppendToString(eCSSProperty_background_image, aValue, aSerialization); aValue.Append(char16_t(' ')); @@ -505,10 +512,6 @@ Declaration::GetValue(nsCSSProperty aProperty, nsAString& aValue, aValue.Append(char16_t(',')); aValue.Append(char16_t(' ')); } - - aValue.Append(char16_t(' ')); - AppendValueToString(eCSSProperty_background_color, aValue, - aSerialization); break; } case eCSSProperty_font: { diff --git a/layout/style/test/chrome/test_author_specified_style.html b/layout/style/test/chrome/test_author_specified_style.html index 06005df27451..034e2f5e405e 100644 --- a/layout/style/test/chrome/test_author_specified_style.html +++ b/layout/style/test/chrome/test_author_specified_style.html @@ -20,22 +20,22 @@ var values = [ ]; var properties = [ - // property to test with // fixed prefix to ignore from getAuthoredPropertyValue() + // property to test with // fixed suffix to ignore from getAuthoredPropertyValue() "color", "", "background-color", "", - "background", "none repeat scroll 0% 0% " + "background", " none repeat scroll 0% 0%" ]; function runTest() { var span = document.createElement("span"); for (var j = 0; j < properties.length; j += 2) { var propertyName = properties[j]; - var expectedPrefix = properties[j + 1]; + var expectedSuffix = properties[j + 1]; for (var i = 0; i < values.length; i += 2) { var value = values[i]; var expected = values[i + 1]; span.setAttribute("style", propertyName + ": " + value); - is(span.style.getAuthoredPropertyValue(propertyName), expectedPrefix + expected, "specified " + value); + is(span.style.getAuthoredPropertyValue(propertyName), expected + expectedSuffix, "specified " + value); } } diff --git a/layout/style/test/test_shorthand_property_getters.html b/layout/style/test/test_shorthand_property_getters.html index 19e6965a3de1..31c8e33de2d7 100644 --- a/layout/style/test/test_shorthand_property_getters.html +++ b/layout/style/test/test_shorthand_property_getters.html @@ -213,6 +213,18 @@ is(e.style.cssText, 'border: medium solid green;', "border DOES reset -moz-border-left-colors"); +// Test that the color goes at the beginning of the last item of the +// background shorthand. +// FIXME: Really the "repeat scroll 0% 0%" shouldn't be there. +e.setAttribute("style", "background: url(foo.png) blue"); +is(e.style.cssText, + "background: blue url(\"foo.png\") repeat scroll 0% 0%;", + "color should be at start of single-item background"); +e.setAttribute("style", "background: url(bar.png), url(foo.png) blue"); +is(e.style.cssText, + "background: url(\"bar.png\") repeat scroll 0% 0%, blue url(\"foo.png\") repeat scroll 0% 0%;", + "color should be at start of single-item background"); + diff --git a/layout/xul/nsBoxFrame.cpp b/layout/xul/nsBoxFrame.cpp index 0e5070f01be8..d489026ae3b3 100644 --- a/layout/xul/nsBoxFrame.cpp +++ b/layout/xul/nsBoxFrame.cpp @@ -1436,7 +1436,7 @@ nsBoxFrame::PaintXULDebugBackground(nsRenderingContext& aRenderingContext, int32_t appUnitsPerDevPixel = PresContext()->AppUnitsPerDevPixel(); ColorPattern color(ToDeviceColor(isHorizontal ? Color(0.f, 0.f, 1.f, 1.f) : - Color(1.f, 0.f, 0.f, 1.f)); + Color(1.f, 0.f, 0.f, 1.f))); DrawTarget* drawTarget = aRenderingContext.GetDrawTarget(); @@ -1466,13 +1466,14 @@ nsBoxFrame::PaintXULDebugBackground(nsRenderingContext& aRenderingContext, // place a green border around us. if (NS_SUBTREE_DIRTY(this)) { nsRect dirty(inner); - ColorPattern green(ToDeviceColor(Color0.f, 1.f, 0.f, 1.f))); + ColorPattern green(ToDeviceColor(Color(0.f, 1.f, 0.f, 1.f))); drawTarget->StrokeRect(NSRectToRect(dirty, appUnitsPerDevPixel), green); } } void nsBoxFrame::PaintXULDebugOverlay(DrawTarget& aDrawTarget, nsPoint aPt) +{ nsMargin border; GetBorder(border); diff --git a/media/webrtc/signaling/src/media-conduit/WebrtcGmpVideoCodec.h b/media/webrtc/signaling/src/media-conduit/WebrtcGmpVideoCodec.h index d219a276f9f5..494a8bcfbd01 100644 --- a/media/webrtc/signaling/src/media-conduit/WebrtcGmpVideoCodec.h +++ b/media/webrtc/signaling/src/media-conduit/WebrtcGmpVideoCodec.h @@ -138,15 +138,12 @@ public: } virtual void InputDataExhausted() MOZ_OVERRIDE { - MOZ_CRASH(); } virtual void DrainComplete() MOZ_OVERRIDE { - MOZ_CRASH(); } virtual void ResetComplete() MOZ_OVERRIDE { - MOZ_CRASH(); } virtual void Error(GMPErr aError) MOZ_OVERRIDE { diff --git a/mfbt/MathAlgorithms.h b/mfbt/MathAlgorithms.h index 99185ed59b63..a1a74408052d 100644 --- a/mfbt/MathAlgorithms.h +++ b/mfbt/MathAlgorithms.h @@ -382,7 +382,7 @@ public: static uint_fast8_t compute(const T aValue) { // Check for <= 1 to avoid the == 0 undefined case. - return aValue <= 1 ? 0 : 64 - CountLeadingZeroes64(aValue - 1); + return aValue <= 1 ? 0u : 64u - CountLeadingZeroes64(aValue - 1); } }; diff --git a/netwerk/cache2/CacheEntry.cpp b/netwerk/cache2/CacheEntry.cpp index a8aec185c035..93207ca3b94e 100644 --- a/netwerk/cache2/CacheEntry.cpp +++ b/netwerk/cache2/CacheEntry.cpp @@ -610,7 +610,8 @@ bool CacheEntry::InvokeCallbacks(bool aReadOnly) // returns RECHECK_AFTER_WRITE_FINISHED. If we would stop the loop, other // readers or potential writers would be unnecessarily kept from being // invoked. - mCallbacks.InsertElementAt(i, callback); + size_t pos = std::min(mCallbacks.Length(), static_cast(i)); + mCallbacks.InsertElementAt(pos, callback); ++i; } } diff --git a/netwerk/protocol/http/HttpBaseChannel.h b/netwerk/protocol/http/HttpBaseChannel.h index 2ad71807cef4..4c05db762f38 100644 --- a/netwerk/protocol/http/HttpBaseChannel.h +++ b/netwerk/protocol/http/HttpBaseChannel.h @@ -190,7 +190,7 @@ public: NS_IMETHOD ForceNoIntercept() MOZ_OVERRIDE; NS_IMETHOD GetTopWindowURI(nsIURI **aTopWindowURI) MOZ_OVERRIDE; NS_IMETHOD ContinueBeginConnect() MOZ_OVERRIDE; - NS_IMETHOD GetProxyURI(nsIURI **proxyURI); + NS_IMETHOD GetProxyURI(nsIURI **proxyURI) MOZ_OVERRIDE; inline void CleanRedirectCacheChainIfNecessary() { diff --git a/netwerk/srtp/src/crypto/kernel/err.c b/netwerk/srtp/src/crypto/kernel/err.c index dac10fad7c24..3237965abd4a 100644 --- a/netwerk/srtp/src/crypto/kernel/err.c +++ b/netwerk/srtp/src/crypto/kernel/err.c @@ -136,6 +136,7 @@ err_report(int priority, char *format, ...) { } vsyslog(syslogpri, format, args); + } #endif va_end(args); } diff --git a/nsprpub/TAG-INFO b/nsprpub/TAG-INFO index a5b9555a9bf9..68dc8df3471c 100644 --- a/nsprpub/TAG-INFO +++ b/nsprpub/TAG-INFO @@ -1 +1 @@ -NSPR_4_10_8_BETA3 +NSPR_4_10_8_RTM diff --git a/nsprpub/config/prdepend.h b/nsprpub/config/prdepend.h index 6c66b37ca0fc..e49e92677e3e 100644 --- a/nsprpub/config/prdepend.h +++ b/nsprpub/config/prdepend.h @@ -10,4 +10,3 @@ */ #error "Do not include this header file." - diff --git a/nsprpub/pr/include/prinit.h b/nsprpub/pr/include/prinit.h index 032398c79c69..5cdf6d24c91f 100644 --- a/nsprpub/pr/include/prinit.h +++ b/nsprpub/pr/include/prinit.h @@ -31,11 +31,11 @@ PR_BEGIN_EXTERN_C ** The format of the version string is ** ".[.] []" */ -#define PR_VERSION "4.10.8 Beta" +#define PR_VERSION "4.10.8" #define PR_VMAJOR 4 #define PR_VMINOR 10 #define PR_VPATCH 8 -#define PR_BETA PR_TRUE +#define PR_BETA PR_FALSE /* ** PRVersionCheck diff --git a/parser/htmlparser/nsHTMLTagList.h b/parser/htmlparser/nsHTMLTagList.h index 88be04531268..26110979d319 100644 --- a/parser/htmlparser/nsHTMLTagList.h +++ b/parser/htmlparser/nsHTMLTagList.h @@ -46,7 +46,7 @@ HTML_HTMLELEMENT_TAG(aside) HTML_TAG(audio, Audio) HTML_HTMLELEMENT_TAG(b) HTML_TAG(base, Shared) -HTML_TAG(basefont, Span) +HTML_HTMLELEMENT_TAG(basefont) HTML_HTMLELEMENT_TAG(bdo) HTML_TAG(bgsound, Unknown) HTML_HTMLELEMENT_TAG(big) diff --git a/security/manager/ssl/tests/unit/head_psm.js b/security/manager/ssl/tests/unit/head_psm.js index 64a32ee4081e..f57d9866f43b 100644 --- a/security/manager/ssl/tests/unit/head_psm.js +++ b/security/manager/ssl/tests/unit/head_psm.js @@ -58,6 +58,7 @@ const SEC_ERROR_OCSP_UNKNOWN_CERT = SEC_ERROR_BASE + 126; const SEC_ERROR_OCSP_MALFORMED_RESPONSE = SEC_ERROR_BASE + 129; const SEC_ERROR_OCSP_UNAUTHORIZED_RESPONSE = SEC_ERROR_BASE + 130; const SEC_ERROR_OCSP_OLD_RESPONSE = SEC_ERROR_BASE + 132; +const SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE = SEC_ERROR_BASE + 141; // -8051 const SEC_ERROR_OCSP_INVALID_SIGNING_CERT = SEC_ERROR_BASE + 144; const SEC_ERROR_POLICY_VALIDATION_FAILED = SEC_ERROR_BASE + 160; // -8032 const SEC_ERROR_OCSP_BAD_SIGNATURE = SEC_ERROR_BASE + 157; diff --git a/security/manager/ssl/tests/unit/test_keysize.js b/security/manager/ssl/tests/unit/test_keysize.js index bc1fcc8d456d..48aadd11a97f 100644 --- a/security/manager/ssl/tests/unit/test_keysize.js +++ b/security/manager/ssl/tests/unit/test_keysize.js @@ -5,6 +5,8 @@ "use strict"; // Checks that RSA certs with key sizes below 1024 bits are rejected. +// Checks that ECC certs using curves other than the NIST P-256, P-384 or P-521 +// curves are rejected. do_get_profile(); // must be called before getting nsIX509CertDB const certdb = Cc["@mozilla.org/security/x509certdb;1"] @@ -53,6 +55,40 @@ function check_fail_ca(cert) { certificateUsageSSLCA); } +/** + * Tests a cert chain. + * + * @param {String} rootKeyType + * The key type of the root certificate, or the name of an elliptic + * curve, as output by the 'openssl ecparam -list_curves' command. + * @param {Number} rootKeySize + * @param {String} intKeyType + * @param {Number} intKeySize + * @param {String} eeKeyType + * @param {Number} eeKeySize + * @param {Number} eeExpectedError + */ +function checkChain(rootKeyType, rootKeySize, intKeyType, intKeySize, + eeKeyType, eeKeySize, eeExpectedError) { + let rootName = "root_" + rootKeyType + "_" + rootKeySize; + let intName = "int_" + intKeyType + "_" + intKeySize; + let eeName = "ee_" + eeKeyType + "_" + eeKeySize; + + let intFullName = intName + "-" + rootName; + let eeFullName = eeName + "-" + intName + "-" + rootName; + + load_cert(rootName, "CTu,CTu,CTu"); + load_cert(intFullName, ",,"); + let eeCert = certFromFile(eeFullName + ".der") + + do_print("cert cn=" + eeCert.commonName); + do_print("cert o=" + eeCert.organization); + do_print("cert issuer cn=" + eeCert.issuerCommonName); + do_print("cert issuer o=" + eeCert.issuerOrganization); + checkCertErrorGeneric(certdb, eeCert, eeExpectedError, + certificateUsageSSLServer); +} + function checkForKeyType(keyType, inadequateKeySize, adequateKeySize) { let rootOKName = "root_" + keyType + "_" + adequateKeySize; let rootNotOKName = "root_" + keyType + "_" + inadequateKeySize; @@ -86,8 +122,52 @@ function checkForKeyType(keyType, inadequateKeySize, adequateKeySize) { check_fail(certFromFile(eeFullName + ".der")); } +function checkECCChains() { + checkChain("prime256v1", 256, + "secp384r1", 384, + "secp521r1", 521, + 0); + checkChain("prime256v1", 256, + "secp224r1", 224, + "prime256v1", 256, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); + checkChain("prime256v1", 256, + "prime256v1", 256, + "secp224r1", 224, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); + checkChain("secp224r1", 224, + "prime256v1", 256, + "prime256v1", 256, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); + checkChain("prime256v1", 256, + "prime256v1", 256, + "secp256k1", 256, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); + checkChain("secp256k1", 256, + "prime256v1", 256, + "prime256v1", 256, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); +} + +function checkCombinationChains() { + checkChain("rsa", 2048, + "prime256v1", 256, + "secp384r1", 384, + 0); + checkChain("rsa", 2048, + "prime256v1", 256, + "secp224r1", 224, + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); + checkChain("prime256v1", 256, + "rsa", 1016, + "prime256v1", 256, + MOZILLA_PKIX_ERROR_INADEQUATE_KEY_SIZE); +} + function run_test() { checkForKeyType("rsa", 1016, 1024); + checkECCChains(); + checkCombinationChains(); run_next_test(); } diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp224r1_224.der b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp224r1_224.der new file mode 100644 index 000000000000..03679bac975c Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp224r1_224.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp256k1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp256k1_256.der new file mode 100644 index 000000000000..8942a06abe93 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_prime256v1_256-root_secp256k1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_rsa_1016-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_rsa_1016-root_prime256v1_256.der new file mode 100644 index 000000000000..78abf110f2ef Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_rsa_1016-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_secp224r1_224-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_secp224r1_224-root_prime256v1_256.der new file mode 100644 index 000000000000..f516851210dc Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_prime256v1_256-int_secp224r1_224-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_prime256v1_256.der new file mode 100644 index 000000000000..6a26ba4cba10 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_rsa_2048.der b/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_rsa_2048.der new file mode 100644 index 000000000000..77191698e7a2 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_secp224r1_224-int_prime256v1_256-root_rsa_2048.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_secp256k1_256-int_prime256v1_256-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_secp256k1_256-int_prime256v1_256-root_prime256v1_256.der new file mode 100644 index 000000000000..eb530b5a3665 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_secp256k1_256-int_prime256v1_256-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_secp384r1_384-int_prime256v1_256-root_rsa_2048.der b/security/manager/ssl/tests/unit/test_keysize/ee_secp384r1_384-int_prime256v1_256-root_rsa_2048.der new file mode 100644 index 000000000000..2187fd1c14b3 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_secp384r1_384-int_prime256v1_256-root_rsa_2048.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/ee_secp521r1_521-int_secp384r1_384-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/ee_secp521r1_521-int_secp384r1_384-root_prime256v1_256.der new file mode 100644 index 000000000000..ba8bd47c6259 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/ee_secp521r1_521-int_secp384r1_384-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/generate.py b/security/manager/ssl/tests/unit/test_keysize/generate.py index 01428c80798b..b3424e4c0c4d 100644 --- a/security/manager/ssl/tests/unit/test_keysize/generate.py +++ b/security/manager/ssl/tests/unit/test_keysize/generate.py @@ -30,12 +30,14 @@ mozilla_testing_ev_policy = ('certificatePolicies = @v3_ca_ev_cp\n\n' + 'CPS.1 = "http://mytestdomain.local/cps"') generated_ev_root_filenames = [] +generated_certs = [] def generate_and_maybe_import_cert(key_type, cert_name_prefix, cert_name_suffix, base_ext_text, signer_key_filename, signer_cert_filename, key_size, generate_ev): """ Generates a certificate and imports it into the NSS DB if appropriate. + If an equivalent certificate has already been generated, it is reused. Arguments: key_type -- the type of key generated: potential values: 'rsa', or any of @@ -78,6 +80,22 @@ def generate_and_maybe_import_cert(key_type, cert_name_prefix, cert_name_suffix, # Use the organization field to store the cert nickname for easier debugging subject_string += '/O=' + cert_name + # Reuse the existing RSA EV root + if (generate_ev and key_type == 'rsa' and signer_key_filename == '' + and signer_cert_filename == '' and key_size == '2048'): + cert_name = 'evroot' + key_filename = '../test_ev_certs/evroot.key' + cert_filename = '../test_ev_certs/evroot.der' + CertUtils.import_cert_and_pkcs12(srcdir, key_filename, + '../test_ev_certs/evroot.p12', + cert_name, ',,') + return [cert_name, key_filename, cert_filename] + + # Don't regenerate a previously generated cert + for cert in generated_certs: + if cert_name == cert[0]: + return cert + [key_filename, cert_filename] = CertUtils.generate_cert_generic( db_dir, srcdir, @@ -89,6 +107,7 @@ def generate_and_maybe_import_cert(key_type, cert_name_prefix, cert_name_suffix, signer_cert_filename, subject_string, key_size) + generated_certs.append([cert_name, key_filename, cert_filename]) if generate_ev: # The dest_dir argument of generate_pkcs12() is also set to db_dir as @@ -104,6 +123,49 @@ def generate_and_maybe_import_cert(key_type, cert_name_prefix, cert_name_suffix, return [cert_name, key_filename, cert_filename] +def generate_cert_chain(root_key_type, root_key_size, int_key_type, int_key_size, + ee_key_type, ee_key_size, generate_ev): + """ + Generates a certificate chain and imports the individual certificates into + the NSS DB if appropriate. + + Arguments: + (root|int|ee)_key_type -- the type of key generated: potential values: 'rsa', + or any of the curves found by + 'openssl ecparam -list_curves' + (root|int|ee)_key_size -- public key size for the relevant cert + generate_ev -- whether EV certs should be generated + """ + [root_nick, root_key_file, root_cert_file] = generate_and_maybe_import_cert( + root_key_type, + 'root', + '', + ca_ext_text, + '', + '', + root_key_size, + generate_ev) + + [int_nick, int_key_file, int_cert_file] = generate_and_maybe_import_cert( + int_key_type, + 'int', + root_nick, + ca_ext_text, + root_key_file, + root_cert_file, + int_key_size, + generate_ev) + + generate_and_maybe_import_cert( + ee_key_type, + 'ee', + int_nick, + ee_ext_text, + int_key_file, + int_cert_file, + ee_key_size, + generate_ev) + def generate_certs(key_type, inadequate_key_size, adequate_key_size, generate_ev): """ Generates the various certificates used by the key size tests. @@ -220,6 +282,46 @@ def generate_certs(key_type, inadequate_key_size, adequate_key_size, generate_ev inadequate_key_size, generate_ev) +def generate_ecc_chains(): + generate_cert_chain('prime256v1', '256', + 'secp384r1', '384', + 'secp521r1', '521', + False) + generate_cert_chain('prime256v1', '256', + 'secp224r1', '224', + 'prime256v1', '256', + False) + generate_cert_chain('prime256v1', '256', + 'prime256v1', '256', + 'secp224r1', '224', + False) + generate_cert_chain('secp224r1', '224', + 'prime256v1', '256', + 'prime256v1', '256', + False) + generate_cert_chain('prime256v1', '256', + 'prime256v1', '256', + 'secp256k1', '256', + False) + generate_cert_chain('secp256k1', '256', + 'prime256v1', '256', + 'prime256v1', '256', + False) + +def generate_combination_chains(): + generate_cert_chain('rsa', '2048', + 'prime256v1', '256', + 'secp384r1', '384', + False) + generate_cert_chain('rsa', '2048', + 'prime256v1', '256', + 'secp224r1', '224', + False) + generate_cert_chain('prime256v1', '256', + 'rsa', '1016', + 'prime256v1', '256', + False) + # Create a NSS DB for use by the OCSP responder. CertUtils.init_nss_db(srcdir) @@ -228,6 +330,8 @@ CertUtils.init_nss_db(srcdir) # that can be tested is 1016, less than 2048 is 2040 and so on. generate_certs('rsa', '1016', '1024', False) generate_certs('rsa', '2040', '2048', True) +generate_ecc_chains() +generate_combination_chains() # Print a blank line and the information needed to enable EV for any roots # generated by this script. diff --git a/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_prime256v1_256.der new file mode 100644 index 000000000000..70bfcec594ec Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_rsa_2048.der b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_rsa_2048.der new file mode 100644 index 000000000000..45c9434e86e8 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_rsa_2048.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp224r1_224.der b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp224r1_224.der new file mode 100644 index 000000000000..dd2ccdd99010 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp224r1_224.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp256k1_256.der b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp256k1_256.der new file mode 100644 index 000000000000..b17a3e6fb211 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_prime256v1_256-root_secp256k1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_rsa_1016-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/int_rsa_1016-root_prime256v1_256.der new file mode 100644 index 000000000000..2a0c0d250629 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_rsa_1016-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_secp224r1_224-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/int_secp224r1_224-root_prime256v1_256.der new file mode 100644 index 000000000000..49a70c40e5b5 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_secp224r1_224-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/int_secp384r1_384-root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/int_secp384r1_384-root_prime256v1_256.der new file mode 100644 index 000000000000..0864d5e59910 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/int_secp384r1_384-root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/root_prime256v1_256.der b/security/manager/ssl/tests/unit/test_keysize/root_prime256v1_256.der new file mode 100644 index 000000000000..f6a7548e72c1 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/root_prime256v1_256.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/root_rsa_2048.der b/security/manager/ssl/tests/unit/test_keysize/root_rsa_2048.der new file mode 100644 index 000000000000..c7bec96eb907 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/root_rsa_2048.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/root_secp224r1_224.der b/security/manager/ssl/tests/unit/test_keysize/root_secp224r1_224.der new file mode 100644 index 000000000000..36ac715740a7 Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/root_secp224r1_224.der differ diff --git a/security/manager/ssl/tests/unit/test_keysize/root_secp256k1_256.der b/security/manager/ssl/tests/unit/test_keysize/root_secp256k1_256.der new file mode 100644 index 000000000000..8581249a4b3e Binary files /dev/null and b/security/manager/ssl/tests/unit/test_keysize/root_secp256k1_256.der differ diff --git a/security/nss/TAG-INFO b/security/nss/TAG-INFO index dde7cbc3cb13..70b0cd0c21e2 100644 --- a/security/nss/TAG-INFO +++ b/security/nss/TAG-INFO @@ -1 +1 @@ -NSS_3_18_BETA6 +NSS_3_17_4_RC0 diff --git a/security/nss/coreconf/command.mk b/security/nss/coreconf/command.mk index 35ebe868945c..ec1fd4d36839 100644 --- a/security/nss/coreconf/command.mk +++ b/security/nss/coreconf/command.mk @@ -11,8 +11,7 @@ AS = $(CC) ASFLAGS += $(CFLAGS) CCF = $(CC) $(CFLAGS) -LINK_DLL = $(LINK) $(OS_DLLFLAGS) $(DLLFLAGS) -LINK_EXE = $(LINK) $(OS_LFLAGS) $(LFLAGS) +LINK_DLL = $(LINK) $(OS_DLLFLAGS) $(DLLFLAGS) $(XLDFLAGS) CFLAGS = $(OPTIMIZER) $(OS_CFLAGS) $(XP_DEFINE) $(DEFINES) $(INCLUDES) \ $(XCFLAGS) PERL = perl diff --git a/security/nss/coreconf/coreconf.dep b/security/nss/coreconf/coreconf.dep index 5182f75552c8..590d1bfaeee3 100644 --- a/security/nss/coreconf/coreconf.dep +++ b/security/nss/coreconf/coreconf.dep @@ -10,3 +10,4 @@ */ #error "Do not include this header file." + diff --git a/security/nss/coreconf/rules.mk b/security/nss/coreconf/rules.mk index 937eed4edec8..5495b0c329f6 100644 --- a/security/nss/coreconf/rules.mk +++ b/security/nss/coreconf/rules.mk @@ -241,7 +241,7 @@ alltags: $(PROGRAM): $(OBJS) $(EXTRA_LIBS) @$(MAKE_OBJDIR) ifeq (,$(filter-out _WIN%,$(NS_USE_GCC)_$(OS_TARGET))) - $(MKPROG) $(subst /,\\,$(OBJS)) -Fe$@ -link $(LDFLAGS) $(subst /,\\,$(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS)) + $(MKPROG) $(subst /,\\,$(OBJS)) -Fe$@ -link $(LDFLAGS) $(XLDFLAGS) $(subst /,\\,$(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS)) ifdef MT if test -f $@.manifest; then \ $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \ @@ -332,7 +332,7 @@ $(OBJDIR)/$(PROG_PREFIX)%$(PROG_SUFFIX): $(OBJDIR)/$(PROG_PREFIX)%$(OBJ_SUFFIX) @$(MAKE_OBJDIR) ifeq (,$(filter-out _WIN%,$(NS_USE_GCC)_$(OS_TARGET))) $(MKPROG) $< -Fe$@ -link \ - $(LDFLAGS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS) + $(LDFLAGS) $(XLDFLAGS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS) ifdef MT if test -f $@.manifest; then \ $(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \ diff --git a/security/nss/lib/ckfw/dbm/db.c b/security/nss/lib/ckfw/dbm/db.c index 7880afbebf6f..8d0a6cba8d8c 100644 --- a/security/nss/lib/ckfw/dbm/db.c +++ b/security/nss/lib/ckfw/dbm/db.c @@ -137,7 +137,8 @@ nss_dbm_db_set_label /* Locked region */ { - if( CKR_OK != NSSCKFWMutex_Lock(db->crustylock) ) { + rv = NSSCKFWMutex_Lock(db->crustylock); + if( CKR_OK != rv ) { return rv; } diff --git a/security/nss/lib/ckfw/nssmkey/mobject.c b/security/nss/lib/ckfw/nssmkey/mobject.c index 36867db340b5..2013e7e99149 100644 --- a/security/nss/lib/ckfw/nssmkey/mobject.c +++ b/security/nss/lib/ckfw/nssmkey/mobject.c @@ -1880,7 +1880,7 @@ nss_ckmk_CreateObject ) { CK_OBJECT_CLASS objClass; - ckmkInternalObject *io; + ckmkInternalObject *io = NULL; CK_BBOOL isToken; /* diff --git a/security/nss/lib/freebl/mpi/doc/LICENSE-MPL b/security/nss/lib/freebl/mpi/doc/LICENSE-MPL index d1f78f522fb9..41dc2327f169 100644 --- a/security/nss/lib/freebl/mpi/doc/LICENSE-MPL +++ b/security/nss/lib/freebl/mpi/doc/LICENSE-MPL @@ -1,35 +1,3 @@ -***** BEGIN LICENSE BLOCK ***** -Version: MPL 1.1/GPL 2.0/LGPL 2.1 - -The contents of this file are subject to the Mozilla Public License Version -1.1 (the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at -http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the -License. - -The Original Code is the Netscape security libraries. - -The Initial Developer of the Original Code is Netscape -Communications Corporation. Portions created by Netscape are -Copyright (C) 1994-2000 Netscape Communications Corporation. All -Rights Reserved. - -Contributor(s): - -Alternatively, the contents of this file may be used under the terms of -either the GNU General Public License Version 2 or later (the "GPL"), or -the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -in which case the provisions of the GPL or the LGPL are applicable instead -of those above. If you wish to allow use of your version of this file only -under the terms of either the GPL or the LGPL, and not to allow others to -use your version of this file under the terms of the MPL, indicate your -decision by deleting the provisions above and replace them with the notice -and other provisions required by the GPL or the LGPL. If you do not delete -the provisions above, a recipient may use your version of this file under -the terms of any one of the MPL, the GPL or the LGPL. - -***** END LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/security/nss/lib/freebl/mpi/tests/LICENSE-MPL b/security/nss/lib/freebl/mpi/tests/LICENSE-MPL index d1f78f522fb9..41dc2327f169 100644 --- a/security/nss/lib/freebl/mpi/tests/LICENSE-MPL +++ b/security/nss/lib/freebl/mpi/tests/LICENSE-MPL @@ -1,35 +1,3 @@ -***** BEGIN LICENSE BLOCK ***** -Version: MPL 1.1/GPL 2.0/LGPL 2.1 - -The contents of this file are subject to the Mozilla Public License Version -1.1 (the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at -http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the -License. - -The Original Code is the Netscape security libraries. - -The Initial Developer of the Original Code is Netscape -Communications Corporation. Portions created by Netscape are -Copyright (C) 1994-2000 Netscape Communications Corporation. All -Rights Reserved. - -Contributor(s): - -Alternatively, the contents of this file may be used under the terms of -either the GNU General Public License Version 2 or later (the "GPL"), or -the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -in which case the provisions of the GPL or the LGPL are applicable instead -of those above. If you wish to allow use of your version of this file only -under the terms of either the GPL or the LGPL, and not to allow others to -use your version of this file under the terms of the MPL, indicate your -decision by deleting the provisions above and replace them with the notice -and other provisions required by the GPL or the LGPL. If you do not delete -the provisions above, a recipient may use your version of this file under -the terms of any one of the MPL, the GPL or the LGPL. - -***** END LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/security/nss/lib/freebl/mpi/utils/LICENSE-MPL b/security/nss/lib/freebl/mpi/utils/LICENSE-MPL index d1f78f522fb9..41dc2327f169 100644 --- a/security/nss/lib/freebl/mpi/utils/LICENSE-MPL +++ b/security/nss/lib/freebl/mpi/utils/LICENSE-MPL @@ -1,35 +1,3 @@ -***** BEGIN LICENSE BLOCK ***** -Version: MPL 1.1/GPL 2.0/LGPL 2.1 - -The contents of this file are subject to the Mozilla Public License Version -1.1 (the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at -http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the -License. - -The Original Code is the Netscape security libraries. - -The Initial Developer of the Original Code is Netscape -Communications Corporation. Portions created by Netscape are -Copyright (C) 1994-2000 Netscape Communications Corporation. All -Rights Reserved. - -Contributor(s): - -Alternatively, the contents of this file may be used under the terms of -either the GNU General Public License Version 2 or later (the "GPL"), or -the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -in which case the provisions of the GPL or the LGPL are applicable instead -of those above. If you wish to allow use of your version of this file only -under the terms of either the GPL or the LGPL, and not to allow others to -use your version of this file under the terms of the MPL, indicate your -decision by deleting the provisions above and replace them with the notice -and other provisions required by the GPL or the LGPL. If you do not delete -the provisions above, a recipient may use your version of this file under -the terms of any one of the MPL, the GPL or the LGPL. - -***** END LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h b/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h index 6219992036c3..49cd9d2cdf6a 100644 --- a/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h +++ b/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h @@ -45,4 +45,9 @@ pkix_pl_CrlDp_Create(const CRLDistributionPoint *dp, const CERTName *certIssuerName, pkix_pl_CrlDp **pPkixDP, void *plContext); + +#ifdef __cplusplus +} +#endif + #endif /* _PKIX_PL_CRLDP_H */ diff --git a/security/nss/lib/nss/nss.h b/security/nss/lib/nss/nss.h index c5fd3252598e..8d7a52f742f2 100644 --- a/security/nss/lib/nss/nss.h +++ b/security/nss/lib/nss/nss.h @@ -33,12 +33,12 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define NSS_VERSION "3.18" _NSS_ECC_STRING _NSS_CUSTOMIZED " Beta" +#define NSS_VERSION "3.17.4" _NSS_ECC_STRING _NSS_CUSTOMIZED #define NSS_VMAJOR 3 -#define NSS_VMINOR 18 -#define NSS_VPATCH 0 +#define NSS_VMINOR 17 +#define NSS_VPATCH 4 #define NSS_VBUILD 0 -#define NSS_BETA PR_TRUE +#define NSS_BETA PR_FALSE #ifndef RC_INVOKED diff --git a/security/nss/lib/softoken/softkver.h b/security/nss/lib/softoken/softkver.h index c3f1a03920e5..e387352073a5 100644 --- a/security/nss/lib/softoken/softkver.h +++ b/security/nss/lib/softoken/softkver.h @@ -25,11 +25,11 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define SOFTOKEN_VERSION "3.18" SOFTOKEN_ECC_STRING " Beta" +#define SOFTOKEN_VERSION "3.17.4" SOFTOKEN_ECC_STRING #define SOFTOKEN_VMAJOR 3 -#define SOFTOKEN_VMINOR 18 -#define SOFTOKEN_VPATCH 0 +#define SOFTOKEN_VMINOR 17 +#define SOFTOKEN_VPATCH 4 #define SOFTOKEN_VBUILD 0 -#define SOFTOKEN_BETA PR_TRUE +#define SOFTOKEN_BETA PR_FALSE #endif /* _SOFTKVER_H_ */ diff --git a/security/nss/lib/util/nssutil.h b/security/nss/lib/util/nssutil.h index 03bd6da90265..ff9d19a2ee5f 100644 --- a/security/nss/lib/util/nssutil.h +++ b/security/nss/lib/util/nssutil.h @@ -19,12 +19,12 @@ * The format of the version string should be * ".[.[.]][ ]" */ -#define NSSUTIL_VERSION "3.18 Beta" +#define NSSUTIL_VERSION "3.17.4" #define NSSUTIL_VMAJOR 3 -#define NSSUTIL_VMINOR 18 -#define NSSUTIL_VPATCH 0 +#define NSSUTIL_VMINOR 17 +#define NSSUTIL_VPATCH 4 #define NSSUTIL_VBUILD 0 -#define NSSUTIL_BETA PR_TRUE +#define NSSUTIL_BETA PR_FALSE SEC_BEGIN_PROTOS diff --git a/security/nss/tests/chains/scenarios/scenarios b/security/nss/tests/chains/scenarios/scenarios index 3a704754ce3e..d26c3f92efd9 100644 --- a/security/nss/tests/chains/scenarios/scenarios +++ b/security/nss/tests/chains/scenarios/scenarios @@ -1,47 +1,6 @@ -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Network Security Services (NSS) -# -# The Initial Developer of the Original Code is Sun Microsystems, Inc. -# Portions created by the Initial Developer are Copyright (C) 2009 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Slavomir Katuscak , Sun Microsystems -# Ryan Sleevi , Google -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -# -# Scenario ocspd.cfg will always be processed first, -# regardless of its presence in this list. -# -# Scenario method.cfg will always be processed, regardless of its presence -# in this list, and will be processed twice, once with httpserv -O get -# and once with -O post. Because method.cfg will be executed with both -# classic and libpkix engines, it must not contain any policy checks. +# 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/. # bridge.cfg megabridge_3_2.cfg diff --git a/security/nss/tests/iopr/server_scr/config b/security/nss/tests/iopr/server_scr/config index 19821c79a17e..9e65b926c874 100644 --- a/security/nss/tests/iopr/server_scr/config +++ b/security/nss/tests/iopr/server_scr/config @@ -1,37 +1,6 @@ -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Network Security Services (NSS) -# -# The Initial Developer of the Original Code is Sun Microsystems, Inc. -# Portions created by the Initial Developer are Copyright (C) 2006-2009 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** +# 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/. certDir=/iopr caCertName=TestCA diff --git a/security/pkix/include/pkix/Result.h b/security/pkix/include/pkix/Result.h index 01a3a8248631..818a7f3f0b53 100644 --- a/security/pkix/include/pkix/Result.h +++ b/security/pkix/include/pkix/Result.h @@ -171,6 +171,8 @@ static const unsigned int FATAL_ERROR_FLAG = 0x800; SSL_ERROR_BAD_CERT_DOMAIN) \ MOZILLA_PKIX_MAP(ERROR_NO_RFC822NAME_MATCH, 43, \ MOZILLA_PKIX_ERROR_NO_RFC822NAME_MATCH) \ + MOZILLA_PKIX_MAP(ERROR_UNSUPPORTED_ELLIPTIC_CURVE, 44, \ + SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE) \ MOZILLA_PKIX_MAP(FATAL_ERROR_INVALID_ARGS, FATAL_ERROR_FLAG | 1, \ SEC_ERROR_INVALID_ARGS) \ MOZILLA_PKIX_MAP(FATAL_ERROR_INVALID_STATE, FATAL_ERROR_FLAG | 2, \ diff --git a/security/pkix/include/pkix/bind.h b/security/pkix/include/pkix/bind.h deleted file mode 100644 index db13deec376b..000000000000 --- a/security/pkix/include/pkix/bind.h +++ /dev/null @@ -1,231 +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 code is made available to you under your choice of the following sets - * of licensing terms: - */ -/* 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/. - */ -/* Copyright 2013 Mozilla Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Work around missing std::bind, std::ref, std::cref in older compilers. This -// implementation isn't intended to be complete; rather, it is the minimal -// implementation needed to make our use of std::bind work for compilers that -// lack both C++11 and TR1 support for these features. We cannot even assume -// that rvalue references work, which means we don't get perfect forwarding -// and thus we basically have to define a new overload for every distinct call -// signature. -// -// A positive side-effect of this code is improved debugging usability; it is -// much more convenient to step through code that uses this polyfill than it is -// to step through the many nested layers of a real std::bind implementation. -// -// Build with MOZILLA_PKIX_USE_REAL_FUNCTIONAL defined in order to use the -// compiler's definitions of these functions. This is helpful in order to -// ensure that the calling code is actually compatible with the real std::bind -// and friends. - -#ifndef mozilla_pkix__bind_h -#define mozilla_pkix__bind_h - -#ifdef MOZILLA_PKIX_USE_REAL_FUNCTIONAL -#include -#endif - -namespace mozilla { namespace pkix { - -#ifdef MOZILLA_PKIX_USE_REAL_FUNCTIONAL - -using std::bind; -using std::cref; -using std::ref; -using std::placeholders::_1; -using std::placeholders::_2; -using std::placeholders::_3; -using std::placeholders::_4; - -#else - -extern class Placeholder1 { } _1; -extern class Placeholder2 { } _2; -extern class Placeholder3 { } _3; -extern class Placeholder4 { } _4; - -template V& ref(V& v) { return v; } -template const V& cref(const V& v) { return v; } - -namespace internal { - -template -class Bind1 -{ -public: - typedef R (&F)(P1&, B1&); - Bind1(F f, B1& b1) : f(f), b1(b1) { } - R operator()(P1& p1) const { return f(p1, b1); } -private: - F f; - B1& b1; - void operator=(const Bind1&) = delete; -}; - -template -class Bind2 -{ -public: - typedef R (&F)(P1&, B1&, B2&); - Bind2(F f, B1& b1, B2& b2) : f(f), b1(b1), b2(b2) { } - R operator()(P1& p1) const { return f(p1, b1, b2); } -private: - F f; - B1& b1; - B2& b2; - void operator=(const Bind2&) = delete; -}; - -template -class Bind3 -{ -public: - typedef R (&F)(P1&, B1, B2, B3&); - Bind3(F f, B1& b1, B2& b2, B3& b3) - : f(f), b1(b1), b2(b2), b3(b3) { } - R operator()(P1& p1) const { return f(p1, b1, b2, b3); } -private: - F f; - B1& b1; - B2& b2; - B3& b3; - void operator=(const Bind3&) = delete; -}; - -template -class Bind4 -{ -public: - typedef R (&F)(P1&, B1, B2, B3&, B4&); - Bind4(F f, B1& b1, B2& b2, B3& b3, B4& b4) - : f(f), b1(b1), b2(b2), b3(b3), b4(b4) { } - R operator()(P1& p1) const { return f(p1, b1, b2, b3, b4); } -private: - F f; - B1& b1; - B2& b2; - B3& b3; - B4& b4; - void operator=(const Bind4&) = delete; -}; - -template -class BindToMemberFunction4 -{ -public: - // XXX: C++ doesn't have reference-to-member function, only - // pointer-to-member function, so we can't enforce the non-nullness of f - // using the type system. - typedef R (C1::*F)(P1&, P2&, P3, P4&); - BindToMemberFunction4(F f, C1& that) : f(f), that(that) { } - R operator()(P1& p1, P2& p2, P3 p3, P4& p4) const - { - return (that.*f)(p1, p2, p3, p4); - } -private: - const F f; - C1& that; - void operator=(const BindToMemberFunction4&) = delete; -}; - -template -class Bind5 -{ -public: - typedef R (&F)(P1&, B1, B2, B3, B4, B5); - Bind5(F f, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) - : f(f), b1(b1), b2(b2), b3(b3), b4(b4), b5(b5) { } - R operator()(P1& p1) const { return f(p1, b1, b2, b3, b4, b5); } -private: - F f; - B1 b1; - B2 b2; - B3 b3; - B4 b4; - B5 b5; - void operator=(const Bind5&) = delete; -}; - -} // namespace internal - -template -inline internal::Bind1 -bind(R (&f)(P1&, B1&), Placeholder1&, B1& b1) -{ - return internal::Bind1(f, b1); -} - -template -inline internal::Bind2 -bind(R (&f)(P1&, B1&, B2&), Placeholder1&, B1& b1, B2& b2) -{ - return internal::Bind2(f, b1, b2); -} - -template -inline internal::Bind3 -bind(R (&f)(P1&, B1, B2, B3&), Placeholder1&, const B1& b1, const B2& b2, - B3& b3) -{ - return internal::Bind3(f, b1, b2, b3); -} - -template -inline internal::Bind4 -bind(R (&f)(P1&, B1, B2, B3&, B4&), Placeholder1&, const B1& b1, const B2& b2, - B3& b3, B4& b4) -{ - return internal::Bind4(f, b1, b2, b3, b4); -} - -// XXX: C++ doesn't have reference-to-member function, only -// pointer-to-member function, so we can't enforce the non-nullness of f -// using the type system. -template -inline internal::BindToMemberFunction4 -bind(R (C1::*f)(P1&, P2&, P3, P4&), C1& that, Placeholder1&, - Placeholder2&, Placeholder3, Placeholder4&) -{ - return internal::BindToMemberFunction4(f, that); -} - -template -inline internal::Bind5 -bind(R (&f)(P1&, B1, B2, B3, B4, B5&), Placeholder1&, B1 b1, B2 b2, B3 b3, - B4 b4, B5& b5) -{ - return internal::Bind5(f, b1, b2, b3, b4, b5); -} - -#endif - -} } // namespace mozilla::pkix - -#endif // mozilla_pkix__bind_h diff --git a/security/pkix/include/pkix/pkixnss.h b/security/pkix/include/pkix/pkixnss.h index 20a052d9634f..96a8a1615a45 100644 --- a/security/pkix/include/pkix/pkixnss.h +++ b/security/pkix/include/pkix/pkixnss.h @@ -51,8 +51,9 @@ Result VerifySignedDataNSS(const SignedDataWithSignature& sd, Result DigestBufNSS(Input item, /*out*/ uint8_t* digestBuf, size_t digestBufLen); -// Checks, for RSA keys and DSA keys, that the modulus is at least the given -// number of bits. +// Checks, for RSA keys, that the modulus is at least the given number of bits. +// Checks, for ECC keys, that the curve used is one of the NIST P-256, P-384, +// or P-521 curves. Result CheckPublicKeyNSS(Input subjectPublicKeyInfo, unsigned int minimumNonECCBits); diff --git a/security/pkix/include/pkix/pkixtypes.h b/security/pkix/include/pkix/pkixtypes.h index e294ec77f359..00da6d9933fa 100644 --- a/security/pkix/include/pkix/pkixtypes.h +++ b/security/pkix/include/pkix/pkixtypes.h @@ -39,10 +39,18 @@ enum class DigestAlgorithm sha1 = 4, }; -// Named ECC Curves: -// * secp521r1 (OID 1.3.132.0.35, RFC 5480) -// * secp384r1 (OID 1.3.132.0.34, RFC 5480) -// * secp256r1 (OID 1.2.840.10045.3.17, RFC 5480) +enum class NamedCurve +{ + // secp521r1 (OID 1.3.132.0.35, RFC 5480) + secp521r1 = 1, + + // secp384r1 (OID 1.3.132.0.34, RFC 5480) + secp384r1 = 2, + + // secp256r1 (OID 1.2.840.10045.3.1.7, RFC 5480) + secp256r1 = 3, +}; + enum class SignatureAlgorithm { // ecdsa-with-SHA512 (OID 1.2.840.10045.4.3.4, RFC 5758 Section 3.2) @@ -294,8 +302,8 @@ public: /*optional*/ const Input* stapledOCSPresponse, /*optional*/ const Input* aiaExtension) = 0; - // Check that the key size, algorithm, and parameters of the given public key - // are acceptable. + // Check that the key size, algorithm, elliptic curve used (if applicable), + // and parameters of the given public key are acceptable. // // VerifySignedData() should do the same checks that this function does, but // mainly for efficiency, some keys are not passed to VerifySignedData(). diff --git a/security/pkix/lib/pkixbind.cpp b/security/pkix/lib/pkixbind.cpp deleted file mode 100644 index 62caee9cbaf2..000000000000 --- a/security/pkix/lib/pkixbind.cpp +++ /dev/null @@ -1,38 +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 code is made available to you under your choice of the following sets - * of licensing terms: - */ -/* 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/. - */ -/* Copyright 2013 Mozilla Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "pkix/bind.h" - -#ifndef MOZILLA_PKIX_USE_REAL_FUNCTIONAL - -namespace mozilla { namespace pkix { - -Placeholder1 _1; -Placeholder2 _2; -Placeholder3 _3; -Placeholder4 _4; - -} } // namespace mozilla::pkix - -#endif diff --git a/security/pkix/lib/pkixcert.cpp b/security/pkix/lib/pkixcert.cpp index f5daacfe2651..6371f5d30b59 100644 --- a/security/pkix/lib/pkixcert.cpp +++ b/security/pkix/lib/pkixcert.cpp @@ -22,7 +22,6 @@ * limitations under the License. */ -#include "pkix/bind.h" #include "pkixutil.h" namespace mozilla { namespace pkix { @@ -140,9 +139,12 @@ BackCert::Init() } } - rv = der::OptionalExtensions(tbsCertificate, CSC | 3, - bind(&BackCert::RememberExtension, *this, _1, - _2, _3, _4)); + rv = der::OptionalExtensions( + tbsCertificate, CSC | 3, + [this](Reader& extnID, const Input& extnValue, bool critical, + /*out*/ bool& understood) { + return RememberExtension(extnID, extnValue, critical, understood); + }); if (rv != Success) { return rv; } @@ -178,10 +180,8 @@ BackCert::Init() return der::End(tbsCertificate); } -// XXX: The second value is of type |const Input&| instead of type |Input| due -// to limitations in our std::bind polyfill. Result -BackCert::RememberExtension(Reader& extnID, const Input& extnValue, +BackCert::RememberExtension(Reader& extnID, Input extnValue, bool critical, /*out*/ bool& understood) { understood = false; diff --git a/security/pkix/lib/pkixcheck.cpp b/security/pkix/lib/pkixcheck.cpp index 19b43c882b91..9cab151114ff 100644 --- a/security/pkix/lib/pkixcheck.cpp +++ b/security/pkix/lib/pkixcheck.cpp @@ -24,7 +24,6 @@ #include "pkixcheck.h" -#include "pkix/bind.h" #include "pkixder.h" #include "pkixutil.h" @@ -296,24 +295,6 @@ static const long UNLIMITED_PATH_LEN = -1; // must be less than zero // BasicConstraints ::= SEQUENCE { // cA BOOLEAN DEFAULT FALSE, // pathLenConstraint INTEGER (0..MAX) OPTIONAL } -static Result -DecodeBasicConstraints(Reader& input, /*out*/ bool& isCA, - /*out*/ long& pathLenConstraint) -{ - if (der::OptionalBoolean(input, isCA) != Success) { - return Result::ERROR_EXTENSION_VALUE_INVALID; - } - - // TODO(bug 985025): If isCA is false, pathLenConstraint MUST NOT - // be included (as per RFC 5280 section 4.2.1.9), but for compatibility - // reasons, we don't check this for now. - if (der::OptionalInteger(input, UNLIMITED_PATH_LEN, pathLenConstraint) - != Success) { - return Result::ERROR_EXTENSION_VALUE_INVALID; - } - - return Success; -} // RFC5280 4.2.1.9. Basic Constraints (id-ce-basicConstraints) Result @@ -327,9 +308,19 @@ CheckBasicConstraints(EndEntityOrCA endEntityOrCA, if (encodedBasicConstraints) { Reader input(*encodedBasicConstraints); - if (der::Nested(input, der::SEQUENCE, - bind(DecodeBasicConstraints, _1, ref(isCA), - ref(pathLenConstraint))) != Success) { + Result rv = der::Nested(input, der::SEQUENCE, + [&isCA, &pathLenConstraint](Reader& r) { + Result rv = der::OptionalBoolean(r, isCA); + if (rv != Success) { + return rv; + } + // TODO(bug 985025): If isCA is false, pathLenConstraint + // MUST NOT be included (as per RFC 5280 section + // 4.2.1.9), but for compatibility reasons, we don't + // check this. + return der::OptionalInteger(r, UNLIMITED_PATH_LEN, pathLenConstraint); + }); + if (rv != Success) { return Result::ERROR_EXTENSION_VALUE_INVALID; } if (der::End(input) != Success) { @@ -488,10 +479,11 @@ CheckExtendedKeyUsage(EndEntityOrCA endEntityOrCA, bool found = requiredEKU == KeyPurposeId::anyExtendedKeyUsage; Reader input(*encodedExtendedKeyUsage); - if (der::NestedOf(input, der::SEQUENCE, der::OIDTag, der::EmptyAllowed::No, - bind(MatchEKU, _1, requiredEKU, endEntityOrCA, - ref(found), ref(foundOCSPSigning))) - != Success) { + Result rv = der::NestedOf(input, der::SEQUENCE, der::OIDTag, + der::EmptyAllowed::No, [&](Reader& r) { + return MatchEKU(r, requiredEKU, endEntityOrCA, found, foundOCSPSigning); + }); + if (rv != Success) { return Result::ERROR_INADEQUATE_CERT_TYPE; } if (der::End(input) != Success) { diff --git a/security/pkix/lib/pkixder.cpp b/security/pkix/lib/pkixder.cpp index 645bdf801cd0..c380c82c1ba1 100644 --- a/security/pkix/lib/pkixder.cpp +++ b/security/pkix/lib/pkixder.cpp @@ -24,7 +24,6 @@ #include "pkixder.h" -#include "pkix/bind.h" #include "pkixutil.h" namespace mozilla { namespace pkix { namespace der { @@ -224,6 +223,42 @@ SignatureAlgorithmOIDValue(Reader& algorithmID, return Success; } +static Result +NamedCurveOIDValue(Reader& namedCurveID, /*out*/ NamedCurve& namedCurve) +{ + // RFC 5480 + // python DottedOIDToCode.py secp256r1 1.2.840.10045.3.1.7 + static const uint8_t secp256r1[] = { + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07 + }; + + // RFC 5480 + // python DottedOIDToCode.py id-secp384r1 1.3.132.0.34 + static const uint8_t secp384r1[] = { + 0x2b, 0x81, 0x04, 0x00, 0x22 + }; + + // RFC 5480 + // python DottedOIDToCode.py id-secp521r1 1.3.132.0.35 + static const uint8_t secp521r1[] = { + 0x2b, 0x81, 0x04, 0x00, 0x23 + }; + + // Matching is attempted based on a rough estimate of the commonality of the + // named curve, to minimize the number of MatchRest calls. + if (namedCurveID.MatchRest(secp256r1)) { + namedCurve = NamedCurve::secp256r1; + } else if (namedCurveID.MatchRest(secp384r1)) { + namedCurve = NamedCurve::secp384r1; + } else if (namedCurveID.MatchRest(secp521r1)) { + namedCurve = NamedCurve::secp521r1; + } else { + return Result::ERROR_UNSUPPORTED_ELLIPTIC_CURVE; + } + + return Success; +} + template Result AlgorithmIdentifier(OidValueParser oidValueParser, Reader& input, @@ -268,6 +303,23 @@ DigestAlgorithmIdentifier(Reader& input, /*out*/ DigestAlgorithm& algorithm) return AlgorithmIdentifier(DigestAlgorithmOIDValue, input, algorithm); } +Result +NamedCurveOID(Reader& input, /*out*/ NamedCurve& namedCurve) +{ + Reader namedCurveID; + Result rv = ExpectTagAndGetValue(input, der::OIDTag, namedCurveID); + if (rv != Success) { + return rv; + } + + rv = NamedCurveOIDValue(namedCurveID, namedCurve); + if (rv != Success) { + return rv; + } + + return Success; +} + Result SignedData(Reader& input, /*out*/ Reader& tbs, /*out*/ SignedDataWithSignature& signedData) diff --git a/security/pkix/lib/pkixder.h b/security/pkix/lib/pkixder.h index 30f7ab0dfabf..4ca48559ec0f 100644 --- a/security/pkix/lib/pkixder.h +++ b/security/pkix/lib/pkixder.h @@ -186,14 +186,24 @@ Nested(Reader& input, uint8_t outerTag, uint8_t innerTag, Decoder decoder) // Foo ::= SEQUENCE { // } // -// using a call like this: +// using code like this: // -// rv = NestedOf(input, SEQEUENCE, SEQUENCE, bind(_1, Foo)); +// Result Foo(Reader& r) { /*...*/ } // -// Result Foo(Reader& input) { -// } +// rv = der::NestedOf(input, der::SEQEUENCE, der::SEQUENCE, Foo); // -// In this example, Foo will get called once for each element of foos. +// or: +// +// Result Bar(Reader& r, int value) { /*...*/ } +// +// int value = /*...*/; +// +// rv = der::NestedOf(input, der::SEQUENCE, [value](Reader& r) { +// return Bar(r, value); +// }); +// +// In these examples the function will get called once for each element of +// foos. // template inline Result @@ -598,6 +608,8 @@ Result DigestAlgorithmIdentifier(Reader& input, Result SignatureAlgorithmIdentifier(Reader& input, /*out*/ SignatureAlgorithm& algorithm); +Result NamedCurveOID(Reader& input, /*out*/ NamedCurve& namedCurve); + // Parses a SEQUENCE into tbs and then parses an AlgorithmIdentifier followed // by a BIT STRING into signedData. This handles the commonality between // parsing the signed/signature fields of certificates and OCSP responses. In diff --git a/security/pkix/lib/pkixnames.cpp b/security/pkix/lib/pkixnames.cpp index 04e0966ad8ad..a74b4b45199d 100644 --- a/security/pkix/lib/pkixnames.cpp +++ b/security/pkix/lib/pkixnames.cpp @@ -34,7 +34,6 @@ // constraints, the reference identifier is the entire encoded name constraint // extension value. -#include "pkix/bind.h" #include "pkixcheck.h" #include "pkixutil.h" @@ -468,10 +467,10 @@ SearchNames(/*optional*/ const Input* subjectAltName, // SET SIZE (1..MAX) OF AttributeTypeAndValue Reader subjectReader(subject); return der::NestedOf(subjectReader, der::SEQUENCE, der::SET, - der::EmptyAllowed::Yes, - bind(SearchWithinRDN, _1, referenceIDType, - referenceID, fallBackToEmailAddress, - fallBackToCommonName, ref(match))); + der::EmptyAllowed::Yes, [&](Reader& r) { + return SearchWithinRDN(r, referenceIDType, referenceID, + fallBackToEmailAddress, fallBackToCommonName, match); + }); } // RelativeDistinguishedName ::= @@ -489,10 +488,11 @@ SearchWithinRDN(Reader& rdn, /*in/out*/ MatchResult& match) { do { - Result rv = der::Nested(rdn, der::SEQUENCE, - bind(SearchWithinAVA, _1, referenceIDType, - referenceID, fallBackToEmailAddress, - fallBackToCommonName, ref(match))); + Result rv = der::Nested(rdn, der::SEQUENCE, [&](Reader& r) { + return SearchWithinAVA(r, referenceIDType, referenceID, + fallBackToEmailAddress, fallBackToCommonName, + match); + }); if (rv != Success) { return rv; } diff --git a/security/pkix/lib/pkixnss.cpp b/security/pkix/lib/pkixnss.cpp index a3e3553345ef..0e407ce4c079 100644 --- a/security/pkix/lib/pkixnss.cpp +++ b/security/pkix/lib/pkixnss.cpp @@ -32,6 +32,7 @@ #include "pk11pub.h" #include "pkix/pkix.h" #include "pkix/ScopedPtr.h" +#include "pkixder.h" #include "secerr.h" #include "sslerr.h" @@ -57,8 +58,41 @@ CheckPublicKeySize(Input subjectPublicKeyInfo, unsigned int minimumNonECCBits, switch (publicKey.get()->keyType) { case ecKey: - // TODO(bug 1077790): We should check which curve. + { + SECKEYECParams* encodedParams = &publicKey.get()->u.ec.DEREncodedParams; + if (!encodedParams) { + return Result::ERROR_UNSUPPORTED_ELLIPTIC_CURVE; + } + + Input input; + Result rv = input.Init(encodedParams->data, encodedParams->len); + if (rv != Success) { + return rv; + } + + Reader reader(input); + NamedCurve namedCurve; + rv = der::NamedCurveOID(reader, namedCurve); + if (rv != Success) { + return rv; + } + + rv = der::End(reader); + if (rv != Success) { + return rv; + } + + switch (namedCurve) { + case NamedCurve::secp256r1: // fall through + case NamedCurve::secp384r1: // fall through + case NamedCurve::secp521r1: + break; + default: + return Result::ERROR_UNSUPPORTED_ELLIPTIC_CURVE; + } + return Success; + } case rsaKey: if (SECKEY_PublicKeyStrengthInBits(publicKey.get()) < minimumNonECCBits) { return Result::ERROR_INADEQUATE_KEY_SIZE; diff --git a/security/pkix/lib/pkixocsp.cpp b/security/pkix/lib/pkixocsp.cpp index 2581db7e4829..89f8a0b30117 100644 --- a/security/pkix/lib/pkixocsp.cpp +++ b/security/pkix/lib/pkixocsp.cpp @@ -24,7 +24,6 @@ #include -#include "pkix/bind.h" #include "pkix/pkix.h" #include "pkixcheck.h" #include "pkixutil.h" @@ -298,8 +297,9 @@ VerifyEncodedOCSPResponse(TrustDomain& trustDomain, const struct CertID& certID, thisUpdate, validThrough); Reader input(encodedResponse); - Result rv = der::Nested(input, der::SEQUENCE, - bind(OCSPResponse, _1, ref(context))); + Result rv = der::Nested(input, der::SEQUENCE, [&context](Reader& r) { + return OCSPResponse(r, context); + }); if (rv != Success) { return MapBadDERToMalformedOCSPResponse(rv); } @@ -358,7 +358,9 @@ OCSPResponse(Reader& input, Context& context) } return der::Nested(input, der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 0, - der::SEQUENCE, bind(ResponseBytes, _1, ref(context))); + der::SEQUENCE, [&context](Reader& r) { + return ResponseBytes(r, context); + }); } // ResponseBytes ::= SEQUENCE { @@ -377,7 +379,9 @@ ResponseBytes(Reader& input, Context& context) } return der::Nested(input, der::OCTET_STRING, der::SEQUENCE, - bind(BasicResponse, _1, ref(context))); + [&context](Reader& r) { + return BasicResponse(r, context); + }); } // BasicOCSPResponse ::= SEQUENCE { @@ -493,8 +497,9 @@ ResponseData(Reader& input, Context& context, // responder will never return an empty response, and handling the case of an // empty response makes things unnecessarily complicated. rv = der::NestedOf(input, der::SEQUENCE, der::SEQUENCE, - der::EmptyAllowed::No, - bind(SingleResponse, _1, ref(context))); + der::EmptyAllowed::No, [&context](Reader& r) { + return SingleResponse(r, context); + }); if (rv != Success) { return rv; } @@ -517,8 +522,9 @@ static inline Result SingleResponse(Reader& input, Context& context) { bool match = false; - Result rv = der::Nested(input, der::SEQUENCE, - bind(CertID, _1, cref(context), ref(match))); + Result rv = der::Nested(input, der::SEQUENCE, [&context, &match](Reader& r) { + return CertID(r, context, match); + }); if (rv != Success) { return rv; } @@ -599,8 +605,9 @@ SingleResponse(Reader& input, Context& context) der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 0; if (input.Peek(NEXT_UPDATE_TAG)) { Time nextUpdate(Time::uninitialized); - rv = der::Nested(input, NEXT_UPDATE_TAG, - bind(der::GeneralizedTime, _1, ref(nextUpdate))); + rv = der::Nested(input, NEXT_UPDATE_TAG, [&nextUpdate](Reader& r) { + return der::GeneralizedTime(r, nextUpdate); + }); if (rv != Success) { return rv; } diff --git a/security/pkix/lib/pkixutil.h b/security/pkix/lib/pkixutil.h index 6c176bb043b9..238bd62b27c2 100644 --- a/security/pkix/lib/pkixutil.h +++ b/security/pkix/lib/pkixutil.h @@ -140,8 +140,8 @@ private: Input subjectAltName; Input criticalNetscapeCertificateType; - Result RememberExtension(Reader& extnID, const Input& extnValue, - bool critical, /*out*/ bool& understood); + Result RememberExtension(Reader& extnID, Input extnValue, bool critical, + /*out*/ bool& understood); BackCert(const BackCert&) = delete; void operator=(const BackCert&) = delete; diff --git a/security/pkix/moz.build b/security/pkix/moz.build index 5f735624286b..9ebaee7cc4d3 100644 --- a/security/pkix/moz.build +++ b/security/pkix/moz.build @@ -5,7 +5,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. SOURCES += [ - 'lib/pkixbind.cpp', 'lib/pkixbuild.cpp', 'lib/pkixcert.cpp', 'lib/pkixcheck.cpp', diff --git a/security/pkix/test/gtest/pkixder_input_tests.cpp b/security/pkix/test/gtest/pkixder_input_tests.cpp index 4f862b28ebf8..56bee20820e2 100644 --- a/security/pkix/test/gtest/pkixder_input_tests.cpp +++ b/security/pkix/test/gtest/pkixder_input_tests.cpp @@ -26,7 +26,6 @@ #include #include -#include "pkix/bind.h" #include "pkixder.h" using namespace mozilla::pkix; @@ -844,9 +843,10 @@ TEST_F(pkixder_input_tests, NestedOf) std::vector readValues; ASSERT_EQ(Success, - NestedOf(input, SEQUENCE, INTEGER, EmptyAllowed::No, - mozilla::pkix::bind(NestedOfHelper, mozilla::pkix::_1, - mozilla::pkix::ref(readValues)))); + NestedOf(input, SEQUENCE, INTEGER, EmptyAllowed::No, + [&readValues](Reader& r) { + return NestedOfHelper(r, readValues); + })); ASSERT_EQ((size_t) 3, readValues.size()); ASSERT_EQ(0x01, readValues[0]); ASSERT_EQ(0x02, readValues[1]); @@ -862,8 +862,9 @@ TEST_F(pkixder_input_tests, NestedOfWithTruncatedData) std::vector readValues; ASSERT_EQ(Result::ERROR_BAD_DER, NestedOf(input, SEQUENCE, INTEGER, EmptyAllowed::No, - mozilla::pkix::bind(NestedOfHelper, mozilla::pkix::_1, - mozilla::pkix::ref(readValues)))); + [&readValues](Reader& r) { + return NestedOfHelper(r, readValues); + })); ASSERT_EQ((size_t) 0, readValues.size()); } diff --git a/security/pkix/test/gtest/pkixder_universal_types_tests.cpp b/security/pkix/test/gtest/pkixder_universal_types_tests.cpp index df2fb15b3f13..52a3562e26d5 100644 --- a/security/pkix/test/gtest/pkixder_universal_types_tests.cpp +++ b/security/pkix/test/gtest/pkixder_universal_types_tests.cpp @@ -26,7 +26,6 @@ #include #include -#include "pkix/bind.h" #include "pkixder.h" #include "pkixtestutil.h" #include "stdint.h" diff --git a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp index d7e962c028ee..bd3e2f9da2f9 100644 --- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp +++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp @@ -123,11 +123,25 @@ SandboxBroker::SetSecurityLevelForPluginProcess() return false; } - auto result = mPolicy->SetJobLevel(sandbox::JOB_NONE, 0); + auto result = mPolicy->SetJobLevel(sandbox::JOB_NONE, + 0 /* ui_exceptions */); bool ret = (sandbox::SBOX_ALL_OK == result); - result = mPolicy->SetTokenLevel(sandbox::USER_UNPROTECTED, - sandbox::USER_UNPROTECTED); + + result = mPolicy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, + sandbox::USER_NON_ADMIN); ret = ret && (sandbox::SBOX_ALL_OK == result); + + result = mPolicy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_MEDIUM); + ret = ret && (sandbox::SBOX_ALL_OK == result); + + // Add the policy for the client side of a pipe. It is just a file + // in the \pipe\ namespace. We restrict it to pipes that start with + // "chrome." so the sandboxed process cannot connect to system services. + result = mPolicy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, + sandbox::TargetPolicy::FILES_ALLOW_ANY, + L"\\??\\pipe\\chrome.*"); + ret = ret && (sandbox::SBOX_ALL_OK == result); + return ret; } diff --git a/testing/marionette/marionette-listener.js b/testing/marionette/marionette-listener.js index 2c49e8179543..d25e78930a6a 100644 --- a/testing/marionette/marionette-listener.js +++ b/testing/marionette/marionette-listener.js @@ -117,15 +117,31 @@ function registerSelf() { function emitTouchEventForIFrame(message) { message = message.json; - let frames = curFrame.document.getElementsByTagName("iframe"); - let iframe = frames[message.index]; let identifier = nextTouchId; - let tabParent = iframe.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.tabParent; - tabParent.injectTouchEvent(message.type, [identifier], - [message.clientX], [message.clientY], - [message.radiusX], [message.radiusY], - [message.rotationAngle], [message.force], - 1, 0); + + let domWindowUtils = curFrame. + QueryInterface(Components.interfaces.nsIInterfaceRequestor). + getInterface(Components.interfaces.nsIDOMWindowUtils); + var ratio = domWindowUtils.screenPixelsPerCSSPixel; + + var typeForUtils; + switch (message.type) { + case 'touchstart': + typeForUtils = domWindowUtils.TOUCH_CONTACT; + break; + case 'touchend': + typeForUtils = domWindowUtils.TOUCH_REMOVE; + break; + case 'touchcancel': + typeForUtils = domWindowUtils.TOUCH_CANCEL; + break; + case 'touchmove': + typeForUtils = domWindowUtils.TOUCH_CONTACT; + break; + } + domWindowUtils.sendNativeTouchPoint(identifier, typeForUtils, + Math.round(message.screenX * ratio), Math.round(message.screenY * ratio), + message.force, 90); } /** @@ -709,10 +725,12 @@ function emitTouchEvent(type, touch) { let index = sendSyncMessage("MarionetteFrame:getCurrentFrameId"); // only call emitTouchEventForIFrame if we're inside an iframe. if (index != null) { - sendSyncMessage("Marionette:emitTouchEvent", {index: index, type: type, id: touch.identifier, - clientX: touch.clientX, clientY: touch.clientY, - radiusX: touch.radiusX, radiusY: touch.radiusY, - rotation: touch.rotationAngle, force: touch.force}); + sendSyncMessage("Marionette:emitTouchEvent", + { index: index, type: type, id: touch.identifier, + clientX: touch.clientX, clientY: touch.clientY, + screenX: touch.screenX, screenY: touch.screenY, + radiusX: touch.radiusX, radiusY: touch.radiusY, + rotation: touch.rotationAngle, force: touch.force }); return; } } diff --git a/testing/specialpowers/content/specialpowers.js b/testing/specialpowers/content/specialpowers.js index bee62d931218..07d44208c0b1 100644 --- a/testing/specialpowers/content/specialpowers.js +++ b/testing/specialpowers/content/specialpowers.js @@ -61,6 +61,7 @@ SpecialPowers.prototype.sanityCheck = function() { return "foo"; }; // This gets filled in in the constructor. SpecialPowers.prototype.DOMWindowUtils = undefined; SpecialPowers.prototype.Components = undefined; +SpecialPowers.prototype.IsInNestedFrame = false; SpecialPowers.prototype._sendSyncMessage = function(msgname, msg) { if (this.SP_SYNC_MESSAGES.indexOf(msgname) == -1) { @@ -163,6 +164,9 @@ SpecialPowers.prototype.nestedFrameSetup = function() { mm.loadFrameScript(specialPowersBase + "MozillaLogger.js", false); mm.loadFrameScript(specialPowersBase + "specialpowersAPI.js", false); mm.loadFrameScript(specialPowersBase + "specialpowers.js", false); + + let frameScript = "SpecialPowers.prototype.IsInNestedFrame=true;"; + mm.loadFrameScript("data:," + frameScript, false); } }, "remote-browser-shown", false); }; @@ -174,7 +178,11 @@ function attachSpecialPowersToWindow(aWindow) { (aWindow !== undefined) && (aWindow.wrappedJSObject) && !(aWindow.wrappedJSObject.SpecialPowers)) { - aWindow.wrappedJSObject.SpecialPowers = new SpecialPowers(aWindow); + let sp = new SpecialPowers(aWindow); + aWindow.wrappedJSObject.SpecialPowers = sp; + if (sp.IsInNestedFrame) { + sp.addPermission("allowXULXBL", true, aWindow.document); + } } } catch(ex) { dump("TEST-INFO | specialpowers.js | Failed to attach specialpowers to window exception: " + ex + "\n"); @@ -197,6 +205,7 @@ SpecialPowersManager.prototype = { } }; + var specialpowersmanager = new SpecialPowersManager(); this.SpecialPowers = SpecialPowers; diff --git a/testing/web-platform/meta/html/dom/interfaces.html.ini b/testing/web-platform/meta/html/dom/interfaces.html.ini index 80207c2d49b9..13574452fd82 100644 --- a/testing/web-platform/meta/html/dom/interfaces.html.ini +++ b/testing/web-platform/meta/html/dom/interfaces.html.ini @@ -744,12 +744,6 @@ [Stringification of document.createElement("rb")] expected: FAIL - [HTMLUnknownElement must be primary interface of document.createElement("basefont")] - expected: FAIL - - [Stringification of document.createElement("basefont")] - expected: FAIL - [HTMLHtmlElement interface: existence and properties of interface object] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/interfaces.html.ini b/testing/web-platform/meta/html/semantics/interfaces.html.ini index edd654a60476..e02af87bfdc8 100644 --- a/testing/web-platform/meta/html/semantics/interfaces.html.ini +++ b/testing/web-platform/meta/html/semantics/interfaces.html.ini @@ -1,8 +1,5 @@ [interfaces.html] type: testharness - [Interfaces for basefont] - expected: FAIL - [Interfaces for image] expected: FAIL diff --git a/testing/web-platform/meta/html/syntax/serializing-html-fragments/outerHTML.html.ini b/testing/web-platform/meta/html/syntax/serializing-html-fragments/outerHTML.html.ini deleted file mode 100644 index 30e646505812..000000000000 --- a/testing/web-platform/meta/html/syntax/serializing-html-fragments/outerHTML.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[outerHTML.html] - type: testharness - [Node for command] - expected: FAIL - diff --git a/testing/web-platform/meta/workers/WorkerLocation_hash_encoding.htm.ini b/testing/web-platform/meta/workers/WorkerLocation_hash_encoding.htm.ini deleted file mode 100644 index 81add633be88..000000000000 --- a/testing/web-platform/meta/workers/WorkerLocation_hash_encoding.htm.ini +++ /dev/null @@ -1,8 +0,0 @@ -[WorkerLocation_hash_encoding.htm] - type: testharness - [Test Description: WorkerLocation.hash returns \'#question%3f\' from input \'http://example.com/carrot#question%3f\'] - expected: FAIL - - [ WorkerLocation.hash with url encoding string ] - expected: FAIL - diff --git a/testing/web-platform/tests/html/dom/interfaces.html b/testing/web-platform/tests/html/dom/interfaces.html index 80cb446ce15a..c92782923ccb 100644 --- a/testing/web-platform/tests/html/dom/interfaces.html +++ b/testing/web-platform/tests/html/dom/interfaces.html @@ -3239,6 +3239,7 @@ window.onload = function() { 'document.createElement("wbr")', 'document.createElement("summary")', 'document.createElement("acronym")', + 'document.createElement("basefont")', ], HTMLUnknownElement: [ 'document.createElement("quasit")', @@ -3248,7 +3249,6 @@ window.onload = function() { 'document.createElement("nextid")', 'document.createElement("rb")', 'document.createElement("spacer")', - 'document.createElement("basefont")', 'document.createElement("directory")', 'document.createElement("mod")', ], diff --git a/testing/web-platform/tests/html/semantics/interfaces.js b/testing/web-platform/tests/html/semantics/interfaces.js index 5f5d2d908fab..8240607e4664 100644 --- a/testing/web-platform/tests/html/semantics/interfaces.js +++ b/testing/web-platform/tests/html/semantics/interfaces.js @@ -6,7 +6,7 @@ var elements = [ ["audio", "Audio"], ["b", ""], ["base", "Base"], - ["basefont", "Unknown"], + ["basefont", ""], ["bdo", ""], ["bgsound", "Unknown"], ["big", ""], diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index 6de059653217..40f9a39ec0f3 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -350,6 +350,7 @@ if CONFIG['OS_ARCH'] == 'WINNT': 'wbemuuid', 'wintrust', 'wtsapi32', + 'locationapi' ] if CONFIG['ACCESSIBILITY']: OS_LIBS += [ diff --git a/widget/InputData.cpp b/widget/InputData.cpp index d85002303df9..a0e85b4eef6e 100644 --- a/widget/InputData.cpp +++ b/widget/InputData.cpp @@ -158,6 +158,17 @@ MultiTouchInput::ToWidgetMouseEvent(nsIWidget* aWidget) const return event; } +int32_t +MultiTouchInput::IndexOfTouch(int32_t aTouchIdentifier) +{ + for (size_t i = 0; i < mTouches.Length(); i++) { + if (mTouches[i].mIdentifier == aTouchIdentifier) { + return (int32_t)i; + } + } + return -1; +} + // This conversion from WidgetMouseEvent to MultiTouchInput is needed because on // the B2G emulator we can only receive mouse events, but we need to be able // to pan correctly. To do this, we convert the events into a format that the diff --git a/widget/InputData.h b/widget/InputData.h index cc5a26f2711a..6229eabcc04e 100644 --- a/widget/InputData.h +++ b/widget/InputData.h @@ -222,6 +222,10 @@ public: WidgetTouchEvent ToWidgetTouchEvent(nsIWidget* aWidget) const; WidgetMouseEvent ToWidgetMouseEvent(nsIWidget* aWidget) const; + // Return the index into mTouches of the SingleTouchData with the given + // identifier, or -1 if there is no such SingleTouchData. + int32_t IndexOfTouch(int32_t aTouchIdentifier); + // This conversion from WidgetMouseEvent to MultiTouchInput is needed because // on the B2G emulator we can only receive mouse events, but we need to be // able to pan correctly. To do this, we convert the events into a format that diff --git a/widget/gonk/GeckoTouchDispatcher.cpp b/widget/gonk/GeckoTouchDispatcher.cpp index 77f48b6b6100..7701b43a0943 100644 --- a/widget/gonk/GeckoTouchDispatcher.cpp +++ b/widget/gonk/GeckoTouchDispatcher.cpp @@ -224,19 +224,15 @@ Interpolate(int start, int end, TimeDuration aFrameDiff, TimeDuration aTouchDiff static const SingleTouchData& GetTouchByID(const SingleTouchData& aCurrentTouch, MultiTouchInput& aOtherTouch) { - int32_t id = aCurrentTouch.mIdentifier; - for (size_t i = 0; i < aOtherTouch.mTouches.Length(); i++) { - SingleTouchData& touch = aOtherTouch.mTouches[i]; - if (touch.mIdentifier == id) { - return touch; - } + int32_t index = aOtherTouch.IndexOfTouch(aCurrentTouch.mIdentifier); + if (index < 0) { + // We can have situations where a previous touch event had 2 fingers + // and we lift 1 finger off. In those cases, we won't find the touch event + // with given id, so just return the current touch, which will be resampled + // without modification and dispatched. + return aCurrentTouch; } - - // We can have situations where a previous touch event had 2 fingers - // and we lift 1 finger off. In those cases, we won't find the touch event - // with given id, so just return the current touch, which will be resampled - // without modification and dispatched. - return aCurrentTouch; + return aOtherTouch.mTouches[index]; } diff --git a/widget/gonk/nsWindow.cpp b/widget/gonk/nsWindow.cpp index 544805bd19fb..732d3a33e7a5 100644 --- a/widget/gonk/nsWindow.cpp +++ b/widget/gonk/nsWindow.cpp @@ -300,6 +300,71 @@ nsWindow::DispatchTouchInputViaAPZ(MultiTouchInput& aInput) } } + +nsresult +nsWindow::SynthesizeNativeTouchPoint(uint32_t aPointerId, + TouchPointerState aPointerState, + nsIntPoint aPointerScreenPoint, + double aPointerPressure, + uint32_t aPointerOrientation) +{ + if (aPointerState == TOUCH_HOVER) { + return NS_ERROR_UNEXPECTED; + } + + if (!mSynthesizedTouchInput) { + mSynthesizedTouchInput = new MultiTouchInput(); + } + + // We can't dispatch mSynthesizedTouchInput directly because (a) dispatching + // it might inadvertently modify it and (b) in the case of touchend or + // touchcancel events mSynthesizedTouchInput will hold the touches that are + // still down whereas the input dispatched needs to hold the removed + // touch(es). We use |inputToDispatch| for this purpose. + MultiTouchInput inputToDispatch; + inputToDispatch.mInputType = MULTITOUCH_INPUT; + + int32_t index = mSynthesizedTouchInput->IndexOfTouch((int32_t)aPointerId); + if (aPointerState == TOUCH_CONTACT) { + if (index >= 0) { + // found an existing touch point, update it + SingleTouchData& point = mSynthesizedTouchInput->mTouches[index]; + point.mScreenPoint = ScreenIntPoint::FromUntyped(aPointerScreenPoint); + point.mRotationAngle = (float)aPointerOrientation; + point.mForce = (float)aPointerPressure; + inputToDispatch.mType = MultiTouchInput::MULTITOUCH_MOVE; + } else { + // new touch point, add it + mSynthesizedTouchInput->mTouches.AppendElement(SingleTouchData( + (int32_t)aPointerId, + ScreenIntPoint::FromUntyped(aPointerScreenPoint), + ScreenSize(0, 0), + (float)aPointerOrientation, + (float)aPointerPressure)); + inputToDispatch.mType = MultiTouchInput::MULTITOUCH_START; + } + inputToDispatch.mTouches = mSynthesizedTouchInput->mTouches; + } else { + MOZ_ASSERT(aPointerState == TOUCH_REMOVE || aPointerState == TOUCH_CANCEL); + // a touch point is being lifted, so remove it from the stored list + if (index >= 0) { + mSynthesizedTouchInput->mTouches.RemoveElementAt(index); + } + inputToDispatch.mType = (aPointerState == TOUCH_REMOVE + ? MultiTouchInput::MULTITOUCH_END + : MultiTouchInput::MULTITOUCH_CANCEL); + inputToDispatch.mTouches.AppendElement(SingleTouchData( + (int32_t)aPointerId, + ScreenIntPoint::FromUntyped(aPointerScreenPoint), + ScreenSize(0, 0), + (float)aPointerOrientation, + (float)aPointerPressure)); + } + + DispatchTouchInputViaAPZ(inputToDispatch); + return NS_OK; +} + NS_IMETHODIMP nsWindow::Create(nsIWidget *aParent, void *aNativeParent, diff --git a/widget/gonk/nsWindow.h b/widget/gonk/nsWindow.h index cf816ab2dda3..cf5d140c4ad9 100644 --- a/widget/gonk/nsWindow.h +++ b/widget/gonk/nsWindow.h @@ -90,6 +90,12 @@ public: void DispatchTouchInputViaAPZ(mozilla::MultiTouchInput& aInput); NS_IMETHOD DispatchEvent(mozilla::WidgetGUIEvent* aEvent, nsEventStatus& aStatus); + virtual nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId, + TouchPointerState aPointerState, + nsIntPoint aPointerScreenPoint, + double aPointerPressure, + uint32_t aPointerOrientation) MOZ_OVERRIDE; + NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener, bool aDoCapture) { @@ -147,6 +153,11 @@ protected: // Call this function when the users activity is the direct cause of an // event (like a keypress or mouse click). void UserActivity(); + +private: + // This is used by SynthesizeNativeTouchPoint to maintain state between + // multiple synthesized points + nsAutoPtr mSynthesizedTouchInput; }; #endif /* nsWindow_h */ diff --git a/widget/nsIWidget.h b/widget/nsIWidget.h index 4a77cd6d029f..b016abab0507 100644 --- a/widget/nsIWidget.h +++ b/widget/nsIWidget.h @@ -2214,9 +2214,9 @@ protected: // lastchild pointers are weak, which is fine as long as they are // maintained properly. nsCOMPtr mFirstChild; - nsIWidget* mLastChild; + nsIWidget* MOZ_NON_OWNING_REF mLastChild; nsCOMPtr mNextSibling; - nsIWidget* mPrevSibling; + nsIWidget* MOZ_NON_OWNING_REF mPrevSibling; // When Destroy() is called, the sub class should set this true. bool mOnDestroyCalled; nsWindowType mWindowType; diff --git a/widget/windows/moz.build b/widget/windows/moz.build index 88f53ebb8922..d0a27313619c 100644 --- a/widget/windows/moz.build +++ b/widget/windows/moz.build @@ -101,7 +101,7 @@ LOCAL_INCLUDES += [ DEFINES['MOZ_UNICODE'] = True -for var in ('MOZ_ENABLE_D3D9_LAYER', 'MOZ_ENABLE_D3D10_LAYER'): +for var in ('MOZ_ENABLE_D3D10_LAYER'): if CONFIG[var]: DEFINES[var] = True diff --git a/widget/windows/nsToolkit.cpp b/widget/windows/nsToolkit.cpp index 5a3449be9ee3..e40a26e4021c 100644 --- a/widget/windows/nsToolkit.cpp +++ b/widget/windows/nsToolkit.cpp @@ -23,16 +23,6 @@ using namespace mozilla::widget; nsToolkit* nsToolkit::gToolkit = nullptr; HINSTANCE nsToolkit::mDllInstance = 0; -static const unsigned long kD3DUsageDelay = 5000; - -static void -StartAllowingD3D9(nsITimer *aTimer, void *aClosure) -{ - if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Desktop) { - nsWindow::StartAllowingD3D9(true); - } -} - MouseTrailer* nsToolkit::gMouseTrailer; //------------------------------------------------------------------------- @@ -49,14 +39,6 @@ nsToolkit::nsToolkit() #endif gMouseTrailer = &mMouseTrailer; - - if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Desktop) { - mD3D9Timer = do_CreateInstance("@mozilla.org/timer;1"); - mD3D9Timer->InitWithFuncCallback(::StartAllowingD3D9, - nullptr, - kD3DUsageDelay, - nsITimer::TYPE_ONE_SHOT); - } } @@ -86,15 +68,6 @@ nsToolkit::Shutdown() gToolkit = nullptr; } -void -nsToolkit::StartAllowingD3D9() -{ - if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Desktop) { - nsToolkit::GetToolkit()->mD3D9Timer->Cancel(); - nsWindow::StartAllowingD3D9(false); - } -} - //------------------------------------------------------------------------- // // Return the nsToolkit for the current thread. If a toolkit does not diff --git a/widget/windows/nsToolkit.h b/widget/windows/nsToolkit.h index 5a983bd5316e..2b4f5767c976 100644 --- a/widget/windows/nsToolkit.h +++ b/widget/windows/nsToolkit.h @@ -77,12 +77,10 @@ public: static void Startup(HMODULE hModule); static void Shutdown(); - static void StartAllowingD3D9(); protected: static nsToolkit* gToolkit; - nsCOMPtr mD3D9Timer; MouseTrailer mMouseTrailer; }; diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 258f15acf27a..00be1b370fe7 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -133,14 +133,6 @@ #include "mozilla/WindowsVersion.h" #include "nsThemeConstants.h" -#ifdef MOZ_ENABLE_D3D9_LAYER -#include "LayerManagerD3D9.h" -#endif - -#ifdef MOZ_ENABLE_D3D10_LAYER -#include "LayerManagerD3D10.h" -#endif - #include "nsIGfxInfo.h" #include "nsUXThemeConstants.h" #include "KeyboardLayout.h" @@ -256,9 +248,6 @@ int nsWindow::sTrimOnMinimize = 2; // Default value for general window class (used when the pref is the empty string). const char* nsWindow::sDefaultMainWindowClass = kClassNameGeneral; -// If we're using D3D9, this will not be allowed during initial 5 seconds. -bool nsWindow::sAllowD3D9 = false; - TriStateBool nsWindow::sHasBogusPopupsDropShadowOnMultiMonitor = TRI_UNKNOWN; // Used in OOPP plugin focus processing. @@ -3318,24 +3307,6 @@ nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager, *aAllowRetaining = true; } -#ifdef MOZ_ENABLE_D3D10_LAYER - if (mLayerManager) { - if (mLayerManager->GetBackendType() == LayersBackend::LAYERS_D3D10) - { - LayerManagerD3D10 *layerManagerD3D10 = - static_cast(mLayerManager.get()); - if (layerManagerD3D10->device() != - gfxWindowsPlatform::GetPlatform()->GetD3D10Device()) - { - MOZ_ASSERT(!mLayerManager->IsInTransaction()); - - mLayerManager->Destroy(); - mLayerManager = nullptr; - } - } - } -#endif - RECT windowRect; ::GetClientRect(mWnd, &windowRect); @@ -3349,59 +3320,8 @@ nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager, CreateCompositor(); } - if (!mLayerManager || - (!sAllowD3D9 && aPersistence == LAYER_MANAGER_PERSISTENT && - mLayerManager->GetBackendType() == LayersBackend::LAYERS_BASIC && - !ShouldUseOffMainThreadCompositing())) { - // If D3D9 is not currently allowed but the permanent manager is required, - // -and- we're currently using basic layers, run through this check. - LayerManagerPrefs prefs; - GetLayerManagerPrefs(&prefs); - - /* We don't currently support using an accelerated layer manager with - * transparent windows so don't even try. I'm also not sure if we even - * want to support this case. See bug #593471 */ - if (eTransparencyTransparent == mTransparencyMode || - prefs.mDisableAcceleration || - windowRect.right - windowRect.left > MAX_ACCELERATED_DIMENSION || - windowRect.bottom - windowRect.top > MAX_ACCELERATED_DIMENSION) - mUseLayersAcceleration = false; - else if (prefs.mAccelerateByDefault) - mUseLayersAcceleration = true; - - if (mUseLayersAcceleration) { - if (aPersistence == LAYER_MANAGER_PERSISTENT && !sAllowD3D9) { - MOZ_ASSERT(!mLayerManager || !mLayerManager->IsInTransaction()); - - // This will clear out our existing layer manager if we have one since - // if we hit this with a LayerManager we're always using BasicLayers. - nsToolkit::StartAllowingD3D9(); - } - -#ifdef MOZ_ENABLE_D3D10_LAYER - if (!prefs.mPreferD3D9 && !prefs.mPreferOpenGL) { - nsRefPtr layerManager = - new LayerManagerD3D10(this); - if (layerManager->Initialize(prefs.mForceAcceleration)) { - mLayerManager = layerManager; - } - } -#endif -#ifdef MOZ_ENABLE_D3D9_LAYER - if (!prefs.mPreferOpenGL && !mLayerManager && sAllowD3D9) { - nsRefPtr layerManager = - new LayerManagerD3D9(this); - if (layerManager->Initialize(prefs.mForceAcceleration)) { - mLayerManager = layerManager; - } - } -#endif - } - - // Fall back to software if we couldn't use any hardware backends. - if (!mLayerManager) { - mLayerManager = CreateBasicLayerManager(); - } + if (!mLayerManager) { + mLayerManager = CreateBasicLayerManager(); } NS_ASSERTION(mLayerManager, "Couldn't provide a valid layer manager."); @@ -6672,56 +6592,6 @@ bool nsWindow::AutoErase(HDC dc) return false; } -void -nsWindow::AllowD3D9Callback(nsWindow *aWindow) -{ - if (aWindow->mLayerManager && !aWindow->ShouldUseOffMainThreadCompositing()) { - aWindow->mLayerManager->Destroy(); - aWindow->mLayerManager = nullptr; - } -} - -void -nsWindow::AllowD3D9WithReinitializeCallback(nsWindow *aWindow) -{ - if (aWindow->mLayerManager && !aWindow->ShouldUseOffMainThreadCompositing()) { - aWindow->mLayerManager->Destroy(); - aWindow->mLayerManager = nullptr; - (void) aWindow->GetLayerManager(); - } -} - -void -nsWindow::StartAllowingD3D9(bool aReinitialize) -{ - sAllowD3D9 = true; - - LayerManagerPrefs prefs; - GetLayerManagerPrefs(&prefs); - if (prefs.mDisableAcceleration) { - // The guarantee here is, if there's *any* chance that after we - // throw out our layer managers we'd create at least one new, - // accelerated one, we *will* throw out all the current layer - // managers. We early-return here because currently, if - // |disableAcceleration|, we will always use basic managers and - // it's a waste to recreate them. If we're using OMTC we don't want to - // recreate out layer manager and its compositor either. This is even - // more wasteful. - // - // NB: the above implies that it's eminently possible for us to - // skip this early return but still recreate basic managers. - // That's OK. It's *not* OK to take this early return when we - // *might* have created an accelerated manager. - return; - } - - if (aReinitialize) { - EnumAllWindows(AllowD3D9WithReinitializeCallback); - } else { - EnumAllWindows(AllowD3D9Callback); - } -} - bool nsWindow::ShouldUseOffMainThreadCompositing() { diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h index 31c760e7e893..c071cd01c133 100644 --- a/widget/windows/nsWindow.h +++ b/widget/windows/nsWindow.h @@ -238,16 +238,6 @@ public: */ virtual bool AutoErase(HDC dc); - /** - * Start allowing Direct3D9 to be used by widgets when GetLayerManager is - * called. - * - * @param aReinitialize Call GetLayerManager on widgets to ensure D3D9 is - * initialized, this is usually called when this function - * is triggered by timeout and not user/web interaction. - */ - static void StartAllowingD3D9(bool aReinitialize); - /** * AssociateDefaultIMC() associates or disassociates the default IMC for * the window. @@ -314,8 +304,6 @@ protected: static BOOL CALLBACK ClearResourcesCallback(HWND aChild, LPARAM aParam); static BOOL CALLBACK EnumAllChildWindProc(HWND aWnd, LPARAM aParam); static BOOL CALLBACK EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam); - static void AllowD3D9Callback(nsWindow *aWindow); - static void AllowD3D9WithReinitializeCallback(nsWindow *aWindow); /** * Window utilities @@ -498,7 +486,6 @@ protected: static bool sIsInMouseCapture; static int sTrimOnMinimize; static const char* sDefaultMainWindowClass; - static bool sAllowD3D9; // Always use the helper method to read this property. See bug 603793. static TriStateBool sHasBogusPopupsDropShadowOnMultiMonitor; diff --git a/widget/windows/nsWindowGfx.cpp b/widget/windows/nsWindowGfx.cpp index 328fbbebb37a..0513112c78f4 100644 --- a/widget/windows/nsWindowGfx.cpp +++ b/widget/windows/nsWindowGfx.cpp @@ -44,12 +44,6 @@ using mozilla::plugins::PluginInstanceParent; #include "nsDebug.h" #include "nsIXULRuntime.h" -#ifdef MOZ_ENABLE_D3D9_LAYER -#include "LayerManagerD3D9.h" -#endif -#ifdef MOZ_ENABLE_D3D10_LAYER -#include "LayerManagerD3D10.h" -#endif #include "mozilla/layers/CompositorParent.h" #include "ClientLayerManager.h" @@ -521,37 +515,6 @@ bool nsWindow::OnPaint(HDC aDC, uint32_t aNestingLevel) } } break; -#ifdef MOZ_ENABLE_D3D9_LAYER - case LayersBackend::LAYERS_D3D9: - { - nsRefPtr layerManagerD3D9 = - static_cast(GetLayerManager()); - layerManagerD3D9->SetClippingRegion(region); - result = listener->PaintWindow(this, region); - if (layerManagerD3D9->DeviceWasRemoved()) { - mLayerManager->Destroy(); - mLayerManager = nullptr; - // When our device was removed, we should have gfxWindowsPlatform - // check if its render mode is up to date! - gfxWindowsPlatform::GetPlatform()->UpdateRenderMode(); - Invalidate(); - } - } - break; -#endif -#ifdef MOZ_ENABLE_D3D10_LAYER - case LayersBackend::LAYERS_D3D10: - { - gfxWindowsPlatform::GetPlatform()->UpdateRenderMode(); - LayerManagerD3D10 *layerManagerD3D10 = static_cast(GetLayerManager()); - if (layerManagerD3D10->device() != gfxWindowsPlatform::GetPlatform()->GetD3D10Device()) { - Invalidate(); - } else { - result = listener->PaintWindow(this, region); - } - } - break; -#endif case LayersBackend::LAYERS_CLIENT: result = listener->PaintWindow(this, region); break; diff --git a/widget/windows/winrt/MetroWidget.cpp b/widget/windows/winrt/MetroWidget.cpp index 3c1d74cbcc3d..23e66225bc94 100644 --- a/widget/windows/winrt/MetroWidget.cpp +++ b/widget/windows/winrt/MetroWidget.cpp @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ContentHelper.h" -#include "LayerManagerD3D10.h" #include "MetroWidget.h" #include "MetroApp.h" #include "mozilla/Preferences.h" @@ -1005,17 +1004,6 @@ MetroWidget::ShouldUseOffMainThreadCompositing() mWindowType == eWindowType_toplevel; } -bool -MetroWidget::ShouldUseMainThreadD3D10Manager() -{ - // Either we're not initialized yet, or this is the toolkit widget - if (!mView) { - return false; - } - return !gfxPlatform::UsesOffMainThreadCompositing() && - mWindowType == eWindowType_toplevel; -} - bool MetroWidget::ShouldUseBasicManager() { @@ -1158,22 +1146,6 @@ MetroWidget::GetLayerManager(PLayerTransactionChild* aShadowManager, retaining = false; } - // If the backend device has changed, create a new manager (pulled from nswindow) - if (mLayerManager) { - if (mLayerManager->GetBackendType() == LayersBackend::LAYERS_D3D10) { - LayerManagerD3D10 *layerManagerD3D10 = - static_cast(mLayerManager.get()); - if (layerManagerD3D10->device() != - gfxWindowsPlatform::GetPlatform()->GetD3D10Device()) { - MOZ_ASSERT(!mLayerManager->IsInTransaction()); - - mLayerManager->Destroy(); - mLayerManager = nullptr; - retaining = false; - } - } - } - HRESULT hr = S_OK; // Create a layer manager: try to use an async compositor first, if enabled. @@ -1182,13 +1154,7 @@ MetroWidget::GetLayerManager(PLayerTransactionChild* aShadowManager, if (ShouldUseOffMainThreadCompositing()) { NS_ASSERTION(aShadowManager == nullptr, "Async Compositor not supported with e10s"); CreateCompositor(); - } else if (ShouldUseMainThreadD3D10Manager()) { - nsRefPtr layerManager = - new mozilla::layers::LayerManagerD3D10(this); - if (layerManager->Initialize(true, &hr)) { - mLayerManager = layerManager; - } - } else if (ShouldUseBasicManager()) { + } else { mLayerManager = CreateBasicLayerManager(); } // Either we're not ready to initialize yet due to a missing view pointer, diff --git a/widget/windows/winrt/MetroWidget.h b/widget/windows/winrt/MetroWidget.h index 5ce0dc3ade68..d0bc8c8f435b 100644 --- a/widget/windows/winrt/MetroWidget.h +++ b/widget/windows/winrt/MetroWidget.h @@ -148,7 +148,6 @@ public: virtual bool IsEnabled() const; // ShouldUseOffMainThreadCompositing is defined in base widget virtual bool ShouldUseOffMainThreadCompositing(); - bool ShouldUseMainThreadD3D10Manager(); bool ShouldUseBasicManager(); bool ShouldUseAPZC(); virtual LayerManager* GetLayerManager(PLayerTransactionChild* aShadowManager = nullptr, diff --git a/xpcom/tests/moz.build b/xpcom/tests/moz.build index d8687cf3fab4..93c4f938e4f2 100644 --- a/xpcom/tests/moz.build +++ b/xpcom/tests/moz.build @@ -80,7 +80,6 @@ if CONFIG['MOZ_MEMORY']: # XXX Make these tests work in libxul builds. #CPP_UNIT_TESTS += [ -# 'TestTArray', # 'TestThreadPool', # 'TestThreads', # 'TestTimeStamp',