From 3b37f2da2761c29914ab9da05aeb346ea725e6d5 Mon Sep 17 00:00:00 2001 From: Milan Sreckovic Date: Wed, 5 Mar 2014 16:25:09 -0500 Subject: [PATCH 01/70] Bug 910860: Use gfxPrefs to make sure preferences are evaluated on the main thread. This still leaves the preference re-evaluated all the time, not just at startup. Changing that is another bug. r=bgirard. --- gfx/thebes/gfxPlatform.cpp | 48 +++++++++++++++++--------------------- gfx/thebes/gfxPrefs.h | 5 ++++ image/src/ImageFactory.cpp | 3 +++ 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 8e483ae73abf..776d2619cdd5 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -104,7 +104,10 @@ static qcms_transform *gCMSRGBATransform = nullptr; static bool gCMSInitialized = false; static eCMSMode gCMSMode = eCMSMode_Off; -static int gCMSIntent = -2; + +static bool gCMSIntentInitialized = false; +static int gCMSIntent = QCMS_INTENT_DEFAULT; + static void ShutdownCMS(); @@ -138,12 +141,7 @@ NS_IMPL_ISUPPORTS2(SRGBOverrideObserver, nsIObserver, nsISupportsWeakReference) #define BIDI_NUMERAL_PREF "bidi.numeral" -#define GFX_PREF_CMS_RENDERING_INTENT "gfx.color_management.rendering_intent" -#define GFX_PREF_CMS_DISPLAY_PROFILE "gfx.color_management.display_profile" -#define GFX_PREF_CMS_ENABLED_OBSOLETE "gfx.color_management.enabled" #define GFX_PREF_CMS_FORCE_SRGB "gfx.color_management.force_srgb" -#define GFX_PREF_CMS_ENABLEV4 "gfx.color_management.enablev4" -#define GFX_PREF_CMS_MODE "gfx.color_management.mode" NS_IMETHODIMP SRGBOverrideObserver::Observe(nsISupports *aSubject, @@ -1500,17 +1498,14 @@ gfxPlatform::GetCMSMode() { if (gCMSInitialized == false) { gCMSInitialized = true; - nsresult rv; - int32_t mode; - rv = Preferences::GetInt(GFX_PREF_CMS_MODE, &mode); - if (NS_SUCCEEDED(rv) && (mode >= 0) && (mode < eCMSMode_AllCount)) { + int32_t mode = gfxPrefs::CMSMode(); + if (mode >= 0 && mode < eCMSMode_AllCount) { gCMSMode = static_cast(mode); } - bool enableV4; - rv = Preferences::GetBool(GFX_PREF_CMS_ENABLEV4, &enableV4); - if (NS_SUCCEEDED(rv) && enableV4) { + bool enableV4 = gfxPrefs::CMSEnableV4(); + if (enableV4) { qcms_enable_iccv4(); } } @@ -1520,23 +1515,22 @@ gfxPlatform::GetCMSMode() int gfxPlatform::GetRenderingIntent() { - if (gCMSIntent == -2) { + if (!gCMSIntentInitialized) { + gCMSIntentInitialized = true; + + // gfxPrefs.h is using 0 as the default for the rendering + // intent preference, based on that being the value for + // QCMS_INTENT_DEFAULT. Assert here to catch if that ever + // changes and we can then figure out what to do about it. + MOZ_ASSERT(QCMS_INTENT_DEFAULT == 0); /* Try to query the pref system for a rendering intent. */ - int32_t pIntent; - if (NS_SUCCEEDED(Preferences::GetInt(GFX_PREF_CMS_RENDERING_INTENT, &pIntent))) { - /* If the pref is within range, use it as an override. */ - if ((pIntent >= QCMS_INTENT_MIN) && (pIntent <= QCMS_INTENT_MAX)) { - gCMSIntent = pIntent; - } + int32_t pIntent = gfxPrefs::CMSRenderingIntent(); + if ((pIntent >= QCMS_INTENT_MIN) && (pIntent <= QCMS_INTENT_MAX)) { + gCMSIntent = pIntent; + } else { /* If the pref is out of range, use embedded profile. */ - else { - gCMSIntent = -1; - } - } - /* If we didn't get a valid intent from prefs, use the default. */ - else { - gCMSIntent = QCMS_INTENT_DEFAULT; + gCMSIntent = -1; } } return gCMSIntent; diff --git a/gfx/thebes/gfxPrefs.h b/gfx/thebes/gfxPrefs.h index 117704a6767d..6691db6b93b6 100644 --- a/gfx/thebes/gfxPrefs.h +++ b/gfx/thebes/gfxPrefs.h @@ -118,6 +118,11 @@ private: DECL_GFX_PREF(Once, "gfx.canvas.skiagl.cache-size", CanvasSkiaGLCacheSize, int32_t, 96); DECL_GFX_PREF(Once, "gfx.canvas.skiagl.cache-items", CanvasSkiaGLCacheItems, int32_t, 256); + DECL_GFX_PREF(Live, "gfx.color_management.enablev4", CMSEnableV4, bool, false); + DECL_GFX_PREF(Live, "gfx.color_management.mode", CMSMode, int32_t,-1); + // The zero default here should match QCMS_INTENT_DEFAULT from qcms.h + DECL_GFX_PREF(Live, "gfx.color_management.rendering_intent", CMSRenderingIntent, int32_t, 0); + DECL_GFX_PREF(Once, "gfx.direct2d.disabled", Direct2DDisabled, bool, false); DECL_GFX_PREF(Once, "gfx.direct2d.force-enabled", Direct2DForceEnabled, bool, false); DECL_GFX_PREF(Live, "gfx.gralloc.fence-with-readpixels", GrallocFenceWithReadPixels, bool, false); diff --git a/image/src/ImageFactory.cpp b/image/src/ImageFactory.cpp index edced3112261..e9dcfa2a9f1f 100644 --- a/image/src/ImageFactory.cpp +++ b/image/src/ImageFactory.cpp @@ -23,6 +23,7 @@ #include "nsIScriptSecurityManager.h" #include "ImageFactory.h" +#include "gfxPrefs.h" namespace mozilla { namespace image { @@ -38,6 +39,8 @@ ImageFactory::Initialize() { MOZ_ASSERT(NS_IsMainThread()); if (!gInitializedPrefCaches) { + // Initialize the graphics preferences + gfxPrefs::GetSingleton(); Preferences::AddBoolVarCache(&gDiscardable, "image.mem.discardable"); Preferences::AddBoolVarCache(&gDecodeOnDraw, "image.mem.decodeondraw"); Preferences::AddBoolVarCache(&gEnableMozSampleSize, "image.mozsamplesize.enabled"); From d40d37485102677646459a612b73ce12ddf67e62 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Wed, 5 Mar 2014 21:28:12 +0000 Subject: [PATCH 02/70] Bug 979407 - Fix ASSERTION: viewport height must be nonnegative, with negative markerHeight or markerWidth attribute. r=dholbert --- layout/svg/crashtests/979407-1.svg | 4 ++++ layout/svg/crashtests/979407-2.svg | 4 ++++ layout/svg/crashtests/crashtests.list | 2 ++ layout/svg/nsSVGMarkerFrame.cpp | 6 ++++++ 4 files changed, 16 insertions(+) create mode 100644 layout/svg/crashtests/979407-1.svg create mode 100644 layout/svg/crashtests/979407-2.svg diff --git a/layout/svg/crashtests/979407-1.svg b/layout/svg/crashtests/979407-1.svg new file mode 100644 index 000000000000..b615f3bec297 --- /dev/null +++ b/layout/svg/crashtests/979407-1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/layout/svg/crashtests/979407-2.svg b/layout/svg/crashtests/979407-2.svg new file mode 100644 index 000000000000..75aee0634506 --- /dev/null +++ b/layout/svg/crashtests/979407-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/layout/svg/crashtests/crashtests.list b/layout/svg/crashtests/crashtests.list index 7ee3e5f5406e..fc8226c0f487 100644 --- a/layout/svg/crashtests/crashtests.list +++ b/layout/svg/crashtests/crashtests.list @@ -181,3 +181,5 @@ load 952270-1.svg load 963086-1.svg load 975773-1.svg load 974746-1.svg +load 979407-1.svg +load 979407-2.svg \ No newline at end of file diff --git a/layout/svg/nsSVGMarkerFrame.cpp b/layout/svg/nsSVGMarkerFrame.cpp index fc4d4e234e46..a7ba27f1058c 100644 --- a/layout/svg/nsSVGMarkerFrame.cpp +++ b/layout/svg/nsSVGMarkerFrame.cpp @@ -116,6 +116,9 @@ nsSVGMarkerFrame::PaintMark(nsRenderingContext *aContext, AutoMarkerReferencer markerRef(this, aMarkedFrame); SVGMarkerElement *marker = static_cast(mContent); + if (!marker->HasValidDimensions()) { + return NS_OK; + } const nsSVGViewBoxRect viewBox = marker->GetViewBoxRect(); @@ -171,6 +174,9 @@ nsSVGMarkerFrame::GetMarkBBoxContribution(const Matrix &aToBBoxUserspace, AutoMarkerReferencer markerRef(this, aMarkedFrame); SVGMarkerElement *content = static_cast(mContent); + if (!content->HasValidDimensions()) { + return bbox; + } const nsSVGViewBoxRect viewBox = content->GetViewBoxRect(); From 9875c89a85447a29079cf2d9b9cea3d9f2bf26ea Mon Sep 17 00:00:00 2001 From: Yura Zenevich Date: Wed, 5 Mar 2014 16:45:29 -0500 Subject: [PATCH 03/70] Bug 976082 - added tests for Touch Adapter. r=eeejay --- accessible/tests/mochitest/jsat/a11y.ini | 3 + accessible/tests/mochitest/jsat/dom_helper.js | 157 +++++++++++++++++++++ accessible/tests/mochitest/jsat/gestures.json | 132 +++++++++++++++++ accessible/tests/mochitest/jsat/jsatcommon.js | 15 +- .../tests/mochitest/jsat/test_touch_adapter.html | 54 +++++++ 5 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 accessible/tests/mochitest/jsat/dom_helper.js create mode 100644 accessible/tests/mochitest/jsat/gestures.json create mode 100644 accessible/tests/mochitest/jsat/test_touch_adapter.html --- accessible/tests/mochitest/jsat/a11y.ini | 3 + accessible/tests/mochitest/jsat/dom_helper.js | 157 ++++++++++++++++++ accessible/tests/mochitest/jsat/gestures.json | 132 +++++++++++++++ accessible/tests/mochitest/jsat/jsatcommon.js | 15 +- .../mochitest/jsat/test_touch_adapter.html | 54 ++++++ 5 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 accessible/tests/mochitest/jsat/dom_helper.js create mode 100644 accessible/tests/mochitest/jsat/gestures.json create mode 100644 accessible/tests/mochitest/jsat/test_touch_adapter.html diff --git a/accessible/tests/mochitest/jsat/a11y.ini b/accessible/tests/mochitest/jsat/a11y.ini index c0d42259db02..bbbd8f2298f3 100644 --- a/accessible/tests/mochitest/jsat/a11y.ini +++ b/accessible/tests/mochitest/jsat/a11y.ini @@ -1,5 +1,7 @@ [DEFAULT] support-files = + dom_helper.js + gestures.json jsatcommon.js output.js doc_traversal.html @@ -12,4 +14,5 @@ support-files = [test_live_regions.html] [test_output.html] [test_tables.html] +[test_touch_adapter.html] [test_traversal.html] diff --git a/accessible/tests/mochitest/jsat/dom_helper.js b/accessible/tests/mochitest/jsat/dom_helper.js new file mode 100644 index 000000000000..a1711ab9766a --- /dev/null +++ b/accessible/tests/mochitest/jsat/dom_helper.js @@ -0,0 +1,157 @@ +'use strict'; + +/*global getMainChromeWindow, getBoundsForDOMElm, AccessFuTest, Point*/ +/* exported loadJSON*/ + +const Ci = Components.interfaces; +const Cu = Components.utils; + +Cu.import('resource://gre/modules/accessibility/Utils.jsm'); +Cu.import('resource://gre/modules/Geometry.jsm'); + +var win = getMainChromeWindow(window); + +var winUtils = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface( + Ci.nsIDOMWindowUtils); + +/** + * For a given list of points calculate their coordinates in relation to the + * document body. + * @param {Array} aTouchPoints An array of objects of the following format: { + * base: {String}, // Id of an element to server as a base for the touch. + * x: {Number}, // An optional x offset from the base element's geometric + * // centre. + * y: {Number} // An optional y offset from the base element's geometric + * // centre. + * } + * @return {JSON} An array of {x, y} coordinations. + */ +function calculateTouchListCoordinates(aTouchPoints) { + var coords = []; + var dpi = winUtils.displayDPI; + for (var i = 0, target = aTouchPoints[i]; i < aTouchPoints.length; ++i) { + var bounds = getBoundsForDOMElm(target.base); + var parentBounds = getBoundsForDOMElm('root'); + var point = new Point(target.x || 0, target.y || 0); + point.scale(dpi); + point.add(bounds[0], bounds[1]); + point.add(bounds[2] / 2, bounds[3] / 2); + point.subtract(parentBounds[0], parentBounds[0]); + coords.push({ + x: point.x, + y: point.y + }); + } + return coords; +} + +/** + * Send a touch event with specified touchPoints. + * @param {Array} aTouchPoints An array of points to be associated with + * touches. + * @param {String} aName A name of the touch event. + */ +function sendTouchEvent(aTouchPoints, aName) { + var touchList = sendTouchEvent.touchList; + if (aName === 'touchend') { + sendTouchEvent.touchList = null; + } else { + var coords = calculateTouchListCoordinates(aTouchPoints); + var touches = []; + for (var i = 0; i < coords.length; ++i) { + var {x, y} = coords[i]; + var node = document.elementFromPoint(x, y); + var touch = document.createTouch(window, node, aName === 'touchstart' ? + 1 : touchList.item(i).identifier, x, y, x, y); + touches.push(touch); + } + touchList = document.createTouchList(touches); + sendTouchEvent.touchList = touchList; + } + var evt = document.createEvent('TouchEvent'); + evt.initTouchEvent(aName, true, true, window, 0, false, false, false, false, + touchList, touchList, touchList); + document.dispatchEvent(evt); +} + +sendTouchEvent.touchList = null; + +/** + * A map of event names to the functions that actually send them. + * @type {Object} + */ +var eventMap = { + touchstart: sendTouchEvent, + touchend: sendTouchEvent, + touchmove: sendTouchEvent +}; + +/** + * Attach a listener for the mozAccessFuGesture event that tests its + * type. + * @param {Array} aExpectedGestures A stack of expected event types. + * Note: the listener is removed once the stack reaches 0. + */ +function testMozAccessFuGesture(aExpectedGestures) { + var types = typeof aExpectedGestures === "string" ? + [aExpectedGestures] : aExpectedGestures; + function handleGesture(aEvent) { + is(aEvent.detail.type, types.shift(), + 'Received correct mozAccessFuGesture: ' + aExpectedGestures + '.'); + if (types.length === 0) { + win.removeEventListener('mozAccessFuGesture', handleGesture); + AccessFuTest.nextTest(); + } + } + win.addEventListener('mozAccessFuGesture', handleGesture); +} + +/** + * An extention to AccessFuTest that adds an ability to test a sequence of + * touch/mouse/etc events and their expected mozAccessFuGesture events. + * @param {Array} aSequence An array of touch/mouse/etc events to be generated + * and the expected mozAccessFuGesture events. + */ +AccessFuTest.addSequence = function AccessFuTest_addSequence(aSequence) { + aSequence.forEach(function add(step) { + function fireEvent() { + eventMap[step.type](step.target, step.type); + } + function runStep() { + if (step.expectedGestures) { + testMozAccessFuGesture(step.expectedGestures); + fireEvent(); + } else { + fireEvent(); + AccessFuTest.nextTest(); + } + } + AccessFuTest.addFunc(function() { + if (step.delay) { + window.setTimeout(runStep, step.delay); + } else { + runStep(); + } + }); + }); + AccessFuTest.addFunc(function() { + // In order to isolate sequences of touch/mouse/etc events run them with 1s + // timeout. + window.setTimeout(AccessFuTest.nextTest, 1000); + }); +}; + +/** + * A helper function that loads JSON files. + * @param {String} aPath A path to a JSON file. + * @param {Function} aCallback A callback to be called on success. + */ +function loadJSON(aPath, aCallback) { + var request = new XMLHttpRequest(); + request.open('GET', aPath, true); + request.responseType = 'json'; + request.onload = function onload() { + aCallback(request.response); + }; + request.send(); +} diff --git a/accessible/tests/mochitest/jsat/gestures.json b/accessible/tests/mochitest/jsat/gestures.json new file mode 100644 index 000000000000..e073521014d8 --- /dev/null +++ b/accessible/tests/mochitest/jsat/gestures.json @@ -0,0 +1,132 @@ +[ + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchend", "delay": 100, "expectedGestures": "tap"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.03, "y": 0.02}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "tap"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "expectedGestures": "dwell"}, + {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.03, "y": 0.02}], + "delay": 50}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100}, + {"type": "touchmove", "target": [{"base": "button", "x": -0.03, "y": 0.01}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "doubletap"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100}, + {"type": "touchend", "delay": 100, "expectedGestures": "tripletap"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100, "expectedGestures": "doubletaphold"}, + {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchend", "delay": 100}, + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 100, "expectedGestures": "taphold"}, + {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0.5, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipeleft"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0.5}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipedown"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0.5}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipeup"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0.1}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0.5, "y": 0.1}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": -0.05}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipeleft"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, + {"type": "touchmove", "target": [{"base": "button", "x": -0.1, "y": 0.5}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipedown"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swipeup"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 450, "expectedGestures": "explore"}, + {"type": "touchend", "delay": 100, "expectedGestures": "exploreend"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], + "delay": 450, "expectedGestures": "explore"}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.1, "y": 0.5}], + "delay": 150, "expectedGestures": "explore"}, + {"type": "touchend", "delay": 100, "expectedGestures": "exploreend"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}, + {"base": "button", "x": 0, "y": 0.5}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}, + {"base": "button", "x": 0.5, "y": 0.5}], "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} + ], + [ + {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}, + {"base": "button", "x": 0, "y": 0.5}, + {"base": "button", "x": 0, "y": 1}]}, + {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}, + {"base": "button", "x": 0.5, "y": 0.5}, + {"base": "button", "x": 0.5, "y": 1}], + "delay": 50}, + {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} + ] +] diff --git a/accessible/tests/mochitest/jsat/jsatcommon.js b/accessible/tests/mochitest/jsat/jsatcommon.js index 7d3aaceb6a65..3393a66bf947 100644 --- a/accessible/tests/mochitest/jsat/jsatcommon.js +++ b/accessible/tests/mochitest/jsat/jsatcommon.js @@ -1,5 +1,10 @@ // A common module to run tests on the AccessFu module +'use strict'; + +/*global isDeeply, getMainChromeWindow, SimpleTest, SpecialPowers, Logger, + AccessFu, Utils, addMessageListener, currentTabDocument, currentBrowser*/ + /** * A global variable holding an array of test functions. */ @@ -117,12 +122,12 @@ var AccessFuTest = { runTests: function AccessFuTest_runTests() { if (gTestFuncs.length === 0) { ok(false, "No tests specified!"); - simpleTest.finish(); + SimpleTest.finish(); return; } // Create an Iterator for gTestFuncs array. - gIterator = Iterator(gTestFuncs); + gIterator = Iterator(gTestFuncs); // jshint ignore:line // Start AccessFu and put it in stand-by. Components.utils.import("resource://gre/modules/accessibility/AccessFu.jsm"); @@ -144,7 +149,7 @@ var AccessFuTest = { AccessFuTest.nextTest(); } else { // Run all test functions synchronously. - [testFunc() for (testFunc of gTestFuncs)]; + [testFunc() for (testFunc of gTestFuncs)]; // jshint ignore:line AccessFuTest.finish(); } }); @@ -199,7 +204,7 @@ AccessFuContentTest.prototype = { } aMessageManager.addMessageListener('AccessFu:Present', this); - aMessageManager.addMessageListener('AccessFu:Ready', function (aMessage) { + aMessageManager.addMessageListener('AccessFu:Ready', function () { aMessageManager.addMessageListener('AccessFu:ContentStarted', aCallback); aMessageManager.sendAsyncMessage('AccessFu:Start', { buildApp: 'browser' }); }); @@ -226,7 +231,7 @@ AccessFuContentTest.prototype = { } } else if (this.finishedCallback) { for (var mm of this.mms) { - mm.sendAsyncMessage('AccessFu:Stop'); + mm.sendAsyncMessage('AccessFu:Stop'); } this.finishedCallback(); } diff --git a/accessible/tests/mochitest/jsat/test_touch_adapter.html b/accessible/tests/mochitest/jsat/test_touch_adapter.html new file mode 100644 index 000000000000..2aba79504dbf --- /dev/null +++ b/accessible/tests/mochitest/jsat/test_touch_adapter.html @@ -0,0 +1,54 @@ + + + + AccessFu tests for touch adapters. + + + + + + + + + + + + + Mozilla Bug 976082 + +
+ +
+ + From 1fd761ef373636651eb85413ea349850b39b12c3 Mon Sep 17 00:00:00 2001 From: James Willcox Date: Wed, 5 Mar 2014 15:48:58 -0600 Subject: [PATCH 04/70] Bug 956993 - Rely on OES_EGL_image_external for SharedSurface_EGLImage r=jgilbert --- gfx/gl/ScopedGLHelpers.cpp | 1 + gfx/gl/SharedSurfaceEGL.cpp | 151 ++++++--------------------- gfx/gl/SharedSurfaceEGL.h | 22 ++-- gfx/layers/opengl/TextureHostOGL.cpp | 13 +-- gfx/thebes/gfxAndroidPlatform.cpp | 17 +++ gfx/thebes/gfxAndroidPlatform.h | 2 + 6 files changed, 64 insertions(+), 142 deletions(-) diff --git a/gfx/gl/ScopedGLHelpers.cpp b/gfx/gl/ScopedGLHelpers.cpp index 73706eb92eb7..18ae2d122e60 100644 --- a/gfx/gl/ScopedGLHelpers.cpp +++ b/gfx/gl/ScopedGLHelpers.cpp @@ -124,6 +124,7 @@ ScopedBindTexture::Init(GLenum aTarget) GLenum bindingTarget = (aTarget == LOCAL_GL_TEXTURE_2D) ? LOCAL_GL_TEXTURE_BINDING_2D : (aTarget == LOCAL_GL_TEXTURE_RECTANGLE_ARB) ? LOCAL_GL_TEXTURE_BINDING_RECTANGLE_ARB : (aTarget == LOCAL_GL_TEXTURE_CUBE_MAP) ? LOCAL_GL_TEXTURE_BINDING_CUBE_MAP + : (aTarget == LOCAL_GL_TEXTURE_EXTERNAL) ? LOCAL_GL_TEXTURE_EXTERNAL : LOCAL_GL_NONE; MOZ_ASSERT(bindingTarget != LOCAL_GL_NONE); mGL->GetUIntegerv(bindingTarget, &mOldTex); diff --git a/gfx/gl/SharedSurfaceEGL.cpp b/gfx/gl/SharedSurfaceEGL.cpp index 0e502cde7a4d..3525b71defe0 100644 --- a/gfx/gl/SharedSurfaceEGL.cpp +++ b/gfx/gl/SharedSurfaceEGL.cpp @@ -27,18 +27,30 @@ SharedSurface_EGLImage::Create(GLContext* prodGL, { GLLibraryEGL* egl = &sEGLLibrary; MOZ_ASSERT(egl); + MOZ_ASSERT(context); - if (!HasExtensions(egl, prodGL)) + if (!HasExtensions(egl, prodGL)) { return nullptr; + } MOZ_ALWAYS_TRUE(prodGL->MakeCurrent()); GLuint prodTex = CreateTextureForOffscreen(prodGL, formats, size); - if (!prodTex) + if (!prodTex) { return nullptr; + } + + EGLClientBuffer buffer = reinterpret_cast(prodTex); + EGLImage image = egl->fCreateImage(egl->Display(), context, + LOCAL_EGL_GL_TEXTURE_2D, buffer, + nullptr); + if (!image) { + prodGL->fDeleteTextures(1, &prodTex); + return nullptr; + } return new SharedSurface_EGLImage(prodGL, egl, size, hasAlpha, - formats, prodTex); + formats, prodTex, image); } @@ -47,7 +59,7 @@ SharedSurface_EGLImage::HasExtensions(GLLibraryEGL* egl, GLContext* gl) { return egl->HasKHRImageBase() && egl->IsExtensionSupported(GLLibraryEGL::KHR_gl_texture_2D_image) && - gl->IsExtensionSupported(GLContext::OES_EGL_image); + gl->IsExtensionSupported(GLContext::OES_EGL_image_external); } SharedSurface_EGLImage::SharedSurface_EGLImage(GLContext* gl, @@ -55,7 +67,8 @@ SharedSurface_EGLImage::SharedSurface_EGLImage(GLContext* gl, const gfx::IntSize& size, bool hasAlpha, const GLFormats& formats, - GLuint prodTex) + GLuint prodTex, + EGLImage image) : SharedSurface_GL(SharedSurfaceType::EGLImageShare, AttachmentType::GLTexture, gl, @@ -65,14 +78,10 @@ SharedSurface_EGLImage::SharedSurface_EGLImage(GLContext* gl, , mEGL(egl) , mFormats(formats) , mProdTex(prodTex) - , mProdTexForPipe(0) - , mImage(0) + , mImage(image) , mCurConsGL(nullptr) , mConsTex(0) , mSync(0) - , mPipeFailed(false) - , mPipeComplete(false) - , mPipeActive(false) {} SharedSurface_EGLImage::~SharedSurface_EGLImage() @@ -84,11 +93,6 @@ SharedSurface_EGLImage::~SharedSurface_EGLImage() mGL->fDeleteTextures(1, &mProdTex); mProdTex = 0; - if (mProdTexForPipe) { - mGL->fDeleteTextures(1, &mProdTexForPipe); - mProdTexForPipe = 0; - } - if (mConsTex) { MOZ_ASSERT(mGarbageBin); mGarbageBin->Trash(mConsTex); @@ -103,94 +107,12 @@ SharedSurface_EGLImage::~SharedSurface_EGLImage() } } -void -SharedSurface_EGLImage::LockProdImpl() -{ - MutexAutoLock lock(mMutex); - - if (!mPipeComplete) - return; - - if (mPipeActive) - return; - - mGL->BlitHelper()->BlitTextureToTexture(mProdTex, mProdTexForPipe, Size(), Size()); - mGL->fDeleteTextures(1, &mProdTex); - mProdTex = mProdTexForPipe; - mProdTexForPipe = 0; - mPipeActive = true; -} - -static bool -CreateTexturePipe(GLLibraryEGL* const egl, GLContext* const gl, - const GLFormats& formats, const gfx::IntSize& size, - GLuint* const out_tex, EGLImage* const out_image) -{ - MOZ_ASSERT(out_tex && out_image); - *out_tex = 0; - *out_image = 0; - - GLuint tex = CreateTextureForOffscreen(gl, formats, size); - if (!tex) - return false; - - EGLContext context = GLContextEGL::Cast(gl)->GetEGLContext(); - MOZ_ASSERT(context); - EGLClientBuffer buffer = reinterpret_cast(tex); - EGLImage image = egl->fCreateImage(egl->Display(), context, - LOCAL_EGL_GL_TEXTURE_2D, buffer, - nullptr); - if (!image) { - gl->fDeleteTextures(1, &tex); - return false; - } - - // Success. - *out_tex = tex; - *out_image = image; - return true; -} - void SharedSurface_EGLImage::Fence() { MutexAutoLock lock(mMutex); mGL->MakeCurrent(); - if (!mPipeActive) { - MOZ_ASSERT(!mSync); - MOZ_ASSERT(!mPipeComplete); - - if (!mPipeFailed) { - if (!CreateTexturePipe(mEGL, mGL, mFormats, Size(), - &mProdTexForPipe, &mImage)) - { - mPipeFailed = true; - } - } - - if (!mPixels) { - SurfaceFormat format = - HasAlpha() ? SurfaceFormat::B8G8R8A8 - : SurfaceFormat::B8G8R8X8; - mPixels = Factory::CreateDataSourceSurface(Size(), format); - } - - DataSourceSurface::MappedSurface map; - mPixels->Map(DataSourceSurface::MapType::WRITE, &map); - - nsRefPtr wrappedData = - new gfxImageSurface(map.mData, - ThebesIntSize(mPixels->GetSize()), - map.mStride, - SurfaceFormatToImageFormat(mPixels->GetFormat())); - ReadScreenIntoImageSurface(mGL, wrappedData); - mPixels->Unmap(); - return; - } - MOZ_ASSERT(mPipeActive); - MOZ_ASSERT(mCurConsGL); - if (mEGL->IsExtensionSupported(GLLibraryEGL::KHR_fence_sync) && mGL->IsExtensionSupported(GLContext::OES_EGL_sync)) { @@ -249,42 +171,28 @@ SharedSurface_EGLImage::Display() const return mEGL->Display(); } -GLuint -SharedSurface_EGLImage::AcquireConsumerTexture(GLContext* consGL) +void +SharedSurface_EGLImage::AcquireConsumerTexture(GLContext* consGL, GLuint* out_texture, GLuint* out_target) { MutexAutoLock lock(mMutex); MOZ_ASSERT(!mCurConsGL || consGL == mCurConsGL); - if (mPipeFailed) - return 0; - - if (mPipeActive) { - MOZ_ASSERT(mConsTex); - - return mConsTex; - } if (!mConsTex) { consGL->fGenTextures(1, &mConsTex); - ScopedBindTexture autoTex(consGL, mConsTex); - consGL->fEGLImageTargetTexture2D(LOCAL_GL_TEXTURE_2D, mImage); + MOZ_ASSERT(mConsTex); + + ScopedBindTexture autoTex(consGL, mConsTex, LOCAL_GL_TEXTURE_EXTERNAL); + consGL->fEGLImageTargetTexture2D(LOCAL_GL_TEXTURE_EXTERNAL, mImage); - mPipeComplete = true; mCurConsGL = consGL; mGarbageBin = consGL->TexGarbageBin(); } MOZ_ASSERT(consGL == mCurConsGL); - return 0; + *out_texture = mConsTex; + *out_target = LOCAL_GL_TEXTURE_EXTERNAL; } -DataSourceSurface* -SharedSurface_EGLImage::GetPixels() const -{ - MutexAutoLock lock(mMutex); - return mPixels; -} - - SurfaceFactory_EGLImage* SurfaceFactory_EGLImage::Create(GLContext* prodGL, @@ -292,6 +200,11 @@ SurfaceFactory_EGLImage::Create(GLContext* prodGL, { EGLContext context = GLContextEGL::Cast(prodGL)->GetEGLContext(); + GLLibraryEGL* egl = &sEGLLibrary; + if (!SharedSurface_EGLImage::HasExtensions(egl, prodGL)) { + return nullptr; + } + return new SurfaceFactory_EGLImage(prodGL, context, caps); } diff --git a/gfx/gl/SharedSurfaceEGL.h b/gfx/gl/SharedSurfaceEGL.h index 03339f44bb75..fbb662acf2d7 100644 --- a/gfx/gl/SharedSurfaceEGL.h +++ b/gfx/gl/SharedSurfaceEGL.h @@ -35,37 +35,34 @@ public: return (SharedSurface_EGLImage*)surf; } + static bool HasExtensions(GLLibraryEGL* egl, GLContext* gl); + protected: mutable Mutex mMutex; GLLibraryEGL* const mEGL; const GLFormats mFormats; GLuint mProdTex; - RefPtr mPixels; - GLuint mProdTexForPipe; // Moves to mProdTex when mPipeActive becomes true. EGLImage mImage; GLContext* mCurConsGL; GLuint mConsTex; nsRefPtr mGarbageBin; EGLSync mSync; - bool mPipeFailed; // Pipe creation failed, and has been abandoned. - bool mPipeComplete; // Pipe connects (mPipeActive ? mProdTex : mProdTexForPipe) to mConsTex. - bool mPipeActive; // Pipe is complete and in use for production. SharedSurface_EGLImage(GLContext* gl, GLLibraryEGL* egl, const gfx::IntSize& size, bool hasAlpha, const GLFormats& formats, - GLuint prodTex); + GLuint prodTex, + EGLImage image); EGLDisplay Display() const; - static bool HasExtensions(GLLibraryEGL* egl, GLContext* gl); public: virtual ~SharedSurface_EGLImage(); - virtual void LockProdImpl(); + virtual void LockProdImpl() {} virtual void UnlockProdImpl() {} @@ -78,11 +75,8 @@ public: } // Implementation-specific functions below: - // Returns 0 if the pipe isn't ready. If 0, use GetPixels below. - GLuint AcquireConsumerTexture(GLContext* consGL); - - // Will be void if AcquireConsumerTexture returns non-zero. - gfx::DataSourceSurface* GetPixels() const; + // Returns texture and target + void AcquireConsumerTexture(GLContext* consGL, GLuint* out_texture, GLuint* out_target); }; @@ -91,7 +85,7 @@ class SurfaceFactory_EGLImage : public SurfaceFactory_GL { public: - // Infallible: + // Fallible: static SurfaceFactory_EGLImage* Create(GLContext* prodGL, const SurfaceCaps& caps); diff --git a/gfx/layers/opengl/TextureHostOGL.cpp b/gfx/layers/opengl/TextureHostOGL.cpp index 10ea33ec8455..dd1ef6d921e7 100644 --- a/gfx/layers/opengl/TextureHostOGL.cpp +++ b/gfx/layers/opengl/TextureHostOGL.cpp @@ -515,15 +515,10 @@ StreamTextureSourceOGL::RetrieveTextureFromStream() SharedSurface_EGLImage* eglImageSurf = SharedSurface_EGLImage::Cast(sharedSurf); - mTextureHandle = eglImageSurf->AcquireConsumerTexture(gl()); - mTextureTarget = eglImageSurf->TextureTarget(); - if (!mTextureHandle) { - toUpload = eglImageSurf->GetPixels(); - MOZ_ASSERT(toUpload); - } else { - mFormat = sharedSurf->HasAlpha() ? SurfaceFormat::R8G8B8A8 - : SurfaceFormat::R8G8B8X8; - } + eglImageSurf->AcquireConsumerTexture(gl(), &mTextureHandle, &mTextureTarget); + MOZ_ASSERT(mTextureHandle); + mFormat = sharedSurf->HasAlpha() ? SurfaceFormat::R8G8B8A8 + : SurfaceFormat::R8G8B8X8; break; } #ifdef XP_MACOSX diff --git a/gfx/thebes/gfxAndroidPlatform.cpp b/gfx/thebes/gfxAndroidPlatform.cpp index 3c65c4cf5e09..740dda797d66 100644 --- a/gfx/thebes/gfxAndroidPlatform.cpp +++ b/gfx/thebes/gfxAndroidPlatform.cpp @@ -22,6 +22,10 @@ #include "gfxPrefs.h" #include "cairo.h" +#ifdef MOZ_WIDGET_ANDROID +#include "AndroidBridge.h" +#endif + #include "ft2build.h" #include FT_FREETYPE_H #include FT_MODULE_H @@ -418,3 +422,16 @@ gfxAndroidPlatform::GetScreenDepth() const { return mScreenDepth; } + +bool +gfxAndroidPlatform::UseAcceleratedSkiaCanvas() +{ +#ifdef MOZ_WIDGET_ANDROID + if (AndroidBridge::Bridge()->GetAPIVersion() < 11) { + // It's slower than software due to not having a compositing fast path + return false; + } +#endif + + return gfxPlatform::UseAcceleratedSkiaCanvas(); +} diff --git a/gfx/thebes/gfxAndroidPlatform.h b/gfx/thebes/gfxAndroidPlatform.h index 4d71ac58243e..5d4c4ee867fd 100644 --- a/gfx/thebes/gfxAndroidPlatform.h +++ b/gfx/thebes/gfxAndroidPlatform.h @@ -81,6 +81,8 @@ public: virtual int GetScreenDepth() const; + virtual bool UseAcceleratedSkiaCanvas() MOZ_OVERRIDE; + private: int mScreenDepth; gfxImageFormat mOffscreenFormat; From dfee0058ef308fc46fda9d4c68d7d70fe6086329 Mon Sep 17 00:00:00 2001 From: James Willcox Date: Wed, 5 Mar 2014 15:49:37 -0600 Subject: [PATCH 05/70] Bug 939276 - Use a single GLContext for all SkiaGL canvases r=jgilbert,vlad,gwright,bjacob --HG-- rename : gfx/gl/GLContextSkia.cpp => gfx/gl/SkiaGLGlue.cpp --- .../canvas/src/CanvasRenderingContext2D.cpp | 134 +++++++----------- content/canvas/src/CanvasRenderingContext2D.h | 5 +- gfx/2d/2D.h | 21 +-- gfx/2d/DrawTargetSkia.cpp | 126 ++++------------ gfx/2d/DrawTargetSkia.h | 28 +--- gfx/2d/Factory.cpp | 17 +-- gfx/2d/Types.h | 3 +- gfx/gl/GLContextSkia.h | 8 -- gfx/gl/GLScreenBuffer.cpp | 3 +- gfx/gl/GLScreenBuffer.h | 3 +- gfx/gl/SharedSurfaceGL.cpp | 46 ++++-- gfx/gl/SharedSurfaceGL.h | 11 +- gfx/gl/{GLContextSkia.cpp => SkiaGLGlue.cpp} | 20 ++- gfx/gl/SkiaGLGlue.h | 64 +++++++++ gfx/gl/SurfaceStream.cpp | 17 +++ gfx/gl/SurfaceStream.h | 8 +- gfx/gl/moz.build | 4 +- gfx/layers/CopyableCanvasLayer.cpp | 4 +- gfx/layers/CopyableCanvasLayer.h | 9 ++ gfx/layers/Layers.h | 9 ++ gfx/layers/client/CanvasClient.cpp | 23 ++- gfx/layers/client/ClientCanvasLayer.cpp | 51 ++++++- gfx/layers/client/ClientCanvasLayer.h | 14 +- gfx/layers/opengl/TextureClientOGL.cpp | 2 +- gfx/layers/opengl/TextureClientOGL.h | 3 +- gfx/thebes/gfxPlatform.cpp | 55 +++++-- gfx/thebes/gfxPlatform.h | 8 +- 27 files changed, 400 insertions(+), 296 deletions(-) delete mode 100644 gfx/gl/GLContextSkia.h rename gfx/gl/{GLContextSkia.cpp => SkiaGLGlue.cpp} (97%) create mode 100755 gfx/gl/SkiaGLGlue.h diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index ff799d38f534..4beba864fa99 100755 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -94,14 +94,14 @@ #include "GLContext.h" #include "GLContextProvider.h" -#ifdef USE_SKIA_GPU #undef free // apparently defined by some windows header, clashing with a free() // method in SkTypes.h -#include "GLContextSkia.h" +#include "SkiaGLGlue.h" +#include "SurfaceStream.h" #include "SurfaceTypes.h" -#include "nsIGfxInfo.h" -#endif + using mozilla::gl::GLContext; +using mozilla::gl::SkiaGLGlue; using mozilla::gl::GLContextProvider; #ifdef XP_WIN @@ -430,28 +430,18 @@ public: } } -#ifdef USE_SKIA_GPU static void PreTransactionCallback(void* aData) { CanvasRenderingContext2DUserData* self = static_cast(aData); CanvasRenderingContext2D* context = self->mContext; - if (!context) + if (!context || !context->mStream || !context->mTarget) return; - GLContext* glContext = static_cast(context->mTarget->GetGLContext()); - if (!glContext) - return; - - if (context->mTarget) { - // Since SkiaGL default to store drawing command until flush - // We will have to flush it before present. - context->mTarget->Flush(); - } - glContext->MakeCurrent(); - glContext->PublishFrame(); + // Since SkiaGL default to store drawing command until flush + // We will have to flush it before present. + context->mTarget->Flush(); } -#endif static void DidTransactionCallback(void* aData) { @@ -542,18 +532,15 @@ DrawTarget* CanvasRenderingContext2D::sErrorTarget = nullptr; CanvasRenderingContext2D::CanvasRenderingContext2D() - : mZero(false), mOpaque(false), mResetLayer(true) + : mForceSoftware(false), mZero(false), mOpaque(false), mResetLayer(true) , mIPC(false) + , mStream(nullptr) , mIsEntireFrameInvalid(false) , mPredictManyRedrawCalls(false), mPathTransformWillUpdate(false) , mInvalidateCount(0) { sNumLivingContexts++; SetIsDOMBinding(); - -#ifdef USE_SKIA_GPU - mForceSoftware = false; -#endif } CanvasRenderingContext2D::~CanvasRenderingContext2D() @@ -568,9 +555,7 @@ CanvasRenderingContext2D::~CanvasRenderingContext2D() NS_IF_RELEASE(sErrorTarget); } -#ifdef USE_SKIA_GPU RemoveDemotableContext(this); -#endif } JSObject* @@ -638,6 +623,7 @@ CanvasRenderingContext2D::Reset() } mTarget = nullptr; + mStream = nullptr; // reset hit regions #ifdef ACCESSIBILITY @@ -765,8 +751,7 @@ CanvasRenderingContext2D::RedrawUser(const gfxRect& r) void CanvasRenderingContext2D::Demote() { -#ifdef USE_SKIA_GPU - if (!IsTargetValid() || mForceSoftware || !mTarget->GetGLContext()) + if (!IsTargetValid() || mForceSoftware || !mStream) return; RemoveDemotableContext(this); @@ -774,6 +759,7 @@ void CanvasRenderingContext2D::Demote() RefPtr snapshot = mTarget->Snapshot(); RefPtr oldTarget = mTarget; mTarget = nullptr; + mStream = nullptr; mResetLayer = true; mForceSoftware = true; @@ -792,11 +778,8 @@ void CanvasRenderingContext2D::Demote() } mTarget->SetTransform(oldTarget->GetTransform()); -#endif } -#ifdef USE_SKIA_GPU - std::vector& CanvasRenderingContext2D::DemotableContexts() { @@ -807,11 +790,7 @@ CanvasRenderingContext2D::DemotableContexts() void CanvasRenderingContext2D::DemoteOldestContextIfNecessary() { -#ifdef MOZ_GFX_OPTIMIZE_MOBILE - const size_t kMaxContexts = 2; -#else - const size_t kMaxContexts = 16; -#endif + const size_t kMaxContexts = 64; std::vector& contexts = DemotableContexts(); if (contexts.size() < kMaxContexts) @@ -845,8 +824,6 @@ CheckSizeForSkiaGL(IntSize size) { return size.width >= minsize && size.height >= minsize; } -#endif - void CanvasRenderingContext2D::EnsureTarget() { @@ -872,42 +849,29 @@ CanvasRenderingContext2D::EnsureTarget() } if (layerManager) { -#ifdef USE_SKIA_GPU - if (gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas()) { - SurfaceCaps caps = SurfaceCaps::ForRGBA(); - caps.preserve = true; - -#ifdef MOZ_WIDGET_GONK - layers::ShadowLayerForwarder *forwarder = layerManager->AsShadowForwarder(); - if (forwarder) { - caps.surfaceAllocator = static_cast(forwarder); - } -#endif - + if (gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas() && + !mForceSoftware && + CheckSizeForSkiaGL(size)) { DemoteOldestContextIfNecessary(); - nsRefPtr glContext; - nsCOMPtr gfxInfo = do_GetService("@mozilla.org/gfx/info;1"); - nsString vendor; + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); - if (!mForceSoftware && CheckSizeForSkiaGL(size)) - { - glContext = GLContextProvider::CreateOffscreen(gfxIntSize(size.width, size.height), - caps); + if (glue) { + mTarget = Factory::CreateDrawTargetSkiaWithGrContext(glue->GetGrContext(), size, format); + if (mTarget) { + mStream = gfx::SurfaceStream::CreateForType(SurfaceStreamType::TripleBuffer, glue->GetGLContext()); + AddDemotableContext(this); + } else { + printf_stderr("Failed to create a SkiaGL DrawTarget, falling back to software\n"); + } } - - if (glContext) { - SkAutoTUnref i(CreateGrGLInterfaceFromGLContext(glContext)); - mTarget = Factory::CreateDrawTargetSkiaWithGLContextAndGrGLInterface(glContext, i, size, format); - AddDemotableContext(this); - } else { + if (!mTarget) { mTarget = layerManager->CreateDrawTarget(size, format); } } else -#endif - mTarget = layerManager->CreateDrawTarget(size, format); + mTarget = layerManager->CreateDrawTarget(size, format); } else { - mTarget = gfxPlatform::GetPlatform()->CreateOffscreenCanvasDrawTarget(size, format); + mTarget = gfxPlatform::GetPlatform()->CreateOffscreenCanvasDrawTarget(size, format); } } @@ -1092,12 +1056,10 @@ CanvasRenderingContext2D::SetContextOptions(JSContext* aCx, JS::HandleGetUserData(&g2DContextLayerUserData)); CanvasLayer::Data data; - data.mGLContext = static_cast(mTarget->GetGLContext()); + if (mStream) { + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); + + if (glue) { + data.mGLContext = glue->GetGLContext(); + data.mStream = mStream.get(); + } + } else { + data.mDrawTarget = mTarget; + } + if (userData && userData->IsForContext(this) && aOldLayer->IsDataValid(data)) { nsRefPtr ret = aOldLayer; return ret.forget(); @@ -4184,15 +4150,17 @@ CanvasRenderingContext2D::GetCanvasLayer(nsDisplayListBuilder* aBuilder, canvasLayer->SetUserData(&g2DContextLayerUserData, userData); CanvasLayer::Data data; -#ifdef USE_SKIA_GPU - GLContext* glContext = static_cast(mTarget->GetGLContext()); - if (glContext) { - canvasLayer->SetPreTransactionCallback( - CanvasRenderingContext2DUserData::PreTransactionCallback, userData); - data.mGLContext = glContext; - } else -#endif - { + if (mStream) { + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); + + if (glue) { + canvasLayer->SetPreTransactionCallback( + CanvasRenderingContext2DUserData::PreTransactionCallback, userData); + data.mGLContext = glue->GetGLContext(); + data.mStream = mStream.get(); + data.mTexID = (uint32_t)((uintptr_t)mTarget->GetNativeSurface(NativeSurfaceType::OPENGL_TEXTURE)); + } + } else { data.mDrawTarget = mTarget; } diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index 73edb6ed0f69..c3fb0aa16f9a 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -31,6 +31,7 @@ class nsXULElement; namespace mozilla { namespace gfx { class SourceSurface; +class SurfaceStream; } namespace dom { @@ -596,7 +597,6 @@ protected: return CurrentState().font; } -#if USE_SKIA_GPU static std::vector& DemotableContexts(); static void DemoteOldestContextIfNecessary(); @@ -605,7 +605,6 @@ protected: // Do not use GL bool mForceSoftware; -#endif // Member vars int32_t mWidth, mHeight; @@ -632,6 +631,8 @@ protected: // sErrorTarget. mozilla::RefPtr mTarget; + RefPtr mStream; + /** * Flag to avoid duplicate calls to InvalidateFrame. Set to true whenever * Redraw is called, reset to false when Render is called. diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h index 5a161f223aad..0db291fac88c 100644 --- a/gfx/2d/2D.h +++ b/gfx/2d/2D.h @@ -971,15 +971,10 @@ public: return mPermitSubpixelAA; } - virtual GenericRefCountedBase* GetGLContext() const { - return nullptr; - } - #ifdef USE_SKIA_GPU - virtual void InitWithGLContextAndGrGLInterface(GenericRefCountedBase* aGLContext, - GrGLInterface* aGrGLInterface, - const IntSize &aSize, - SurfaceFormat aFormat) + virtual void InitWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat) { MOZ_CRASH(); } @@ -1085,13 +1080,9 @@ public: #ifdef USE_SKIA_GPU static TemporaryRef - CreateDrawTargetSkiaWithGLContextAndGrGLInterface(GenericRefCountedBase* aGLContext, - GrGLInterface* aGrGLInterface, - const IntSize &aSize, - SurfaceFormat aFormat); - - static void - SetGlobalSkiaCacheLimits(int aCount, int aSizeInBytes); + CreateDrawTargetSkiaWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat); #endif static void PurgeAllCaches(); diff --git a/gfx/2d/DrawTargetSkia.cpp b/gfx/2d/DrawTargetSkia.cpp index 2edec2f6ad99..09637fedf181 100644 --- a/gfx/2d/DrawTargetSkia.cpp +++ b/gfx/2d/DrawTargetSkia.cpp @@ -79,80 +79,6 @@ public: ExtendMode mExtendMode; }; -#ifdef USE_SKIA_GPU -int DrawTargetSkia::sTextureCacheCount = 256; -int DrawTargetSkia::sTextureCacheSizeInBytes = 96*1024*1024; - -static std::vector& -GLDrawTargets() -{ - static std::vector targets; - return targets; -} - -void -DrawTargetSkia::RebalanceCacheLimits() -{ - // Divide the global cache limits equally between all currently active GL-backed - // Skia DrawTargets. - std::vector& targets = GLDrawTargets(); - uint32_t targetCount = targets.size(); - if (targetCount == 0) - return; - - int individualCacheSize = sTextureCacheSizeInBytes / targetCount; - for (uint32_t i = 0; i < targetCount; i++) { - targets[i]->SetCacheLimits(sTextureCacheCount, individualCacheSize); - } -} - -static void -AddGLDrawTarget(DrawTargetSkia* target) -{ - GLDrawTargets().push_back(target); - DrawTargetSkia::RebalanceCacheLimits(); -} - -static void -RemoveGLDrawTarget(DrawTargetSkia* target) -{ - std::vector& targets = GLDrawTargets(); - std::vector::iterator it = std::find(targets.begin(), targets.end(), target); - if (it != targets.end()) { - targets.erase(it); - DrawTargetSkia::RebalanceCacheLimits(); - } -} - -void -DrawTargetSkia::SetGlobalCacheLimits(int aCount, int aSizeInBytes) -{ - sTextureCacheCount = aCount; - sTextureCacheSizeInBytes = aSizeInBytes; - - DrawTargetSkia::RebalanceCacheLimits(); -} - -void -DrawTargetSkia::PurgeCaches() -{ - if (mGrContext) { - mGrContext->freeGpuResources(); - } -} - -/* static */ void -DrawTargetSkia::PurgeAllCaches() -{ - std::vector& targets = GLDrawTargets(); - uint32_t targetCount = targets.size(); - for (uint32_t i = 0; i < targetCount; i++) { - targets[i]->PurgeCaches(); - } -} - -#endif - /** * When constructing a temporary SkBitmap via GetBitmapForSurface, we may also * have to construct a temporary DataSourceSurface, which must live as long as @@ -189,15 +115,12 @@ GetBitmapForSurface(SourceSurface* aSurface) } DrawTargetSkia::DrawTargetSkia() - : mSnapshot(nullptr) + : mTexture(0), mSnapshot(nullptr) { } DrawTargetSkia::~DrawTargetSkia() { -#ifdef USE_SKIA_GPU - RemoveGLDrawTarget(this); -#endif } TemporaryRef @@ -770,45 +693,33 @@ DrawTargetSkia::Init(const IntSize &aSize, SurfaceFormat aFormat) #ifdef USE_SKIA_GPU void -DrawTargetSkia::InitWithGLContextAndGrGLInterface(GenericRefCountedBase* aGLContext, - GrGLInterface* aGrGLInterface, - const IntSize &aSize, - SurfaceFormat aFormat) +DrawTargetSkia::InitWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat) { - mGLContext = aGLContext; + mGrContext = aGrContext; + mSize = aSize; mFormat = aFormat; - mGrGLInterface = aGrGLInterface; - mGrGLInterface->fCallbackData = reinterpret_cast(this); - - GrBackendContext backendContext = reinterpret_cast(aGrGLInterface); - SkAutoTUnref gr(GrContext::Create(kOpenGL_GrBackend, backendContext)); - mGrContext = gr.get(); - - GrBackendRenderTargetDesc targetDescriptor; + GrTextureDesc targetDescriptor; + targetDescriptor.fFlags = kRenderTarget_GrTextureFlagBit; targetDescriptor.fWidth = mSize.width; targetDescriptor.fHeight = mSize.height; targetDescriptor.fConfig = GfxFormatToGrConfig(mFormat); targetDescriptor.fOrigin = kBottomLeft_GrSurfaceOrigin; targetDescriptor.fSampleCnt = 0; - targetDescriptor.fRenderTargetHandle = 0; // GLContext always exposes the right framebuffer as id 0 - SkAutoTUnref target(mGrContext->wrapBackendRenderTarget(targetDescriptor)); - SkAutoTUnref device(new SkGpuDevice(mGrContext.get(), target.get())); + SkAutoTUnref skiaTexture(mGrContext->createUncachedTexture(targetDescriptor, NULL, 0)); + + mTexture = (uint32_t)skiaTexture->getTextureHandle(); + + SkAutoTUnref device(new SkGpuDevice(mGrContext.get(), skiaTexture->asRenderTarget())); SkAutoTUnref canvas(new SkCanvas(device.get())); mCanvas = canvas.get(); - - AddGLDrawTarget(this); } -void -DrawTargetSkia::SetCacheLimits(int aCount, int aSizeInBytes) -{ - MOZ_ASSERT(mGrContext, "No GrContext!"); - mGrContext->setTextureCacheLimits(aCount, aSizeInBytes); -} #endif void @@ -840,6 +751,17 @@ DrawTargetSkia::SetTransform(const Matrix& aTransform) mTransform = aTransform; } +void* +DrawTargetSkia::GetNativeSurface(NativeSurfaceType aType) +{ + if (aType == NativeSurfaceType::OPENGL_TEXTURE) { + return (void*)((uintptr_t)mTexture); + } + + return nullptr; +} + + TemporaryRef DrawTargetSkia::CreatePathBuilder(FillRule aFillRule) const { diff --git a/gfx/2d/DrawTargetSkia.h b/gfx/2d/DrawTargetSkia.h index 4970048d5134..c8efe7fef529 100644 --- a/gfx/2d/DrawTargetSkia.h +++ b/gfx/2d/DrawTargetSkia.h @@ -100,23 +100,15 @@ public: virtual TemporaryRef CreateGradientStops(GradientStop *aStops, uint32_t aNumStops, ExtendMode aExtendMode = ExtendMode::CLAMP) const; virtual TemporaryRef CreateFilter(FilterType aType); virtual void SetTransform(const Matrix &aTransform); + virtual void *GetNativeSurface(NativeSurfaceType aType); bool Init(const IntSize &aSize, SurfaceFormat aFormat); void Init(unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat); #ifdef USE_SKIA_GPU - virtual GenericRefCountedBase* GetGLContext() const MOZ_OVERRIDE { return mGLContext; } - void InitWithGLContextAndGrGLInterface(GenericRefCountedBase* aGLContext, - GrGLInterface* aGrGLInterface, - const IntSize &aSize, - SurfaceFormat aFormat) MOZ_OVERRIDE; - - void SetCacheLimits(int aCount, int aSizeInBytes); - void PurgeCaches(); - - static void SetGlobalCacheLimits(int aCount, int aSizeInBytes); - static void RebalanceCacheLimits(); - static void PurgeAllCaches(); + void InitWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat) MOZ_OVERRIDE; #endif operator std::string() const { @@ -134,18 +126,8 @@ private: SkRect SkRectCoveringWholeSurface() const; #ifdef USE_SKIA_GPU - /* - * These members have inter-dependencies, but do not keep each other alive, so - * destruction order is very important here: mGrContext uses mGrGLInterface, and - * through it, uses mGLContext, so it is important that they be declared in the - * present order. - */ - RefPtr mGLContext; - SkRefPtr mGrGLInterface; SkRefPtr mGrContext; - - static int sTextureCacheCount; - static int sTextureCacheSizeInBytes; + uint32_t mTexture; #endif IntSize mSize; diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp index 2e3d3b14bce6..ce491502c888 100644 --- a/gfx/2d/Factory.cpp +++ b/gfx/2d/Factory.cpp @@ -586,30 +586,21 @@ Factory::D2DCleanup() #ifdef USE_SKIA_GPU TemporaryRef -Factory::CreateDrawTargetSkiaWithGLContextAndGrGLInterface(GenericRefCountedBase* aGLContext, - GrGLInterface* aGrGLInterface, - const IntSize &aSize, - SurfaceFormat aFormat) +Factory::CreateDrawTargetSkiaWithGrContext(GrContext* aGrContext, + const IntSize &aSize, + SurfaceFormat aFormat) { DrawTargetSkia* newDrawTargetSkia = new DrawTargetSkia(); - newDrawTargetSkia->InitWithGLContextAndGrGLInterface(aGLContext, aGrGLInterface, aSize, aFormat); + newDrawTargetSkia->InitWithGrContext(aGrContext, aSize, aFormat); RefPtr newTarget = newDrawTargetSkia; return newTarget; } -void -Factory::SetGlobalSkiaCacheLimits(int aCount, int aSizeInBytes) -{ - DrawTargetSkia::SetGlobalCacheLimits(aCount, aSizeInBytes); -} #endif // USE_SKIA_GPU void Factory::PurgeAllCaches() { -#ifdef USE_SKIA_GPU - DrawTargetSkia::PurgeAllCaches(); -#endif } #ifdef USE_SKIA_FREETYPE diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index ec0943334470..8f51a91553f8 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -96,7 +96,8 @@ MOZ_BEGIN_ENUM_CLASS(NativeSurfaceType, int8_t) CAIRO_SURFACE, CAIRO_CONTEXT, CGCONTEXT, - CGCONTEXT_ACCELERATED + CGCONTEXT_ACCELERATED, + OPENGL_TEXTURE MOZ_END_ENUM_CLASS(NativeSurfaceType) MOZ_BEGIN_ENUM_CLASS(NativeFontType, int8_t) diff --git a/gfx/gl/GLContextSkia.h b/gfx/gl/GLContextSkia.h deleted file mode 100644 index 2f9994ef56d2..000000000000 --- a/gfx/gl/GLContextSkia.h +++ /dev/null @@ -1,8 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */ -/* 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 "skia/GrGLInterface.h" - -GrGLInterface* CreateGrGLInterfaceFromGLContext(mozilla::gl::GLContext* context); diff --git a/gfx/gl/GLScreenBuffer.cpp b/gfx/gl/GLScreenBuffer.cpp index 120ac72a601f..ed554da77a22 100755 --- a/gfx/gl/GLScreenBuffer.cpp +++ b/gfx/gl/GLScreenBuffer.cpp @@ -43,6 +43,7 @@ GLScreenBuffer::Create(GLContext* gl, #ifdef MOZ_WIDGET_GONK /* On B2G, we want a Gralloc factory, and we want one right at the start */ if (!factory && + caps.surfaceAllocator && XRE_GetProcessType() != GeckoProcessType_Default) { factory = new SurfaceFactory_Gralloc(gl, caps); @@ -70,7 +71,6 @@ GLScreenBuffer::Create(GLContext* gl, GLScreenBuffer::~GLScreenBuffer() { - delete mStream; delete mDraw; delete mRead; @@ -378,7 +378,6 @@ GLScreenBuffer::Morph(SurfaceFactory_GL* newFactory, SurfaceStreamType streamTyp SurfaceStream* newStream = SurfaceStream::CreateForType(streamType, mGL, mStream); MOZ_ASSERT(newStream); - delete mStream; mStream = newStream; } diff --git a/gfx/gl/GLScreenBuffer.h b/gfx/gl/GLScreenBuffer.h index 4ba86ba74ff8..d899eba5f18d 100644 --- a/gfx/gl/GLScreenBuffer.h +++ b/gfx/gl/GLScreenBuffer.h @@ -16,6 +16,7 @@ #define SCREEN_BUFFER_H_ #include "SurfaceTypes.h" +#include "SurfaceStream.h" #include "GLContextTypes.h" #include "GLDefs.h" #include "mozilla/gfx/2D.h" @@ -156,7 +157,7 @@ protected: GLContext* const mGL; // Owns us. SurfaceCaps mCaps; SurfaceFactory_GL* mFactory; // Owned by us. - SurfaceStream* mStream; // Owned by us. + RefPtr mStream; DrawBuffer* mDraw; // Owned by us. ReadBuffer* mRead; // Owned by us. diff --git a/gfx/gl/SharedSurfaceGL.cpp b/gfx/gl/SharedSurfaceGL.cpp index 28b49eb3e712..4e96b0647f2d 100644 --- a/gfx/gl/SharedSurfaceGL.cpp +++ b/gfx/gl/SharedSurfaceGL.cpp @@ -283,8 +283,24 @@ SharedSurface_Basic::SharedSurface_Basic(GLContext* gl, gl, size, hasAlpha) - , mTex(tex) + , mTex(tex), mFB(0) { + mGL->MakeCurrent(); + mGL->fGenFramebuffers(1, &mFB); + + ScopedBindFramebuffer autoFB(mGL, mFB); + mGL->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, + LOCAL_GL_COLOR_ATTACHMENT0, + LOCAL_GL_TEXTURE_2D, + mTex, + 0); + + GLenum status = mGL->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER); + if (status != LOCAL_GL_FRAMEBUFFER_COMPLETE) { + mGL->fDeleteFramebuffers(1, &mFB); + mFB = 0; + } + mData = Factory::CreateDataSourceSurfaceWithStride(size, format, GetAlignedStride<4>(size.width * BytesPerPixel(format))); } @@ -294,16 +310,19 @@ SharedSurface_Basic::~SharedSurface_Basic() if (!mGL->MakeCurrent()) return; + if (mFB) + mGL->fDeleteFramebuffers(1, &mFB); + mGL->fDeleteTextures(1, &mTex); } void SharedSurface_Basic::Fence() { - MOZ_ASSERT(mData->GetSize() == mGL->OffscreenSize()); - mGL->MakeCurrent(); + ScopedBindFramebuffer autoFB(mGL, mFB); + DataSourceSurface::MappedSurface map; mData->Map(DataSourceSurface::MapType::WRITE, &map); nsRefPtr wrappedData = @@ -311,7 +330,7 @@ SharedSurface_Basic::Fence() ThebesIntSize(mData->GetSize()), map.mStride, SurfaceFormatToImageFormat(mData->GetFormat())); - ReadScreenIntoImageSurface(mGL, wrappedData); + ReadPixelsIntoImageSurface(mGL, wrappedData); mData->Unmap(); } @@ -322,15 +341,24 @@ SharedSurface_GLTexture::Create(GLContext* prodGL, GLContext* consGL, const GLFormats& formats, const gfx::IntSize& size, - bool hasAlpha) + bool hasAlpha, + GLuint texture) { MOZ_ASSERT(prodGL); MOZ_ASSERT(!consGL || prodGL->SharesWith(consGL)); prodGL->MakeCurrent(); - GLuint tex = CreateTextureForOffscreen(prodGL, formats, size); - return new SharedSurface_GLTexture(prodGL, consGL, size, hasAlpha, tex); + GLuint tex = texture; + + bool ownsTex = false; + + if (!tex) { + tex = CreateTextureForOffscreen(prodGL, formats, size); + ownsTex = true; + } + + return new SharedSurface_GLTexture(prodGL, consGL, size, hasAlpha, tex, ownsTex); } SharedSurface_GLTexture::~SharedSurface_GLTexture() @@ -338,7 +366,9 @@ SharedSurface_GLTexture::~SharedSurface_GLTexture() if (!mGL->MakeCurrent()) return; - mGL->fDeleteTextures(1, &mTex); + if (mOwnsTex) { + mGL->fDeleteTextures(1, &mTex); + } if (mSync) { mGL->fDeleteSync(mSync); diff --git a/gfx/gl/SharedSurfaceGL.h b/gfx/gl/SharedSurfaceGL.h index 70221aa2e7df..5abf56abe582 100644 --- a/gfx/gl/SharedSurfaceGL.h +++ b/gfx/gl/SharedSurfaceGL.h @@ -6,6 +6,7 @@ #ifndef SHARED_SURFACE_GL_H_ #define SHARED_SURFACE_GL_H_ +#include "ScopedGLHelpers.h" #include "SharedSurface.h" #include "SurfaceFactory.h" #include "SurfaceTypes.h" @@ -135,6 +136,8 @@ public: protected: const GLuint mTex; + GLuint mFB; + RefPtr mData; SharedSurface_Basic(GLContext* gl, @@ -192,7 +195,8 @@ public: GLContext* consGL, const GLFormats& formats, const gfx::IntSize& size, - bool hasAlpha); + bool hasAlpha, + GLuint texture = 0); static SharedSurface_GLTexture* Cast(SharedSurface* surf) { MOZ_ASSERT(surf->Type() == SharedSurfaceType::GLTextureShare); @@ -203,6 +207,7 @@ public: protected: GLContext* mConsGL; const GLuint mTex; + const bool mOwnsTex; GLsync mSync; mutable Mutex mMutex; @@ -210,7 +215,8 @@ protected: GLContext* consGL, const gfx::IntSize& size, bool hasAlpha, - GLuint tex) + GLuint tex, + bool ownsTex) : SharedSurface_GL(SharedSurfaceType::GLTextureShare, AttachmentType::GLTexture, prodGL, @@ -218,6 +224,7 @@ protected: hasAlpha) , mConsGL(consGL) , mTex(tex) + , mOwnsTex(ownsTex) , mSync(0) , mMutex("SharedSurface_GLTexture mutex") { diff --git a/gfx/gl/GLContextSkia.cpp b/gfx/gl/SkiaGLGlue.cpp similarity index 97% rename from gfx/gl/GLContextSkia.cpp rename to gfx/gl/SkiaGLGlue.cpp index 9c46f86e6541..25467d50ec95 100755 --- a/gfx/gl/GLContextSkia.cpp +++ b/gfx/gl/SkiaGLGlue.cpp @@ -3,6 +3,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "skia/GrContext.h" #include "skia/GrGLInterface.h" #include "mozilla/gfx/2D.h" #include "mozilla/ThreadLocal.h" @@ -16,9 +17,11 @@ #endif #include "GLContext.h" +#include "SkiaGLGlue.h" using mozilla::gl::GLContext; using mozilla::gl::GLFeature; +using mozilla::gl::SkiaGLGlue; using mozilla::gfx::DrawTarget; static mozilla::ThreadLocal sGLContext; @@ -27,8 +30,8 @@ extern "C" { void EnsureGLContext(const GrGLInterface* i) { - const DrawTarget* drawTarget = reinterpret_cast(i->fCallbackData); - GLContext* gl = static_cast(drawTarget->GetGLContext()); + const SkiaGLGlue* contextSkia = reinterpret_cast(i->fCallbackData); + GLContext* gl = contextSkia->GetGLContext(); gl->MakeCurrent(); if (!sGLContext.initialized()) { @@ -775,7 +778,7 @@ GrGLvoid glVertexPointer_mozilla(GrGLint size, GrGLenum type, GrGLsizei stride, } // extern "C" -GrGLInterface* CreateGrGLInterfaceFromGLContext(GLContext* context) +static GrGLInterface* CreateGrGLInterfaceFromGLContext(GLContext* context) { GrGLInterface* i = new GrGLInterface(); i->fCallback = EnsureGLContext; @@ -934,3 +937,14 @@ GrGLInterface* CreateGrGLInterfaceFromGLContext(GLContext* context) return i; } + +SkiaGLGlue::SkiaGLGlue(GLContext* context) + : mGLContext(context) +{ + SkAutoTUnref i(CreateGrGLInterfaceFromGLContext(mGLContext)); + i->fCallbackData = reinterpret_cast(this); + mGrGLInterface = i; + SkAutoTUnref gr(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)mGrGLInterface.get())); + + mGrContext = gr; +} diff --git a/gfx/gl/SkiaGLGlue.h b/gfx/gl/SkiaGLGlue.h new file mode 100755 index 000000000000..1d80021566fb --- /dev/null +++ b/gfx/gl/SkiaGLGlue.h @@ -0,0 +1,64 @@ +/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */ +/* 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/RefPtr.h" + +#ifdef USE_SKIA_GPU + +#include "GLContext.h" +#include "skia/GrGLInterface.h" +#include "skia/GrContext.h" + +namespace mozilla { +namespace gl { + +class SkiaGLGlue : public GenericAtomicRefCounted +{ +public: + SkiaGLGlue(GLContext* context); + GLContext* GetGLContext() const { return mGLContext.get(); } + GrContext* GetGrContext() const { return mGrContext.get(); } + +protected: + virtual ~SkiaGLGlue() { + /* + * These members have inter-dependencies, but do not keep each other alive, so + * destruction order is very important here: mGrContext uses mGrGLInterface, and + * through it, uses mGLContext + */ + mGrContext = nullptr; + mGrGLInterface = nullptr; + mGLContext = nullptr; + } + +private: + RefPtr mGLContext; + SkRefPtr mGrGLInterface; + SkRefPtr mGrContext; +}; + +} +} + +#else + +class GrContext; + +namespace mozilla { +namespace gl { + +class GLContext; + +class SkiaGLGlue : public GenericAtomicRefCounted +{ +public: + SkiaGLGlue(GLContext* context); + GLContext* GetGLContext() const { return nullptr; } + GrContext* GetGrContext() const { return nullptr; } +}; +} +} + +#endif \ No newline at end of file diff --git a/gfx/gl/SurfaceStream.cpp b/gfx/gl/SurfaceStream.cpp index b28cfff6af4b..bf105160e4a8 100644 --- a/gfx/gl/SurfaceStream.cpp +++ b/gfx/gl/SurfaceStream.cpp @@ -7,6 +7,7 @@ #include "gfxPoint.h" #include "SharedSurface.h" +#include "SharedSurfaceGL.h" #include "SurfaceFactory.h" #include "GeckoProfiler.h" @@ -53,6 +54,22 @@ SurfaceStream::CreateForType(SurfaceStreamType type, mozilla::gl::GLContext* glC return result; } +bool +SurfaceStream_TripleBuffer::CopySurfaceToProducer(SharedSurface* src, SurfaceFactory* factory) +{ + if (!mProducer) { + New(factory, src->Size(), mProducer); + if (!mProducer) { + return false; + } + } + + MOZ_ASSERT(src->Size() == mProducer->Size(), "Size mismatch"); + + SharedSurface::Copy(src, mProducer, factory); + return true; +} + void SurfaceStream::New(SurfaceFactory* factory, const gfx::IntSize& size, SharedSurface*& surf) diff --git a/gfx/gl/SurfaceStream.h b/gfx/gl/SurfaceStream.h index d7c7a1994760..a7b4f5961ee6 100644 --- a/gfx/gl/SurfaceStream.h +++ b/gfx/gl/SurfaceStream.h @@ -11,6 +11,7 @@ #include "mozilla/Monitor.h" #include "mozilla/Attributes.h" #include "mozilla/gfx/Point.h" +#include "mozilla/GenericRefCounted.h" #include "SurfaceTypes.h" namespace mozilla { @@ -24,7 +25,7 @@ class SharedSurface; class SurfaceFactory; // Owned by: ScreenBuffer -class SurfaceStream +class SurfaceStream : public GenericAtomicRefCounted { public: typedef enum { @@ -50,6 +51,8 @@ public: const SurfaceStreamType mType; mozilla::gl::GLContext* GLContext() const { return mGLContext; } + + protected: // |mProd| is owned by us, but can be ripped away when // creating a new GLStream from this one. @@ -121,6 +124,8 @@ public: virtual SharedSurface* Resize(SurfaceFactory* factory, const gfx::IntSize& size); + virtual bool CopySurfaceToProducer(SharedSurface* src, SurfaceFactory* factory) { MOZ_ASSERT(0); return false; } + protected: // SwapCons will return the same surface more than once, // if nothing new has been published. @@ -189,6 +194,7 @@ protected: public: SurfaceStream_TripleBuffer(SurfaceStream* prevStream); virtual ~SurfaceStream_TripleBuffer(); + virtual bool CopySurfaceToProducer(SharedSurface* src, SurfaceFactory* factory); private: // Common constructor code. diff --git a/gfx/gl/moz.build b/gfx/gl/moz.build index 64e90c38332d..533b71f1715c 100644 --- a/gfx/gl/moz.build +++ b/gfx/gl/moz.build @@ -75,9 +75,9 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': 'SharedSurfaceANGLE.cpp', ] if CONFIG['MOZ_ENABLE_SKIA_GPU']: - EXPORTS += ['GLContextSkia.h'] + EXPORTS += ['SkiaGLGlue.h'] UNIFIED_SOURCES += [ - 'GLContextSkia.cpp', + 'SkiaGLGlue.cpp', ] if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': diff --git a/gfx/layers/CopyableCanvasLayer.cpp b/gfx/layers/CopyableCanvasLayer.cpp index a5bec15a7e7d..37ba82a5d1ec 100644 --- a/gfx/layers/CopyableCanvasLayer.cpp +++ b/gfx/layers/CopyableCanvasLayer.cpp @@ -32,6 +32,7 @@ namespace layers { CopyableCanvasLayer::CopyableCanvasLayer(LayerManager* aLayerManager, void *aImplData) : CanvasLayer(aLayerManager, aImplData) + , mStream(nullptr) { MOZ_COUNT_CTOR(CopyableCanvasLayer); } @@ -48,6 +49,7 @@ CopyableCanvasLayer::Initialize(const Data& aData) if (aData.mGLContext) { mGLContext = aData.mGLContext; + mStream = aData.mStream; mIsGLAlphaPremult = aData.mIsGLAlphaPremult; mNeedsYFlip = true; MOZ_ASSERT(mGLContext->IsOffscreen(), "canvas gl context isn't offscreen"); @@ -70,7 +72,7 @@ CopyableCanvasLayer::Initialize(const Data& aData) bool CopyableCanvasLayer::IsDataValid(const Data& aData) { - return mGLContext == aData.mGLContext; + return mGLContext == aData.mGLContext && mStream == aData.mStream; } void diff --git a/gfx/layers/CopyableCanvasLayer.h b/gfx/layers/CopyableCanvasLayer.h index ca92c8a11c49..22448118c326 100644 --- a/gfx/layers/CopyableCanvasLayer.h +++ b/gfx/layers/CopyableCanvasLayer.h @@ -22,6 +22,13 @@ #include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc namespace mozilla { + +namespace gfx { +class SurfaceStream; +class SharedSurface; +class SurfaceFactory; +} + namespace layers { class CanvasClientWebGL; @@ -54,6 +61,8 @@ protected: nsRefPtr mGLContext; mozilla::RefPtr mDrawTarget; + RefPtr mStream; + uint32_t mCanvasFramebuffer; bool mIsGLAlphaPremult; diff --git a/gfx/layers/Layers.h b/gfx/layers/Layers.h index 56f04b6d648a..ef38bb9af4b9 100644 --- a/gfx/layers/Layers.h +++ b/gfx/layers/Layers.h @@ -63,6 +63,7 @@ class GLContext; namespace gfx { class DrawTarget; +class SurfaceStream; } namespace css { @@ -1796,6 +1797,8 @@ public: Data() : mDrawTarget(nullptr) , mGLContext(nullptr) + , mStream(nullptr) + , mTexID(0) , mSize(0,0) , mIsGLAlphaPremult(false) { } @@ -1804,6 +1807,12 @@ public: mozilla::gfx::DrawTarget *mDrawTarget; // a DrawTarget for the canvas contents mozilla::gl::GLContext* mGLContext; // or this, for GL. + // Canvas/SkiaGL uses this + mozilla::gfx::SurfaceStream* mStream; + + // ID of the texture backing the canvas layer (defaults to 0) + uint32_t mTexID; + // The size of the canvas content nsIntSize mSize; diff --git a/gfx/layers/client/CanvasClient.cpp b/gfx/layers/client/CanvasClient.cpp index 24a4d34b9e5d..b2ec194f4e46 100644 --- a/gfx/layers/client/CanvasClient.cpp +++ b/gfx/layers/client/CanvasClient.cpp @@ -116,7 +116,18 @@ void CanvasClientSurfaceStream::Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) { GLScreenBuffer* screen = aLayer->mGLContext->Screen(); - SurfaceStream* stream = screen->Stream(); + SurfaceStream* stream = nullptr; + + if (aLayer->mStream) { + stream = aLayer->mStream; + + // Copy our current surface to the current producer surface in our stream, then + // call SwapProducer to make a new buffer ready. + stream->CopySurfaceToProducer(aLayer->mTextureSurface, aLayer->mFactory); + stream->SwapProducer(aLayer->mFactory, gfx::IntSize(aSize.width, aSize.height)); + } else { + stream = screen->Stream(); + } bool isCrossProcess = !(XRE_GetProcessType() == GeckoProcessType_Default); bool bufferCreated = false; @@ -255,7 +266,15 @@ DeprecatedCanvasClientSurfaceStream::Update(gfx::IntSize aSize, ClientCanvasLaye mDeprecatedTextureClient->EnsureAllocated(aSize, gfxContentType::COLOR); GLScreenBuffer* screen = aLayer->mGLContext->Screen(); - SurfaceStream* stream = screen->Stream(); + SurfaceStream* stream = nullptr; + + if (aLayer->mStream) { + stream = aLayer->mStream; + stream->CopySurfaceToProducer(aLayer->mTextureSurface, aLayer->mFactory); + stream->SwapProducer(aLayer->mFactory, gfx::IntSize(aSize.width, aSize.height)); + } else { + stream = screen->Stream(); + } bool isCrossProcess = !(XRE_GetProcessType() == GeckoProcessType_Default); if (isCrossProcess) { diff --git a/gfx/layers/client/ClientCanvasLayer.cpp b/gfx/layers/client/ClientCanvasLayer.cpp index 855aa7ef8dbf..cc30cf3814a5 100644 --- a/gfx/layers/client/ClientCanvasLayer.cpp +++ b/gfx/layers/client/ClientCanvasLayer.cpp @@ -33,15 +33,34 @@ using namespace mozilla::gl; namespace mozilla { namespace layers { +ClientCanvasLayer::~ClientCanvasLayer() +{ + MOZ_COUNT_DTOR(ClientCanvasLayer); + if (mCanvasClient) { + mCanvasClient->OnDetach(); + mCanvasClient = nullptr; + } + if (mTextureSurface) { + delete mTextureSurface; + } +} + void ClientCanvasLayer::Initialize(const Data& aData) { CopyableCanvasLayer::Initialize(aData); - + mCanvasClient = nullptr; if (mGLContext) { GLScreenBuffer* screen = mGLContext->Screen(); + + SurfaceCaps caps = screen->Caps(); + if (mStream) { + // The screen caps are irrelevant if we're using a separate stream + caps = GetContentFlags() & CONTENT_OPAQUE ? SurfaceCaps::ForRGB() : SurfaceCaps::ForRGBA(); + } + SurfaceStreamType streamType = SurfaceStream::ChooseGLStreamType(SurfaceStream::OffMainThread, screen->PreserveBuffer()); @@ -53,11 +72,11 @@ ClientCanvasLayer::Initialize(const Data& aData) if (!isCrossProcess) { // [Basic/OGL Layers, OMTC] WebGL layer init. - factory = SurfaceFactory_EGLImage::Create(mGLContext, screen->Caps()); + factory = SurfaceFactory_EGLImage::Create(mGLContext, caps); } else { // [Basic/OGL Layers, OOPC] WebGL layer init. (Out Of Process Compositing) #ifdef MOZ_WIDGET_GONK - factory = new SurfaceFactory_Gralloc(mGLContext, screen->Caps(), ClientManager()->AsShadowForwarder()); + factory = new SurfaceFactory_Gralloc(mGLContext, caps, ClientManager()->AsShadowForwarder()); #else // we could do readback here maybe NS_NOTREACHED("isCrossProcess but not on native B2G!"); @@ -67,15 +86,35 @@ ClientCanvasLayer::Initialize(const Data& aData) // [Basic Layers, OMTC] WebGL layer init. // Well, this *should* work... #ifdef XP_MACOSX - factory = new SurfaceFactory_IOSurface(mGLContext, screen->Caps()); + factory = new SurfaceFactory_IOSurface(mGLContext, caps); #else - factory = new SurfaceFactory_GLTexture(mGLContext, nullptr, screen->Caps()); + factory = new SurfaceFactory_GLTexture(mGLContext, nullptr, caps); #endif } } } - if (factory) { + if (mStream) { + // We're using a stream other than the one in the default screen + mFactory = factory; + if (!mFactory) { + // Absolutely must have a factory here, so create a basic one + mFactory = new SurfaceFactory_Basic(mGLContext, caps); + } + + gfx::IntSize size = gfx::IntSize(aData.mSize.width, aData.mSize.height); + mTextureSurface = SharedSurface_GLTexture::Create(mGLContext, mGLContext, + mGLContext->GetGLFormats(), + size, caps.alpha, aData.mTexID); + SharedSurface* producer = mStream->SwapProducer(mFactory, size); + if (!producer) { + // Fallback to basic factory + delete mFactory; + mFactory = new SurfaceFactory_Basic(mGLContext, caps); + producer = mStream->SwapProducer(mFactory, size); + MOZ_ASSERT(producer, "Failed to create initial canvas surface with basic factory"); + } + } else if (factory) { screen->Morph(factory, streamType); } } diff --git a/gfx/layers/client/ClientCanvasLayer.h b/gfx/layers/client/ClientCanvasLayer.h index 6338e0348430..37e5a1e6a539 100644 --- a/gfx/layers/client/ClientCanvasLayer.h +++ b/gfx/layers/client/ClientCanvasLayer.h @@ -33,17 +33,12 @@ public: ClientCanvasLayer(ClientLayerManager* aLayerManager) : CopyableCanvasLayer(aLayerManager, static_cast(MOZ_THIS_IN_INITIALIZER_LIST())) + , mTextureSurface(nullptr) + , mFactory(nullptr) { MOZ_COUNT_CTOR(ClientCanvasLayer); } - virtual ~ClientCanvasLayer() - { - MOZ_COUNT_DTOR(ClientCanvasLayer); - if (mCanvasClient) { - mCanvasClient->OnDetach(); - mCanvasClient = nullptr; - } - } + virtual ~ClientCanvasLayer(); virtual void SetVisibleRegion(const nsIntRegion& aRegion) { @@ -97,6 +92,9 @@ protected: RefPtr mCanvasClient; + gfx::SharedSurface* mTextureSurface; + gfx::SurfaceFactory* mFactory; + friend class DeprecatedCanvasClient2D; friend class CanvasClient2D; friend class DeprecatedCanvasClientSurfaceStream; diff --git a/gfx/layers/opengl/TextureClientOGL.cpp b/gfx/layers/opengl/TextureClientOGL.cpp index f3f25c5a4b24..c80737afed41 100644 --- a/gfx/layers/opengl/TextureClientOGL.cpp +++ b/gfx/layers/opengl/TextureClientOGL.cpp @@ -86,7 +86,6 @@ SharedTextureClientOGL::IsAllocated() const StreamTextureClientOGL::StreamTextureClientOGL(TextureFlags aFlags) : TextureClient(aFlags) - , mStream(0) , mIsLocked(false) { } @@ -131,6 +130,7 @@ StreamTextureClientOGL::InitWith(gfx::SurfaceStream* aStream) { MOZ_ASSERT(!IsAllocated()); mStream = aStream; + mGL = mStream->GLContext(); } bool diff --git a/gfx/layers/opengl/TextureClientOGL.h b/gfx/layers/opengl/TextureClientOGL.h index 9b0d661000c1..333cc2ac705e 100644 --- a/gfx/layers/opengl/TextureClientOGL.h +++ b/gfx/layers/opengl/TextureClientOGL.h @@ -97,8 +97,9 @@ public: virtual gfx::IntSize GetSize() const { return gfx::IntSize(); } protected: - gfx::SurfaceStream* mStream; bool mIsLocked; + RefPtr mStream; + RefPtr mGL; }; } // namespace diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 776d2619cdd5..c522e585a367 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -76,6 +76,9 @@ #ifdef USE_SKIA #include "mozilla/Hal.h" #include "skia/SkGraphics.h" + +#include "SkiaGLGlue.h" + #endif #include "mozilla/Preferences.h" @@ -202,6 +205,8 @@ MemoryPressureObserver::Observe(nsISupports *aSubject, { NS_ASSERTION(strcmp(aTopic, "memory-pressure") == 0, "unexpected event topic"); Factory::PurgeAllCaches(); + + gfxPlatform::GetPlatform()->PurgeSkiaCache(); return NS_OK; } @@ -266,6 +271,8 @@ gfxPlatform::gfxPlatform() mLayersUseDeprecated = false; #endif + mSkiaGlue = nullptr; + uint32_t canvasMask = BackendTypeBit(BackendType::CAIRO) | BackendTypeBit(BackendType::SKIA); uint32_t contentMask = BackendTypeBit(BackendType::CAIRO); InitBackendPrefs(canvasMask, BackendType::CAIRO, @@ -422,10 +429,6 @@ gfxPlatform::Init() CreateCMSOutputProfile(); -#ifdef USE_SKIA - gPlatform->InitializeSkiaCaches(); -#endif - // Listen to memory pressure event so we can purge DrawTarget caches nsCOMPtr obs = mozilla::services::GetObserverService(); if (obs) { @@ -825,9 +828,8 @@ gfxPlatform::UseAcceleratedSkiaCanvas() } void -gfxPlatform::InitializeSkiaCaches() +gfxPlatform::InitializeSkiaCacheLimits() { -#ifdef USE_SKIA_GPU if (UseAcceleratedSkiaCanvas()) { bool usingDynamicCache = gfxPrefs::CanvasSkiaGLDynamicCache(); int cacheItemLimit = gfxPrefs::CanvasSkiaGLCacheItems(); @@ -847,12 +849,47 @@ gfxPlatform::InitializeSkiaCaches() } } -#ifdef DEBUG + #ifdef DEBUG printf_stderr("Determined SkiaGL cache limits: Size %i, Items: %i\n", cacheSizeLimit, cacheItemLimit); + #endif + + mSkiaGlue->GetGrContext()->setTextureCacheLimits(cacheItemLimit, cacheSizeLimit); + } +} + +mozilla::gl::SkiaGLGlue* +gfxPlatform::GetSkiaGLGlue() +{ +#ifdef USE_SKIA_GPU + if (!mSkiaGlue) { + /* Dummy context. We always draw into a FBO. + * + * FIXME: This should be stored in TLS or something, since there needs to be one for each thread using it. As it + * stands, this only works on the main thread. + */ + mozilla::gfx::SurfaceCaps caps = mozilla::gfx::SurfaceCaps::ForRGBA(); + nsRefPtr glContext = mozilla::gl::GLContextProvider::CreateOffscreen(gfxIntSize(16, 16), caps); + if (!glContext) { + printf_stderr("Failed to create GLContext for SkiaGL!\n"); + return nullptr; + } + mSkiaGlue = new mozilla::gl::SkiaGLGlue(glContext); + MOZ_ASSERT(mSkiaGlue->GetGrContext(), "No GrContext"); + InitializeSkiaCacheLimits(); + } #endif - Factory::SetGlobalSkiaCacheLimits(cacheItemLimit, cacheSizeLimit); - } + return mSkiaGlue; +} + +void +gfxPlatform::PurgeSkiaCache() +{ +#ifdef USE_SKIA_GPU + if (!mSkiaGlue) + return; + + mSkiaGlue->GetGrContext()->freeGpuResources(); #endif } diff --git a/gfx/thebes/gfxPlatform.h b/gfx/thebes/gfxPlatform.h index e1de1b29b9a4..a127c77d151b 100644 --- a/gfx/thebes/gfxPlatform.h +++ b/gfx/thebes/gfxPlatform.h @@ -40,6 +40,7 @@ struct gfxRGBA; namespace mozilla { namespace gl { class GLContext; +class SkiaGLGlue; } namespace gfx { class DrawTarget; @@ -283,8 +284,7 @@ public: } virtual bool UseAcceleratedSkiaCanvas(); - - virtual void InitializeSkiaCaches(); + virtual void InitializeSkiaCacheLimits(); void GetAzureBackendInfo(mozilla::widget::InfoObject &aObj) { aObj.DefineProperty("AzureCanvasBackend", GetBackendName(mPreferredCanvasBackend)); @@ -598,6 +598,9 @@ public: bool PreferMemoryOverShmem() const; bool UseDeprecatedTextures() const { return mLayersUseDeprecated; } + mozilla::gl::SkiaGLGlue* GetSkiaGLGlue(); + void PurgeSkiaCache(); + protected: gfxPlatform(); virtual ~gfxPlatform(); @@ -711,6 +714,7 @@ private: mozilla::RefPtr mRecorder; bool mLayersPreferMemoryOverShmem; bool mLayersUseDeprecated; + mozilla::RefPtr mSkiaGlue; }; #endif /* GFX_PLATFORM_H */ From 38c98ab8dcf13171c0c5c4800255cd39d5c3964c Mon Sep 17 00:00:00 2001 From: James Willcox Date: Wed, 5 Mar 2014 15:49:55 -0600 Subject: [PATCH 06/70] Bug 980048 - Don't use EGL fences on Pandaboard r=jgilbert --- gfx/gl/GLContext.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gfx/gl/GLContext.cpp b/gfx/gl/GLContext.cpp index 7d60fdad30df..0b8aea5cc506 100644 --- a/gfx/gl/GLContext.cpp +++ b/gfx/gl/GLContext.cpp @@ -628,6 +628,12 @@ GLContext::InitWithPrefix(const char *prefix, bool trygl) MarkUnsupported(GLFeature::standard_derivatives); } + if (Vendor() == GLVendor::Imagination && + Renderer() == GLRenderer::SGX540) { + // Bug 980048 + MarkExtensionUnsupported(OES_EGL_sync); + } + #ifdef XP_MACOSX // The Mac Nvidia driver, for versions up to and including 10.8, don't seem // to properly support this. See 814839 From cc460fe7667df5aa02c51255712c141d2d656da6 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Wed, 5 Mar 2014 16:59:42 -0500 Subject: [PATCH 07/70] Bug 979684 - Port the per-source flags for skia to moz.build; r=mshal --- gfx/skia/Makefile.in | 13 ------------- gfx/skia/generate_mozbuild.py | 10 ++++++++++ gfx/skia/moz.build | 13 ++++++++++--- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/gfx/skia/Makefile.in b/gfx/skia/Makefile.in index 07a77a3e9cb2..ee0efb2e88cd 100644 --- a/gfx/skia/Makefile.in +++ b/gfx/skia/Makefile.in @@ -17,19 +17,6 @@ endif include $(topsrcdir)/config/rules.mk -ifneq (,$(INTEL_ARCHITECTURE)) -ifdef GNU_CC -SkBitmapFilter_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkBitmapProcState_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkBitmapProcState_opts_SSSE3.$(OBJ_SUFFIX): CXXFLAGS+=-mssse3 -SkBlitRect_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkBlitRow_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkBlurImage_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkMorphology_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -SkUtils_opts_SSE2.$(OBJ_SUFFIX): CXXFLAGS+=-msse2 -endif -endif - ifeq ($(CPU_ARCH)_$(GNU_CC),arm_1) # The assembly uses the frame pointer register (r7 in Thumb/r11 in # ARM), the compiler doesn't like that. diff --git a/gfx/skia/generate_mozbuild.py b/gfx/skia/generate_mozbuild.py index 00eaa4abd742..3408076a82cd 100755 --- a/gfx/skia/generate_mozbuild.py +++ b/gfx/skia/generate_mozbuild.py @@ -67,6 +67,16 @@ if (CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android') or \ CONFIG['MOZ_WIDGET_GTK']: DEFINES['SK_FONTHOST_DOES_NOT_USE_FONTMGR'] = 1 +if CONFIG['INTEL_ARCHITECTURE'] and CONFIG['GNU_CC']: + SOURCES['trunk/src/opts/SkBitmapFilter_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBitmapProcState_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBitmapProcState_opts_SSSE3.cpp'].flags += ['-mssse3'] + SOURCES['trunk/src/opts/SkBlitRect_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBlitRow_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBlurImage_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkMorphology_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkUtils_opts_SSE2.cpp'].flags += ['-msse2'] + if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['SKIA_DLL'] = 1 DEFINES['GR_DLL'] = 1 diff --git a/gfx/skia/moz.build b/gfx/skia/moz.build index 56c354c24487..eb512bf94302 100644 --- a/gfx/skia/moz.build +++ b/gfx/skia/moz.build @@ -847,9 +847,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'qt', 'gonk', 'co if CONFIG['INTEL_ARCHITECTURE'] and CONFIG['HAVE_TOOLCHAIN_SUPPORT_MSSSE3']: DEFINES['SK_BUILD_SSSE3'] = 1 -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': - DEFINES['SKIA_DLL'] = 1 - if (CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android') or (CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk') or (CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa') or CONFIG['MOZ_WIDGET_GTK'] or CONFIG['MOZ_WIDGET_QT']: DEFINES['SK_FONTHOST_DOES_NOT_USE_FONTMGR'] = 1 @@ -857,5 +854,15 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['SKIA_DLL'] = 1 DEFINES['GR_DLL'] = 1 +if CONFIG['INTEL_ARCHITECTURE'] and CONFIG['GNU_CC']: + SOURCES['trunk/src/opts/SkBitmapFilter_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBitmapProcState_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBitmapProcState_opts_SSSE3.cpp'].flags += ['-mssse3'] + SOURCES['trunk/src/opts/SkBlitRect_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBlitRow_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkBlurImage_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkMorphology_opts_SSE2.cpp'].flags += ['-msse2'] + SOURCES['trunk/src/opts/SkUtils_opts_SSE2.cpp'].flags += ['-msse2'] + DEFINES['SKIA_IMPLEMENTATION'] = 1 DEFINES['GR_IMPLEMENTATION'] = 1 From 87efce53b9c2f6ef65fab18b2c31d2b2db49be8c Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Wed, 5 Mar 2014 17:00:17 -0500 Subject: [PATCH 08/70] Bug 979685 - Rewrite the qcms Makefile.in in moz.build; r=mshal --- gfx/qcms/Makefile.in | 54 -------------------------------------------- gfx/qcms/moz.build | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 54 deletions(-) delete mode 100644 gfx/qcms/Makefile.in diff --git a/gfx/qcms/Makefile.in b/gfx/qcms/Makefile.in deleted file mode 100644 index 6097265660c9..000000000000 --- a/gfx/qcms/Makefile.in +++ /dev/null @@ -1,54 +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/. - -ifeq (86,$(findstring 86,$(OS_TEST))) -CSRCS += transform-sse2.c -ifdef _MSC_VER -ifneq ($(OS_ARCH)_$(OS_TEST),WINNT_x86_64) - CSRCS += transform-sse1.c -endif -else - CSRCS += transform-sse1.c -ifdef GNU_CC - SSE1_FLAGS=-msse - SSE2_FLAGS=-msse2 -else -ifeq ($(SOLARIS_SUNPRO_CC),1) -ifneq (64,$(findstring 64,$(OS_TEST))) - SSE1_FLAGS=-xarch=sse - SSE2_FLAGS=-xarch=sse2 -else -# Sun Studio doesn't work correctly for x86 intristics -# with -m64 and without optimization. - SSE1_FLAGS= -xO4 - SSE2_FLAGS= -xO4 -endif -else - SSE1_FLAGS= - SSE2_FLAGS= -endif -endif -endif -else -ifeq (ppc,$(findstring ppc,$(CPU_ARCH))) -ifdef GNU_CC - CSRCS += transform-altivec.c - ALTIVEC_FLAGS=-maltivec -endif -endif -endif - -include $(topsrcdir)/config/rules.mk - -# Disable spammy "missing initializer" GCC warning -ifdef GNU_CC -CFLAGS += -Wno-missing-field-initializers -endif # GNU_CC - -# special rules for transform-sse*.c to get the right cflags. (taken from pixman/src/Makefile.in) -transform-sse1.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(SSE1_FLAGS) - -transform-sse2.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(SSE2_FLAGS) - -transform-altivec.$(OBJ_SUFFIX): COMPILE_CFLAGS += $(ALTIVEC_FLAGS) diff --git a/gfx/qcms/moz.build b/gfx/qcms/moz.build index 04888c63aa7f..e0683ac657c0 100644 --- a/gfx/qcms/moz.build +++ b/gfx/qcms/moz.build @@ -20,3 +20,48 @@ SOURCES += [ MSVC_ENABLE_PGO = True FINAL_LIBRARY = 'gkmedias' + +if CONFIG['GNU_CC']: + CFLAGS += ['-Wno-missing-field-initializers'] + +use_sse1 = False +use_sse2 = False +use_altivec = False +if '86' in CONFIG['OS_TEST']: + use_sse2 = True + if CONFIG['_MSC_VER']: + if CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['OS_TEST'] != 'x86_64': + use_sse1 = True + else: + use_sse1 = True +elif 'ppc' in CONFIG['CPU_ARCH']: + if CONFIG['GNU_CC']: + use_altivec = True + +if use_sse1: + SOURCES += ['transform-sse1.c'] + if CONFIG['GNU_CC']: + SOURCES['transform-sse1.c'].flags += ['-msse'] + elif CONFIG['SOLARIS_SUNPRO_CC']: + if '64' in CONFIG['OS_TEST']: + # Sun Studio doesn't work correctly for x86 intristics + # with -m64 and without optimization. + SOURCES['transform-sse1.c'].flags += ['-xO4'] + else: + SOURCES['transform-sse1.c'].flags += ['-xarch=sse'] + +if use_sse2: + SOURCES += ['transform-sse2.c'] + if CONFIG['GNU_CC']: + SOURCES['transform-sse2.c'].flags += ['-msse2'] + elif CONFIG['SOLARIS_SUNPRO_CC']: + if '64' in CONFIG['OS_TEST']: + # Sun Studio doesn't work correctly for x86 intristics + # with -m64 and without optimization. + SOURCES['transform-sse2.c'].flags += ['-xO4'] + else: + SOURCES['transform-sse2.c'].flags += ['-xarch=sse2'] + +if use_altivec: + SOURCES += ['transform-altivec.c'] + SOURCES['transform-altivec.c'].flags += ['-maltivec'] From b2e7c544830e7d3b9e0b3313cfe1b55cad216ec2 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Wed, 5 Mar 2014 17:00:52 -0500 Subject: [PATCH 09/70] Bug 979689 - Port the per-source flags for libvpx to moz.build; r=mshal --- media/libvpx/Makefile.in | 10 ---------- media/libvpx/moz.build | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/media/libvpx/Makefile.in b/media/libvpx/Makefile.in index a97a421ea7a1..b224881a598e 100644 --- a/media/libvpx/Makefile.in +++ b/media/libvpx/Makefile.in @@ -89,16 +89,6 @@ EXTRA_MDDEPEND_FILES = vp8_asm_enc_offsets.s.pp vp8_asm_enc_offsets.$(OBJ_SUFFIX include $(topsrcdir)/config/rules.mk -# This must be after rules.mk in order to use $(OBJ_SUFFIX) outside a -# recursively-expanded variable. - -# dont add for MSVC -ifndef _MSC_VER -%_sse2.$(OBJ_SUFFIX): CFLAGS += -msse2 -%_ssse3.$(OBJ_SUFFIX): CFLAGS += -mssse3 -%_avx2.$(OBJ_SUFFIX): CFLAGS += -mavx2 -endif - quantize_sse4.$(OBJ_SUFFIX): vp8_asm_enc_offsets.asm quantize_ssse3.$(OBJ_SUFFIX): vp8_asm_enc_offsets.asm diff --git a/media/libvpx/moz.build b/media/libvpx/moz.build index 730924f73a1c..a2fcee782f96 100644 --- a/media/libvpx/moz.build +++ b/media/libvpx/moz.build @@ -87,3 +87,13 @@ if CONFIG['OS_TARGET'] == 'Android': SOURCES += [ '%s/sources/android/cpufeatures/cpu-features.c' % CONFIG['ANDROID_NDK'], ] + +if not CONFIG['_MSC_VER']: + for f in SOURCES: + if f.endswith('.c'): + if 'sse2' in f: + SOURCES[f].flags += ['-msse2'] + if 'ssse3' in f: + SOURCES[f].flags += ['-mssse3'] + if 'avx2' in f: + SOURCES[f].flags += ['-mavx2'] From 2ab5b67790eacd15551c368d13be2bd6b46f3b5b Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Wed, 5 Mar 2014 14:16:01 -0800 Subject: [PATCH 10/70] Bug 958491 - Test extension-only param. - r=kamidphish --- .../test/webgl/non-conf-tests/mochitest.ini | 1 + .../webgl/non-conf-tests/test_fb_param.html | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 content/canvas/test/webgl/non-conf-tests/test_fb_param.html diff --git a/content/canvas/test/webgl/non-conf-tests/mochitest.ini b/content/canvas/test/webgl/non-conf-tests/mochitest.ini index d7eca9927afe..b5dc7b94fb05 100644 --- a/content/canvas/test/webgl/non-conf-tests/mochitest.ini +++ b/content/canvas/test/webgl/non-conf-tests/mochitest.ini @@ -4,6 +4,7 @@ support-files = webgl-util.js [test_depth_readpixels.html] +[test_fb_param.html] [test_highp_fs.html] [test_no_arr_points.html] [test_privileged_exts.html] diff --git a/content/canvas/test/webgl/non-conf-tests/test_fb_param.html b/content/canvas/test/webgl/non-conf-tests/test_fb_param.html new file mode 100644 index 000000000000..00fc70cd236a --- /dev/null +++ b/content/canvas/test/webgl/non-conf-tests/test_fb_param.html @@ -0,0 +1,55 @@ + +WebGL test: bug 958491 + + + + + + + + + From b22fb48408c8d162a18f78ec31e9e8ffaa9fa71f Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Wed, 5 Mar 2014 14:16:01 -0800 Subject: [PATCH 11/70] Bug 958723 - Add test for this bad param query. - r=kamidphish --- .../test/webgl/non-conf-tests/mochitest.ini | 1 + .../non-conf-tests/test_fb_param_crash.html | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 content/canvas/test/webgl/non-conf-tests/test_fb_param_crash.html diff --git a/content/canvas/test/webgl/non-conf-tests/mochitest.ini b/content/canvas/test/webgl/non-conf-tests/mochitest.ini index b5dc7b94fb05..6422a2dd5c4b 100644 --- a/content/canvas/test/webgl/non-conf-tests/mochitest.ini +++ b/content/canvas/test/webgl/non-conf-tests/mochitest.ini @@ -5,6 +5,7 @@ support-files = [test_depth_readpixels.html] [test_fb_param.html] +[test_fb_param_crash.html] [test_highp_fs.html] [test_no_arr_points.html] [test_privileged_exts.html] diff --git a/content/canvas/test/webgl/non-conf-tests/test_fb_param_crash.html b/content/canvas/test/webgl/non-conf-tests/test_fb_param_crash.html new file mode 100644 index 000000000000..10b8d3db31c8 --- /dev/null +++ b/content/canvas/test/webgl/non-conf-tests/test_fb_param_crash.html @@ -0,0 +1,49 @@ + +WebGL test: bug 958723 + + + + + + + + + From 50b8293e47f53731b72f469e68c2b31de5a9278f Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Wed, 5 Mar 2014 14:16:02 -0800 Subject: [PATCH 12/70] Bug 958723 - Check for valid FB first. - r=gabadie --- content/canvas/src/WebGLContextGL.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/canvas/src/WebGLContextGL.cpp b/content/canvas/src/WebGLContextGL.cpp index 5573ef0186d9..dd0231b63bfb 100644 --- a/content/canvas/src/WebGLContextGL.cpp +++ b/content/canvas/src/WebGLContextGL.cpp @@ -1343,6 +1343,11 @@ WebGLContext::GetFramebufferAttachmentParameter(JSContext* cx, return JS::NullValue(); } + if (!mBoundFramebuffer) { + ErrorInvalidOperation("getFramebufferAttachmentParameter: cannot query framebuffer 0"); + return JS::NullValue(); + } + if (attachment != LOCAL_GL_DEPTH_ATTACHMENT && attachment != LOCAL_GL_STENCIL_ATTACHMENT && attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) @@ -1365,11 +1370,6 @@ WebGLContext::GetFramebufferAttachmentParameter(JSContext* cx, } } - if (!mBoundFramebuffer) { - ErrorInvalidOperation("getFramebufferAttachmentParameter: cannot query framebuffer 0"); - return JS::NullValue(); - } - MakeContextCurrent(); const WebGLFramebuffer::Attachment& fba = mBoundFramebuffer->GetAttachment(attachment); From 1148e8bb3e0fbca5495773955e377b5c65ded0df Mon Sep 17 00:00:00 2001 From: Henrik Skupin Date: Wed, 5 Mar 2014 23:22:29 +0100 Subject: [PATCH 13/70] Bug 979815 - Update URL of virtualenv to use version 1.9.1 from the official github repository. r=jgriffin --- testing/tps/INSTALL.sh | 2 +- testing/tps/README | 31 ++++++++++++++----------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/testing/tps/INSTALL.sh b/testing/tps/INSTALL.sh index 8bfcfbd6dd5e..173049065048 100755 --- a/testing/tps/INSTALL.sh +++ b/testing/tps/INSTALL.sh @@ -48,7 +48,7 @@ else fi # Create a virtualenv: -curl https://raw.github.com/jonallengriffin/virtualenv/msys/virtualenv.py | ${PYTHON} - ${TARGET} +curl https://raw.github.com/pypa/virtualenv/1.9.1/virtualenv.py | ${PYTHON} - ${TARGET} cd ${TARGET} . $BIN_NAME if [ -z "${VIRTUAL_ENV}" ] diff --git a/testing/tps/README b/testing/tps/README index fa2ee2ec2f6d..316d43bda9f5 100644 --- a/testing/tps/README +++ b/testing/tps/README @@ -1,17 +1,14 @@ -TPS is a test automation framework for Firefox Sync. See -https://developer.mozilla.org/en/TPS for documentation. - -INSTALLATION: - -TPS requires several packages to operate properly. To install TPS and -required packages, use the INSTALL.sh script, provided: - - ./INSTALL.sh /path/to/create/virtualenv - -This script will create a virtalenv and install TPS into it. TPS can then -be run by activating the virtualenv and executing: - - runtps --binary=/path/to/firefox - - - +TPS is a test automation framework for Firefox Sync. See +https://developer.mozilla.org/en/TPS for documentation. + +INSTALLATION: + +TPS requires several packages to operate properly. To install TPS and +required packages, use the INSTALL.sh script, provided: + + ./INSTALL.sh /path/to/create/virtualenv + +This script will create a virtalenv and install TPS into it. TPS can then +be run by activating the virtualenv and executing: + + runtps --binary=/path/to/firefox From 8ab46db4e23e2c77b593cfb497fdea38966c45dd Mon Sep 17 00:00:00 2001 From: Jim Mathies Date: Wed, 5 Mar 2014 16:47:01 -0600 Subject: [PATCH 14/70] Bug 980063 - Use a ref ptr vs auto ptr for wake locks in winrt widget. r=tabraldes --- widget/windows/winrt/MetroAppShell.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/widget/windows/winrt/MetroAppShell.cpp b/widget/windows/winrt/MetroAppShell.cpp index 40e41c7ede08..3ce2daa6c809 100644 --- a/widget/windows/winrt/MetroAppShell.cpp +++ b/widget/windows/winrt/MetroAppShell.cpp @@ -236,12 +236,14 @@ MetroAppShell::Run(void) rv = NS_ERROR_NOT_IMPLEMENTED; break; case GeckoProcessType_Default: { - nsAutoPtr wakeLock = InitWakeLock(); - mozilla::widget::StartAudioSession(); - sMetroApp->ActivateBaseView(); - rv = nsBaseAppShell::Run(); - mozilla::widget::StopAudioSession(); - ShutdownWakeLock(wakeLock); + { + nsRefPtr wakeLock = InitWakeLock(); + mozilla::widget::StartAudioSession(); + sMetroApp->ActivateBaseView(); + rv = nsBaseAppShell::Run(); + mozilla::widget::StopAudioSession(); + ShutdownWakeLock(wakeLock); + } nsCOMPtr appStartup (do_GetService(NS_APPSTARTUP_CONTRACTID)); bool restartingInMetro = false, restartingInDesktop = false; From cf269be15565805757f5d9fba5672b43743d28b4 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 5 Mar 2014 14:19:28 -0800 Subject: [PATCH 15/70] Backout 519787a56627 (bug 972712, part 6) and the follow-up 5c9a4a1f2c0b (bug 978227) because ASAN is complaining intermittently about the former. r=me. --HG-- extra : rebase_source : 31e2b96c57703caf94f65fed1d0c007d6984421e --- js/public/MemoryMetrics.h | 139 ++++++------------ js/src/jscompartment.cpp | 10 +- js/src/jscompartment.h | 2 +- js/src/jsobj.cpp | 22 +-- js/src/jsobj.h | 4 +- js/src/vm/MemoryMetrics.cpp | 195 ++++++-------------------- js/src/vm/Shape.h | 14 +- js/xpconnect/src/XPCJSRuntime.cpp | 225 ++++++++++++++---------------- 8 files changed, 212 insertions(+), 399 deletions(-) diff --git a/js/public/MemoryMetrics.h b/js/public/MemoryMetrics.h index 63e96d21e773..54faf160f40a 100644 --- a/js/public/MemoryMetrics.h +++ b/js/public/MemoryMetrics.h @@ -115,44 +115,30 @@ enum { namespace JS { -struct ClassInfo +// Data for tracking memory usage of things hanging off objects. +struct ObjectsExtraSizes { #define FOR_EACH_SIZE(macro) \ - macro(Objects, IsLiveGCThing, objectsGCHeap) \ - macro(Objects, NotLiveGCThing, objectsMallocHeapSlots) \ - macro(Objects, NotLiveGCThing, objectsMallocHeapElementsNonAsmJS) \ - macro(Objects, NotLiveGCThing, objectsMallocHeapElementsAsmJS) \ - macro(Objects, NotLiveGCThing, objectsNonHeapElementsAsmJS) \ - macro(Objects, NotLiveGCThing, objectsNonHeapCodeAsmJS) \ - macro(Objects, NotLiveGCThing, objectsMallocHeapMisc) \ - \ - macro(Other, IsLiveGCThing, shapesGCHeapTree) \ - macro(Other, IsLiveGCThing, shapesGCHeapDict) \ - macro(Other, IsLiveGCThing, shapesGCHeapBase) \ - macro(Other, NotLiveGCThing, shapesMallocHeapTreeTables) \ - macro(Other, NotLiveGCThing, shapesMallocHeapDictTables) \ - macro(Other, NotLiveGCThing, shapesMallocHeapTreeKids) \ + macro(Objects, NotLiveGCThing, mallocHeapSlots) \ + macro(Objects, NotLiveGCThing, mallocHeapElementsNonAsmJS) \ + macro(Objects, NotLiveGCThing, mallocHeapElementsAsmJS) \ + macro(Objects, NotLiveGCThing, nonHeapElementsAsmJS) \ + macro(Objects, NotLiveGCThing, nonHeapCodeAsmJS) \ + macro(Objects, NotLiveGCThing, mallocHeapAsmJSModuleData) \ + macro(Objects, NotLiveGCThing, mallocHeapArgumentsData) \ + macro(Objects, NotLiveGCThing, mallocHeapRegExpStatics) \ + macro(Objects, NotLiveGCThing, mallocHeapPropertyIteratorData) \ + macro(Objects, NotLiveGCThing, mallocHeapCtypesData) - ClassInfo() + ObjectsExtraSizes() : FOR_EACH_SIZE(ZERO_SIZE) dummy() {} - void add(const ClassInfo &other) { + void add(const ObjectsExtraSizes &other) { FOR_EACH_SIZE(ADD_OTHER_SIZE) } - void subtract(const ClassInfo &other) { - FOR_EACH_SIZE(SUB_OTHER_SIZE) - } - - bool isNotable() const { - static const size_t NotabilityThreshold = 16 * 1024; - size_t n = 0; - FOR_EACH_SIZE(ADD_SIZE_TO_N) - return n >= NotabilityThreshold; - } - size_t sizeOfLiveGCThings() const { size_t n = 0; FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) @@ -169,29 +155,6 @@ struct ClassInfo #undef FOR_EACH_SIZE }; -// Holds data about a notable class (one whose combined object and shape -// instances use more than a certain amount of memory) so we can report it -// individually. -// -// The only difference between this class and ClassInfo is that this class -// holds a copy of the filename. -struct NotableClassInfo : public ClassInfo -{ - NotableClassInfo(); - NotableClassInfo(const char *className, const ClassInfo &info); - NotableClassInfo(NotableClassInfo &&info); - NotableClassInfo &operator=(NotableClassInfo &&info); - - ~NotableClassInfo() { - js_free(className_); - } - - char *className_; - - private: - NotableClassInfo(const NotableClassInfo& info) MOZ_DELETE; -}; - // Data for tracking JIT-code memory usage. struct CodeSizes { @@ -519,7 +482,20 @@ struct ZoneStats struct CompartmentStats { #define FOR_EACH_SIZE(macro) \ + macro(Objects, IsLiveGCThing, objectsGCHeapOrdinary) \ + macro(Objects, IsLiveGCThing, objectsGCHeapFunction) \ + macro(Objects, IsLiveGCThing, objectsGCHeapDenseArray) \ + macro(Objects, IsLiveGCThing, objectsGCHeapSlowArray) \ + macro(Objects, IsLiveGCThing, objectsGCHeapCrossCompartmentWrapper) \ macro(Private, NotLiveGCThing, objectsPrivate) \ + macro(Other, IsLiveGCThing, shapesGCHeapTreeGlobalParented) \ + macro(Other, IsLiveGCThing, shapesGCHeapTreeNonGlobalParented) \ + macro(Other, IsLiveGCThing, shapesGCHeapDict) \ + macro(Other, IsLiveGCThing, shapesGCHeapBase) \ + macro(Other, NotLiveGCThing, shapesMallocHeapTreeTables) \ + macro(Other, NotLiveGCThing, shapesMallocHeapDictTables) \ + macro(Other, NotLiveGCThing, shapesMallocHeapTreeShapeKids) \ + macro(Other, NotLiveGCThing, shapesMallocHeapCompartmentTables) \ macro(Other, IsLiveGCThing, scriptsGCHeap) \ macro(Other, NotLiveGCThing, scriptsMallocHeapData) \ macro(Other, NotLiveGCThing, baselineData) \ @@ -531,76 +507,45 @@ struct CompartmentStats macro(Other, NotLiveGCThing, typeInferenceArrayTypeTables) \ macro(Other, NotLiveGCThing, typeInferenceObjectTypeTables) \ macro(Other, NotLiveGCThing, compartmentObject) \ - macro(Other, NotLiveGCThing, compartmentTables) \ macro(Other, NotLiveGCThing, crossCompartmentWrappersTable) \ macro(Other, NotLiveGCThing, regexpCompartment) \ macro(Other, NotLiveGCThing, debuggeesSet) CompartmentStats() : FOR_EACH_SIZE(ZERO_SIZE) - classInfo(), - extra(), - allClasses(nullptr), - notableClasses(), - isTotals(true) + objectsExtra(), + extra() {} - CompartmentStats(CompartmentStats &&other) + CompartmentStats(const CompartmentStats &other) : FOR_EACH_SIZE(COPY_OTHER_SIZE) - classInfo(mozilla::Move(other.classInfo)), - extra(other.extra), - allClasses(other.allClasses), - notableClasses(mozilla::Move(other.notableClasses)), - isTotals(other.isTotals) - { - other.allClasses = nullptr; - MOZ_ASSERT(!other.isTotals); - } + objectsExtra(other.objectsExtra), + extra(other.extra) + {} - ~CompartmentStats() { - // |allClasses| is usually deleted and set to nullptr before this - // destructor runs. But there are failure cases due to OOMs that may - // prevent that, so it doesn't hurt to try again here. - js_delete(allClasses); - } - - bool initClasses(JSRuntime *rt); - - void addSizes(const CompartmentStats &other) { - MOZ_ASSERT(isTotals); + void add(const CompartmentStats &other) { FOR_EACH_SIZE(ADD_OTHER_SIZE) - classInfo.add(other.classInfo); + objectsExtra.add(other.objectsExtra); + // Do nothing with |extra|. } size_t sizeOfLiveGCThings() const { - MOZ_ASSERT(isTotals); size_t n = 0; FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) - n += classInfo.sizeOfLiveGCThings(); + n += objectsExtra.sizeOfLiveGCThings(); + // Do nothing with |extra|. return n; } void addToTabSizes(TabSizes *sizes) const { - MOZ_ASSERT(isTotals); FOR_EACH_SIZE(ADD_TO_TAB_SIZES); - classInfo.addToTabSizes(sizes); + objectsExtra.addToTabSizes(sizes); + // Do nothing with |extra|. } - // The class measurements in |classInfo| are initially for all classes. At - // the end, if the measurement granularity is FineGrained, we subtract the - // measurements of the notable classes and move them into |notableClasses|. FOR_EACH_SIZE(DECL_SIZE) - ClassInfo classInfo; - void *extra; // This field can be used by embedders. - - typedef js::HashMap ClassesHashMap; - - // These are similar to |allStrings| and |notableStrings| in ZoneStats. - ClassesHashMap *allClasses; - js::Vector notableClasses; - bool isTotals; + ObjectsExtraSizes objectsExtra; + void *extra; // This field can be used by embedders. #undef FOR_EACH_SIZE }; diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index dcd1532404fe..cb1112f27676 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -912,7 +912,7 @@ JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, size_t *tiArrayTypeTables, size_t *tiObjectTypeTables, size_t *compartmentObject, - size_t *compartmentTables, + size_t *shapesCompartmentTables, size_t *crossCompartmentWrappersArg, size_t *regexpCompartment, size_t *debuggeesSet, @@ -921,10 +921,10 @@ JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, *compartmentObject += mallocSizeOf(this); types.addSizeOfExcludingThis(mallocSizeOf, tiAllocationSiteTables, tiArrayTypeTables, tiObjectTypeTables); - *compartmentTables += baseShapes.sizeOfExcludingThis(mallocSizeOf) - + initialShapes.sizeOfExcludingThis(mallocSizeOf) - + newTypeObjects.sizeOfExcludingThis(mallocSizeOf) - + lazyTypeObjects.sizeOfExcludingThis(mallocSizeOf); + *shapesCompartmentTables += baseShapes.sizeOfExcludingThis(mallocSizeOf) + + initialShapes.sizeOfExcludingThis(mallocSizeOf) + + newTypeObjects.sizeOfExcludingThis(mallocSizeOf) + + lazyTypeObjects.sizeOfExcludingThis(mallocSizeOf); *crossCompartmentWrappersArg += crossCompartmentWrappers.sizeOfExcludingThis(mallocSizeOf); *regexpCompartment += regExps.sizeOfExcludingThis(mallocSizeOf); *debuggeesSet += debuggees.sizeOfExcludingThis(mallocSizeOf); diff --git a/js/src/jscompartment.h b/js/src/jscompartment.h index 1fe749639967..74b49d6037c8 100644 --- a/js/src/jscompartment.h +++ b/js/src/jscompartment.h @@ -226,7 +226,7 @@ struct JSCompartment size_t *tiArrayTypeTables, size_t *tiObjectTypeTables, size_t *compartmentObject, - size_t *compartmentTables, + size_t *shapesCompartmentTables, size_t *crossCompartmentWrappers, size_t *regexpCompartment, size_t *debuggeesSet, diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index ba39d83a282e..f0cd988b6858 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -5931,10 +5931,10 @@ js_DumpBacktrace(JSContext *cx) fprintf(stdout, "%s", sprinter.string()); } void -JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ClassInfo *info) +JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ObjectsExtraSizes *sizes) { if (hasDynamicSlots()) - info->objectsMallocHeapSlots += mallocSizeOf(slots); + sizes->mallocHeapSlots += mallocSizeOf(slots); if (hasDynamicElements()) { js::ObjectElements *elements = getElementsHeader(); @@ -5942,12 +5942,12 @@ JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ClassIn #if defined (JS_CPU_X64) // On x64, ArrayBufferObject::prepareForAsmJS switches the // ArrayBufferObject to use mmap'd storage. - info->objectsNonHeapElementsAsmJS += as().byteLength(); + sizes->nonHeapElementsAsmJS += as().byteLength(); #else - info->objectsMallocHeapElementsAsmJS += mallocSizeOf(elements); + sizes->mallocHeapElementsAsmJS += mallocSizeOf(elements); #endif } else { - info->objectsMallocHeapElementsNonAsmJS += mallocSizeOf(elements); + sizes->mallocHeapElementsNonAsmJS += mallocSizeOf(elements); } } @@ -5970,20 +5970,20 @@ JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ClassIn // - ( 1.0%, 96.4%): Proxy } else if (is()) { - info->objectsMallocHeapMisc += as().sizeOfMisc(mallocSizeOf); + sizes->mallocHeapArgumentsData += as().sizeOfMisc(mallocSizeOf); } else if (is()) { - info->objectsMallocHeapMisc += as().sizeOfData(mallocSizeOf); + sizes->mallocHeapRegExpStatics += as().sizeOfData(mallocSizeOf); } else if (is()) { - info->objectsMallocHeapMisc += as().sizeOfMisc(mallocSizeOf); + sizes->mallocHeapPropertyIteratorData += as().sizeOfMisc(mallocSizeOf); #ifdef JS_ION } else if (is()) { - as().addSizeOfMisc(mallocSizeOf, &info->objectsNonHeapCodeAsmJS, - &info->objectsMallocHeapMisc); + as().addSizeOfMisc(mallocSizeOf, &sizes->nonHeapCodeAsmJS, + &sizes->mallocHeapAsmJSModuleData); #endif #ifdef JS_HAS_CTYPES } else { // This must be the last case. - info->objectsMallocHeapMisc += + sizes->mallocHeapCtypesData += js::SizeOfDataIfCDataObject(mallocSizeOf, const_cast(this)); #endif } diff --git a/js/src/jsobj.h b/js/src/jsobj.h index 4c11985aa274..8a6bf7f87f04 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -25,7 +25,7 @@ #include "vm/Xdr.h" namespace JS { -struct ClassInfo; +struct ObjectsExtraSizes; } namespace js { @@ -354,7 +354,7 @@ class JSObject : public js::ObjectImpl return lastProperty()->hasTable(); } - void addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ClassInfo *info); + void addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::ObjectsExtraSizes *sizes); bool hasIdempotentProtoChain() const; diff --git a/js/src/vm/MemoryMetrics.cpp b/js/src/vm/MemoryMetrics.cpp index b05db48615e4..0300dd43926c 100644 --- a/js/src/vm/MemoryMetrics.cpp +++ b/js/src/vm/MemoryMetrics.cpp @@ -155,37 +155,6 @@ NotableStringInfo &NotableStringInfo::operator=(NotableStringInfo &&info) return *this; } -NotableClassInfo::NotableClassInfo() - : ClassInfo(), - className_(nullptr) -{ -} - -NotableClassInfo::NotableClassInfo(const char *className, const ClassInfo &info) - : ClassInfo(info) -{ - size_t bytes = strlen(className) + 1; - className_ = js_pod_malloc(bytes); - if (!className_) - MOZ_CRASH("oom"); - PodCopy(className_, className, bytes); -} - -NotableClassInfo::NotableClassInfo(NotableClassInfo &&info) - : ClassInfo(Move(info)) -{ - className_ = info.className_; - info.className_ = nullptr; -} - -NotableClassInfo &NotableClassInfo::operator=(NotableClassInfo &&info) -{ - MOZ_ASSERT(this != &info, "self-move assignment is prohibited"); - this->~NotableClassInfo(); - new (this) NotableClassInfo(Move(info)); - return *this; -} - NotableScriptSourceInfo::NotableScriptSourceInfo() : ScriptSourceInfo(), filename_(nullptr) @@ -275,8 +244,6 @@ StatsCompartmentCallback(JSRuntime *rt, void *data, JSCompartment *compartment) // CollectRuntimeStats reserves enough space. MOZ_ALWAYS_TRUE(rtStats->compartmentStatsVector.growBy(1)); CompartmentStats &cStats = rtStats->compartmentStatsVector.back(); - if (!cStats.initClasses(rt)) - MOZ_CRASH("oom"); rtStats->initExtraCompartmentStats(compartment, &cStats); compartment->compartmentStats = &cStats; @@ -287,7 +254,7 @@ StatsCompartmentCallback(JSRuntime *rt, void *data, JSCompartment *compartment) &cStats.typeInferenceArrayTypeTables, &cStats.typeInferenceObjectTypeTables, &cStats.compartmentObject, - &cStats.compartmentTables, + &cStats.shapesMallocHeapCompartmentTables, &cStats.crossCompartmentWrappersTable, &cStats.regexpCompartment, &cStats.debuggeesSet, @@ -323,25 +290,6 @@ enum Granularity { CoarseGrained // Corresponds to AddSizeOfTab() }; -static void -AddClassInfo(Granularity granularity, CompartmentStats *cStats, const char *className, - JS::ClassInfo &info) -{ - if (granularity == FineGrained) { - if (!className) - className = ""; - CompartmentStats::ClassesHashMap::AddPtr p = - cStats->allClasses->lookupForAdd(className); - if (!p) { - // Ignore failure -- we just won't record the - // object/shape/base-shape as notable. - (void)cStats->allClasses->add(p, className, info); - } else { - p->value().add(info); - } - } -} - // The various kinds of hashing are expensive, and the results are unused when // doing coarse-grained measurements. Skipping them more than doubles the // profile speed for complex pages such as gmail.com. @@ -357,15 +305,16 @@ StatsCellCallback(JSRuntime *rt, void *data, void *thing, JSGCTraceKind traceKin case JSTRACE_OBJECT: { JSObject *obj = static_cast(thing); CompartmentStats *cStats = GetCompartmentStats(obj->compartment()); + if (obj->is()) + cStats->objectsGCHeapFunction += thingSize; + else if (obj->is()) + cStats->objectsGCHeapDenseArray += thingSize; + else if (obj->is()) + cStats->objectsGCHeapCrossCompartmentWrapper += thingSize; + else + cStats->objectsGCHeapOrdinary += thingSize; - JS::ClassInfo info; // This zeroes all the sizes. - info.objectsGCHeap += thingSize; - obj->addSizeOfExcludingThis(rtStats->mallocSizeOf_, &info); - - cStats->classInfo.add(info); - - const char* className = obj->getClass()->name; - AddClassInfo(granularity, cStats, className, info); + obj->addSizeOfExcludingThis(rtStats->mallocSizeOf_, &cStats->objectsExtra); if (ObjectPrivateVisitor *opv = closure->opv) { nsISupports *iface; @@ -400,33 +349,30 @@ StatsCellCallback(JSRuntime *rt, void *data, void *thing, JSGCTraceKind traceKin case JSTRACE_SHAPE: { Shape *shape = static_cast(thing); CompartmentStats *cStats = GetCompartmentStats(shape->compartment()); + if (shape->inDictionary()) { + cStats->shapesGCHeapDict += thingSize; - JS::ClassInfo info; // This zeroes all the sizes. - if (shape->inDictionary()) - info.shapesGCHeapDict += thingSize; - else - info.shapesGCHeapTree += thingSize; - shape->addSizeOfExcludingThis(rtStats->mallocSizeOf_, &info); + // nullptr because kidsSize shouldn't be incremented in this case. + shape->addSizeOfExcludingThis(rtStats->mallocSizeOf_, + &cStats->shapesMallocHeapDictTables, nullptr); + } else { + JSObject *parent = shape->base()->getObjectParent(); + if (parent && parent->is()) + cStats->shapesGCHeapTreeGlobalParented += thingSize; + else + cStats->shapesGCHeapTreeNonGlobalParented += thingSize; - cStats->classInfo.add(info); - - const char* className = shape->base()->clasp()->name; - AddClassInfo(granularity, cStats, className, info); + shape->addSizeOfExcludingThis(rtStats->mallocSizeOf_, + &cStats->shapesMallocHeapTreeTables, + &cStats->shapesMallocHeapTreeShapeKids); + } break; } case JSTRACE_BASE_SHAPE: { BaseShape *base = static_cast(thing); CompartmentStats *cStats = GetCompartmentStats(base->compartment()); - - JS::ClassInfo info; // This zeroes all the sizes. - info.shapesGCHeapBase += thingSize; - // No malloc-heap measurements. - - cStats->classInfo.add(info); - - const char* className = base->clasp()->name; - AddClassInfo(granularity, cStats, className, info); + cStats->shapesGCHeapBase += thingSize; break; } @@ -502,32 +448,6 @@ StatsCellCallback(JSRuntime *rt, void *data, void *thing, JSGCTraceKind traceKin zStats->unusedGCThings -= thingSize; } -bool -ZoneStats::initStrings(JSRuntime *rt) -{ - isTotals = false; - allStrings = rt->new_(); - if (!allStrings || !allStrings->init()) { - js_delete(allStrings); - allStrings = nullptr; - return false; - } - return true; -} - -bool -CompartmentStats::initClasses(JSRuntime *rt) -{ - isTotals = false; - allClasses = rt->new_(); - if (!allClasses || !allClasses->init()) { - js_delete(allClasses); - allClasses = nullptr; - return false; - } - return true; -} - static bool FindNotableStrings(ZoneStats &zStats) { @@ -560,39 +480,18 @@ FindNotableStrings(ZoneStats &zStats) return true; } -static bool -FindNotableClasses(CompartmentStats &cStats) +bool +ZoneStats::initStrings(JSRuntime *rt) { - using namespace JS; - - // We should only run FindNotableClasses once per ZoneStats object. - MOZ_ASSERT(cStats.notableClasses.empty()); - - for (CompartmentStats::ClassesHashMap::Range r = cStats.allClasses->all(); - !r.empty(); - r.popFront()) - { - const char *className = r.front().key(); - ClassInfo &info = r.front().value(); - - // If this class isn't notable, or if we can't grow the notableStrings - // vector, skip this string. - if (!info.isNotable()) - continue; - - if (!cStats.notableClasses.growBy(1)) - return false; - - cStats.notableClasses.back() = NotableClassInfo(className, info); - - // We're moving this class from a non-notable to a notable bucket, so - // subtract it out of the non-notable tallies. - cStats.classInfo.subtract(info); + isTotals = false; + allStrings = rt->new_(); + if (!allStrings) + return false; + if (!allStrings->init()) { + js_delete(allStrings); + allStrings = nullptr; + return false; } - // Delete |allClasses| now, rather than waiting for zStats's destruction, - // to reduce peak memory consumption during reporting. - js_delete(cStats.allClasses); - cStats.allClasses = nullptr; return true; } @@ -676,21 +575,11 @@ JS::CollectRuntimeStats(JSRuntime *rt, RuntimeStats *rtStats, ObjectPrivateVisit MOZ_ASSERT(!zTotals.allStrings); - CompartmentStatsVector &cs = rtStats->compartmentStatsVector; - CompartmentStats &cTotals = rtStats->cTotals; - - // As with the zones, we sum all compartments first, and then get the - // notable classes within each zone. - for (size_t i = 0; i < cs.length(); i++) - cTotals.addSizes(cs[i]); - - for (size_t i = 0; i < cs.length(); i++) { - if (!FindNotableClasses(cs[i])) - return false; + for (size_t i = 0; i < rtStats->compartmentStatsVector.length(); i++) { + CompartmentStats &cStats = rtStats->compartmentStatsVector[i]; + rtStats->cTotals.add(cStats); } - MOZ_ASSERT(!cTotals.allClasses); - rtStats->gcHeapGCThings = rtStats->zTotals.sizeOfLiveGCThings() + rtStats->cTotals.sizeOfLiveGCThings(); @@ -794,8 +683,10 @@ AddSizeOfTab(JSRuntime *rt, HandleObject obj, MallocSizeOf mallocSizeOf, ObjectP JS_ASSERT(rtStats.zoneStatsVector.length() == 1); rtStats.zTotals.addSizes(rtStats.zoneStatsVector[0]); - for (size_t i = 0; i < rtStats.compartmentStatsVector.length(); i++) - rtStats.cTotals.addSizes(rtStats.compartmentStatsVector[i]); + for (size_t i = 0; i < rtStats.compartmentStatsVector.length(); i++) { + CompartmentStats &cStats = rtStats.compartmentStatsVector[i]; + rtStats.cTotals.add(cStats); + } for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) comp->compartmentStats = nullptr; diff --git a/js/src/vm/Shape.h b/js/src/vm/Shape.h index 0b35862b3a51..d9a42d5b3717 100644 --- a/js/src/vm/Shape.h +++ b/js/src/vm/Shape.h @@ -26,7 +26,6 @@ #include "gc/Marking.h" #include "gc/Rooting.h" #include "js/HashTable.h" -#include "js/MemoryMetrics.h" #include "js/RootingAPI.h" #ifdef _MSC_VER @@ -985,17 +984,12 @@ class Shape : public gc::BarrieredCell ShapeTable &table() const { return base()->table(); } void addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, - JS::ClassInfo *info) const - { - if (hasTable()) { - if (inDictionary()) - info->shapesMallocHeapDictTables += table().sizeOfIncludingThis(mallocSizeOf); - else - info->shapesMallocHeapTreeTables += table().sizeOfIncludingThis(mallocSizeOf); - } + size_t *propTableSize, size_t *kidsSize) const { + if (hasTable()) + *propTableSize += table().sizeOfIncludingThis(mallocSizeOf); if (!inDictionary() && kids.isHash()) - info->shapesMallocHeapTreeKids += kids.toHash()->sizeOfIncludingThis(mallocSizeOf); + *kidsSize += kids.toHash()->sizeOfIncludingThis(mallocSizeOf); } bool isNative() const { diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index 53ae0d67b31e..680871cc7f87 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -1911,103 +1911,6 @@ ReportZoneStats(const JS::ZoneStats &zStats, # undef STRING_LENGTH } -static nsresult -ReportClassStats(const ClassInfo &classInfo, const nsACString &path, - nsIHandleReportCallback *cb, nsISupports *closure, - size_t &gcTotal) -{ - // We deliberately don't use ZCREPORT_BYTES, so that these per-class values - // don't go into sundries. - - if (classInfo.objectsGCHeap > 0) { - REPORT_GC_BYTES(path + NS_LITERAL_CSTRING("objects/gc-heap"), - classInfo.objectsGCHeap, - "Objects, including fixed slots."); - } - - if (classInfo.objectsMallocHeapSlots > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/malloc-heap/slots"), - KIND_HEAP, classInfo.objectsMallocHeapSlots, - "Non-fixed object slots."); - } - - if (classInfo.objectsMallocHeapElementsNonAsmJS > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/malloc-heap/elements/non-asm.js"), - KIND_HEAP, classInfo.objectsMallocHeapElementsNonAsmJS, - "Non-asm.js indexed elements."); - } - - // asm.js arrays are heap-allocated on some platforms and - // non-heap-allocated on others. We never put them under sundries, - // because (a) in practice they're almost always larger than the sundries - // threshold, and (b) we'd need a third category of sundries ("non-heap"), - // which would be a pain. - size_t mallocHeapElementsAsmJS = classInfo.objectsMallocHeapElementsAsmJS; - size_t nonHeapElementsAsmJS = classInfo.objectsNonHeapElementsAsmJS; - MOZ_ASSERT(mallocHeapElementsAsmJS == 0 || nonHeapElementsAsmJS == 0); - if (mallocHeapElementsAsmJS > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/malloc-heap/elements/asm.js"), - KIND_HEAP, mallocHeapElementsAsmJS, - "asm.js array buffer elements on the malloc heap."); - } - if (nonHeapElementsAsmJS > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/non-heap/elements/asm.js"), - KIND_NONHEAP, nonHeapElementsAsmJS, - "asm.js array buffer elements outside both the malloc heap and " - "the GC heap."); - } - - if (classInfo.objectsNonHeapCodeAsmJS > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/non-heap/code/asm.js"), - KIND_NONHEAP, classInfo.objectsNonHeapCodeAsmJS, - "AOT-compiled asm.js code."); - } - - if (classInfo.objectsMallocHeapMisc > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("objects/malloc-heap/misc"), - KIND_HEAP, classInfo.objectsMallocHeapMisc, - "Miscellaneous object data."); - } - - if (classInfo.shapesGCHeapTree > 0) { - REPORT_GC_BYTES(path + NS_LITERAL_CSTRING("shapes/gc-heap/tree"), - classInfo.shapesGCHeapTree, - "Shapes in a property tree."); - } - - if (classInfo.shapesGCHeapDict > 0) { - REPORT_GC_BYTES(path + NS_LITERAL_CSTRING("shapes/gc-heap/dict"), - classInfo.shapesGCHeapDict, - "Shapes in dictionary mode."); - } - - if (classInfo.shapesGCHeapBase > 0) { - REPORT_GC_BYTES(path + NS_LITERAL_CSTRING("shapes/gc-heap/base"), - classInfo.shapesGCHeapBase, - "Base shapes, which collate data common to many shapes."); - } - - if (classInfo.shapesMallocHeapTreeTables > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("shapes/malloc-heap/tree-tables"), - KIND_HEAP, classInfo.shapesMallocHeapTreeTables, - "Property tables of shapes in a property tree."); - } - - if (classInfo.shapesMallocHeapDictTables > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("shapes/malloc-heap/dict-tables"), - KIND_HEAP, classInfo.shapesMallocHeapDictTables, - "Property tables of shapes in dictionary mode."); - } - - if (classInfo.shapesMallocHeapTreeKids > 0) { - REPORT_BYTES(path + NS_LITERAL_CSTRING("shapes/malloc-heap/tree-kids"), - KIND_HEAP, classInfo.shapesMallocHeapTreeKids, - "Kid hashes of shapes in a property tree."); - } - - return NS_OK; -} - static nsresult ReportCompartmentStats(const JS::CompartmentStats &cStats, const xpc::CompartmentStatsExtras &extras, @@ -2020,9 +1923,6 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats, size_t gcTotal = 0, sundriesGCHeap = 0, sundriesMallocHeap = 0; nsAutoCString cJSPathPrefix = extras.jsPathPrefix; nsAutoCString cDOMPathPrefix = extras.domPathPrefix; - nsresult rv; - - MOZ_ASSERT(!gcTotalOut == cStats.isTotals); // Only attempt to prefix if we got a location and the path wasn't already // prefixed. @@ -2043,25 +1943,26 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats, } } - nsCString nonNotablePath = cJSPathPrefix; - nonNotablePath += cStats.isTotals - ? NS_LITERAL_CSTRING("classes/") - : NS_LITERAL_CSTRING("classes/class()/"); + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/gc-heap/ordinary"), + cStats.objectsGCHeapOrdinary, + "Ordinary objects, i.e. not otherwise distinguished by memory " + "reporters."); - rv = ReportClassStats(cStats.classInfo, nonNotablePath, cb, closure, - gcTotal); - NS_ENSURE_SUCCESS(rv, rv); + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/gc-heap/function"), + cStats.objectsGCHeapFunction, + "Function objects."); - for (size_t i = 0; i < cStats.notableClasses.length(); i++) { - MOZ_ASSERT(!cStats.isTotals); - const JS::NotableClassInfo& classInfo = cStats.notableClasses[i]; + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/gc-heap/dense-array"), + cStats.objectsGCHeapDenseArray, + "Dense array objects."); - nsCString classPath = cJSPathPrefix + - nsPrintfCString("classes/class(%s)/", classInfo.className_); + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/gc-heap/slow-array"), + cStats.objectsGCHeapSlowArray, + "Slow array objects."); - rv = ReportClassStats(classInfo, classPath, cb, closure, gcTotal); - NS_ENSURE_SUCCESS(rv, rv); - } + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/gc-heap/cross-compartment-wrapper"), + cStats.objectsGCHeapCrossCompartmentWrapper, + "Cross-compartment wrapper objects."); // Note that we use cDOMPathPrefix here. This is because we measure orphan // DOM nodes in the JS reporter, but we want to report them in a "dom" @@ -2071,6 +1972,41 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats, "Orphan DOM nodes, i.e. those that are only reachable from JavaScript " "objects."); + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/gc-heap/tree/global-parented"), + cStats.shapesGCHeapTreeGlobalParented, + "Shapes that (a) are in a property tree, and (b) represent an object " + "whose parent is the global object."); + + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/gc-heap/tree/non-global-parented"), + cStats.shapesGCHeapTreeNonGlobalParented, + "Shapes that (a) are in a property tree, and (b) represent an object " + "whose parent is not the global object."); + + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/gc-heap/dict"), + cStats.shapesGCHeapDict, + "Shapes that are in dictionary mode."); + + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/gc-heap/base"), + cStats.shapesGCHeapBase, + "Base shapes, which collate data common to many shapes."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/malloc-heap/tree-tables"), + cStats.shapesMallocHeapTreeTables, + "Property tables belonging to shapes that are in a property tree."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/malloc-heap/dict-tables"), + cStats.shapesMallocHeapDictTables, + "Property tables that belong to shapes that are in dictionary mode."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/malloc-heap/tree-shape-kids"), + cStats.shapesMallocHeapTreeShapeKids, + "Kid hashes that belong to shapes that are in a property tree."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("shapes/malloc-heap/compartment-tables"), + cStats.shapesMallocHeapCompartmentTables, + "Compartment-wide tables storing shape information used during object " + "construction."); + ZCREPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("scripts/gc-heap"), cStats.scriptsGCHeap, "JSScript instances. There is one per user-defined function in a " @@ -2116,10 +2052,6 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats, cStats.compartmentObject, "The JSCompartment object itself."); - ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("compartment-tables"), - cStats.compartmentTables, - "Compartment-wide tables storing shape and type object information."); - ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("cross-compartment-wrapper-table"), cStats.crossCompartmentWrappersTable, "The cross-compartment wrapper table."); @@ -2132,6 +2064,58 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats, cStats.debuggeesSet, "The debuggees set."); + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/slots"), + cStats.objectsExtra.mallocHeapSlots, + "Non-fixed object slot arrays, which represent object properties."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/elements/non-asm.js"), + cStats.objectsExtra.mallocHeapElementsNonAsmJS, + "Non-asm.js indexed elements."); + + // asm.js arrays are heap-allocated on some platforms and + // non-heap-allocated on others. We never put them under sundries, + // because (a) in practice they're almost always larger than the sundries + // threshold, and (b) we'd need a third category of sundries ("non-heap"), + // which would be a pain. + size_t mallocHeapElementsAsmJS = cStats.objectsExtra.mallocHeapElementsAsmJS; + size_t nonHeapElementsAsmJS = cStats.objectsExtra.nonHeapElementsAsmJS; + MOZ_ASSERT(mallocHeapElementsAsmJS == 0 || nonHeapElementsAsmJS == 0); + if (mallocHeapElementsAsmJS > 0) { + REPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/elements/asm.js"), + KIND_HEAP, mallocHeapElementsAsmJS, + "asm.js array buffer elements on the malloc heap."); + } + if (nonHeapElementsAsmJS > 0) { + REPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/non-heap/elements/asm.js"), + KIND_NONHEAP, nonHeapElementsAsmJS, + "asm.js array buffer elements outside both the malloc heap and " + "the GC heap."); + } + + REPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/non-heap/code/asm.js"), + KIND_NONHEAP, cStats.objectsExtra.nonHeapCodeAsmJS, + "AOT-compiled asm.js code."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/asm.js-module-data"), + cStats.objectsExtra.mallocHeapAsmJSModuleData, + "asm.js module data."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/arguments-data"), + cStats.objectsExtra.mallocHeapArgumentsData, + "Data belonging to Arguments objects."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/regexp-statics"), + cStats.objectsExtra.mallocHeapRegExpStatics, + "Data belonging to the RegExpStatics object."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/property-iterator-data"), + cStats.objectsExtra.mallocHeapPropertyIteratorData, + "Data belonging to property iterator objects."); + + ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/malloc-heap/ctypes-data"), + cStats.objectsExtra.mallocHeapCtypesData, + "Data belonging to ctypes objects."); + if (sundriesGCHeap > 0) { // We deliberately don't use ZCREPORT_GC_BYTES here. REPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("sundries/gc-heap"), @@ -2201,10 +2185,9 @@ ReportJSRuntimeExplicitTreeStats(const JS::RuntimeStats &rtStats, } for (size_t i = 0; i < rtStats.compartmentStatsVector.length(); i++) { - const JS::CompartmentStats &cStats = rtStats.compartmentStatsVector[i]; + JS::CompartmentStats cStats = rtStats.compartmentStatsVector[i]; const xpc::CompartmentStatsExtras *extras = static_cast(cStats.extra); - rv = ReportCompartmentStats(cStats, *extras, addonManager, cb, closure, &gcTotal); NS_ENSURE_SUCCESS(rv, rv); From f275733ee0f6d641e5546859033f2c8484953d0d Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 5 Mar 2014 15:26:49 -0800 Subject: [PATCH 16/70] Bug 972712 (follow-up) - Fix bustage due to a missing #include. r=bustage on a CLOSED TREE. --- js/src/jsscript.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index 929ff87d09b3..f226951b27dc 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -35,6 +35,7 @@ #include "gc/Marking.h" #include "jit/BaselineJIT.h" #include "jit/IonCode.h" +#include "js/MemoryMetrics.h" #include "js/OldDebugAPI.h" #include "js/Utility.h" #include "vm/ArgumentsObject.h" From 9900cfe3ccea18642ef301bee0a232fdc385e0f7 Mon Sep 17 00:00:00 2001 From: Karl Tomlinson Date: Thu, 6 Mar 2014 13:16:37 +1300 Subject: [PATCH 17/70] b=865241 test HRTF panner left/right symmetry and block-offset invariance --HG-- extra : transplant_source : Z%7E%83XS%0Ck%09%00%0A%CA%D9%FF%B8%D3%9E%FB%D72j --- content/media/webaudio/test/mochitest.ini | 1 + .../test/test_pannerNodeHRTFSymmetry.html | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 content/media/webaudio/test/test_pannerNodeHRTFSymmetry.html diff --git a/content/media/webaudio/test/mochitest.ini b/content/media/webaudio/test/mochitest.ini index ae7e68dfb164..74e949d98fad 100644 --- a/content/media/webaudio/test/mochitest.ini +++ b/content/media/webaudio/test/mochitest.ini @@ -108,6 +108,7 @@ support-files = [test_pannerNode.html] [test_pannerNodeAbove.html] [test_pannerNodeChannelCount.html] +[test_pannerNodeHRTFSymmetry.html] [test_pannerNodeTail.html] [test_pannerNode_equalPower.html] [test_periodicWave.html] diff --git a/content/media/webaudio/test/test_pannerNodeHRTFSymmetry.html b/content/media/webaudio/test/test_pannerNodeHRTFSymmetry.html new file mode 100644 index 000000000000..257d2a9efe35 --- /dev/null +++ b/content/media/webaudio/test/test_pannerNodeHRTFSymmetry.html @@ -0,0 +1,104 @@ + + + + Test left/right symmetry and block-offset invariance of HRTF panner + + + + + +
+
+
+ + From c181546a587cf4623cc8ba8cfc4332754bb53eb5 Mon Sep 17 00:00:00 2001 From: Karl Tomlinson Date: Thu, 6 Mar 2014 13:24:10 +1300 Subject: [PATCH 18/70] b=973782 revert 8e574d7a951a, intermittently failing test from bug 938022 DONTBUILD --- content/media/webaudio/test/mochitest.ini | 1 - .../media/webaudio/test/test_bug938022.html | 28 ------------------- 2 files changed, 29 deletions(-) delete mode 100644 content/media/webaudio/test/test_bug938022.html diff --git a/content/media/webaudio/test/mochitest.ini b/content/media/webaudio/test/mochitest.ini index 74e949d98fad..70c9a75c2d48 100644 --- a/content/media/webaudio/test/mochitest.ini +++ b/content/media/webaudio/test/mochitest.ini @@ -63,7 +63,6 @@ support-files = [test_bug875221.html] [test_bug875402.html] [test_bug894150.html] -[test_bug938022.html] [test_bug956489.html] [test_bug964376.html] [test_bug972678.html] diff --git a/content/media/webaudio/test/test_bug938022.html b/content/media/webaudio/test/test_bug938022.html deleted file mode 100644 index 7510549bc387..000000000000 --- a/content/media/webaudio/test/test_bug938022.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - Test audio element currentTime is correct when used as media source - - - - -
-
-
- - From b67b8321a1b134c869e1b9e55f3b7199e06712f6 Mon Sep 17 00:00:00 2001 From: Jonathan Watt Date: Wed, 5 Mar 2014 14:24:01 +0000 Subject: [PATCH 19/70] Bug 979883 - Convert the Qt widget consumers of imgIContainer::GetFrame to act on a Moz2D SourceSurface instead of a Thebes gfxASurface. r=mattwoodrow --- widget/qt/nsClipboard.cpp | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/widget/qt/nsClipboard.cpp b/widget/qt/nsClipboard.cpp index 5f342b3fb3ca..27d8cba45d2c 100644 --- a/widget/qt/nsClipboard.cpp +++ b/widget/qt/nsClipboard.cpp @@ -11,7 +11,9 @@ #include #include +#include "gfxPlatform.h" #include "mozilla/ArrayUtils.h" +#include "mozilla/gfx/2D.h" #include "nsClipboard.h" #include "nsISupportsPrimitives.h" @@ -26,6 +28,7 @@ #include "gfxImageSurface.h" using namespace mozilla; +using namespace mozilla::gfx; NS_IMPL_ISUPPORTS1(nsClipboard, nsIClipboard) @@ -53,14 +56,14 @@ nsClipboard::~nsClipboard() } static inline QImage::Format -_gfximage_to_qformat(gfxImageFormat aFormat) +_moz2dformat_to_qformat(SurfaceFormat aFormat) { switch (aFormat) { - case gfxImageFormat::ARGB32: + case SurfaceFormat::B8G8R8A8: return QImage::Format_ARGB32_Premultiplied; - case gfxImageFormat::RGB24: + case SurfaceFormat::B8G8R8X8: return QImage::Format_ARGB32; - case gfxImageFormat::RGB16_565: + case SurfaceFormat::R5G6B5: return QImage::Format_RGB16; default: return QImage::Format_Invalid; @@ -176,21 +179,33 @@ nsClipboard::SetNativeClipboardData( nsITransferable *aTransferable, if (!image) // Not getting an image for an image mime type!? continue; - nsRefPtr surface = + nsRefPtr thebesSurface = image->GetFrame(imgIContainer::FRAME_CURRENT, imgIContainer::FLAG_SYNC_DECODE); + if (!thebesSurface) + continue; + + RefPtr surface = + gfxPlatform::GetPlatform()->GetSourceSurfaceForSurface(nullptr, + thebesSurface); if (!surface) continue; - nsRefPtr frame(surface->GetAsReadableARGB32ImageSurface()); - if (!frame) + RefPtr dataSurface = + surface->GetDataSurface(); + if (!dataSurface) continue; - QImage qImage(frame->Data(), - frame->Width(), - frame->Height(), - frame->Stride(), - _gfximage_to_qformat(frame->Format())); + DataSourceSurface::MappedSurface map; + dataSurface->Map(DataSourceSurface::MapType::READ, &map); + if (!map.mData) + continue; + + QImage qImage(map.mData, + dataSurface->GetSize().width, + dataSurface->GetSize().height, + map.mStride, + _moz2dformat_to_qformat(dataSurface->GetFormat())); // Add image to the mimeData mimeData->setImageData(qImage); From 1490825198c9805623022f85a9b52aadd0fafc0f Mon Sep 17 00:00:00 2001 From: Jonathan Watt Date: Wed, 5 Mar 2014 16:10:34 +0000 Subject: [PATCH 20/70] Bug 979905 - Make VectorImage use a Moz2D backed gfxContext. r=mattwoodrow --- image/src/VectorImage.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/image/src/VectorImage.cpp b/image/src/VectorImage.cpp index 2de2682832e9..64842cd1928d 100644 --- a/image/src/VectorImage.cpp +++ b/image/src/VectorImage.cpp @@ -14,6 +14,8 @@ #include "mozilla/AutoRestore.h" #include "mozilla/MemoryReporting.h" #include "mozilla/dom/SVGSVGElement.h" +#include "mozilla/gfx/2D.h" +#include "mozilla/RefPtr.h" #include "nsIDOMEvent.h" #include "nsIPresShell.h" #include "nsIStreamListener.h" @@ -680,7 +682,16 @@ VectorImage::GetFrame(uint32_t aWhichFrame, nsRefPtr surface = new gfxImageSurface(surfaceSize, gfxImageFormat::ARGB32); - nsRefPtr context = new gfxContext(surface); + + RefPtr drawTarget = + Factory::CreateDrawTargetForData(BackendType::CAIRO, + surface->Data(), + IntSize(imageIntSize.width, + imageIntSize.height), + surface->Stride(), + SurfaceFormat::B8G8R8A8); + + nsRefPtr context = new gfxContext(drawTarget); // Draw to our surface! // -------------------- From 4c3646d5ae19218988047b045dff4a9978fb29f1 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 16:33:46 -0800 Subject: [PATCH 21/70] Backed out changeset e91a61089c37 (bug 976082) for linux debug m-oth permafails --- accessible/tests/mochitest/jsat/a11y.ini | 3 - accessible/tests/mochitest/jsat/dom_helper.js | 157 ------------------ accessible/tests/mochitest/jsat/gestures.json | 132 --------------- accessible/tests/mochitest/jsat/jsatcommon.js | 15 +- .../mochitest/jsat/test_touch_adapter.html | 54 ------ 5 files changed, 5 insertions(+), 356 deletions(-) delete mode 100644 accessible/tests/mochitest/jsat/dom_helper.js delete mode 100644 accessible/tests/mochitest/jsat/gestures.json delete mode 100644 accessible/tests/mochitest/jsat/test_touch_adapter.html diff --git a/accessible/tests/mochitest/jsat/a11y.ini b/accessible/tests/mochitest/jsat/a11y.ini index bbbd8f2298f3..c0d42259db02 100644 --- a/accessible/tests/mochitest/jsat/a11y.ini +++ b/accessible/tests/mochitest/jsat/a11y.ini @@ -1,7 +1,5 @@ [DEFAULT] support-files = - dom_helper.js - gestures.json jsatcommon.js output.js doc_traversal.html @@ -14,5 +12,4 @@ support-files = [test_live_regions.html] [test_output.html] [test_tables.html] -[test_touch_adapter.html] [test_traversal.html] diff --git a/accessible/tests/mochitest/jsat/dom_helper.js b/accessible/tests/mochitest/jsat/dom_helper.js deleted file mode 100644 index a1711ab9766a..000000000000 --- a/accessible/tests/mochitest/jsat/dom_helper.js +++ /dev/null @@ -1,157 +0,0 @@ -'use strict'; - -/*global getMainChromeWindow, getBoundsForDOMElm, AccessFuTest, Point*/ -/* exported loadJSON*/ - -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import('resource://gre/modules/accessibility/Utils.jsm'); -Cu.import('resource://gre/modules/Geometry.jsm'); - -var win = getMainChromeWindow(window); - -var winUtils = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface( - Ci.nsIDOMWindowUtils); - -/** - * For a given list of points calculate their coordinates in relation to the - * document body. - * @param {Array} aTouchPoints An array of objects of the following format: { - * base: {String}, // Id of an element to server as a base for the touch. - * x: {Number}, // An optional x offset from the base element's geometric - * // centre. - * y: {Number} // An optional y offset from the base element's geometric - * // centre. - * } - * @return {JSON} An array of {x, y} coordinations. - */ -function calculateTouchListCoordinates(aTouchPoints) { - var coords = []; - var dpi = winUtils.displayDPI; - for (var i = 0, target = aTouchPoints[i]; i < aTouchPoints.length; ++i) { - var bounds = getBoundsForDOMElm(target.base); - var parentBounds = getBoundsForDOMElm('root'); - var point = new Point(target.x || 0, target.y || 0); - point.scale(dpi); - point.add(bounds[0], bounds[1]); - point.add(bounds[2] / 2, bounds[3] / 2); - point.subtract(parentBounds[0], parentBounds[0]); - coords.push({ - x: point.x, - y: point.y - }); - } - return coords; -} - -/** - * Send a touch event with specified touchPoints. - * @param {Array} aTouchPoints An array of points to be associated with - * touches. - * @param {String} aName A name of the touch event. - */ -function sendTouchEvent(aTouchPoints, aName) { - var touchList = sendTouchEvent.touchList; - if (aName === 'touchend') { - sendTouchEvent.touchList = null; - } else { - var coords = calculateTouchListCoordinates(aTouchPoints); - var touches = []; - for (var i = 0; i < coords.length; ++i) { - var {x, y} = coords[i]; - var node = document.elementFromPoint(x, y); - var touch = document.createTouch(window, node, aName === 'touchstart' ? - 1 : touchList.item(i).identifier, x, y, x, y); - touches.push(touch); - } - touchList = document.createTouchList(touches); - sendTouchEvent.touchList = touchList; - } - var evt = document.createEvent('TouchEvent'); - evt.initTouchEvent(aName, true, true, window, 0, false, false, false, false, - touchList, touchList, touchList); - document.dispatchEvent(evt); -} - -sendTouchEvent.touchList = null; - -/** - * A map of event names to the functions that actually send them. - * @type {Object} - */ -var eventMap = { - touchstart: sendTouchEvent, - touchend: sendTouchEvent, - touchmove: sendTouchEvent -}; - -/** - * Attach a listener for the mozAccessFuGesture event that tests its - * type. - * @param {Array} aExpectedGestures A stack of expected event types. - * Note: the listener is removed once the stack reaches 0. - */ -function testMozAccessFuGesture(aExpectedGestures) { - var types = typeof aExpectedGestures === "string" ? - [aExpectedGestures] : aExpectedGestures; - function handleGesture(aEvent) { - is(aEvent.detail.type, types.shift(), - 'Received correct mozAccessFuGesture: ' + aExpectedGestures + '.'); - if (types.length === 0) { - win.removeEventListener('mozAccessFuGesture', handleGesture); - AccessFuTest.nextTest(); - } - } - win.addEventListener('mozAccessFuGesture', handleGesture); -} - -/** - * An extention to AccessFuTest that adds an ability to test a sequence of - * touch/mouse/etc events and their expected mozAccessFuGesture events. - * @param {Array} aSequence An array of touch/mouse/etc events to be generated - * and the expected mozAccessFuGesture events. - */ -AccessFuTest.addSequence = function AccessFuTest_addSequence(aSequence) { - aSequence.forEach(function add(step) { - function fireEvent() { - eventMap[step.type](step.target, step.type); - } - function runStep() { - if (step.expectedGestures) { - testMozAccessFuGesture(step.expectedGestures); - fireEvent(); - } else { - fireEvent(); - AccessFuTest.nextTest(); - } - } - AccessFuTest.addFunc(function() { - if (step.delay) { - window.setTimeout(runStep, step.delay); - } else { - runStep(); - } - }); - }); - AccessFuTest.addFunc(function() { - // In order to isolate sequences of touch/mouse/etc events run them with 1s - // timeout. - window.setTimeout(AccessFuTest.nextTest, 1000); - }); -}; - -/** - * A helper function that loads JSON files. - * @param {String} aPath A path to a JSON file. - * @param {Function} aCallback A callback to be called on success. - */ -function loadJSON(aPath, aCallback) { - var request = new XMLHttpRequest(); - request.open('GET', aPath, true); - request.responseType = 'json'; - request.onload = function onload() { - aCallback(request.response); - }; - request.send(); -} diff --git a/accessible/tests/mochitest/jsat/gestures.json b/accessible/tests/mochitest/jsat/gestures.json deleted file mode 100644 index e073521014d8..000000000000 --- a/accessible/tests/mochitest/jsat/gestures.json +++ /dev/null @@ -1,132 +0,0 @@ -[ - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchend", "delay": 100, "expectedGestures": "tap"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.03, "y": 0.02}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "tap"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "expectedGestures": "dwell"}, - {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.03, "y": 0.02}], - "delay": 50}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100}, - {"type": "touchmove", "target": [{"base": "button", "x": -0.03, "y": 0.01}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "doubletap"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100}, - {"type": "touchend", "delay": 100, "expectedGestures": "tripletap"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100, "expectedGestures": "doubletaphold"}, - {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchend", "delay": 100}, - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 100, "expectedGestures": "taphold"}, - {"type": "touchend", "delay": 600, "expectedGestures": "dwellend"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0.5, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipeleft"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0.5}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipedown"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0.5}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipeup"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0.1}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0.5, "y": 0.1}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": -0.05}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipeleft"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}]}, - {"type": "touchmove", "target": [{"base": "button", "x": -0.1, "y": 0.5}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipedown"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swipeup"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 450, "expectedGestures": "explore"}, - {"type": "touchend", "delay": 100, "expectedGestures": "exploreend"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0.1, "y": 0.5}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0, "y": 0}], - "delay": 450, "expectedGestures": "explore"}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.1, "y": 0.5}], - "delay": 150, "expectedGestures": "explore"}, - {"type": "touchend", "delay": 100, "expectedGestures": "exploreend"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}, - {"base": "button", "x": 0, "y": 0.5}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}, - {"base": "button", "x": 0.5, "y": 0.5}], "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} - ], - [ - {"type": "touchstart", "target": [{"base": "button", "x": 0, "y": 0}, - {"base": "button", "x": 0, "y": 0.5}, - {"base": "button", "x": 0, "y": 1}]}, - {"type": "touchmove", "target": [{"base": "button", "x": 0.5, "y": 0}, - {"base": "button", "x": 0.5, "y": 0.5}, - {"base": "button", "x": 0.5, "y": 1}], - "delay": 50}, - {"type": "touchend", "delay": 100, "expectedGestures": "swiperight"} - ] -] diff --git a/accessible/tests/mochitest/jsat/jsatcommon.js b/accessible/tests/mochitest/jsat/jsatcommon.js index 3393a66bf947..7d3aaceb6a65 100644 --- a/accessible/tests/mochitest/jsat/jsatcommon.js +++ b/accessible/tests/mochitest/jsat/jsatcommon.js @@ -1,10 +1,5 @@ // A common module to run tests on the AccessFu module -'use strict'; - -/*global isDeeply, getMainChromeWindow, SimpleTest, SpecialPowers, Logger, - AccessFu, Utils, addMessageListener, currentTabDocument, currentBrowser*/ - /** * A global variable holding an array of test functions. */ @@ -122,12 +117,12 @@ var AccessFuTest = { runTests: function AccessFuTest_runTests() { if (gTestFuncs.length === 0) { ok(false, "No tests specified!"); - SimpleTest.finish(); + simpleTest.finish(); return; } // Create an Iterator for gTestFuncs array. - gIterator = Iterator(gTestFuncs); // jshint ignore:line + gIterator = Iterator(gTestFuncs); // Start AccessFu and put it in stand-by. Components.utils.import("resource://gre/modules/accessibility/AccessFu.jsm"); @@ -149,7 +144,7 @@ var AccessFuTest = { AccessFuTest.nextTest(); } else { // Run all test functions synchronously. - [testFunc() for (testFunc of gTestFuncs)]; // jshint ignore:line + [testFunc() for (testFunc of gTestFuncs)]; AccessFuTest.finish(); } }); @@ -204,7 +199,7 @@ AccessFuContentTest.prototype = { } aMessageManager.addMessageListener('AccessFu:Present', this); - aMessageManager.addMessageListener('AccessFu:Ready', function () { + aMessageManager.addMessageListener('AccessFu:Ready', function (aMessage) { aMessageManager.addMessageListener('AccessFu:ContentStarted', aCallback); aMessageManager.sendAsyncMessage('AccessFu:Start', { buildApp: 'browser' }); }); @@ -231,7 +226,7 @@ AccessFuContentTest.prototype = { } } else if (this.finishedCallback) { for (var mm of this.mms) { - mm.sendAsyncMessage('AccessFu:Stop'); + mm.sendAsyncMessage('AccessFu:Stop'); } this.finishedCallback(); } diff --git a/accessible/tests/mochitest/jsat/test_touch_adapter.html b/accessible/tests/mochitest/jsat/test_touch_adapter.html deleted file mode 100644 index 2aba79504dbf..000000000000 --- a/accessible/tests/mochitest/jsat/test_touch_adapter.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - AccessFu tests for touch adapters. - - - - - - - - - - - - - Mozilla Bug 976082 - -
- -
- - From f5ba183f678d8b513e458d7fc1b4f065cd255cb3 Mon Sep 17 00:00:00 2001 From: Jonathan Watt Date: Thu, 6 Mar 2014 00:35:23 +0000 Subject: [PATCH 22/70] Bug 660224 - Test whether using MozReftestInvalidate and MozAfterPaint fixes the orange for layout/reftests/css-ui-invalid/default-style/textarea-focus.html. r=dholbert --HG-- extra : rebase_source : a4134334ad32e4c8334856167f440d769c9b5643 --- .../default-style/textarea-focus.html | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/layout/reftests/css-ui-invalid/default-style/textarea-focus.html b/layout/reftests/css-ui-invalid/default-style/textarea-focus.html index 0f9d79026303..673974c2a5e2 100644 --- a/layout/reftests/css-ui-invalid/default-style/textarea-focus.html +++ b/layout/reftests/css-ui-invalid/default-style/textarea-focus.html @@ -1,13 +1,24 @@ - - + + From cd3950ff3fd14e44c8c25646d1b907af3c4d7d13 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Wed, 5 Mar 2014 19:36:56 -0500 Subject: [PATCH 23/70] Bug 977170 - can't query IAccessible from HTML area element having ISimpleDOMNode pointer, r=tbsaunde --- accessible/src/base/FocusManager.cpp | 39 ++++--------------- accessible/src/base/FocusManager.h | 6 --- accessible/src/generic/DocAccessible-inl.h | 7 ++++ accessible/src/generic/DocAccessible.cpp | 26 +++++++++++++ accessible/src/generic/DocAccessible.h | 9 +++++ accessible/src/generic/moz.build | 1 + .../src/windows/sdn/sdnAccessible-inl.h | 2 +- 7 files changed, 51 insertions(+), 39 deletions(-) diff --git a/accessible/src/base/FocusManager.cpp b/accessible/src/base/FocusManager.cpp index 14dcdcc70eb8..24ab912e3495 100644 --- a/accessible/src/base/FocusManager.cpp +++ b/accessible/src/base/FocusManager.cpp @@ -7,11 +7,9 @@ #include "Accessible-inl.h" #include "AccIterator.h" #include "DocAccessible-inl.h" -#include "HTMLImageMapAccessible.h" #include "nsAccessibilityService.h" #include "nsAccUtils.h" #include "nsEventShell.h" -#include "nsImageFrame.h" #include "Role.h" #include "nsEventStateManager.h" @@ -39,7 +37,7 @@ FocusManager::FocusedAccessible() const if (focusedNode) { DocAccessible* doc = GetAccService()->GetDocAccessible(focusedNode->OwnerDoc()); - return doc ? GetFocusableAccessibleFor(focusedNode, doc) : nullptr; + return doc ? doc->GetAccessibleEvenIfNotInMapOrContainer(focusedNode) : nullptr; } return nullptr; @@ -63,7 +61,7 @@ FocusManager::IsFocused(const Accessible* aAccessible) const DocAccessible* doc = GetAccService()->GetDocAccessible(focusedNode->OwnerDoc()); return aAccessible == - (doc ? GetFocusableAccessibleFor(focusedNode, doc) : nullptr); + (doc ? doc->GetAccessibleEvenIfNotInMapOrContainer(focusedNode) : nullptr); } } return false; @@ -243,7 +241,7 @@ FocusManager::ProcessDOMFocus(nsINode* aTarget) DocAccessible* document = GetAccService()->GetDocAccessible(aTarget->OwnerDoc()); - Accessible* target = GetFocusableAccessibleFor(aTarget, document); + Accessible* target = document->GetAccessibleEvenIfNotInMapOrContainer(aTarget); if (target && document) { // Check if still focused. Otherwise we can end up with storing the active // item for control that isn't focused anymore. @@ -251,7 +249,8 @@ FocusManager::ProcessDOMFocus(nsINode* aTarget) if (!focusedNode) return; - Accessible* DOMFocus = GetFocusableAccessibleFor(focusedNode, document); + Accessible* DOMFocus = + document->GetAccessibleEvenIfNotInMapOrContainer(focusedNode); if (target != DOMFocus) return; @@ -283,7 +282,8 @@ FocusManager::ProcessFocusEvent(AccEvent* aEvent) if (!focusedNode) return; - Accessible* DOMFocus = GetFocusableAccessibleFor(focusedNode, document); + Accessible* DOMFocus = + document->GetAccessibleEvenIfNotInMapOrContainer(focusedNode); if (target != DOMFocus) return; @@ -408,28 +408,3 @@ FocusManager::FocusedDOMDocument() const nsINode* focusedNode = FocusedDOMNode(); return focusedNode ? focusedNode->OwnerDoc() : nullptr; } - -Accessible* -FocusManager::GetFocusableAccessibleFor(nsINode* aNode, - DocAccessible* aDoc) const -{ - if (!aNode->IsContent() || !aNode->AsContent()->IsHTML(nsGkAtoms::area)) - return aDoc->GetAccessibleOrContainer(aNode); - - // XXX Bug 135040, incorrect when multiple images use the same map. - nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame(); - nsImageFrame* imageFrame = do_QueryFrame(frame); - if (imageFrame) { - Accessible* parent = aDoc->GetAccessible(imageFrame->GetContent()); - if (parent) { - Accessible* area = - parent->AsImageMap()->GetChildAccessibleFor(aNode); - if (area) - return area; - - return nullptr; - } - } - - return aDoc->GetAccessibleOrContainer(aNode); -} diff --git a/accessible/src/base/FocusManager.h b/accessible/src/base/FocusManager.h index c6790a0933d7..ccbbd9e9ee38 100644 --- a/accessible/src/base/FocusManager.h +++ b/accessible/src/base/FocusManager.h @@ -123,12 +123,6 @@ private: */ nsIDocument* FocusedDOMDocument() const; - /** - * Return accessible for a focusable node. - */ - Accessible* GetFocusableAccessibleFor(nsINode* aNode, - DocAccessible* aDoc) const; - private: nsRefPtr mActiveItem; nsRefPtr mActiveARIAMenubar; diff --git a/accessible/src/generic/DocAccessible-inl.h b/accessible/src/generic/DocAccessible-inl.h index 6e884863ca71..76629326e2a2 100644 --- a/accessible/src/generic/DocAccessible-inl.h +++ b/accessible/src/generic/DocAccessible-inl.h @@ -116,6 +116,13 @@ DocAccessible::MaybeNotifyOfValueChange(Accessible* aAccessible) FireDelayedEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE, aAccessible); } +inline Accessible* +DocAccessible::GetAccessibleEvenIfNotInMapOrContainer(nsINode* aNode) const +{ + Accessible* acc = GetAccessibleEvenIfNotInMap(aNode); + return acc ? acc : GetContainerAccessible(aNode); +} + } // namespace a11y } // namespace mozilla diff --git a/accessible/src/generic/DocAccessible.cpp b/accessible/src/generic/DocAccessible.cpp index 2da4eb104b7e..1629e39bd8ff 100644 --- a/accessible/src/generic/DocAccessible.cpp +++ b/accessible/src/generic/DocAccessible.cpp @@ -6,6 +6,7 @@ #include "Accessible-inl.h" #include "AccIterator.h" #include "DocAccessible-inl.h" +#include "HTMLImageMapAccessible.h" #include "nsAccCache.h" #include "nsAccessiblePivot.h" #include "nsAccUtils.h" @@ -30,6 +31,7 @@ #include "nsEventStateManager.h" #include "nsIFrame.h" #include "nsIInterfaceRequestorUtils.h" +#include "nsImageFrame.h" #include "nsIPersistentProperties2.h" #include "nsIPresShell.h" #include "nsIServiceManager.h" @@ -1435,6 +1437,30 @@ DocAccessible::ProcessInvalidationList() mInvalidationList.Clear(); } +Accessible* +DocAccessible::GetAccessibleEvenIfNotInMap(nsINode* aNode) const +{ +if (!aNode->IsContent() || !aNode->AsContent()->IsHTML(nsGkAtoms::area)) + return GetAccessible(aNode); + + // XXX Bug 135040, incorrect when multiple images use the same map. + nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame(); + nsImageFrame* imageFrame = do_QueryFrame(frame); + if (imageFrame) { + Accessible* parent = GetAccessible(imageFrame->GetContent()); + if (parent) { + Accessible* area = + parent->AsImageMap()->GetChildAccessibleFor(aNode); + if (area) + return area; + + return nullptr; + } + } + + return GetAccessible(aNode); +} + //////////////////////////////////////////////////////////////////////////////// // Accessible protected diff --git a/accessible/src/generic/DocAccessible.h b/accessible/src/generic/DocAccessible.h index 2c8eb0a50ad6..a7398de14b4d 100644 --- a/accessible/src/generic/DocAccessible.h +++ b/accessible/src/generic/DocAccessible.h @@ -211,6 +211,15 @@ public: */ Accessible* GetAccessible(nsINode* aNode) const; + /** + * Return an accessible for the given node even if the node is not in + * document's node map cache (like HTML area element). + * + * XXX: it should be really merged with GetAccessible(). + */ + Accessible* GetAccessibleEvenIfNotInMap(nsINode* aNode) const; + Accessible* GetAccessibleEvenIfNotInMapOrContainer(nsINode* aNode) const; + /** * Return whether the given DOM node has an accessible or not. */ diff --git a/accessible/src/generic/moz.build b/accessible/src/generic/moz.build index 2694aed6b178..c76afb218f19 100644 --- a/accessible/src/generic/moz.build +++ b/accessible/src/generic/moz.build @@ -40,6 +40,7 @@ if CONFIG['MOZ_ENABLE_GTK']: ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': LOCAL_INCLUDES += [ + '../windows/ia2', '../windows/msaa', ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': diff --git a/accessible/src/windows/sdn/sdnAccessible-inl.h b/accessible/src/windows/sdn/sdnAccessible-inl.h index 40af20ee63a2..a3d1a95e8094 100644 --- a/accessible/src/windows/sdn/sdnAccessible-inl.h +++ b/accessible/src/windows/sdn/sdnAccessible-inl.h @@ -25,7 +25,7 @@ inline Accessible* sdnAccessible::GetAccessible() const { DocAccessible* document = GetDocument(); - return document ? document->GetAccessible(mNode) : nullptr; + return document ? document->GetAccessibleEvenIfNotInMap(mNode) : nullptr; } } // namespace a11y From 4d169705e6fc0f12435eb35951e50d5a912fd6f8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 5 Mar 2014 16:53:08 -0800 Subject: [PATCH 24/70] (no bug) Add labels to the various is() checks in test_initial_storage.html, to aid in diagnosing test-failures. r=dholbert --- layout/style/test/test_initial_storage.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/layout/style/test/test_initial_storage.html b/layout/style/test/test_initial_storage.html index 7d040b7dba89..f7c62c4eea8e 100644 --- a/layout/style/test/test_initial_storage.html +++ b/layout/style/test/test_initial_storage.html @@ -41,7 +41,8 @@ function test_property(property) var val = gDeclaration.getPropertyValue(sproperty); is(val, "", "value of '" + sproperty + "' before we do anything"); is(val, gDeclaration[sinfo.domProp], - "consistency between decl.getPropertyValue('" + sproperty + "') and decl." + sinfo.domProp); + "(initial) consistency between decl.getPropertyValue('" + sproperty + + "') and decl." + sinfo.domProp); } check_initial(property); if ("subproperties" in info) @@ -56,7 +57,7 @@ function test_property(property) is(val, keyword, keyword + " reported back for property '" + sproperty + "'"); is(val, gDeclaration[sinfo.domProp], - "consistency between decl.getPropertyValue('" + sproperty + + "(set) consistency between decl.getPropertyValue('" + sproperty + "') and decl." + sinfo.domProp); } check_set(property); @@ -81,7 +82,8 @@ function test_property(property) var val = gDeclaration.getPropertyValue(sproperty); is(val, "", "value of '" + sproperty + "' after removal of value"); is(val, gDeclaration[sinfo.domProp], - "consistency between decl.getPropertyValue('" + sproperty + "') and decl." + sinfo.domProp); + "(final) consistency between decl.getPropertyValue('" + sproperty + + "') and decl." + sinfo.domProp); } check_final(property); if ("subproperties" in info) From 6ca9eaaa7d8daec7c170f0d4d2c9ba661483edf6 Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Wed, 5 Mar 2014 17:35:40 -0800 Subject: [PATCH 25/70] Bug 980108 - GLContext.h should not use GLAPIENTRY decls. - r=kamidphish --- gfx/gl/GLContext.h | 48 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/gfx/gl/GLContext.h b/gfx/gl/GLContext.h index d29bc3961012..012291a4a4d6 100644 --- a/gfx/gl/GLContext.h +++ b/gfx/gl/GLContext.h @@ -1938,39 +1938,39 @@ public: private: - GLuint GLAPIENTRY raw_fCreateProgram() { + GLuint raw_fCreateProgram() { BEFORE_GL_CALL; GLuint ret = mSymbols.fCreateProgram(); AFTER_GL_CALL; return ret; } - GLuint GLAPIENTRY raw_fCreateShader(GLenum t) { + GLuint raw_fCreateShader(GLenum t) { BEFORE_GL_CALL; GLuint ret = mSymbols.fCreateShader(t); AFTER_GL_CALL; return ret; } - void GLAPIENTRY raw_fGenBuffers(GLsizei n, GLuint* names) { + void raw_fGenBuffers(GLsizei n, GLuint* names) { BEFORE_GL_CALL; mSymbols.fGenBuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fGenFramebuffers(GLsizei n, GLuint* names) { + void raw_fGenFramebuffers(GLsizei n, GLuint* names) { BEFORE_GL_CALL; mSymbols.fGenFramebuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fGenRenderbuffers(GLsizei n, GLuint* names) { + void raw_fGenRenderbuffers(GLsizei n, GLuint* names) { BEFORE_GL_CALL; mSymbols.fGenRenderbuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fGenTextures(GLsizei n, GLuint* names) { + void raw_fGenTextures(GLsizei n, GLuint* names) { BEFORE_GL_CALL; mSymbols.fGenTextures(n, names); AFTER_GL_CALL; @@ -2010,37 +2010,37 @@ public: } private: - void GLAPIENTRY raw_fDeleteProgram(GLuint program) { + void raw_fDeleteProgram(GLuint program) { BEFORE_GL_CALL; mSymbols.fDeleteProgram(program); AFTER_GL_CALL; } - void GLAPIENTRY raw_fDeleteShader(GLuint shader) { + void raw_fDeleteShader(GLuint shader) { BEFORE_GL_CALL; mSymbols.fDeleteShader(shader); AFTER_GL_CALL; } - void GLAPIENTRY raw_fDeleteBuffers(GLsizei n, const GLuint* names) { + void raw_fDeleteBuffers(GLsizei n, const GLuint* names) { BEFORE_GL_CALL; mSymbols.fDeleteBuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fDeleteFramebuffers(GLsizei n, const GLuint* names) { + void raw_fDeleteFramebuffers(GLsizei n, const GLuint* names) { BEFORE_GL_CALL; mSymbols.fDeleteFramebuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fDeleteRenderbuffers(GLsizei n, const GLuint* names) { + void raw_fDeleteRenderbuffers(GLsizei n, const GLuint* names) { BEFORE_GL_CALL; mSymbols.fDeleteRenderbuffers(n, names); AFTER_GL_CALL; } - void GLAPIENTRY raw_fDeleteTextures(GLsizei n, const GLuint* names) { + void raw_fDeleteTextures(GLsizei n, const GLuint* names) { BEFORE_GL_CALL; mSymbols.fDeleteTextures(n, names); AFTER_GL_CALL; @@ -2090,7 +2090,7 @@ public: TRACKING_CONTEXT(DeletedTextures(this, n, names)); } - GLenum GLAPIENTRY fGetGraphicsResetStatus() { + GLenum fGetGraphicsResetStatus() { MOZ_ASSERT(mHasRobustness); BEFORE_GL_CALL; @@ -2104,7 +2104,7 @@ public: // ----------------------------------------------------------------------------- // Extension ARB_sync (GL) public: - GLsync GLAPIENTRY fFenceSync(GLenum condition, GLbitfield flags) { + GLsync fFenceSync(GLenum condition, GLbitfield flags) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fFenceSync); GLsync ret = mSymbols.fFenceSync(condition, flags); @@ -2112,7 +2112,7 @@ public: return ret; } - realGLboolean GLAPIENTRY fIsSync(GLsync sync) { + realGLboolean fIsSync(GLsync sync) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fIsSync); realGLboolean ret = mSymbols.fIsSync(sync); @@ -2120,14 +2120,14 @@ public: return ret; } - void GLAPIENTRY fDeleteSync(GLsync sync) { + void fDeleteSync(GLsync sync) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fDeleteSync); mSymbols.fDeleteSync(sync); AFTER_GL_CALL; } - GLenum GLAPIENTRY fClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { + GLenum fClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fClientWaitSync); GLenum ret = mSymbols.fClientWaitSync(sync, flags, timeout); @@ -2135,21 +2135,21 @@ public: return ret; } - void GLAPIENTRY fWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { + void fWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fWaitSync); mSymbols.fWaitSync(sync, flags, timeout); AFTER_GL_CALL; } - void GLAPIENTRY fGetInteger64v(GLenum pname, GLint64 *params) { + void fGetInteger64v(GLenum pname, GLint64 *params) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fGetInteger64v); mSymbols.fGetInteger64v(pname, params); AFTER_GL_CALL; } - void GLAPIENTRY fGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) { + void fGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fGetSynciv); mSymbols.fGetSynciv(sync, pname, bufSize, length, values); @@ -2404,7 +2404,7 @@ public: // ----------------------------------------------------------------------------- // Package XXX_vertex_array_object public: - void GLAPIENTRY fBindVertexArray(GLuint array) + void fBindVertexArray(GLuint array) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fBindVertexArray); @@ -2412,7 +2412,7 @@ public: AFTER_GL_CALL; } - void GLAPIENTRY fDeleteVertexArrays(GLsizei n, const GLuint *arrays) + void fDeleteVertexArrays(GLsizei n, const GLuint *arrays) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fDeleteVertexArrays); @@ -2420,7 +2420,7 @@ public: AFTER_GL_CALL; } - void GLAPIENTRY fGenVertexArrays(GLsizei n, GLuint *arrays) + void fGenVertexArrays(GLsizei n, GLuint *arrays) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fGenVertexArrays); @@ -2428,7 +2428,7 @@ public: AFTER_GL_CALL; } - realGLboolean GLAPIENTRY fIsVertexArray(GLuint array) + realGLboolean fIsVertexArray(GLuint array) { BEFORE_GL_CALL; ASSERT_SYMBOL_PRESENT(fIsVertexArray); From d56fde36e243a5fd76b26290d6c600234c36adde Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Wed, 5 Mar 2014 17:58:01 -0800 Subject: [PATCH 26/70] Bug 619487: Assert when preferences are used off the main thread. r=dbaron --- modules/libpref/src/Preferences.cpp | 2 ++ modules/libpref/src/nsPrefBranch.h | 6 +++--- modules/libpref/src/prefapi.cpp | 9 +++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp index 0f770d5d4c1d..14609ca099c3 100644 --- a/modules/libpref/src/Preferences.cpp +++ b/modules/libpref/src/Preferences.cpp @@ -402,6 +402,8 @@ Preferences::GetInstanceForService() bool Preferences::InitStaticMembers() { + MOZ_ASSERT(NS_IsMainThread()); + if (!sShutdown && !sPreferences) { nsCOMPtr prefService = do_GetService(NS_PREFSERVICE_CONTRACTID); diff --git a/modules/libpref/src/nsPrefBranch.h b/modules/libpref/src/nsPrefBranch.h index a168be04c52d..faa47f2f06b8 100644 --- a/modules/libpref/src/nsPrefBranch.h +++ b/modules/libpref/src/nsPrefBranch.h @@ -182,7 +182,7 @@ class nsPrefBranch : public nsIPrefBranchInternal, { friend class mozilla::PreferenceServiceReporter; public: - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_DECL_NSIPREFBRANCH NS_DECL_NSIPREFBRANCH2 NS_DECL_NSIOBSERVER @@ -235,7 +235,7 @@ public: nsPrefLocalizedString(); virtual ~nsPrefLocalizedString(); - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_FORWARD_NSISUPPORTSSTRING(mUnicodeString->) NS_FORWARD_NSISUPPORTSPRIMITIVE(mUnicodeString->) @@ -253,7 +253,7 @@ private: class nsRelativeFilePref : public nsIRelativeFilePref { public: - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_DECL_NSIRELATIVEFILEPREF nsRelativeFilePref(); diff --git a/modules/libpref/src/prefapi.cpp b/modules/libpref/src/prefapi.cpp index 4a0363057e5d..35ddaa08472e 100644 --- a/modules/libpref/src/prefapi.cpp +++ b/modules/libpref/src/prefapi.cpp @@ -8,6 +8,7 @@ #include "prefapi.h" #include "prefapi_private_data.h" #include "prefread.h" +#include "MainThreadUtils.h" #include "nsReadableUtils.h" #include "nsCRT.h" @@ -575,6 +576,8 @@ pref_DeleteItem(PLDHashTable *table, PLDHashEntryHdr *heh, uint32_t i, void *arg nsresult PREF_DeleteBranch(const char *branch_name) { + MOZ_ASSERT(NS_IsMainThread()); + int len = (int)strlen(branch_name); if (!gHashTable.ops) @@ -642,6 +645,8 @@ pref_ClearUserPref(PLDHashTable *table, PLDHashEntryHdr *he, uint32_t, nsresult PREF_ClearAllUserPrefs() { + MOZ_ASSERT(NS_IsMainThread()); + if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; @@ -716,6 +721,8 @@ static void pref_SetValue(PrefValue* oldValue, PrefValue newValue, PrefType type PrefHashEntry* pref_HashTableLookup(const void *key) { + MOZ_ASSERT(NS_IsMainThread()); + PrefHashEntry* result = static_cast(PL_DHashTableOperate(&gHashTable, key, PL_DHASH_LOOKUP)); @@ -727,6 +734,8 @@ PrefHashEntry* pref_HashTableLookup(const void *key) nsresult pref_HashPref(const char *key, PrefValue value, PrefType type, uint32_t flags) { + MOZ_ASSERT(NS_IsMainThread()); + if (!gHashTable.ops) return NS_ERROR_OUT_OF_MEMORY; From a315427893b841eeb58a0cfa888ddd5d85772480 Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Wed, 5 Mar 2014 17:58:03 -0800 Subject: [PATCH 27/70] Bug 979951: Always preserve the worker wrapper to ensure that we have something to tell us what compartment to enter. r=bent --- dom/workers/WorkerPrivate.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index f5921e84fd26..28da302c1e8f 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -2142,7 +2142,13 @@ WorkerPrivateParent::WrapObject(JSContext* aCx, AssertIsOnParentThread(); - return WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate()); + JSObject* wrapper = + WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate()); + if (wrapper) { + MOZ_ALWAYS_TRUE(TryPreserveWrapper(wrapper)); + } + + return wrapper; } template From e61fc8be4dbcaec41099675076986a9315557609 Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Wed, 5 Mar 2014 17:58:13 -0800 Subject: [PATCH 28/70] Bug 968836 - fix a few already_AddRefed members in MediaManager.cpp; r=jesup --- dom/media/MediaManager.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 79902f9ff38b..2a215c091b09 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -1,3 +1,5 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -225,23 +227,22 @@ class DeviceSuccessCallbackRunnable: public nsRunnable public: DeviceSuccessCallbackRunnable( uint64_t aWindowID, - already_AddRefed aSuccess, - already_AddRefed aError, + nsCOMPtr aSuccess, + nsCOMPtr aError, nsTArray >* aDevices) - : mSuccess(aSuccess) - , mError(aError) - , mDevices(aDevices) + : mDevices(aDevices) , mWindowID(aWindowID) - , mManager(MediaManager::GetInstance()) {} + , mManager(MediaManager::GetInstance()) + { + mSuccess.swap(aSuccess); + mError.swap(aError); + } NS_IMETHOD Run() { NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); - nsCOMPtr success(mSuccess); - nsCOMPtr error(mError); - // Only run if window is still on our active list. if (!mManager->IsWindowStillActive(mWindowID)) { return NS_OK; @@ -256,7 +257,7 @@ public: // We should in the future return an empty array, and dynamically add // devices to the dropdowns if things are hotplugged while the // requester is up. - error->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); + mError->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); return NS_OK; } @@ -272,13 +273,13 @@ public: static_cast(tmp.Elements()) )); - success->OnSuccess(devices); + mSuccess->OnSuccess(devices); return NS_OK; } private: - already_AddRefed mSuccess; - already_AddRefed mError; + nsCOMPtr mSuccess; + nsCOMPtr mError; nsAutoPtr > > mDevices; uint64_t mWindowID; nsRefPtr mManager; @@ -1099,13 +1100,15 @@ public: NS_DispatchToMainThread(new DeviceSuccessCallbackRunnable(mWindowId, mSuccess, mError, final.forget())); + // DeviceSuccessCallbackRunnable should have taken these. + MOZ_ASSERT(!mSuccess && !mError); return NS_OK; } private: MediaStreamConstraintsInternal mConstraints; - already_AddRefed mSuccess; - already_AddRefed mError; + nsCOMPtr mSuccess; + nsCOMPtr mError; nsRefPtr mManager; uint64_t mWindowId; const nsString mCallId; From c4e9ca8e55e2f354b890679c33e47a60105d085e Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 18:01:32 -0800 Subject: [PATCH 29/70] Backed out changeset 3b3d4ad70da0 (bug 660224) for turning textarea-focus.html permaorange on Windows --- .../default-style/textarea-focus.html | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/layout/reftests/css-ui-invalid/default-style/textarea-focus.html b/layout/reftests/css-ui-invalid/default-style/textarea-focus.html index 673974c2a5e2..0f9d79026303 100644 --- a/layout/reftests/css-ui-invalid/default-style/textarea-focus.html +++ b/layout/reftests/css-ui-invalid/default-style/textarea-focus.html @@ -1,24 +1,13 @@ - - + + From 4aa16951409e7be24713698e01ca8115b9e370b7 Mon Sep 17 00:00:00 2001 From: Myk Melez Date: Wed, 5 Mar 2014 18:06:17 -0800 Subject: [PATCH 30/70] Bug 966182 - implement Task.async; r=paolo --- toolkit/modules/Promise.jsm | 8 + toolkit/modules/Task.jsm | 97 ++++++++++-- .../modules/tests/xpcshell/test_Promise.js | 9 ++ toolkit/modules/tests/xpcshell/test_task.js | 143 ++++++++++++++++++ 4 files changed, 241 insertions(+), 16 deletions(-) diff --git a/toolkit/modules/Promise.jsm b/toolkit/modules/Promise.jsm index 142b7642fe50..f1ba862eae7c 100755 --- a/toolkit/modules/Promise.jsm +++ b/toolkit/modules/Promise.jsm @@ -442,6 +442,14 @@ Promise.defer = function () */ Promise.resolve = function (aValue) { + if (aValue && typeof(aValue) == "function" && aValue.isAsyncFunction) { + throw new TypeError( + "Cannot resolve a promise with an async function. " + + "You should either invoke the async function first " + + "or use 'Task.spawn' instead of 'Task.async' to start " + + "the Task and return its promise."); + } + return new Promise((aResolve) => aResolve(aValue)); }; diff --git a/toolkit/modules/Task.jsm b/toolkit/modules/Task.jsm index fe5127ac2b63..5031b4c5315a 100644 --- a/toolkit/modules/Task.jsm +++ b/toolkit/modules/Task.jsm @@ -136,24 +136,53 @@ this.Task = { * called when the task terminates. */ spawn: function Task_spawn(aTask) { - if (aTask && typeof(aTask) == "function") { - try { - // Let's call into the function ourselves. - aTask = aTask(); - } catch (ex if ex instanceof Task.Result) { - return Promise.resolve(ex.value); - } catch (ex) { - return Promise.reject(ex); - } + return createAsyncFunction(aTask).call(undefined); + }, + + /** + * Create and return an 'async function' that starts a new task. + * + * This is similar to 'spawn' except that it doesn't immediately start + * the task, it binds the task to the async function's 'this' object and + * arguments, and it requires the task to be a function. + * + * It simplifies the common pattern of implementing a method via a task, + * like this simple object with a 'greet' method that has a 'name' parameter + * and spawns a task to send a greeting and return its reply: + * + * let greeter = { + * message: "Hello, NAME!", + * greet: function(name) { + * return Task.spawn((function* () { + * return yield sendGreeting(this.message.replace(/NAME/, name)); + * }).bind(this); + * }) + * }; + * + * With Task.async, the method can be declared succinctly: + * + * let greeter = { + * message: "Hello, NAME!", + * greet: Task.async(function* (name) { + * return yield sendGreeting(this.message.replace(/NAME/, name)); + * }) + * }; + * + * While maintaining identical semantics: + * + * greeter.greet("Mitchell").then((reply) => { ... }); // behaves the same + * + * @param aTask + * The task function to start. + * + * @return A function that starts the task function and returns its promise. + */ + async: function Task_async(aTask) { + if (typeof(aTask) != "function") { + throw new TypeError("aTask argument must be a function"); } - if (isGenerator(aTask)) { - // This is an iterator resulting from calling a generator function. - return new TaskImpl(aTask).deferred.promise; - } - - // Just propagate the given value to the caller as a resolved promise. - return Promise.resolve(aTask); + return createAsyncFunction(aTask); }, /** @@ -168,6 +197,42 @@ this.Task = { } }; +function createAsyncFunction(aTask) { + let asyncFunction = function () { + let result = aTask; + if (aTask && typeof(aTask) == "function") { + if (aTask.isAsyncFunction) { + throw new TypeError( + "Cannot use an async function in place of a promise. " + + "You should either invoke the async function first " + + "or use 'Task.spawn' instead of 'Task.async' to start " + + "the Task and return its promise."); + } + + try { + // Let's call into the function ourselves. + result = aTask.apply(this, arguments); + } catch (ex if ex instanceof Task.Result) { + return Promise.resolve(ex.value); + } catch (ex) { + return Promise.reject(ex); + } + } + + if (isGenerator(result)) { + // This is an iterator resulting from calling a generator function. + return new TaskImpl(result).deferred.promise; + } + + // Just propagate the given value to the caller as a resolved promise. + return Promise.resolve(result); + }; + + asyncFunction.isAsyncFunction = true; + + return asyncFunction; +} + //////////////////////////////////////////////////////////////////////////////// //// TaskImpl diff --git a/toolkit/modules/tests/xpcshell/test_Promise.js b/toolkit/modules/tests/xpcshell/test_Promise.js index fe91a04a258a..2836c6477284 100644 --- a/toolkit/modules/tests/xpcshell/test_Promise.js +++ b/toolkit/modules/tests/xpcshell/test_Promise.js @@ -4,6 +4,7 @@ Components.utils.import("resource://gre/modules/Promise.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource://gre/modules/Task.jsm"); //////////////////////////////////////////////////////////////////////////////// //// Test runner @@ -527,6 +528,14 @@ tests.push( return promise; })); +// Test that Promise.resolve throws when its argument is an async function. +tests.push( + make_promise_test(function test_promise_resolve_throws_with_async_function(test) { + Assert.throws(() => Promise.resolve(Task.async(function* () {})), + /Cannot resolve a promise with an async function/); + return Promise.resolve(); + })); + // Test that the code after "then" is always executed before the callbacks tests.push( make_promise_test(function then_returns_before_callbacks(test) { diff --git a/toolkit/modules/tests/xpcshell/test_task.js b/toolkit/modules/tests/xpcshell/test_task.js index f82cdbd8ce79..4be9478f649c 100644 --- a/toolkit/modules/tests/xpcshell/test_task.js +++ b/toolkit/modules/tests/xpcshell/test_task.js @@ -118,6 +118,36 @@ add_test(function test_spawn_function() }); }); +add_test(function test_spawn_function_this() +{ + Task.spawn(function () { + return this; + }).then(function (result) { + // Since the task function wasn't defined in strict mode, its "this" object + // should be the same as the "this" object in this function, i.e. the global + // object. + do_check_eq(result, this); + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_spawn_function_this_strict() +{ + "use strict"; + Task.spawn(function () { + return this; + }).then(function (result) { + // Since the task function was defined in strict mode, its "this" object + // should be undefined. + do_check_eq(typeof(result), "undefined"); + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + add_test(function test_spawn_function_returning_promise() { Task.spawn(function () { @@ -242,3 +272,116 @@ add_test(function test_mixed_legacy_and_star() do_throw("Unexpected error: " + ex); }); }); + +add_test(function test_async_function_from_generator() +{ + Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function* (param) { + do_check_eq(this, object); + return param; + }) + }; + + // Ensure the async function returns a promise that resolves as expected. + do_check_eq((yield object.asyncFunction(1)), 1); + + // Ensure a second call to the async function also returns such a promise. + do_check_eq((yield object.asyncFunction(3)), 3); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_function_from_function() +{ + Task.spawn(function* () { + return Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function (param) { + do_check_eq(this, object); + return param; + }) + }; + + // Ensure the async function returns a promise that resolves as expected. + do_check_eq((yield object.asyncFunction(5)), 5); + + // Ensure a second call to the async function also returns such a promise. + do_check_eq((yield object.asyncFunction(7)), 7); + }); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_function_that_throws_rejects_promise() +{ + Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function* () { + throw "Rejected!"; + }) + }; + + yield object.asyncFunction(); + }).then(function () { + do_throw("unexpected success calling async function that throws error"); + }, function (ex) { + do_check_eq(ex, "Rejected!"); + run_next_test(); + }); +}); + +add_test(function test_async_return_function() +{ + Task.spawn(function* () { + // Ensure an async function that returns a function resolves to the function + // itself instead of calling the function and resolving to its return value. + return Task.spawn(function* () { + let returnValue = function () { + return "These aren't the droids you're looking for."; + }; + + let asyncFunction = Task.async(function () { + return returnValue; + }); + + do_check_eq((yield asyncFunction()), returnValue); + }); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_throw_argument_not_function() +{ + Task.spawn(function* () { + // Ensure Task.async throws if its aTask argument is not a function. + Assert.throws(() => Task.async("not a function"), + /aTask argument must be a function/); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_throw_on_function_in_place_of_promise() +{ + Task.spawn(function* () { + // Ensure Task.spawn throws if passed an async function. + Assert.throws(() => Task.spawn(Task.async(function* () {})), + /Cannot use an async function in place of a promise/); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); From 006d4b42d48e5d823af9bec15c48ac6a70d487fc Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 18:44:33 -0800 Subject: [PATCH 31/70] Backed out changeset 3a5a9d48b90c (bug 968836) for m-bc bustage --- dom/media/MediaManager.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 2a215c091b09..79902f9ff38b 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -1,5 +1,3 @@ -/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -227,22 +225,23 @@ class DeviceSuccessCallbackRunnable: public nsRunnable public: DeviceSuccessCallbackRunnable( uint64_t aWindowID, - nsCOMPtr aSuccess, - nsCOMPtr aError, + already_AddRefed aSuccess, + already_AddRefed aError, nsTArray >* aDevices) - : mDevices(aDevices) + : mSuccess(aSuccess) + , mError(aError) + , mDevices(aDevices) , mWindowID(aWindowID) - , mManager(MediaManager::GetInstance()) - { - mSuccess.swap(aSuccess); - mError.swap(aError); - } + , mManager(MediaManager::GetInstance()) {} NS_IMETHOD Run() { NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); + nsCOMPtr success(mSuccess); + nsCOMPtr error(mError); + // Only run if window is still on our active list. if (!mManager->IsWindowStillActive(mWindowID)) { return NS_OK; @@ -257,7 +256,7 @@ public: // We should in the future return an empty array, and dynamically add // devices to the dropdowns if things are hotplugged while the // requester is up. - mError->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); + error->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); return NS_OK; } @@ -273,13 +272,13 @@ public: static_cast(tmp.Elements()) )); - mSuccess->OnSuccess(devices); + success->OnSuccess(devices); return NS_OK; } private: - nsCOMPtr mSuccess; - nsCOMPtr mError; + already_AddRefed mSuccess; + already_AddRefed mError; nsAutoPtr > > mDevices; uint64_t mWindowID; nsRefPtr mManager; @@ -1100,15 +1099,13 @@ public: NS_DispatchToMainThread(new DeviceSuccessCallbackRunnable(mWindowId, mSuccess, mError, final.forget())); - // DeviceSuccessCallbackRunnable should have taken these. - MOZ_ASSERT(!mSuccess && !mError); return NS_OK; } private: MediaStreamConstraintsInternal mConstraints; - nsCOMPtr mSuccess; - nsCOMPtr mError; + already_AddRefed mSuccess; + already_AddRefed mError; nsRefPtr mManager; uint64_t mWindowId; const nsString mCallId; From 30b8684198215746ef97706fd27b872c63419ad0 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 18:44:50 -0800 Subject: [PATCH 32/70] Backed out changeset 78c1e9b63491 (bug 979951) for m-bc bustage --- dom/workers/WorkerPrivate.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 28da302c1e8f..f5921e84fd26 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -2142,13 +2142,7 @@ WorkerPrivateParent::WrapObject(JSContext* aCx, AssertIsOnParentThread(); - JSObject* wrapper = - WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate()); - if (wrapper) { - MOZ_ALWAYS_TRUE(TryPreserveWrapper(wrapper)); - } - - return wrapper; + return WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate()); } template From 98e21b85eadbce2fbbf1b4107c45c93ac705ab61 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 18:45:05 -0800 Subject: [PATCH 33/70] Backed out changeset 9535abc58cd6 (bug 619487) for m-bc bustage --- modules/libpref/src/Preferences.cpp | 2 -- modules/libpref/src/nsPrefBranch.h | 6 +++--- modules/libpref/src/prefapi.cpp | 9 --------- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp index 14609ca099c3..0f770d5d4c1d 100644 --- a/modules/libpref/src/Preferences.cpp +++ b/modules/libpref/src/Preferences.cpp @@ -402,8 +402,6 @@ Preferences::GetInstanceForService() bool Preferences::InitStaticMembers() { - MOZ_ASSERT(NS_IsMainThread()); - if (!sShutdown && !sPreferences) { nsCOMPtr prefService = do_GetService(NS_PREFSERVICE_CONTRACTID); diff --git a/modules/libpref/src/nsPrefBranch.h b/modules/libpref/src/nsPrefBranch.h index faa47f2f06b8..a168be04c52d 100644 --- a/modules/libpref/src/nsPrefBranch.h +++ b/modules/libpref/src/nsPrefBranch.h @@ -182,7 +182,7 @@ class nsPrefBranch : public nsIPrefBranchInternal, { friend class mozilla::PreferenceServiceReporter; public: - NS_DECL_ISUPPORTS + NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIPREFBRANCH NS_DECL_NSIPREFBRANCH2 NS_DECL_NSIOBSERVER @@ -235,7 +235,7 @@ public: nsPrefLocalizedString(); virtual ~nsPrefLocalizedString(); - NS_DECL_ISUPPORTS + NS_DECL_THREADSAFE_ISUPPORTS NS_FORWARD_NSISUPPORTSSTRING(mUnicodeString->) NS_FORWARD_NSISUPPORTSPRIMITIVE(mUnicodeString->) @@ -253,7 +253,7 @@ private: class nsRelativeFilePref : public nsIRelativeFilePref { public: - NS_DECL_ISUPPORTS + NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIRELATIVEFILEPREF nsRelativeFilePref(); diff --git a/modules/libpref/src/prefapi.cpp b/modules/libpref/src/prefapi.cpp index 35ddaa08472e..4a0363057e5d 100644 --- a/modules/libpref/src/prefapi.cpp +++ b/modules/libpref/src/prefapi.cpp @@ -8,7 +8,6 @@ #include "prefapi.h" #include "prefapi_private_data.h" #include "prefread.h" -#include "MainThreadUtils.h" #include "nsReadableUtils.h" #include "nsCRT.h" @@ -576,8 +575,6 @@ pref_DeleteItem(PLDHashTable *table, PLDHashEntryHdr *heh, uint32_t i, void *arg nsresult PREF_DeleteBranch(const char *branch_name) { - MOZ_ASSERT(NS_IsMainThread()); - int len = (int)strlen(branch_name); if (!gHashTable.ops) @@ -645,8 +642,6 @@ pref_ClearUserPref(PLDHashTable *table, PLDHashEntryHdr *he, uint32_t, nsresult PREF_ClearAllUserPrefs() { - MOZ_ASSERT(NS_IsMainThread()); - if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; @@ -721,8 +716,6 @@ static void pref_SetValue(PrefValue* oldValue, PrefValue newValue, PrefType type PrefHashEntry* pref_HashTableLookup(const void *key) { - MOZ_ASSERT(NS_IsMainThread()); - PrefHashEntry* result = static_cast(PL_DHashTableOperate(&gHashTable, key, PL_DHASH_LOOKUP)); @@ -734,8 +727,6 @@ PrefHashEntry* pref_HashTableLookup(const void *key) nsresult pref_HashPref(const char *key, PrefValue value, PrefType type, uint32_t flags) { - MOZ_ASSERT(NS_IsMainThread()); - if (!gHashTable.ops) return NS_ERROR_OUT_OF_MEMORY; From b1852c5b93fcdd825cbe531433d3bf6230f608b8 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Wed, 5 Mar 2014 20:52:54 -0600 Subject: [PATCH 34/70] Bug 980062. Make nsDisplaySubDocument use the visible rect of the contained list because it contains the enlarged area. r=roc mVisibleRect contains the bounds after the scrolled content has been clipped to the scrollport. The visible rect on the contained list (mList) contain the bounds for all pre-drawn content in the displayport. --- layout/base/nsDisplayList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index cb53727aa351..edaac00a96d1 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -3535,7 +3535,7 @@ nsDisplaySubDocument::BuildLayer(nsDisplayListBuilder* aBuilder, mFrame->GetOffsetToCrossDoc(ReferenceFrame()); RecordFrameMetrics(mFrame, rootScrollFrame, ReferenceFrame(), - container, mVisibleRect, viewport, + container, mList.GetVisibleRect(), viewport, (usingDisplayport ? &displayport : nullptr), (usingCriticalDisplayport ? &criticalDisplayport : nullptr), scrollId, isRootContentDocument, aContainerParameters); From 205af94a59e46a4091d1b2a41808f557ee5c1a77 Mon Sep 17 00:00:00 2001 From: Matt Woodrow Date: Thu, 13 Feb 2014 13:20:41 +1300 Subject: [PATCH 35/70] Bug 940455 - Add LayerManager functonality to clear out a portion of the window for the OS to paint. r=roc,Bas --- gfx/layers/Layers.h | 8 + gfx/layers/basic/BasicLayerManager.cpp | 10 + gfx/layers/d3d10/LayerManagerD3D10.cpp | 24 + gfx/layers/d3d10/LayerManagerD3D10.fx | 12 + gfx/layers/d3d10/LayerManagerD3D10Effect.h | 11984 ++++++++++--------- gfx/layers/d3d9/LayerManagerD3D9.cpp | 19 + gfx/src/nsITheme.h | 8 +- layout/base/FrameLayerBuilder.cpp | 7 + layout/base/nsDisplayList.cpp | 7 +- layout/base/nsDisplayList.h | 6 + widget/cocoa/nsNativeThemeCocoa.h | 3 +- widget/cocoa/nsNativeThemeCocoa.mm | 3 +- widget/gtk/nsNativeThemeGTK.cpp | 3 +- widget/gtk/nsNativeThemeGTK.h | 3 +- widget/windows/nsNativeThemeWin.cpp | 39 +- widget/windows/nsNativeThemeWin.h | 3 +- 16 files changed, 6447 insertions(+), 5692 deletions(-) diff --git a/gfx/layers/Layers.h b/gfx/layers/Layers.h index ef38bb9af4b9..1996c1e64e12 100644 --- a/gfx/layers/Layers.h +++ b/gfx/layers/Layers.h @@ -596,12 +596,19 @@ public: bool IsInTransaction() const { return mInTransaction; } + virtual void AddRegionToClear(const nsIntRegion& aRegion) + { + mRegionToClear.Or(mRegionToClear, aRegion); + } + protected: nsRefPtr mRoot; gfx::UserData mUserData; bool mDestroyed; bool mSnapEffectiveTransforms; + nsIntRegion mRegionToClear; + // Print interesting information about this into aTo. Internally // used to implement Dump*() and Log*(). virtual nsACString& PrintInfo(nsACString& aTo, const char* aPrefix); @@ -1335,6 +1342,7 @@ public: virtual LayerRenderState GetRenderState() { return LayerRenderState(); } + void Mutated() { mManager->Mutated(this); diff --git a/gfx/layers/basic/BasicLayerManager.cpp b/gfx/layers/basic/BasicLayerManager.cpp index d3bf967557a7..5eab7dea9fc1 100644 --- a/gfx/layers/basic/BasicLayerManager.cpp +++ b/gfx/layers/basic/BasicLayerManager.cpp @@ -625,6 +625,16 @@ BasicLayerManager::EndTransactionInternal(DrawThebesLayerCallback aCallback, } PaintLayer(mTarget, mRoot, aCallback, aCallbackData, nullptr); + if (!mRegionToClear.IsEmpty()) { + AutoSetOperator op(mTarget, gfxContext::OPERATOR_CLEAR); + nsIntRegionRectIterator iter(mRegionToClear); + const nsIntRect *r; + while ((r = iter.Next())) { + mTarget->NewPath(); + mTarget->Rectangle(gfxRect(r->x, r->y, r->width, r->height)); + mTarget->Fill(); + } + } if (mWidget) { FlashWidgetUpdateArea(mTarget); } diff --git a/gfx/layers/d3d10/LayerManagerD3D10.cpp b/gfx/layers/d3d10/LayerManagerD3D10.cpp index 99febc2a52b3..ec9bc3340736 100644 --- a/gfx/layers/d3d10/LayerManagerD3D10.cpp +++ b/gfx/layers/d3d10/LayerManagerD3D10.cpp @@ -709,6 +709,30 @@ LayerManagerD3D10::Render(EndTransactionFlags aFlags) 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 diff --git a/gfx/layers/d3d10/LayerManagerD3D10.fx b/gfx/layers/d3d10/LayerManagerD3D10.fx index 9a73eb238435..0e7e57d2d114 100644 --- a/gfx/layers/d3d10/LayerManagerD3D10.fx +++ b/gfx/layers/d3d10/LayerManagerD3D10.fx @@ -448,6 +448,18 @@ technique10 RenderSolidColorLayer } } +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 diff --git a/gfx/layers/d3d10/LayerManagerD3D10Effect.h b/gfx/layers/d3d10/LayerManagerD3D10Effect.h index ad35ebc73c63..eeaabb2d04b4 100644 --- a/gfx/layers/d3d10/LayerManagerD3D10Effect.h +++ b/gfx/layers/d3d10/LayerManagerD3D10Effect.h @@ -97,7 +97,7 @@ SamplerState LayerTextureSamplerPoint }; // -// 20 technique(s) +// 21 technique(s) // technique10 RenderRGBLayerPremul { @@ -2078,6 +2078,201 @@ technique10 RenderSolidColorLayer } +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 9.29.952.3111 + // + // + // 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 9.29.952.3111 + // + // + // 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 @@ -4684,26 +4879,26 @@ technique10 RenderSolidColorLayerMask const BYTE g_main[] = { - 68, 88, 66, 67, 218, 142, - 35, 224, 179, 182, 169, 21, - 79, 128, 135, 14, 250, 174, - 44, 181, 1, 0, 0, 0, - 30, 32, 1, 0, 1, 0, + 68, 88, 66, 67, 238, 59, + 90, 147, 223, 50, 250, 186, + 190, 133, 137, 53, 139, 30, + 68, 141, 1, 0, 0, 0, + 107, 43, 1, 0, 1, 0, 0, 0, 36, 0, 0, 0, - 70, 88, 49, 48, 242, 31, + 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, - 20, 0, 0, 0, 62, 16, + 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, 40, 0, - 0, 0, 40, 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, @@ -9733,191 +9928,382 @@ const BYTE g_main[] = 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 251, 114, 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, 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, - 3, 0, 0, 0, 255, 255, - 255, 255, 136, 7, 0, 0, - 68, 88, 66, 67, 249, 28, - 197, 252, 166, 119, 59, 228, - 111, 222, 205, 192, 170, 128, - 255, 70, 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, + 1, 0, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 136, 7, 0, 0, 68, 88, + 66, 67, 249, 28, 197, 252, + 166, 119, 59, 228, 111, 222, + 205, 192, 170, 128, 255, 70, + 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, - 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, + 2, 0, 3, 0, 0, 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, + 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, - 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, + 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, 2, 0, - 0, 0, 1, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 5, 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, + 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, - 2, 0, 0, 0, 166, 10, + 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, 32, 16, 0, 0, 0, + 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, - 2, 0, 0, 0, 3, 0, - 0, 0, 246, 15, 16, 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, 11, 50, 32, - 16, 0, 1, 0, 0, 0, - 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 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, - 0, 0, 70, 128, 32, 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, 6, 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, 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, 57, + 46, 50, 57, 46, 57, 53, + 50, 46, 51, 49, 49, 49, + 0, 171, 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, 136, 106, + 87, 29, 239, 32, 100, 138, + 218, 2, 105, 91, 143, 165, + 252, 49, 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, 13, 0, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 6, 0, 0, 0, 0, 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, @@ -9934,94 +10320,32 @@ const BYTE g_main[] = 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, + 69, 70, 252, 0, 0, 0, + 1, 0, 0, 0, 80, 0, + 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 124, 0, + 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, - 133, 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, 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, + 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, @@ -10030,13 +10354,7 @@ const BYTE g_main[] = 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, + 114, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, @@ -10045,1519 +10363,170 @@ const BYTE g_main[] = 32, 57, 46, 50, 57, 46, 57, 53, 50, 46, 51, 49, 49, 49, 0, 171, 171, 171, - 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, + 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, 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, 46, 118, 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, - 120, 218, 197, 160, 79, 160, - 235, 82, 197, 10, 155, 183, - 41, 226, 48, 248, 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, + 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 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, 57, - 46, 50, 57, 46, 57, 53, - 50, 46, 51, 49, 49, 49, - 0, 171, 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, - 206, 125, 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, 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, 3, 0, 0, 0, 255, - 255, 255, 255, 76, 8, 0, - 0, 68, 88, 66, 67, 169, - 150, 145, 216, 234, 78, 253, - 86, 77, 68, 6, 212, 187, - 231, 104, 78, 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, 0, 0, 1, + 0, 0, 0, 3, 0, 0, + 0, 255, 255, 255, 255, 136, + 7, 0, 0, 68, 88, 66, + 67, 249, 28, 197, 252, 166, + 119, 59, 228, 111, 222, 205, + 192, 170, 128, 255, 70, 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, 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, 36, 0, 1, 0, 96, 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, 8, - 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, 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, 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, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 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, 175, 128, 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, 2, - 86, 18, 89, 155, 147, 85, - 85, 212, 15, 31, 6, 43, - 118, 52, 47, 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, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 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, 19, 137, 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, 169, - 150, 145, 216, 234, 78, 253, - 86, 77, 68, 6, 212, 187, - 231, 104, 78, 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, 8, - 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, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 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, 185, 142, 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, 239, - 83, 247, 155, 21, 118, 142, - 53, 183, 4, 63, 81, 228, - 175, 103, 61, 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, 57, 46, 50, 57, - 46, 57, 53, 50, 46, 51, - 49, 49, 49, 0, 171, 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, 29, 151, 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, 169, 150, 145, - 216, 234, 78, 253, 86, 77, - 68, 6, 212, 187, 231, 104, - 78, 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, 6, 0, 0, 0, 0, 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, 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, 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, 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, 0, 0, 0, 9, 50, - 0, 16, 0, 0, 0, 0, - 0, 70, 0, 16, 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, - 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, 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, 1, 0, 0, 0, 70, + 0, 0, 0, 0, 0, 70, 142, 32, 128, 65, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, @@ -11599,10 +10568,10 @@ const BYTE g_main[] = 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 16, + 84, 116, 0, 0, 0, 13, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 4, - 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 3, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11670,7 +10639,7 @@ const BYTE g_main[] = 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, 0, 0, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 0, 0, 157, 1, 0, 0, 48, 0, 0, 0, 4, @@ -11739,596 +10708,98 @@ const BYTE g_main[] = 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, + 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, 92, + 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, 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, + 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, 3, - 157, 0, 0, 0, 0, 0, + 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, 40, 5, 0, 0, 68, - 88, 66, 67, 97, 73, 247, - 126, 8, 101, 119, 242, 175, - 221, 216, 116, 1, 172, 160, - 250, 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, + 0, 140, 2, 0, 0, 68, + 88, 66, 67, 120, 218, 197, + 160, 79, 160, 235, 82, 197, + 10, 155, 183, 41, 226, 48, + 248, 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, 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, + 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, 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, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 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, 103, - 165, 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, 126, 127, 73, 177, 123, - 87, 14, 42, 122, 131, 65, - 136, 212, 65, 198, 133, 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, 101, 0, 0, + 3, 242, 32, 16, 0, 1, 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, + 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, 4, 0, 0, - 0, 9, 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, 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, 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, 82, 68, 69, + 70, 80, 0, 0, 0, 0, 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, + 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, @@ -12337,272 +10808,38 @@ const BYTE g_main[] = 114, 32, 57, 46, 50, 57, 46, 57, 53, 50, 46, 51, 49, 49, 49, 0, 171, 171, - 171, 73, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, + 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, 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, 0, 0, 56, 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, 231, 170, 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, 202, 125, 64, 99, 21, - 11, 196, 180, 9, 103, 153, - 137, 12, 26, 194, 80, 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, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 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, 159, - 179, 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, + 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, @@ -12966,23 +11203,23 @@ const BYTE g_main[] = 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 88, 185, + 0, 171, 171, 171, 116, 139, 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, 97, 73, 247, 126, - 8, 101, 119, 242, 175, 221, - 216, 116, 1, 172, 160, 250, - 1, 0, 0, 0, 40, 5, + 76, 5, 0, 0, 68, 88, + 66, 67, 2, 86, 18, 89, + 155, 147, 85, 85, 212, 15, + 31, 6, 43, 118, 52, 47, + 1, 0, 0, 0, 76, 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, + 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, @@ -13005,16 +11242,18 @@ const BYTE g_main[] = 66, 0, 0, 3, 0, 0, 15, 128, 0, 0, 228, 128, 1, 8, 228, 160, 5, 0, - 0, 3, 1, 0, 15, 128, + 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, 248, 0, 0, 0, - 64, 0, 0, 0, 62, 0, + 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, @@ -13039,8 +11278,8 @@ const BYTE g_main[] = 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, + 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, @@ -13050,13 +11289,17 @@ const BYTE g_main[] = 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, 5, 0, + 116, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, @@ -13069,7 +11312,7 @@ const BYTE g_main[] = 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -13190,1221 +11433,13 @@ const BYTE g_main[] = 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 188, 193, + 116, 0, 171, 171, 216, 147, 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, 169, 150, 145, - 216, 234, 78, 253, 86, 77, - 68, 6, 212, 187, 231, 104, - 78, 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, 8, 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, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 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, 63, - 199, 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, 68, 156, 177, - 19, 117, 199, 87, 208, 226, - 224, 191, 92, 88, 131, 193, - 142, 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, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 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, 163, 207, 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, 169, 150, 145, - 216, 234, 78, 253, 86, 77, - 68, 6, 212, 187, 231, 104, - 78, 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, 8, 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, 57, 46, - 50, 57, 46, 57, 53, 50, - 46, 51, 49, 49, 49, 0, - 171, 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, 109, - 213, 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, 68, 156, 177, - 19, 117, 199, 87, 208, 226, - 224, 191, 92, 88, 131, 193, - 142, 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, - 57, 46, 50, 57, 46, 57, - 53, 50, 46, 51, 49, 49, - 49, 0, 171, 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, 209, 221, 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, + 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, @@ -14767,225 +11802,468 @@ const BYTE g_main[] = 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 142, 227, + 0, 171, 171, 171, 126, 153, 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, 202, 83, 22, 204, - 207, 151, 51, 179, 174, 132, - 82, 181, 125, 14, 145, 73, - 1, 0, 0, 0, 52, 8, + 144, 5, 0, 0, 68, 88, + 66, 67, 239, 83, 247, 155, + 21, 118, 142, 53, 183, 4, + 63, 81, 228, 175, 103, 61, + 1, 0, 0, 0, 144, 5, 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, - 0, 0, 0, 191, 0, 0, - 128, 189, 186, 73, 204, 63, - 197, 32, 80, 63, 81, 0, - 0, 5, 2, 0, 15, 160, - 244, 253, 148, 63, 233, 38, - 1, 64, 39, 49, 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, + 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, 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, + 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, - 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, 0, 0, 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, - 186, 73, 204, 63, 197, 32, - 80, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 69, 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, - 1, 0, 0, 0, 70, 16, + 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, 0, 0, - 0, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 58, 0, - 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 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, 244, 253, 148, 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, - 244, 253, 148, 63, 10, 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, 2, 0, 0, 0, - 70, 16, 16, 0, 1, 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, - 0, 0, 0, 7, 18, 0, + 54, 0, 0, 6, 130, 0, 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 2, 0, - 0, 0, 1, 64, 0, 0, - 0, 0, 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, 39, 49, 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, 233, 38, 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, - 244, 253, 148, 63, 10, 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, - 54, 0, 0, 5, 130, 0, - 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, - 128, 63, 56, 0, 0, 8, + 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, 57, + 46, 50, 57, 46, 57, 53, + 50, 46, 51, 49, 49, 49, + 0, 171, 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, + 169, 150, 145, 216, 234, 78, + 253, 86, 77, 68, 6, 212, + 187, 231, 104, 78, 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, - 1, 0, 0, 0, 6, 128, + 0, 0, 0, 0, 70, 142, 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, + 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, 1, 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, 17, 0, 0, 0, - 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, - 7, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 8, 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, 0, 0, 0, 0, 0, 0, @@ -14996,76 +12274,2126 @@ const BYTE g_main[] = 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, + 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, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 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, + 97, 73, 247, 126, 8, 101, + 119, 242, 175, 221, 216, 116, + 1, 172, 160, 250, 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, - 20, 2, 0, 0, 220, 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, - 246, 0, 0, 0, 2, 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, 249, 0, 0, 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, 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, + 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, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 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, 126, 127, + 73, 177, 123, 87, 14, 42, + 122, 131, 65, 136, 212, 65, + 198, 133, 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, 9, 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, + 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, 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, 133, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 160, 1, 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, 57, + 46, 50, 57, 46, 57, 53, + 50, 46, 51, 49, 49, 49, + 0, 171, 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, 202, 125, + 64, 99, 21, 11, 196, 180, + 9, 103, 153, 137, 12, 26, + 194, 80, 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, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 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, 169, + 150, 145, 216, 234, 78, 253, + 86, 77, 68, 6, 212, 187, + 231, 104, 78, 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, 8, + 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, 97, + 73, 247, 126, 8, 101, 119, + 242, 175, 221, 216, 116, 1, + 172, 160, 250, 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, + 169, 150, 145, 216, 234, 78, + 253, 86, 77, 68, 6, 212, + 187, 231, 104, 78, 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, + 8, 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, 0, 0, 0, 0, - 176, 1, 0, 0, 0, 0, - 0, 0, 192, 1, 0, 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, - 176, 1, 0, 0, 0, 0, - 0, 0, 203, 1, 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, 57, 46, 50, 57, 46, + 57, 53, 50, 46, 51, 49, + 49, 49, 0, 171, 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, + 68, 156, 177, 19, 117, 199, + 87, 208, 226, 224, 191, 92, + 88, 131, 193, 142, 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, - 176, 1, 0, 0, 0, 0, - 0, 0, 213, 1, 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, - 228, 1, 0, 0, 0, 0, - 0, 0, 244, 1, 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, - 4, 2, 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, @@ -15121,602 +14449,298 @@ const BYTE g_main[] = 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 242, 235, + 116, 0, 171, 171, 104, 218, 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, + 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, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, - 0, 0, 255, 255, 255, 255, - 76, 8, 0, 0, 68, 88, - 66, 67, 169, 150, 145, 216, - 234, 78, 253, 86, 77, 68, - 6, 212, 187, 231, 104, 78, - 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, + 0, 0, 3, 0, 0, 0, + 255, 255, 255, 255, 76, 8, + 0, 0, 68, 88, 66, 67, + 169, 150, 145, 216, 234, 78, + 253, 86, 77, 68, 6, 212, + 187, 231, 104, 78, 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, - 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, + 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, - 1, 0, 0, 0, 70, 128, + 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, - 1, 0, 0, 0, 56, 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, 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, + 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, 2, 0, 0, 0, - 166, 10, 16, 0, 0, 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, 32, 16, 0, - 0, 0, 0, 0, 70, 142, + 0, 10, 242, 0, 16, 0, + 1, 0, 0, 0, 70, 142, 32, 0, 2, 0, 0, 0, - 3, 0, 0, 0, 246, 15, + 2, 0, 0, 0, 166, 10, 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, 8, 0, 0, 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, 1, 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, + 8, 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, 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, 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, - 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, + 1, 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, 57, 46, 50, - 57, 46, 57, 53, 50, 46, - 51, 49, 49, 49, 0, 171, - 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, 0, 0, 2, 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, 128, 244, - 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, 122, 120, 197, 160, - 122, 27, 127, 104, 85, 146, - 3, 115, 69, 29, 147, 100, - 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, 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, 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, + 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, - 132, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 148, 1, + 133, 0, 0, 0, 2, 0, + 0, 0, 220, 1, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 148, 1, + 152, 0, 0, 0, 1, 0, + 0, 0, 60, 2, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175, 1, 0, 0, 32, 0, + 104, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 148, 1, + 2, 0, 0, 0, 120, 1, 0, 0, 0, 0, 0, 0, - 185, 1, 0, 0, 48, 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, - 2, 0, 0, 0, 200, 1, + 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 0, 0, - 216, 1, 0, 0, 64, 0, + 188, 1, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 232, 1, + 2, 0, 0, 0, 204, 1, 0, 0, 0, 0, 0, 0, 118, 84, 101, 120, 116, 117, 114, 101, 67, 111, 111, 114, @@ -15737,7 +14761,29 @@ const BYTE g_main[] = 111, 114, 109, 0, 3, 0, 3, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 105, 99, 114, + 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, @@ -15746,328 +14792,213 @@ const BYTE g_main[] = 32, 57, 46, 50, 57, 46, 57, 53, 50, 46, 51, 49, 49, 49, 0, 171, 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, + 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, 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, 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, 68, 0, 0, 0, - 2, 0, 0, 0, 8, 0, - 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 0, 0, + 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, 56, 0, 0, 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, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 228, 252, 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, 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, + 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, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 108, 5, + 0, 0, 68, 88, 66, 67, + 68, 156, 177, 19, 117, 199, + 87, 208, 226, 224, 191, 92, + 88, 131, 193, 142, 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, - 0, 0, 255, 255, 255, 255, - 76, 8, 0, 0, 68, 88, - 66, 67, 169, 150, 145, 216, - 234, 78, 253, 86, 77, 68, - 6, 212, 187, 231, 104, 78, - 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, + 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, - 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, + 98, 16, 0, 3, 194, 16, 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, + 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, - 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, + 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, - 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, + 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, 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, 8, 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, + 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, - 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, + 2, 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, 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, - 0, 0, 0, 0, 152, 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, - 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, + 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, - 77, 97, 110, 97, 103, 101, - 114, 0, 124, 0, 0, 0, - 5, 0, 0, 0, 240, 0, + 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, 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, 148, 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, + 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, - 204, 1, 0, 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, @@ -16087,29 +15018,7 @@ const BYTE g_main[] = 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, + 0, 0, 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, @@ -16119,109 +15028,247 @@ const BYTE g_main[] = 57, 46, 57, 53, 50, 46, 51, 49, 49, 49, 0, 171, 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, + 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, - 0, 0, 0, 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, - 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, + 92, 0, 0, 0, 1, 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, + 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, 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, 218, 3, - 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, 56, 178, 32, 36, - 251, 169, 131, 34, 95, 60, - 44, 33, 126, 59, 30, 160, - 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, + 15, 0, 0, 0, 83, 86, + 95, 84, 97, 114, 103, 101, + 116, 0, 171, 171, 150, 232, 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, + 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, - 1, 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, 169, + 150, 145, 216, 234, 78, 253, + 86, 77, 68, 6, 212, 187, + 231, 104, 78, 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, 0, 1, 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, 8, + 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, @@ -16229,752 +15276,2383 @@ const BYTE g_main[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, + 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, 171, 156, 0, 0, 0, - 2, 0, 0, 0, 200, 0, - 0, 0, 32, 0, 0, 0, + 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, 248, 0, 0, 0, - 0, 0, 0, 0, 16, 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, - 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, 152, + 0, 0, 0, 1, 0, 0, + 0, 60, 2, 0, 0, 64, 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, 57, 46, 50, 57, 46, - 57, 53, 50, 46, 51, 49, - 49, 49, 0, 171, 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, 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, - 1, 0, 0, 0, 3, 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, - 15, 0, 0, 0, 92, 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, 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, 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, - 171, 171, 62, 12, 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, 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, 202, + 83, 22, 204, 207, 151, 51, + 179, 174, 132, 82, 181, 125, + 14, 145, 73, 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, 0, 0, 0, + 191, 0, 0, 128, 189, 186, + 73, 204, 63, 197, 32, 80, + 63, 81, 0, 0, 5, 2, + 0, 15, 160, 244, 253, 148, + 63, 233, 38, 1, 64, 39, + 49, 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, 63, 0, 0, 0, - 20, 0, 0, 0, 0, 0, - 0, 0, 16, 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, 0, + 0, 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, 186, 73, 204, + 63, 197, 32, 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, - 74, 0, 0, 0, 20, 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, 0, 0, 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, 244, + 253, 148, 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, 244, 253, 148, + 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, - 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, + 7, 18, 0, 16, 0, 0, + 0, 0, 0, 58, 0, 16, + 0, 2, 0, 0, 0, 1, 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, + 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, 39, + 49, 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, 233, + 38, 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, 244, 253, 148, + 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, 7, 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, - 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, 4, 0, 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, 1, 0, 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, + 0, 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, 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, 1, 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, + 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, 169, + 150, 145, 216, 234, 78, 253, + 86, 77, 68, 6, 212, 187, + 231, 104, 78, 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, 8, + 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, 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, + 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, 0, 2, 0, 0, 0, - 162, 1, 0, 0, 6, 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, - 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, + 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, 0, 45, 4, 0, 0, - 7, 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, 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, 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, - 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, 3, 0, 0, 0, 1, + 0, 0, 0, 3, 12, 0, + 0, 92, 0, 0, 0, 1, 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, 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, 122, + 120, 197, 160, 122, 27, 127, + 104, 85, 146, 3, 115, 69, + 29, 147, 100, 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, - 45, 4, 0, 0, 7, 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, 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, + 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, 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, 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, 57, 46, + 50, 57, 46, 57, 53, 50, + 46, 51, 49, 49, 49, 0, + 171, 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, 169, + 150, 145, 216, 234, 78, 253, + 86, 77, 68, 6, 212, 187, + 231, 104, 78, 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, 8, + 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, 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, 254, 117, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 34, 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, 186, 125, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 194, 125, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 94, 128, - 0, 0, 102, 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, - 127, 128, 0, 0, 11, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 163, 128, - 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, - 255, 136, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 7, 137, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 99, 142, 0, 0, - 107, 142, 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, 137, 142, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 173, 142, 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, 0, 2, 0, 0, 0, - 47, 1, 0, 0, 6, 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, - 7, 0, 0, 0, 9, 151, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 17, 151, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 177, 156, 0, 0, 185, 156, - 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, 211, 156, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 247, 156, 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, 83, 165, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 91, 165, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 147, 170, - 0, 0, 155, 170, 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, 0, 45, 4, 0, 0, - 7, 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, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 171, 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, 56, + 178, 32, 36, 251, 169, 131, + 34, 95, 60, 44, 33, 126, + 59, 30, 160, 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, 57, 46, + 50, 57, 46, 57, 53, 50, + 46, 51, 49, 49, 49, 0, + 171, 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, 0, 12, 3, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 183, 170, 0, 0, 11, 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, - 1, 0, 0, 0, 219, 170, - 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, - 139, 179, 0, 0, 8, 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, - 1, 0, 0, 0, 147, 179, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 3, 185, 0, 0, - 11, 185, 0, 0, 1, 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, - 45, 4, 0, 0, 7, 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, 2, 0, 0, 0, - 12, 3, 0, 0, 10, 0, + 0, 0, 0, 2, 0, 0, + 0, 12, 3, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 40, 185, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 76, 185, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 162, 1, 0, 0, 6, 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, - 7, 0, 0, 0, 168, 193, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 176, 193, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 232, 198, 0, 0, 240, 198, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 45, 4, - 0, 0, 7, 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, - 2, 0, 0, 0, 12, 3, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 15, 199, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 51, 199, 0, 0, 2, 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, - 2, 0, 0, 0, 47, 1, - 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 143, 207, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 151, 207, 0, 0, 7, 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, - 7, 0, 0, 0, 19, 213, - 0, 0, 27, 213, 0, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 45, 4, 0, 0, - 7, 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, 2, 0, - 0, 0, 12, 3, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 61, 213, 0, 0, 11, 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, - 1, 0, 0, 0, 97, 213, - 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, - 189, 221, 0, 0, 8, 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, - 1, 0, 0, 0, 197, 221, - 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 65, 227, 0, 0, - 73, 227, 0, 0, 1, 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, - 45, 4, 0, 0, 7, 0, + 0, 45, 4, 0, 0, 7, 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, 2, 0, 0, + 0, 12, 3, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 94, 227, - 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 130, 227, 0, 0, - 2, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, - 47, 1, 0, 0, 6, 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, - 7, 0, 0, 0, 222, 235, - 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 230, 235, 0, 0, - 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, - 42, 244, 0, 0, 50, 244, - 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 45, 4, - 0, 0, 7, 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, - 2, 0, 0, 0, 12, 3, - 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 1, 0, - 0, 0, 80, 244, 0, 0, - 11, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 116, 244, 0, 0, 2, 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, - 2, 0, 0, 0, 96, 2, - 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 208, 252, 0, 0, - 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 216, 252, 0, 0, 7, 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, - 7, 0, 0, 0, 136, 3, - 1, 0, 144, 3, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 45, 4, 0, 0, - 7, 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, 2, 0, - 0, 0, 12, 3, 0, 0, - 10, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, - 170, 3, 1, 0, 11, 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, - 1, 0, 0, 0, 206, 3, - 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, - 42, 12, 1, 0, 8, 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, - 1, 0, 0, 0, 50, 12, - 1, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, - 0, 0, 54, 16, 1, 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/d3d9/LayerManagerD3D9.cpp b/gfx/layers/d3d9/LayerManagerD3D9.cpp index 6940602e7c1b..fa6770a147e6 100644 --- a/gfx/layers/d3d9/LayerManagerD3D9.cpp +++ b/gfx/layers/d3d9/LayerManagerD3D9.cpp @@ -261,6 +261,25 @@ LayerManagerD3D9::Render() 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) { diff --git a/gfx/src/nsITheme.h b/gfx/src/nsITheme.h index e19414f83e30..1a30306839aa 100644 --- a/gfx/src/nsITheme.h +++ b/gfx/src/nsITheme.h @@ -16,6 +16,7 @@ struct nsRect; struct nsIntRect; struct nsIntSize; +class nsIntRegion; struct nsFont; struct nsIntMargin; class nsPresContext; @@ -29,8 +30,8 @@ class nsIWidget; // IID for the nsITheme interface // {b0f3efe9-0bd4-4f6b-8daa-0ec7f6006822} #define NS_ITHEME_IID \ -{ 0x3ca584e6, 0xdcd6, 0x485b, \ - { 0x88, 0x8c, 0xe3, 0x47, 0x3d, 0xe4, 0xd9, 0x58 } } +{ 0x2e49c679, 0x2130, 0x432c, \ + { 0x92, 0xcb, 0xd4, 0x8e, 0x9a, 0xe2, 0x34, 0x75 } } // {D930E29B-6909-44e5-AB4B-AF10D6923705} #define NS_THEMERENDERER_CID \ { 0x9020805b, 0x14a3, 0x4125, \ @@ -62,7 +63,8 @@ public: nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect) = 0; + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear = nullptr) = 0; /** * Get the computed CSS border for the widget, in pixels. diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index 317cefef9e1a..e12b697efcaa 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -3756,6 +3756,9 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer, nsRefPtr rc = new nsRenderingContext(); rc->Init(presContext->DeviceContext(), aContext); + nsIntRegion temp = builder->GetRegionToClear(); + builder->ResetRegionToClear(); + if (shouldDrawRectsSeparately) { nsIntRegionRectIterator it(aRegionToDraw); while (const nsIntRect* iterRect = it.Next()) { @@ -3797,6 +3800,10 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer, if (!aRegionToInvalidate.IsEmpty()) { aLayer->AddInvalidRect(aRegionToInvalidate.GetBounds()); } + + aLayer->Manager()->AddRegionToClear(builder->GetRegionToClear()); + builder->ResetRegionToClear(); + builder->AddRegionToClear(temp); } bool diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index edaac00a96d1..320d3c4ac71e 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -2430,6 +2430,7 @@ nsDisplayThemedBackground::Paint(nsDisplayListBuilder* aBuilder, PaintInternal(aBuilder, aCtx, mVisibleRect, nullptr); } + void nsDisplayThemedBackground::PaintInternal(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx, const nsRect& aBounds, @@ -2443,7 +2444,11 @@ nsDisplayThemedBackground::PaintInternal(nsDisplayListBuilder* aBuilder, theme->GetWidgetOverflow(presContext->DeviceContext(), mFrame, mAppearance, &drawing); drawing.IntersectRect(drawing, aBounds); - theme->DrawWidgetBackground(aCtx, mFrame, mAppearance, borderArea, drawing); + nsIntRegion clear; + theme->DrawWidgetBackground(aCtx, mFrame, mAppearance, borderArea, drawing, &clear); + MOZ_ASSERT(clear.IsEmpty() || ReferenceFrame() == aBuilder->RootReferenceFrame(), + "Can't add to clear region if we're transformed!"); + aBuilder->AddRegionToClear(clear); } bool nsDisplayThemedBackground::IsWindowActive() diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 97a51af7a4b6..5220569aa31b 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -641,6 +641,10 @@ public: DisplayListClipState& ClipState() { return mClipState; } + void AddRegionToClear(const nsIntRegion& aRegion) { mRegionToClear.Or(mRegionToClear, aRegion); } + const nsIntRegion& GetRegionToClear() { return mRegionToClear; } + void ResetRegionToClear() { mRegionToClear.SetEmpty(); } + private: void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame, const nsRect& aDirtyRect); @@ -674,6 +678,8 @@ private: const nsIFrame* mCachedReferenceFrame; nsPoint mCachedOffset; nsRegion mExcludedGlassRegion; + // Area of the window (in pixels) to clear so the OS can draw them. + nsIntRegion mRegionToClear; // The display item for the Windows window glass background, if any nsDisplayItem* mGlassDisplayItem; nsTArray mDisplayItemClipsToDestroy; diff --git a/widget/cocoa/nsNativeThemeCocoa.h b/widget/cocoa/nsNativeThemeCocoa.h index 580c23181a3f..2a167b11341b 100644 --- a/widget/cocoa/nsNativeThemeCocoa.h +++ b/widget/cocoa/nsNativeThemeCocoa.h @@ -34,7 +34,8 @@ public: nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect); + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear); NS_IMETHOD GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index 55696549e75a..91ac17e0350e 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -2080,7 +2080,8 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect) + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear) { NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp index 054193f0cc30..607ce690f256 100644 --- a/widget/gtk/nsNativeThemeGTK.cpp +++ b/widget/gtk/nsNativeThemeGTK.cpp @@ -752,7 +752,8 @@ nsNativeThemeGTK::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect) + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear) { GtkWidgetState state; GtkThemeWidgetType gtkWidgetType; diff --git a/widget/gtk/nsNativeThemeGTK.h b/widget/gtk/nsNativeThemeGTK.h index ddfc9d28e43e..cca2271064ea 100644 --- a/widget/gtk/nsNativeThemeGTK.h +++ b/widget/gtk/nsNativeThemeGTK.h @@ -24,7 +24,8 @@ public: NS_IMETHOD DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect); + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear); NS_IMETHOD GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, nsIntMargin* aResult); diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index 962e67d4e704..55aa6404ffd8 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -1536,7 +1536,8 @@ nsNativeThemeWin::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect) + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear) { HANDLE theme = GetTheme(aWidgetType); if (!theme) @@ -1905,35 +1906,13 @@ RENDER_AGAIN: { // The caption buttons are drawn by the DWM, we just need to clear the area where they // are because we might have drawn something above them (like a background-image). - ctx->Save(); - ctx->ResetClip(); - ctx->Translate(dr.TopLeft()); - - // Create a rounded rectangle to follow the buttons' look. - gfxRect buttonbox1(0.0, 0.0, dr.Width(), dr.Height() - 2.0); - gfxRect buttonbox2(1.0, dr.Height() - 2.0, dr.Width() - 1.0, 1.0); - gfxRect buttonbox3(2.0, dr.Height() - 1.0, dr.Width() - 3.0, 1.0); - - gfxContext::GraphicsOperator currentOp = ctx->CurrentOperator(); - ctx->SetOperator(gfxContext::OPERATOR_CLEAR); - - // Each rectangle is drawn individually because OPERATOR_CLEAR takes - // the fallback path to cairo_d2d_acquire_dest if the area to fill - // is a complex region. - ctx->NewPath(); - ctx->Rectangle(buttonbox1, true); - ctx->Fill(); - - ctx->NewPath(); - ctx->Rectangle(buttonbox2, true); - ctx->Fill(); - - ctx->NewPath(); - ctx->Rectangle(buttonbox3, true); - ctx->Fill(); - - ctx->Restore(); - ctx->SetOperator(currentOp); + NS_ASSERTION(aRegionToClear, "Must have a clear region to set!"); + if (aRegionToClear) { + // Create a rounded rectangle to follow the buttons' look. + *aRegionToClear = nsIntRect(dr.X(), dr.Y(), dr.Width(), dr.Height() - 2.0); + aRegionToClear->Or(*aRegionToClear, nsIntRect(dr.X() + 1.0, dr.YMost() - 2.0, dr.Width() - 1.0, 1.0)); + aRegionToClear->Or(*aRegionToClear, nsIntRect(dr.X() + 2.0, dr.YMost() - 1.0, dr.Width() - 3.0, 1.0)); + } } nativeDrawing.EndNativeDrawing(); diff --git a/widget/windows/nsNativeThemeWin.h b/widget/windows/nsNativeThemeWin.h index c296bbf17ccf..fe1320f63275 100644 --- a/widget/windows/nsNativeThemeWin.h +++ b/widget/windows/nsNativeThemeWin.h @@ -31,7 +31,8 @@ public: nsIFrame* aFrame, uint8_t aWidgetType, const nsRect& aRect, - const nsRect& aDirtyRect); + const nsRect& aDirtyRect, + nsIntRegion* aRegionToClear); NS_IMETHOD GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame, From 3fe0bc789cb700b750c5f087e1b1acd87d0239b9 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 11:30:23 -0800 Subject: [PATCH 36/70] Bumping gaia.json for 2 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/566953ef93e6 Author: Marcus Cavanaugh Desc: Merge pull request #16909 from mcav/alarm-bar Bug 979530 - [B2G][Clock] The text alarm in the notification banner is cut off. r=jrburke ======== https://hg.mozilla.org/integration/gaia-central/rev/a73b0c548ddd Author: Marcus Cavanaugh Desc: Bug 979530 - [B2G][Clock] The text alarm in the notification banner is cutoff --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 6ec57a973960..c7e2bc280c7b 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "5d470e57a89125a55663058050b2cd147630a948", + "revision": "566953ef93e6cd8ba592ea2f264b38a7bda4cf53", "repo_path": "/integration/gaia-central" } From 2e6e84fa0e52dc80340f6b07c5d415f0d1af817e Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 11:35:50 -0800 Subject: [PATCH 37/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 231bb04b970f..5091e6f99266 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 2dd43d361924..b76a16b3e97e 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 231bb04b970f..5091e6f99266 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 387e7e458b72..847d38866102 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 09ac0ccd380c..484f8f864702 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index 118f70425ca2..af2c75a25d19 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index 80d6bde1e9a8..fadeab877241 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 63a5d534f953..5cf2f35019ab 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 02ccba944420..e1653e9297fc 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From cfaa473489672e60fa4145e77b82cbaf687855f9 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 11:55:22 -0800 Subject: [PATCH 38/70] Bumping gaia.json for 2 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/c7a34ae95f67 Author: Pavel Ivanov Desc: Merge pull request #16667 from pivanov/bug-949024 Bug 949024 - Update Branded Wallpapers Sizes for v.1.4 ======== https://hg.mozilla.org/integration/gaia-central/rev/11cfc3fcb2a0 Author: Pavel Ivanov Desc: Bug 949024 - Update Branded Wallpapers Sizes for v.1.4 --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index c7e2bc280c7b..f001955dca45 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "566953ef93e6cd8ba592ea2f264b38a7bda4cf53", + "revision": "c7a34ae95f67bef811de5c8514142908fe056f51", "repo_path": "/integration/gaia-central" } From 92a43620a1cadeb427f3e1ef5c20b4323215f319 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 12:01:08 -0800 Subject: [PATCH 39/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 5091e6f99266..0f2cf0b50929 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 b76a16b3e97e..79351cc56eeb 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 5091e6f99266..0f2cf0b50929 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 847d38866102..9c854188e89e 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 484f8f864702..29b8910cbf67 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index af2c75a25d19..5cc450455735 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index fadeab877241..98f306f9b123 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 5cf2f35019ab..8c9656f3839e 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index e1653e9297fc..b4602d834430 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From 296f9a085fad239aaff039757c3de1db5f77934f Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 12:05:23 -0800 Subject: [PATCH 40/70] Bumping gaia.json for 4 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/a19581a56f75 Author: Pavel Ivanov Desc: Merge pull request #16918 from pivanov/bug-979696 Folowup patch for Bug 979696 ======== https://hg.mozilla.org/integration/gaia-central/rev/87eec8bd392a Author: Pavel Ivanov Desc: Folowup patch for Bug 979696 ======== https://hg.mozilla.org/integration/gaia-central/rev/73bd440eef89 Author: Pavel Ivanov Desc: Merge pull request #16908 from pivanov/bug-979696 Bug 979696 - Update Photographic Wallpapers Sizes for 1.4 ======== https://hg.mozilla.org/integration/gaia-central/rev/cca85e9f8e17 Author: Pavel Ivanov Desc: Bug 979696 - Update Photographic Wallpapers Sizes for 1.4 --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index f001955dca45..d385477e1c2c 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "c7a34ae95f67bef811de5c8514142908fe056f51", + "revision": "a19581a56f753e86220ceabd632a7a35d6f8626e", "repo_path": "/integration/gaia-central" } From 9ea8c8b6bc7c670347fa6e25633eb259762d6425 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 12:11:10 -0800 Subject: [PATCH 41/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 0f2cf0b50929..5a1d75689d41 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 79351cc56eeb..a17eb1561820 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 0f2cf0b50929..5a1d75689d41 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 9c854188e89e..8ad7c65dc8ea 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 29b8910cbf67..71ff3287ae45 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index 5cc450455735..053f2e99de35 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index 98f306f9b123..50cef680c1fa 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 8c9656f3839e..85318ff9a90d 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index b4602d834430..e10ccd57d674 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From e7157883bcb9d41b9a9078bbbc1e9405df300619 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 12:35:25 -0800 Subject: [PATCH 42/70] Bumping gaia.json for 4 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/92e7b0175abd Author: Gareth Aye Desc: Merge pull request #16907 from millermedeiros/972666-lines-over-events-2 Bug 972666 - [Calendar] lines over events longer than 2 hours r=gaye ======== https://hg.mozilla.org/integration/gaia-central/rev/41e352749ff5 Author: Miller Medeiros Desc: Bug 972666 - [Calendar] lines over events longer than 2 hours ======== https://hg.mozilla.org/integration/gaia-central/rev/82970d7816cd Author: Gareth Aye Desc: Merge pull request #16912 from millermedeiros/979969-marionette-is-view-active Bug 979969 - [Calendar] calendar.isViewActive should check if element is really "active" on the marionette tests r=gaye ======== https://hg.mozilla.org/integration/gaia-central/rev/11cc4d709a3d Author: Miller Medeiros Desc: Bug 979969 - [Calendar] calendar.isViewActive should check if element is really "active" on the marionette tests --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index d385477e1c2c..37de7be28a83 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "a19581a56f753e86220ceabd632a7a35d6f8626e", + "revision": "92e7b0175abd7640f0bce1b63a2be715fb988aad", "repo_path": "/integration/gaia-central" } From 552a8d8d8ca2a779fd3d89bc7417683f3222e973 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 12:40:51 -0800 Subject: [PATCH 43/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 5a1d75689d41..46195a598e25 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 a17eb1561820..a7157c8ae931 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 5a1d75689d41..46195a598e25 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 8ad7c65dc8ea..9913b1a7e9d8 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 71ff3287ae45..a09714915318 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index 053f2e99de35..0eaec87bf6be 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index 50cef680c1fa..8e8927e08359 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 85318ff9a90d..ff9841a4bec0 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index e10ccd57d674..19afda5a736a 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From 51031ace4c524dba431705e2fb4dda53f405e1c5 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 14:40:27 -0800 Subject: [PATCH 44/70] Bumping gaia.json for 1 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/e030bdb4b6db Author: Dale Harvey Desc: Bug 975161 - Reland ensure SIM Pin inputs are visible. r=vingetun This reverts commit 05337d2ce75651550892ca883030548ed5f7d6aa. --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 37de7be28a83..6f3979fe53f4 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "92e7b0175abd7640f0bce1b63a2be715fb988aad", + "revision": "e030bdb4b6db86bf348d61299cc183e55795eb82", "repo_path": "/integration/gaia-central" } From 86a4f1c6c4f6c30435dd6ab37d9e47a651dde027 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 14:45:54 -0800 Subject: [PATCH 45/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 46195a598e25..5972e492ec0b 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 a7157c8ae931..8b30aded8271 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 46195a598e25..5972e492ec0b 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 9913b1a7e9d8..d3f6e45d9cef 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 a09714915318..75eb670c9adf 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index 0eaec87bf6be..25bec2c23493 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index 8e8927e08359..eef43c3633b4 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index ff9841a4bec0..2049dd489aa5 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 19afda5a736a..5c6339ab9429 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From 5d81022a40c71031a4f0189037181cd2aafaa2fb Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 14:50:24 -0800 Subject: [PATCH 46/70] Bumping gaia.json for 2 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/c10a5f7f7e2f Author: Diego Marcos Desc: Merge pull request #16819 from dmarcos/bug974730 Bug 974730 - [Camera] Camera Library has to listen for the onPreviewStat... ======== https://hg.mozilla.org/integration/gaia-central/rev/c82911658e3a Author: Diego Marcos Desc: Bug 974730 - [Camera] Camera Library has to listen for the onPreviewStateChange event --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 6f3979fe53f4..8577d39a0c55 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "e030bdb4b6db86bf348d61299cc183e55795eb82", + "revision": "c10a5f7f7e2f804ce91ce1a4ebb83811788220fe", "repo_path": "/integration/gaia-central" } From a2664abe198f53e33c4836dd84fce930cde35d3b Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 14:51:33 -0800 Subject: [PATCH 47/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 5972e492ec0b..c236755e0c9f 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 8b30aded8271..c26ee2892015 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 5972e492ec0b..c236755e0c9f 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index d3f6e45d9cef..893c79bcb05e 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 75eb670c9adf..fa19414e9cab 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index 25bec2c23493..a44260b33aac 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index eef43c3633b4..cac68063015c 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 2049dd489aa5..c35eb524fbfb 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 5c6339ab9429..de76f24cb0e1 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From 743df76316640683c3a03c3b7746d96e605760cb Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 15:55:23 -0800 Subject: [PATCH 48/70] Bumping gaia.json for 2 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/25562480c0f6 Author: Ryan VanderMeulen Desc: Merge pull request #16917 from 6a68/bug-972645-reset-password Bug 972645 - Implement Reset Password Firefox Accounts flow, resubmitted. r=ferjm ======== https://hg.mozilla.org/integration/gaia-central/rev/9646e5b494aa Author: Jared Hirsch Desc: Bug 972645 - Implement Reset Password Firefox Accounts flow, resubmitted. r=ferjm Includes special case for reset password in FTE, see bug 965494 comment 1 --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 8577d39a0c55..a84f78b5c928 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "c10a5f7f7e2f804ce91ce1a4ebb83811788220fe", + "revision": "25562480c0f615efc6d2a80b56cdba5c4cf6b1a9", "repo_path": "/integration/gaia-central" } From ae1ac771e2c2127c35a9c9e12e97ee2cd258a3d6 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 16:01:12 -0800 Subject: [PATCH 49/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index c236755e0c9f..005f054432a7 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 c26ee2892015..ebc6a7e020ca 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index c236755e0c9f..005f054432a7 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 893c79bcb05e..8edd5970b87e 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 fa19414e9cab..637d3ba144e8 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index a44260b33aac..f0bf9215fbc5 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index cac68063015c..1aa5634a4afb 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index c35eb524fbfb..548905cfc238 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index de76f24cb0e1..85c629ab92b0 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From e3b446823483c0e5e39685a56869f17c317e0b47 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 16:41:23 -0800 Subject: [PATCH 50/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 005f054432a7..e6cc09ded691 100644 --- a/b2g/config/emulator-ics/sources.xml +++ b/b2g/config/emulator-ics/sources.xml @@ -97,7 +97,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 005f054432a7..e6cc09ded691 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -97,7 +97,7 @@ - + From eb8850688443ab8f4ad6103d66d4aa5c805cf68a Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 17:56:28 -0800 Subject: [PATCH 51/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-jb/sources.xml | 4 ++-- b2g/config/mako/sources.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/b2g/config/emulator-jb/sources.xml b/b2g/config/emulator-jb/sources.xml index ebc6a7e020ca..daef4a72af60 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -21,8 +21,8 @@ - - + + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index 548905cfc238..bece119b1140 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -21,8 +21,8 @@ - - + + From 9c9e49ec753965eeca6d80b04793684f20c74c17 Mon Sep 17 00:00:00 2001 From: Dave Hylands Date: Fri, 28 Feb 2014 12:02:55 -0800 Subject: [PATCH 52/70] Bug 977372 - Close IPC'd filedescriptor from device descriptor when finished with it. r=mikeh --- dom/camera/DOMCameraControl.cpp | 10 +++++++++- dom/camera/GonkCameraControl.cpp | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dom/camera/DOMCameraControl.cpp b/dom/camera/DOMCameraControl.cpp index 6f56a4e6f367..15ef138bc09b 100644 --- a/dom/camera/DOMCameraControl.cpp +++ b/dom/camera/DOMCameraControl.cpp @@ -11,6 +11,7 @@ #include "DeviceStorage.h" #include "DeviceStorageFileDescriptor.h" #include "mozilla/dom/TabChild.h" +#include "mozilla/ipc/FileDescriptorUtils.h" #include "mozilla/MediaManager.h" #include "mozilla/Services.h" #include "mozilla/unused.h" @@ -34,6 +35,7 @@ using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::idl; +using namespace mozilla::ipc; NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMCameraControl) NS_INTERFACE_MAP_ENTRY(nsISupports) @@ -728,8 +730,14 @@ nsDOMCameraControl::OnCreatedFileDescriptor(bool aSucceeded) return; } } - OnError(CameraControlListener::kInStartRecording, NS_LITERAL_STRING("FAILURE")); + + // An error occured. We need to manually close the file associated with the + // FileDescriptor, and we shouldn't do this on the main thread, so we + // use a little helper. + nsRefPtr closer = + new CloseFileRunnable(mDSFileDescriptor->mFileDescriptor); + closer->Dispatch(); } void diff --git a/dom/camera/GonkCameraControl.cpp b/dom/camera/GonkCameraControl.cpp index 61c738d55d8c..e744970d0aee 100644 --- a/dom/camera/GonkCameraControl.cpp +++ b/dom/camera/GonkCameraControl.cpp @@ -30,6 +30,7 @@ #include "mozilla/FileUtils.h" #include "mozilla/Services.h" #include "mozilla/unused.h" +#include "mozilla/ipc/FileDescriptorUtils.h" #include "nsAlgorithm.h" #include #include "nsPrintfCString.h" @@ -46,6 +47,7 @@ using namespace mozilla; using namespace mozilla::layers; using namespace mozilla::gfx; +using namespace mozilla::ipc; using namespace android; #define RETURN_IF_NO_CAMERA_HW() \ @@ -855,6 +857,12 @@ nsGonkCameraControl::StartRecordingImpl(DeviceStorageFileDescriptor* aFileDescri return NS_ERROR_INVALID_ARG; } + // SetupRecording creates a dup of the file descriptor, so we need to + // close the file descriptor when we leave this function. Also note, that + // since we're already off the main thread, we don't need to dispatch this. + // We just let the CloseFileRunnable destructor do the work. + nsRefPtr closer = + new CloseFileRunnable(aFileDescriptor->mFileDescriptor); nsresult rv; int fd = aFileDescriptor->mFileDescriptor.PlatformHandle(); if (aOptions) { From 720591b1f5b749711f3445a07c46e321ddff94a4 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 5 Mar 2014 22:48:03 -0500 Subject: [PATCH 53/70] Bug 874787. Add support for legacycaller on proxy bindings. r=efaust,peterv --- dom/bindings/Codegen.py | 4 +++- dom/bindings/Configuration.py | 4 ---- dom/bindings/test/TestBindingHeader.h | 1 + dom/bindings/test/TestCodeGen.webidl | 1 + 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index e0d20f50389b..aeacab18a080 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -270,16 +270,18 @@ class CGDOMProxyJSClass(CGThing): def declare(self): return "" def define(self): + callHook = LEGACYCALLER_HOOK_NAME if self.descriptor.operations["LegacyCaller"] else 'nullptr' return """ static const DOMJSClass Class = { PROXY_CLASS_DEF("%s", 0, /* extra slots */ JSCLASS_IS_DOMJSCLASS, - nullptr, /* call */ + %s, /* call */ nullptr /* construct */), %s }; """ % (self.descriptor.interface.identifier.name, + callHook, CGIndenter(CGGeneric(DOMClass(self.descriptor))).define()) def PrototypeIDAndDepth(descriptor): diff --git a/dom/bindings/Configuration.py b/dom/bindings/Configuration.py index bb70e3c43993..b6bbb24e9338 100644 --- a/dom/bindings/Configuration.py +++ b/dom/bindings/Configuration.py @@ -353,10 +353,6 @@ class Descriptor(DescriptorProvider): raise SyntaxError("%s supports named properties but does " "not have a named getter.\n%s" % (self.interface, self.interface.location)) - if operations['LegacyCaller']: - raise SyntaxError("%s has a legacy caller but is a proxy; " - "we don't support that yet.\n%s" % - (self.interface, self.interface.location)) iface = self.interface while iface: iface.setUserData('hasProxyDescendant', True) diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index a666b8c63545..9c15763c8b5b 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -967,6 +967,7 @@ public: uint32_t Item(uint32_t&); uint32_t Item(uint32_t, bool&) MOZ_DELETE; uint32_t Length(); + void LegacyCall(JS::Handle); }; class TestNamedGetterInterface : public nsISupports, diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl index eff63176110d..1a63d75a18fc 100644 --- a/dom/bindings/test/TestCodeGen.webidl +++ b/dom/bindings/test/TestCodeGen.webidl @@ -876,6 +876,7 @@ dictionary DictForConstructor { interface TestIndexedGetterInterface { getter long item(unsigned long idx); readonly attribute unsigned long length; + legacycaller void(); }; interface TestNamedGetterInterface { From b5f192bb497cd6dfea13a0c9533391d55dcf756a Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 5 Mar 2014 22:48:04 -0500 Subject: [PATCH 54/70] Bug 874788. Allow WebIDL HTMLAllCollection to emulate undefined. r=peterv --- dom/bindings/Codegen.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index aeacab18a080..662ff10f6cd5 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -270,17 +270,24 @@ class CGDOMProxyJSClass(CGThing): def declare(self): return "" def define(self): + flags = ["JSCLASS_IS_DOMJSCLASS"] + # We don't use an IDL annotation for JSCLASS_EMULATES_UNDEFINED because + # we don't want people ever adding that to any interface other than + # HTMLAllCollection. So just hardcode it here. + if self.descriptor.interface.identifier.name == "HTMLAllCollection": + flags.append("JSCLASS_EMULATES_UNDEFINED") callHook = LEGACYCALLER_HOOK_NAME if self.descriptor.operations["LegacyCaller"] else 'nullptr' return """ static const DOMJSClass Class = { PROXY_CLASS_DEF("%s", 0, /* extra slots */ - JSCLASS_IS_DOMJSCLASS, + %s, %s, /* call */ nullptr /* construct */), %s }; """ % (self.descriptor.interface.identifier.name, + " | ".join(flags), callHook, CGIndenter(CGGeneric(DOMClass(self.descriptor))).define()) From 08be7cc27e4059e7fc90919c4bfc18605af50722 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 5 Mar 2014 22:48:04 -0500 Subject: [PATCH 55/70] Bug 951887. Treat form controls as mutable for purposes of constraint validation whether they're in a document tree or not. r=smaug --- content/html/content/src/HTMLInputElement.cpp | 2 +- content/html/content/test/forms/mochitest.ini | 1 + .../forms/test_validation_not_in_doc.html | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 content/html/content/test/forms/test_validation_not_in_doc.html diff --git a/content/html/content/src/HTMLInputElement.cpp b/content/html/content/src/HTMLInputElement.cpp index 1784e5457334..d3a307f542cf 100644 --- a/content/html/content/src/HTMLInputElement.cpp +++ b/content/html/content/src/HTMLInputElement.cpp @@ -6117,7 +6117,7 @@ HTMLInputElement::GetValueMode() const bool HTMLInputElement::IsMutable() const { - return !IsDisabled() && GetCurrentDoc() && + return !IsDisabled() && !(DoesReadOnlyApply() && HasAttr(kNameSpaceID_None, nsGkAtoms::readonly)); } diff --git a/content/html/content/test/forms/mochitest.ini b/content/html/content/test/forms/mochitest.ini index e0b7291a7c9c..55fc785b2507 100644 --- a/content/html/content/test/forms/mochitest.ini +++ b/content/html/content/test/forms/mochitest.ini @@ -73,3 +73,4 @@ skip-if = os == "android" || appname == "b2g" [test_valueAsDate_pref.html] [test_valueasdate_attribute.html] [test_valueasnumber_attribute.html] +[test_validation_not_in_doc.html] diff --git a/content/html/content/test/forms/test_validation_not_in_doc.html b/content/html/content/test/forms/test_validation_not_in_doc.html new file mode 100644 index 000000000000..1500c6086972 --- /dev/null +++ b/content/html/content/test/forms/test_validation_not_in_doc.html @@ -0,0 +1,19 @@ + + +Test for constraint validation of form controls not in documents + + +
+ From ef09518a17e94bcf6f4aab5c9451baf13877f6d1 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Wed, 5 Mar 2014 20:15:35 -0800 Subject: [PATCH 56/70] Bug 960108 - Ignore saved frame chains and contexts in JS::DescribeStack. r=bz --- js/src/vm/OldDebugAPI.cpp | 5 ++++- js/xpconnect/tests/mochitest/test_bug960820.html | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/js/src/vm/OldDebugAPI.cpp b/js/src/vm/OldDebugAPI.cpp index 7b445f2bad25..111604ad30d1 100644 --- a/js/src/vm/OldDebugAPI.cpp +++ b/js/src/vm/OldDebugAPI.cpp @@ -939,7 +939,10 @@ JS::DescribeStack(JSContext *cx, unsigned maxFrames) { Vector frames(cx); - for (NonBuiltinScriptFrameIter i(cx); !i.done(); ++i) { + NonBuiltinScriptFrameIter i(cx, ScriptFrameIter::ALL_CONTEXTS, + ScriptFrameIter::GO_THROUGH_SAVED, + cx->compartment()->principals); + for ( ; !i.done(); ++i) { if (!frames.append(i)) return nullptr; if (frames.length() == maxFrames) diff --git a/js/xpconnect/tests/mochitest/test_bug960820.html b/js/xpconnect/tests/mochitest/test_bug960820.html index 17207154ea72..43310f589e69 100644 --- a/js/xpconnect/tests/mochitest/test_bug960820.html +++ b/js/xpconnect/tests/mochitest/test_bug960820.html @@ -26,6 +26,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=960820 ok(/clickCallback/.test(stack), "clickCallback should be in the stack"); ok(!/clickHandler/.test(stack), "clickHandler should not be in the stack"); ok(/dispatchClick/.test(stack), "dispatchClick should be in the stack"); + + // Check Components.stack, but first filter through the SpecialPowers junk. + var stack = SpecialPowers.wrap(SpecialPowers.Components).stack; + while (/specialpowers/.test(stack)) { + stack = stack.caller; + } + ok(/clickCallback/.test(stack), "clickCallback should be reachable via Components.stack"); + ok(/clickHandler/.test(stack.caller), "clickHandler should be reachable via Components.stack"); + ok(/dispatchClick/.test(stack.caller.caller), "dispatchClick hould be reachable via Components.stack"); } function dispatchClick() { document.dispatchEvent(new MouseEvent('click')); From 21932fdf4b57fa948b8d7cd65fbae9e714afba80 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 20:31:38 -0800 Subject: [PATCH 57/70] Backed out changeset 3bfcf691690a (bug 966182) for adding a hazard. --- toolkit/modules/Promise.jsm | 8 - toolkit/modules/Task.jsm | 97 ++---------- .../modules/tests/xpcshell/test_Promise.js | 9 -- toolkit/modules/tests/xpcshell/test_task.js | 143 ------------------ 4 files changed, 16 insertions(+), 241 deletions(-) diff --git a/toolkit/modules/Promise.jsm b/toolkit/modules/Promise.jsm index f1ba862eae7c..142b7642fe50 100755 --- a/toolkit/modules/Promise.jsm +++ b/toolkit/modules/Promise.jsm @@ -442,14 +442,6 @@ Promise.defer = function () */ Promise.resolve = function (aValue) { - if (aValue && typeof(aValue) == "function" && aValue.isAsyncFunction) { - throw new TypeError( - "Cannot resolve a promise with an async function. " + - "You should either invoke the async function first " + - "or use 'Task.spawn' instead of 'Task.async' to start " + - "the Task and return its promise."); - } - return new Promise((aResolve) => aResolve(aValue)); }; diff --git a/toolkit/modules/Task.jsm b/toolkit/modules/Task.jsm index 5031b4c5315a..fe5127ac2b63 100644 --- a/toolkit/modules/Task.jsm +++ b/toolkit/modules/Task.jsm @@ -136,53 +136,24 @@ this.Task = { * called when the task terminates. */ spawn: function Task_spawn(aTask) { - return createAsyncFunction(aTask).call(undefined); - }, - - /** - * Create and return an 'async function' that starts a new task. - * - * This is similar to 'spawn' except that it doesn't immediately start - * the task, it binds the task to the async function's 'this' object and - * arguments, and it requires the task to be a function. - * - * It simplifies the common pattern of implementing a method via a task, - * like this simple object with a 'greet' method that has a 'name' parameter - * and spawns a task to send a greeting and return its reply: - * - * let greeter = { - * message: "Hello, NAME!", - * greet: function(name) { - * return Task.spawn((function* () { - * return yield sendGreeting(this.message.replace(/NAME/, name)); - * }).bind(this); - * }) - * }; - * - * With Task.async, the method can be declared succinctly: - * - * let greeter = { - * message: "Hello, NAME!", - * greet: Task.async(function* (name) { - * return yield sendGreeting(this.message.replace(/NAME/, name)); - * }) - * }; - * - * While maintaining identical semantics: - * - * greeter.greet("Mitchell").then((reply) => { ... }); // behaves the same - * - * @param aTask - * The task function to start. - * - * @return A function that starts the task function and returns its promise. - */ - async: function Task_async(aTask) { - if (typeof(aTask) != "function") { - throw new TypeError("aTask argument must be a function"); + if (aTask && typeof(aTask) == "function") { + try { + // Let's call into the function ourselves. + aTask = aTask(); + } catch (ex if ex instanceof Task.Result) { + return Promise.resolve(ex.value); + } catch (ex) { + return Promise.reject(ex); + } } - return createAsyncFunction(aTask); + if (isGenerator(aTask)) { + // This is an iterator resulting from calling a generator function. + return new TaskImpl(aTask).deferred.promise; + } + + // Just propagate the given value to the caller as a resolved promise. + return Promise.resolve(aTask); }, /** @@ -197,42 +168,6 @@ this.Task = { } }; -function createAsyncFunction(aTask) { - let asyncFunction = function () { - let result = aTask; - if (aTask && typeof(aTask) == "function") { - if (aTask.isAsyncFunction) { - throw new TypeError( - "Cannot use an async function in place of a promise. " + - "You should either invoke the async function first " + - "or use 'Task.spawn' instead of 'Task.async' to start " + - "the Task and return its promise."); - } - - try { - // Let's call into the function ourselves. - result = aTask.apply(this, arguments); - } catch (ex if ex instanceof Task.Result) { - return Promise.resolve(ex.value); - } catch (ex) { - return Promise.reject(ex); - } - } - - if (isGenerator(result)) { - // This is an iterator resulting from calling a generator function. - return new TaskImpl(result).deferred.promise; - } - - // Just propagate the given value to the caller as a resolved promise. - return Promise.resolve(result); - }; - - asyncFunction.isAsyncFunction = true; - - return asyncFunction; -} - //////////////////////////////////////////////////////////////////////////////// //// TaskImpl diff --git a/toolkit/modules/tests/xpcshell/test_Promise.js b/toolkit/modules/tests/xpcshell/test_Promise.js index 2836c6477284..fe91a04a258a 100644 --- a/toolkit/modules/tests/xpcshell/test_Promise.js +++ b/toolkit/modules/tests/xpcshell/test_Promise.js @@ -4,7 +4,6 @@ Components.utils.import("resource://gre/modules/Promise.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); -Components.utils.import("resource://gre/modules/Task.jsm"); //////////////////////////////////////////////////////////////////////////////// //// Test runner @@ -528,14 +527,6 @@ tests.push( return promise; })); -// Test that Promise.resolve throws when its argument is an async function. -tests.push( - make_promise_test(function test_promise_resolve_throws_with_async_function(test) { - Assert.throws(() => Promise.resolve(Task.async(function* () {})), - /Cannot resolve a promise with an async function/); - return Promise.resolve(); - })); - // Test that the code after "then" is always executed before the callbacks tests.push( make_promise_test(function then_returns_before_callbacks(test) { diff --git a/toolkit/modules/tests/xpcshell/test_task.js b/toolkit/modules/tests/xpcshell/test_task.js index 4be9478f649c..f82cdbd8ce79 100644 --- a/toolkit/modules/tests/xpcshell/test_task.js +++ b/toolkit/modules/tests/xpcshell/test_task.js @@ -118,36 +118,6 @@ add_test(function test_spawn_function() }); }); -add_test(function test_spawn_function_this() -{ - Task.spawn(function () { - return this; - }).then(function (result) { - // Since the task function wasn't defined in strict mode, its "this" object - // should be the same as the "this" object in this function, i.e. the global - // object. - do_check_eq(result, this); - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - -add_test(function test_spawn_function_this_strict() -{ - "use strict"; - Task.spawn(function () { - return this; - }).then(function (result) { - // Since the task function was defined in strict mode, its "this" object - // should be undefined. - do_check_eq(typeof(result), "undefined"); - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - add_test(function test_spawn_function_returning_promise() { Task.spawn(function () { @@ -272,116 +242,3 @@ add_test(function test_mixed_legacy_and_star() do_throw("Unexpected error: " + ex); }); }); - -add_test(function test_async_function_from_generator() -{ - Task.spawn(function* () { - let object = { - asyncFunction: Task.async(function* (param) { - do_check_eq(this, object); - return param; - }) - }; - - // Ensure the async function returns a promise that resolves as expected. - do_check_eq((yield object.asyncFunction(1)), 1); - - // Ensure a second call to the async function also returns such a promise. - do_check_eq((yield object.asyncFunction(3)), 3); - }).then(function () { - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - -add_test(function test_async_function_from_function() -{ - Task.spawn(function* () { - return Task.spawn(function* () { - let object = { - asyncFunction: Task.async(function (param) { - do_check_eq(this, object); - return param; - }) - }; - - // Ensure the async function returns a promise that resolves as expected. - do_check_eq((yield object.asyncFunction(5)), 5); - - // Ensure a second call to the async function also returns such a promise. - do_check_eq((yield object.asyncFunction(7)), 7); - }); - }).then(function () { - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - -add_test(function test_async_function_that_throws_rejects_promise() -{ - Task.spawn(function* () { - let object = { - asyncFunction: Task.async(function* () { - throw "Rejected!"; - }) - }; - - yield object.asyncFunction(); - }).then(function () { - do_throw("unexpected success calling async function that throws error"); - }, function (ex) { - do_check_eq(ex, "Rejected!"); - run_next_test(); - }); -}); - -add_test(function test_async_return_function() -{ - Task.spawn(function* () { - // Ensure an async function that returns a function resolves to the function - // itself instead of calling the function and resolving to its return value. - return Task.spawn(function* () { - let returnValue = function () { - return "These aren't the droids you're looking for."; - }; - - let asyncFunction = Task.async(function () { - return returnValue; - }); - - do_check_eq((yield asyncFunction()), returnValue); - }); - }).then(function () { - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - -add_test(function test_async_throw_argument_not_function() -{ - Task.spawn(function* () { - // Ensure Task.async throws if its aTask argument is not a function. - Assert.throws(() => Task.async("not a function"), - /aTask argument must be a function/); - }).then(function () { - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); - -add_test(function test_async_throw_on_function_in_place_of_promise() -{ - Task.spawn(function* () { - // Ensure Task.spawn throws if passed an async function. - Assert.throws(() => Task.spawn(Task.async(function* () {})), - /Cannot use an async function in place of a promise/); - }).then(function () { - run_next_test(); - }, function (ex) { - do_throw("Unexpected error: " + ex); - }); -}); From af2cd640530775cc3099827eb4e8ca5a275f1fa1 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 5 Mar 2014 20:45:55 -0800 Subject: [PATCH 58/70] Unbacked out changeset 19fe1e621c5c (bug 966182) because it didn't actually introduce the new hazard. --- toolkit/modules/Promise.jsm | 8 + toolkit/modules/Task.jsm | 97 ++++++++++-- .../modules/tests/xpcshell/test_Promise.js | 9 ++ toolkit/modules/tests/xpcshell/test_task.js | 143 ++++++++++++++++++ 4 files changed, 241 insertions(+), 16 deletions(-) diff --git a/toolkit/modules/Promise.jsm b/toolkit/modules/Promise.jsm index 142b7642fe50..f1ba862eae7c 100755 --- a/toolkit/modules/Promise.jsm +++ b/toolkit/modules/Promise.jsm @@ -442,6 +442,14 @@ Promise.defer = function () */ Promise.resolve = function (aValue) { + if (aValue && typeof(aValue) == "function" && aValue.isAsyncFunction) { + throw new TypeError( + "Cannot resolve a promise with an async function. " + + "You should either invoke the async function first " + + "or use 'Task.spawn' instead of 'Task.async' to start " + + "the Task and return its promise."); + } + return new Promise((aResolve) => aResolve(aValue)); }; diff --git a/toolkit/modules/Task.jsm b/toolkit/modules/Task.jsm index fe5127ac2b63..5031b4c5315a 100644 --- a/toolkit/modules/Task.jsm +++ b/toolkit/modules/Task.jsm @@ -136,24 +136,53 @@ this.Task = { * called when the task terminates. */ spawn: function Task_spawn(aTask) { - if (aTask && typeof(aTask) == "function") { - try { - // Let's call into the function ourselves. - aTask = aTask(); - } catch (ex if ex instanceof Task.Result) { - return Promise.resolve(ex.value); - } catch (ex) { - return Promise.reject(ex); - } + return createAsyncFunction(aTask).call(undefined); + }, + + /** + * Create and return an 'async function' that starts a new task. + * + * This is similar to 'spawn' except that it doesn't immediately start + * the task, it binds the task to the async function's 'this' object and + * arguments, and it requires the task to be a function. + * + * It simplifies the common pattern of implementing a method via a task, + * like this simple object with a 'greet' method that has a 'name' parameter + * and spawns a task to send a greeting and return its reply: + * + * let greeter = { + * message: "Hello, NAME!", + * greet: function(name) { + * return Task.spawn((function* () { + * return yield sendGreeting(this.message.replace(/NAME/, name)); + * }).bind(this); + * }) + * }; + * + * With Task.async, the method can be declared succinctly: + * + * let greeter = { + * message: "Hello, NAME!", + * greet: Task.async(function* (name) { + * return yield sendGreeting(this.message.replace(/NAME/, name)); + * }) + * }; + * + * While maintaining identical semantics: + * + * greeter.greet("Mitchell").then((reply) => { ... }); // behaves the same + * + * @param aTask + * The task function to start. + * + * @return A function that starts the task function and returns its promise. + */ + async: function Task_async(aTask) { + if (typeof(aTask) != "function") { + throw new TypeError("aTask argument must be a function"); } - if (isGenerator(aTask)) { - // This is an iterator resulting from calling a generator function. - return new TaskImpl(aTask).deferred.promise; - } - - // Just propagate the given value to the caller as a resolved promise. - return Promise.resolve(aTask); + return createAsyncFunction(aTask); }, /** @@ -168,6 +197,42 @@ this.Task = { } }; +function createAsyncFunction(aTask) { + let asyncFunction = function () { + let result = aTask; + if (aTask && typeof(aTask) == "function") { + if (aTask.isAsyncFunction) { + throw new TypeError( + "Cannot use an async function in place of a promise. " + + "You should either invoke the async function first " + + "or use 'Task.spawn' instead of 'Task.async' to start " + + "the Task and return its promise."); + } + + try { + // Let's call into the function ourselves. + result = aTask.apply(this, arguments); + } catch (ex if ex instanceof Task.Result) { + return Promise.resolve(ex.value); + } catch (ex) { + return Promise.reject(ex); + } + } + + if (isGenerator(result)) { + // This is an iterator resulting from calling a generator function. + return new TaskImpl(result).deferred.promise; + } + + // Just propagate the given value to the caller as a resolved promise. + return Promise.resolve(result); + }; + + asyncFunction.isAsyncFunction = true; + + return asyncFunction; +} + //////////////////////////////////////////////////////////////////////////////// //// TaskImpl diff --git a/toolkit/modules/tests/xpcshell/test_Promise.js b/toolkit/modules/tests/xpcshell/test_Promise.js index fe91a04a258a..2836c6477284 100644 --- a/toolkit/modules/tests/xpcshell/test_Promise.js +++ b/toolkit/modules/tests/xpcshell/test_Promise.js @@ -4,6 +4,7 @@ Components.utils.import("resource://gre/modules/Promise.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource://gre/modules/Task.jsm"); //////////////////////////////////////////////////////////////////////////////// //// Test runner @@ -527,6 +528,14 @@ tests.push( return promise; })); +// Test that Promise.resolve throws when its argument is an async function. +tests.push( + make_promise_test(function test_promise_resolve_throws_with_async_function(test) { + Assert.throws(() => Promise.resolve(Task.async(function* () {})), + /Cannot resolve a promise with an async function/); + return Promise.resolve(); + })); + // Test that the code after "then" is always executed before the callbacks tests.push( make_promise_test(function then_returns_before_callbacks(test) { diff --git a/toolkit/modules/tests/xpcshell/test_task.js b/toolkit/modules/tests/xpcshell/test_task.js index f82cdbd8ce79..4be9478f649c 100644 --- a/toolkit/modules/tests/xpcshell/test_task.js +++ b/toolkit/modules/tests/xpcshell/test_task.js @@ -118,6 +118,36 @@ add_test(function test_spawn_function() }); }); +add_test(function test_spawn_function_this() +{ + Task.spawn(function () { + return this; + }).then(function (result) { + // Since the task function wasn't defined in strict mode, its "this" object + // should be the same as the "this" object in this function, i.e. the global + // object. + do_check_eq(result, this); + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_spawn_function_this_strict() +{ + "use strict"; + Task.spawn(function () { + return this; + }).then(function (result) { + // Since the task function was defined in strict mode, its "this" object + // should be undefined. + do_check_eq(typeof(result), "undefined"); + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + add_test(function test_spawn_function_returning_promise() { Task.spawn(function () { @@ -242,3 +272,116 @@ add_test(function test_mixed_legacy_and_star() do_throw("Unexpected error: " + ex); }); }); + +add_test(function test_async_function_from_generator() +{ + Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function* (param) { + do_check_eq(this, object); + return param; + }) + }; + + // Ensure the async function returns a promise that resolves as expected. + do_check_eq((yield object.asyncFunction(1)), 1); + + // Ensure a second call to the async function also returns such a promise. + do_check_eq((yield object.asyncFunction(3)), 3); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_function_from_function() +{ + Task.spawn(function* () { + return Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function (param) { + do_check_eq(this, object); + return param; + }) + }; + + // Ensure the async function returns a promise that resolves as expected. + do_check_eq((yield object.asyncFunction(5)), 5); + + // Ensure a second call to the async function also returns such a promise. + do_check_eq((yield object.asyncFunction(7)), 7); + }); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_function_that_throws_rejects_promise() +{ + Task.spawn(function* () { + let object = { + asyncFunction: Task.async(function* () { + throw "Rejected!"; + }) + }; + + yield object.asyncFunction(); + }).then(function () { + do_throw("unexpected success calling async function that throws error"); + }, function (ex) { + do_check_eq(ex, "Rejected!"); + run_next_test(); + }); +}); + +add_test(function test_async_return_function() +{ + Task.spawn(function* () { + // Ensure an async function that returns a function resolves to the function + // itself instead of calling the function and resolving to its return value. + return Task.spawn(function* () { + let returnValue = function () { + return "These aren't the droids you're looking for."; + }; + + let asyncFunction = Task.async(function () { + return returnValue; + }); + + do_check_eq((yield asyncFunction()), returnValue); + }); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_throw_argument_not_function() +{ + Task.spawn(function* () { + // Ensure Task.async throws if its aTask argument is not a function. + Assert.throws(() => Task.async("not a function"), + /aTask argument must be a function/); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); + +add_test(function test_async_throw_on_function_in_place_of_promise() +{ + Task.spawn(function* () { + // Ensure Task.spawn throws if passed an async function. + Assert.throws(() => Task.spawn(Task.async(function* () {})), + /Cannot use an async function in place of a promise/); + }).then(function () { + run_next_test(); + }, function (ex) { + do_throw("Unexpected error: " + ex); + }); +}); From 863ed399787db18f956a2cea8ec9e283a8f59cab Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Wed, 5 Mar 2014 17:58:01 -0800 Subject: [PATCH 59/70] Bug 619487: Assert when preferences are used off the main thread. r=dbaron --- modules/libpref/src/Preferences.cpp | 4 ++++ modules/libpref/src/nsPrefBranch.h | 6 +++--- modules/libpref/src/prefapi.cpp | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp index 0f770d5d4c1d..a818df8bfc99 100644 --- a/modules/libpref/src/Preferences.cpp +++ b/modules/libpref/src/Preferences.cpp @@ -402,6 +402,10 @@ Preferences::GetInstanceForService() bool Preferences::InitStaticMembers() { +#ifndef MOZ_B2G + MOZ_ASSERT(NS_IsMainThread()); +#endif + if (!sShutdown && !sPreferences) { nsCOMPtr prefService = do_GetService(NS_PREFSERVICE_CONTRACTID); diff --git a/modules/libpref/src/nsPrefBranch.h b/modules/libpref/src/nsPrefBranch.h index a168be04c52d..faa47f2f06b8 100644 --- a/modules/libpref/src/nsPrefBranch.h +++ b/modules/libpref/src/nsPrefBranch.h @@ -182,7 +182,7 @@ class nsPrefBranch : public nsIPrefBranchInternal, { friend class mozilla::PreferenceServiceReporter; public: - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_DECL_NSIPREFBRANCH NS_DECL_NSIPREFBRANCH2 NS_DECL_NSIOBSERVER @@ -235,7 +235,7 @@ public: nsPrefLocalizedString(); virtual ~nsPrefLocalizedString(); - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_FORWARD_NSISUPPORTSSTRING(mUnicodeString->) NS_FORWARD_NSISUPPORTSPRIMITIVE(mUnicodeString->) @@ -253,7 +253,7 @@ private: class nsRelativeFilePref : public nsIRelativeFilePref { public: - NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_ISUPPORTS NS_DECL_NSIRELATIVEFILEPREF nsRelativeFilePref(); diff --git a/modules/libpref/src/prefapi.cpp b/modules/libpref/src/prefapi.cpp index 4a0363057e5d..5442df8bedb8 100644 --- a/modules/libpref/src/prefapi.cpp +++ b/modules/libpref/src/prefapi.cpp @@ -8,6 +8,7 @@ #include "prefapi.h" #include "prefapi_private_data.h" #include "prefread.h" +#include "MainThreadUtils.h" #include "nsReadableUtils.h" #include "nsCRT.h" @@ -575,6 +576,10 @@ pref_DeleteItem(PLDHashTable *table, PLDHashEntryHdr *heh, uint32_t i, void *arg nsresult PREF_DeleteBranch(const char *branch_name) { +#ifndef MOZ_B2G + MOZ_ASSERT(NS_IsMainThread()); +#endif + int len = (int)strlen(branch_name); if (!gHashTable.ops) @@ -642,6 +647,10 @@ pref_ClearUserPref(PLDHashTable *table, PLDHashEntryHdr *he, uint32_t, nsresult PREF_ClearAllUserPrefs() { +#ifndef MOZ_B2G + MOZ_ASSERT(NS_IsMainThread()); +#endif + if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; @@ -716,6 +725,10 @@ static void pref_SetValue(PrefValue* oldValue, PrefValue newValue, PrefType type PrefHashEntry* pref_HashTableLookup(const void *key) { +#ifndef MOZ_B2G + MOZ_ASSERT(NS_IsMainThread()); +#endif + PrefHashEntry* result = static_cast(PL_DHashTableOperate(&gHashTable, key, PL_DHASH_LOOKUP)); @@ -727,6 +740,10 @@ PrefHashEntry* pref_HashTableLookup(const void *key) nsresult pref_HashPref(const char *key, PrefValue value, PrefType type, uint32_t flags) { +#ifndef MOZ_B2G + MOZ_ASSERT(NS_IsMainThread()); +#endif + if (!gHashTable.ops) return NS_ERROR_OUT_OF_MEMORY; From ccfa0fd03bc05290abd52ca0ca550d54ab6a72f4 Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Wed, 5 Mar 2014 17:58:03 -0800 Subject: [PATCH 60/70] Bug 979951: Always preserve the worker wrapper to ensure that we have something to tell us what compartment to enter. r=bent --- dom/workers/WorkerPrivate.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index f5921e84fd26..80e6322a83f2 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -2142,7 +2142,15 @@ WorkerPrivateParent::WrapObject(JSContext* aCx, AssertIsOnParentThread(); - return WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate()); + // XXXkhuey this should not need to be rooted, the analysis is dumb. + // See bug 980181. + JS::Rooted wrapper(aCx, + WorkerBinding::Wrap(aCx, aScope, ParentAsWorkerPrivate())); + if (wrapper) { + MOZ_ALWAYS_TRUE(TryPreserveWrapper(wrapper)); + } + + return wrapper; } template From 0ca2bb1bf9571396a7b17c680a1da3a8f0579d06 Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Wed, 5 Mar 2014 17:58:13 -0800 Subject: [PATCH 61/70] Bug 968836 - fix a few already_AddRefed members in MediaManager.cpp; r=jesup --- dom/media/MediaManager.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 79902f9ff38b..d0c810dbc3c3 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -1,3 +1,5 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -225,23 +227,22 @@ class DeviceSuccessCallbackRunnable: public nsRunnable public: DeviceSuccessCallbackRunnable( uint64_t aWindowID, - already_AddRefed aSuccess, - already_AddRefed aError, + nsCOMPtr& aSuccess, + nsCOMPtr& aError, nsTArray >* aDevices) - : mSuccess(aSuccess) - , mError(aError) - , mDevices(aDevices) + : mDevices(aDevices) , mWindowID(aWindowID) - , mManager(MediaManager::GetInstance()) {} + , mManager(MediaManager::GetInstance()) + { + mSuccess.swap(aSuccess); + mError.swap(aError); + } NS_IMETHOD Run() { NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); - nsCOMPtr success(mSuccess); - nsCOMPtr error(mError); - // Only run if window is still on our active list. if (!mManager->IsWindowStillActive(mWindowID)) { return NS_OK; @@ -256,7 +257,7 @@ public: // We should in the future return an empty array, and dynamically add // devices to the dropdowns if things are hotplugged while the // requester is up. - error->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); + mError->OnError(NS_LITERAL_STRING("NO_DEVICES_FOUND")); return NS_OK; } @@ -272,13 +273,13 @@ public: static_cast(tmp.Elements()) )); - success->OnSuccess(devices); + mSuccess->OnSuccess(devices); return NS_OK; } private: - already_AddRefed mSuccess; - already_AddRefed mError; + nsCOMPtr mSuccess; + nsCOMPtr mError; nsAutoPtr > > mDevices; uint64_t mWindowID; nsRefPtr mManager; @@ -1099,13 +1100,15 @@ public: NS_DispatchToMainThread(new DeviceSuccessCallbackRunnable(mWindowId, mSuccess, mError, final.forget())); + // DeviceSuccessCallbackRunnable should have taken these. + MOZ_ASSERT(!mSuccess && !mError); return NS_OK; } private: MediaStreamConstraintsInternal mConstraints; - already_AddRefed mSuccess; - already_AddRefed mError; + nsCOMPtr mSuccess; + nsCOMPtr mError; nsRefPtr mManager; uint64_t mWindowId; const nsString mCallId; From df5638354e6f4c9f7222e0719905164d10348d7c Mon Sep 17 00:00:00 2001 From: Dave Hylands Date: Wed, 5 Mar 2014 20:18:06 -0800 Subject: [PATCH 62/70] Bug 977372 - Remove main thread assert so CloseFileRunnable can be used on non-main threads. r=bent --- ipc/glue/FileDescriptorUtils.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/ipc/glue/FileDescriptorUtils.cpp b/ipc/glue/FileDescriptorUtils.cpp index dbd390c6e356..0623ba151485 100644 --- a/ipc/glue/FileDescriptorUtils.cpp +++ b/ipc/glue/FileDescriptorUtils.cpp @@ -21,7 +21,6 @@ using mozilla::ipc::CloseFileRunnable; CloseFileRunnable::CloseFileRunnable(const FileDescriptor& aFileDescriptor) : mFileDescriptor(aFileDescriptor) { - MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aFileDescriptor.IsValid()); } @@ -41,8 +40,6 @@ NS_IMPL_ISUPPORTS1(CloseFileRunnable, nsIRunnable) void CloseFileRunnable::Dispatch() { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr eventTarget = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); NS_ENSURE_TRUE_VOID(eventTarget); From 450fef6f62836f93acb39be7a1d409a611a3f515 Mon Sep 17 00:00:00 2001 From: Benoit Girard Date: Thu, 6 Mar 2014 00:03:10 -0500 Subject: [PATCH 63/70] Bug 973770 - Build backend that generates C/C++ Eclipse projects. r=gps --- build/docs/cppeclipse.rst | 54 ++ build/docs/index.rst | 9 +- .../mozbuild/mozbuild/backend/cpp_eclipse.py | 521 ++++++++++++++++++ python/mozbuild/mozbuild/config_status.py | 7 +- python/mozbuild/mozbuild/mach_commands.py | 2 +- 5 files changed, 590 insertions(+), 3 deletions(-) create mode 100644 build/docs/cppeclipse.rst create mode 100644 python/mozbuild/mozbuild/backend/cpp_eclipse.py diff --git a/build/docs/cppeclipse.rst b/build/docs/cppeclipse.rst new file mode 100644 index 000000000000..4492add473e2 --- /dev/null +++ b/build/docs/cppeclipse.rst @@ -0,0 +1,54 @@ +.. _build_cppeclipse: + +===================== +Cpp Eclipse Projects +===================== + +For additional information on using Eclipse CDT see +`the MDN page +`_. + +The build system contains alpha support for generating C++ Eclipse +project files to aid with development. + +Please report bugs to bugzilla and make them depend on bug 973770. + +To generate a C++ Eclipse project files, you'll need to have a fully +built tree:: + + mach build + +Then, simply generate the Android Eclipse build backend:: + + mach build-backend -b CppEclipse + +If all goes well, the path to the generated workspace should be +printed (currently, ``$OBJDIR/android_eclipse``). + +To use the generated Android Eclipse project files, you'll need to +have a Eclipse CDT 8.3 (We plan to follow the latest Eclipse release) +`Eclipse CDT plugin +`_ +installed. You can then import all the projects into Eclipse using +*File > Import ... > General > Existing Projects into Workspace* +-only- if you have not ran the background indexer. + +Updating Project Files +====================== + +As you pull and update the source tree, your C++ Eclipse files may +fall out of sync with the build configuration. The tree should still +build fine from within Eclipse, but source files may be missing and in +rare circumstances Eclipse's index may not have the proper build +configuration. + +To account for this, you'll want to periodically regenerate the +Android Eclipse project files. You can do this by running ``mach build +&& mach build-backend -b CppEclipse`` from the +command line. + +Currently, regeneration rewrites the original project files. **If +you've made any customizations to the projects, they will likely get +overwritten.** We would like to improve this user experience in the +future. + diff --git a/build/docs/index.rst b/build/docs/index.rst index a85bbef89c39..503761f60be1 100644 --- a/build/docs/index.rst +++ b/build/docs/index.rst @@ -22,8 +22,15 @@ Important Concepts mozinfo preprocessor jar-manifests - visualstudio + +integrated development environment (IDE) +======================================== +.. toctree:: + :maxdepth: 1 + androideclipse + cppeclipse + visualstudio mozbuild ======== diff --git a/python/mozbuild/mozbuild/backend/cpp_eclipse.py b/python/mozbuild/mozbuild/backend/cpp_eclipse.py new file mode 100644 index 000000000000..3567112888f0 --- /dev/null +++ b/python/mozbuild/mozbuild/backend/cpp_eclipse.py @@ -0,0 +1,521 @@ +# 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/. + +import random +import errno +import types +import os +import xml.etree.ElementTree as ET +from .common import CommonBackend + +from ..frontend.data import ( + Defines, +) + +# TODO Have ./mach eclipse generate the workspace and index it: +# /Users/bgirard/mozilla/eclipse/eclipse/eclipse/eclipse -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data $PWD/workspace -importAll $PWD/eclipse +# Open eclipse: +# /Users/bgirard/mozilla/eclipse/eclipse/eclipse/eclipse -data $PWD/workspace + +class CppEclipseBackend(CommonBackend): + """Backend that generates Cpp Eclipse project files. + """ + + def _init(self): + CommonBackend._init(self) + + self._paths_to_defines = {} + self._workspace_dir = os.path.join(self.environment.topobjdir, 'eclipse_workspace') + self._project_dir = os.path.join(self._workspace_dir, 'gecko') + + self._macbundle = self.environment.substs['MOZ_MACBUNDLE_NAME'] + self._appname = self.environment.substs['MOZ_APP_NAME'] + self._bin_suffix = self.environment.substs['BIN_SUFFIX'] + + def detailed(summary): + return ('\n' + \ + 'Generated Cpp Eclipse workspace in "%s".\n' + \ + 'OPTIONAL: Setup & index the project using: eclipse -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data %s -importAll %s\n' + \ + 'NOTE: This will take about 10 minutes.\n\n' \ + 'Run with: eclipse -data %s\n' \ + 'Import the project using File > Import > General > Existing Project into workspace') \ + % (self._workspace_dir, self._workspace_dir, self._project_dir, self._workspace_dir) + + self.summary.backend_detailed_summary = types.MethodType(detailed, + self.summary) + + def consume_object(self, obj): + obj.ack() + + reldir = getattr(obj, 'relativedir', None) + + # Note that unlike VS, Eclipse' indexer seem to crawl the headers and + # isn't picky about the local includes. + if isinstance(obj, Defines): + self._paths_to_defines.setdefault(reldir, {}).update(obj.defines) + + def consume_finished(self): + settings_dir = os.path.join(self._project_dir, '.settings') + launch_dir = os.path.join(self._project_dir, 'RunConfigurations') + workspace_settings_dir = os.path.join(self._workspace_dir, '.metadata/.plugins/org.eclipse.core.runtime/.settings') + workspace_language_dir = os.path.join(self._workspace_dir, '.metadata/.plugins/org.eclipse.cdt.core') + + for dir_name in [self._project_dir, settings_dir, launch_dir, workspace_settings_dir, workspace_language_dir]: + try: + os.makedirs(dir_name) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + project_path = os.path.join(self._project_dir, '.project') + with open(project_path, 'wb') as fh: + self._write_project(fh) + + cproject_path = os.path.join(self._project_dir, '.cproject') + with open(cproject_path, 'wb') as fh: + self._write_cproject(fh) + + language_path = os.path.join(settings_dir, 'language.settings.xml') + with open(language_path, 'wb') as fh: + self._write_language_settings(fh) + + workspace_language_path = os.path.join(workspace_language_dir, 'language.settings.xml') + with open(workspace_language_path, 'wb') as fh: + fh.write(WORKSPACE_LANGUAGE_SETTINGS_TEMPLATE) + + self._write_launch_files(launch_dir) + + # This will show up as an 'unmanged' formatter. This can be named by generating + # another file. + formatter_prefs_path = os.path.join(settings_dir, 'org.eclipse.cdt.core.prefs') + with open(formatter_prefs_path, 'wb') as fh: + fh.write(FORMATTER_SETTINGS); + + editor_prefs_path = os.path.join(workspace_settings_dir, "org.eclipse.ui.editors.prefs"); + with open(editor_prefs_path, 'wb') as fh: + fh.write(EDITOR_SETTINGS); + + def _write_language_settings(self, fh): + settings = LANGUAGE_SETTINGS_TEMPLATE + + settings = settings.replace('@GLOBAL_INCLUDE_PATH@', os.path.join(self.environment.topobjdir, 'dist/include')) + settings = settings.replace('@IPDL_INCLUDE_PATH@', os.path.join(self.environment.topobjdir, 'ipc/ipdl/_ipdlheaders')) + settings = settings.replace('@PREINCLUDE_FILE_PATH@', os.path.join(self.environment.topobjdir, 'dist/include/mozilla-config.h')) + + fh.write(settings) + + def _write_launch_files(self, launch_dir): + main_gecko_launch = os.path.join(launch_dir, 'gecko.launch') + with open(main_gecko_launch, 'wb') as fh: + bin_dir = os.path.join(self.environment.topobjdir, 'dist') + + launch = LAUNCH_CONFIG_TEMPLATE + # TODO Improve binary detection + if self._macbundle: + exe_path = os.path.join(bin_dir, self._macbundle, 'Contents/MacOS') + else: + exe_path = os.path.join(bin_dir, 'bin') + + exe_path = os.path.join(exe_path, self._appname + self._bin_suffix) + launch = launch.replace('@LAUNCH_PROGRAM@', exe_path) + launch = launch.replace('@LAUNCH_ARGS@', '-P -no-remote') + fh.write(launch) + + #TODO Add more launch configs (and delegate calls to mach) + + def _write_project(self, fh): + project = PROJECT_TEMPLATE; + + project = project.replace('@PROJECT_NAME@', 'Gecko') + project = project.replace('@PROJECT_TOPSRCDIR@', self.environment.topsrcdir) + fh.write(project) + + def _write_cproject(self, fh): + fh.write(CPROJECT_TEMPLATE_HEADER.replace('@PROJECT_TOPSRCDIR@', self.environment.topobjdir)) + + for path, defines in self._paths_to_defines.items(): + folderinfo = CPROJECT_TEMPLATE_FOLDER_INFO_HEADER + folderinfo = folderinfo.replace('@FOLDER_ID@', str(random.randint(1000000, 99999999999))) + folderinfo = folderinfo.replace('@FOLDER_NAME@', 'tree/' + path) + fh.write(folderinfo) + for k, v in defines.items(): + define = ET.Element('listOptionValue') + define.set('builtIn', 'false') + define.set('value', str(k) + "=" + str(v)) + fh.write(ET.tostring(define)) + fh.write(CPROJECT_TEMPLATE_FOLDER_INFO_FOOTER) + + + fh.write(CPROJECT_TEMPLATE_FOOTER) + + +PROJECT_TEMPLATE = """ + + @PROJECT_NAME@ + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + tree + 2 + @PROJECT_TOPSRCDIR@ + + + +""" + +CPROJECT_TEMPLATE_HEADER = """ + + + + + + + + + + + + + + + + + + + + + + + + +""" +CPROJECT_TEMPLATE_FOLDER_INFO_HEADER = """ + + + + + + + + + +""" +CPROJECT_TEMPLATE_FILEINFO = """ + + + + + +""" +CPROJECT_TEMPLATE_FOOTER = """ + + + + + + + + + + + + + + + + + + + + +""" + +WORKSPACE_LANGUAGE_SETTINGS_TEMPLATE = """ + + + + + + + + +""" + +LANGUAGE_SETTINGS_TEMPLATE = """ + + + + + + + + + + + + + + + + + + + + + + + + +""" + +LAUNCH_CONFIG_TEMPLATE = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""" + +EDITOR_SETTINGS = """eclipse.preferences.version=1 +lineNumberRuler=true +overviewRuler_migration=migrated_3.1 +printMargin=true +printMarginColumn=80 +showCarriageReturn=false +showEnclosedSpaces=false +showLeadingSpaces=false +showLineFeed=false +showWhitespaceCharacters=true +spacesForTabs=true +tabWidth=2 +undoHistorySize=200 +""" + +FORMATTER_SETTINGS = """eclipse.preferences.version=1 +org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.cdt.core.formatter.alignment_for_assignment=16 +org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 +org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 +org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=48 +org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 +org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 +org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 +org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.cdt.core.formatter.alignment_for_member_access=0 +org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 +org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line_shifted +org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 +org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true +org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true +org.eclipse.cdt.core.formatter.compact_else_if=true +org.eclipse.cdt.core.formatter.continuation_indentation=2 +org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false +org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false +org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=true +org.eclipse.cdt.core.formatter.indent_empty_lines=false +org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.cdt.core.formatter.indentation.size=2 +org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=insert +org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=insert +org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.join_wrapped_lines=false +org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.cdt.core.formatter.lineSplit=80 +org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.cdt.core.formatter.tabulation.char=space +org.eclipse.cdt.core.formatter.tabulation.size=2 +org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false +""" diff --git a/python/mozbuild/mozbuild/config_status.py b/python/mozbuild/mozbuild/config_status.py index 876ac72011d9..2cbdb010271c 100644 --- a/python/mozbuild/mozbuild/config_status.py +++ b/python/mozbuild/mozbuild/config_status.py @@ -95,7 +95,7 @@ def config_status(topobjdir='.', topsrcdir='.', parser.add_option('-d', '--diff', action='store_true', help='print diffs of changed files.') parser.add_option('-b', '--backend', - choices=['RecursiveMake', 'AndroidEclipse', 'VisualStudio'], + choices=['RecursiveMake', 'AndroidEclipse', 'CppEclipse', 'VisualStudio'], default='RecursiveMake', help='what backend to build (default: RecursiveMake).') options, args = parser.parse_args() @@ -119,6 +119,11 @@ def config_status(topobjdir='.', topsrcdir='.', if not MachCommandConditions.is_android(env): raise Exception('The Android Eclipse backend is not available with this configuration.') backend_cls = AndroidEclipseBackend + elif options.backend == 'CppEclipse': + from mozbuild.backend.cpp_eclipse import CppEclipseBackend + backend_cls = CppEclipseBackend + if os.name == 'nt': + raise Exception('Eclipse is not supported on Windows. Consider using Visual Studio instead.') elif options.backend == 'VisualStudio': from mozbuild.backend.visualstudio import VisualStudioBackend backend_cls = VisualStudioBackend diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py index 1f3dac736a85..d2135a4c50ac 100644 --- a/python/mozbuild/mozbuild/mach_commands.py +++ b/python/mozbuild/mozbuild/mach_commands.py @@ -531,7 +531,7 @@ class Build(MachCommandBase): # It would be nice to filter the choices below based on # conditions, but that is for another day. @CommandArgument('-b', '--backend', - choices=['RecursiveMake', 'AndroidEclipse', 'VisualStudio'], + choices=['RecursiveMake', 'AndroidEclipse', 'CppEclipse', 'VisualStudio'], default='RecursiveMake', help='Which backend to build (default: RecursiveMake).') def build_backend(self, backend='RecursiveMake', diff=False): From a614bdaa4b0b81aca5923d9f8145cf626e978e1c Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 6 Mar 2014 00:22:43 -0500 Subject: [PATCH 64/70] Bug 951887 followup. Adjust tests to deal with the new reality. --- .../content/test/forms/test_required_attribute.html | 10 ++++++---- content/html/content/test/test_bug610687.html | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/content/html/content/test/forms/test_required_attribute.html b/content/html/content/test/forms/test_required_attribute.html index 3357423c1d75..cf9586c31b4f 100644 --- a/content/html/content/test/forms/test_required_attribute.html +++ b/content/html/content/test/forms/test_required_attribute.html @@ -185,8 +185,10 @@ function checkInputRequiredValidity(type) element.required = true; SpecialPowers.wrap(element).value = ''; // To make :-moz-ui-valid apply. + checkSufferingFromBeingMissing(element, true); document.forms[0].removeChild(element); - checkNotSufferingFromBeingMissing(element); + // Removing the child changes nothing about whether it's valid + checkSufferingFromBeingMissing(element, true); } function checkInputRequiredValidityForCheckbox() @@ -221,7 +223,7 @@ function checkInputRequiredValidityForCheckbox() element.required = true; element.checked = false; document.forms[0].removeChild(element); - checkNotSufferingFromBeingMissing(element); + checkSufferingFromBeingMissing(element, true); } function checkInputRequiredValidityForRadio() @@ -297,7 +299,7 @@ function checkInputRequiredValidityForRadio() element2.required = true; element2.checked = false; document.forms[0].removeChild(element2); - checkNotSufferingFromBeingMissing(element2); + checkSufferingFromBeingMissing(element2, true); } function checkInputRequiredValidityForFile() @@ -350,7 +352,7 @@ function checkInputRequiredValidityForFile() SpecialPowers.wrap(element).value = ''; file.remove(false); document.forms[0].removeChild(element); - checkNotSufferingFromBeingMissing(element); + checkSufferingFromBeingMissing(element, true); } checkTextareaRequiredValidity(); diff --git a/content/html/content/test/test_bug610687.html b/content/html/content/test/test_bug610687.html index a2b7089c7656..357ac54aab87 100644 --- a/content/html/content/test/test_bug610687.html +++ b/content/html/content/test/test_bug610687.html @@ -129,7 +129,7 @@ function checkRadios(r1, r2, r3, form) var p = r2.parentNode; p.removeChild(r2); checkPseudoClasses(r1, true, true, false); - checkPseudoClasses(r2, true, true, false); + checkPseudoClasses(r2, false, false, true); p.appendChild(r2); checkPseudoClasses(r1, false, false, true); From 5dcc74aa497b52a761631926d2d2c373a9bfc7c3 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Thu, 6 Mar 2014 15:13:50 +0900 Subject: [PATCH 65/70] Bug 979148 - Use NOTIFY_IME_OF_POSITION_CHANGE for IMM32. r=masyuki --- widget/windows/WinIMEHandler.cpp | 3 ++- widget/windows/nsIMM32Handler.cpp | 7 +++++++ widget/windows/nsIMM32Handler.h | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/widget/windows/WinIMEHandler.cpp b/widget/windows/WinIMEHandler.cpp index 470a0c846271..fd62d1afd6ce 100644 --- a/widget/windows/WinIMEHandler.cpp +++ b/widget/windows/WinIMEHandler.cpp @@ -198,6 +198,7 @@ IMEHandler::NotifyIME(nsWindow* aWindow, case REQUEST_TO_CANCEL_COMPOSITION: nsIMM32Handler::CancelComposition(aWindow); return NS_OK; + case NOTIFY_IME_OF_POSITION_CHANGE: case NOTIFY_IME_OF_COMPOSITION_UPDATE: nsIMM32Handler::OnUpdateComposition(aWindow); return NS_OK; @@ -226,7 +227,7 @@ IMEHandler::GetUpdatePreference() } #endif //NS_ENABLE_TSF - return nsIMEUpdatePreference(); + return nsIMM32Handler::GetIMEUpdatePreference(); } // static diff --git a/widget/windows/nsIMM32Handler.cpp b/widget/windows/nsIMM32Handler.cpp index 275af68b4260..0bb2dd783256 100644 --- a/widget/windows/nsIMM32Handler.cpp +++ b/widget/windows/nsIMM32Handler.cpp @@ -138,6 +138,13 @@ nsIMM32Handler::GetKeyboardCodePage() return sCodePage; } +/* static */ +nsIMEUpdatePreference +nsIMM32Handler::GetIMEUpdatePreference() +{ + return nsIMEUpdatePreference(nsIMEUpdatePreference::NOTIFY_POSITION_CHANGE); +} + // used for checking the lParam of WM_IME_COMPOSITION #define IS_COMPOSING_LPARAM(lParam) \ ((lParam) & (GCS_COMPSTR | GCS_COMPATTR | GCS_COMPCLAUSE | GCS_CURSORPOS)) diff --git a/widget/windows/nsIMM32Handler.h b/widget/windows/nsIMM32Handler.h index 107c2b1bfa6b..656a1bdde4a2 100644 --- a/widget/windows/nsIMM32Handler.h +++ b/widget/windows/nsIMM32Handler.h @@ -11,9 +11,9 @@ #include "nsCOMPtr.h" #include "nsString.h" #include "nsTArray.h" +#include "nsIWidget.h" #include "mozilla/EventForwards.h" -class nsIWidget; class nsWindow; struct nsIntRect; @@ -143,6 +143,8 @@ public: static void CancelComposition(nsWindow* aWindow, bool aForce = false); static void OnUpdateComposition(nsWindow* aWindow); + static nsIMEUpdatePreference GetIMEUpdatePreference(); + protected: static void EnsureHandlerInstance(); From 6136d94c752bca15edc74cf34f2fa3abe3d017bd Mon Sep 17 00:00:00 2001 From: Gian-Carlo Pascutto Date: Thu, 6 Mar 2014 07:53:34 +0100 Subject: [PATCH 66/70] Bug 978851 - LoadInfo::UpdateSystemLoad warns about format string in sscanf. r=padenot --- content/media/webrtc/LoadMonitor.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/content/media/webrtc/LoadMonitor.cpp b/content/media/webrtc/LoadMonitor.cpp index b47623d81620..7445fafb1294 100644 --- a/content/media/webrtc/LoadMonitor.cpp +++ b/content/media/webrtc/LoadMonitor.cpp @@ -9,6 +9,7 @@ #include "prtime.h" #include "prinrval.h" #include "prsystem.h" +#include "prprf.h" #include "nsString.h" #include "nsThreadUtils.h" @@ -214,9 +215,9 @@ nsresult LoadInfo::UpdateSystemLoad() uint64_t nice; uint64_t system; uint64_t idle; - if (sscanf(buffer.get(), "cpu %Lu %Lu %Lu %Lu", - &user, &nice, - &system, &idle) != 4) { + if (PR_sscanf(buffer.get(), "cpu %llu %llu %llu %llu", + &user, &nice, + &system, &idle) != 4) { LOG(("Error parsing /proc/stat")); return NS_ERROR_FAILURE; } From 0f4b869938e297336a5ce9305b6a0e46f63d5676 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 23:15:26 -0800 Subject: [PATCH 67/70] Bumping gaia.json for 2 gaia revision(s) a=gaia-bump ======== https://hg.mozilla.org/integration/gaia-central/rev/67e75b4310bc Author: EragonJ Desc: Merge pull request #16896 from EragonJ/bug-979771 Bug 979771 - [DSDS] Data call icon on Utility Tray will not become blue ======== https://hg.mozilla.org/integration/gaia-central/rev/e71c4fe284bc Author: EragonJ Desc: Bug 979771 - [DSDS] Data call icon on Utility Tray will not become blue - we would iterate mozMobileConnections now - update unit tests - refactor code --- b2g/config/gaia.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index a84f78b5c928..267ff77b1c8e 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -4,6 +4,6 @@ "branch": "", "revision": "" }, - "revision": "25562480c0f615efc6d2a80b56cdba5c4cf6b1a9", + "revision": "67e75b4310bc04e26b0e065aa16b71a21b456705", "repo_path": "/integration/gaia-central" } From e846006c1a4eda555b44b490ac217dbc3521b5f1 Mon Sep 17 00:00:00 2001 From: B2G Bumper Bot Date: Wed, 5 Mar 2014 23:20:52 -0800 Subject: [PATCH 68/70] Bumping manifests a=b2g-bump --- b2g/config/emulator-ics/sources.xml | 2 +- b2g/config/emulator-jb/sources.xml | 2 +- b2g/config/emulator/sources.xml | 2 +- b2g/config/hamachi/sources.xml | 2 +- b2g/config/helix/sources.xml | 2 +- b2g/config/inari/sources.xml | 2 +- b2g/config/leo/sources.xml | 2 +- b2g/config/mako/sources.xml | 2 +- b2g/config/wasabi/sources.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index e6cc09ded691..d3e1cbd4123f 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 daef4a72af60..8df00c73d1fb 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index e6cc09ded691..d3e1cbd4123f 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 8edd5970b87e..484f02277bd1 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 637d3ba144e8..c5965a33009b 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/inari/sources.xml b/b2g/config/inari/sources.xml index f0bf9215fbc5..12aa146cb89a 100644 --- a/b2g/config/inari/sources.xml +++ b/b2g/config/inari/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/leo/sources.xml b/b2g/config/leo/sources.xml index 1aa5634a4afb..ee4ffb5f9b1f 100644 --- a/b2g/config/leo/sources.xml +++ b/b2g/config/leo/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/mako/sources.xml b/b2g/config/mako/sources.xml index bece119b1140..0e71f532ab9a 100644 --- a/b2g/config/mako/sources.xml +++ b/b2g/config/mako/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 85c629ab92b0..319fbc0d36ae 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,7 +17,7 @@ - + From 34af5d34eca752d4e8144c419c62351053700da3 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 6 Mar 2014 09:16:01 +0100 Subject: [PATCH 69/70] Backed out changeset 1314168b5271 (bug 977372) --- ipc/glue/FileDescriptorUtils.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ipc/glue/FileDescriptorUtils.cpp b/ipc/glue/FileDescriptorUtils.cpp index 0623ba151485..dbd390c6e356 100644 --- a/ipc/glue/FileDescriptorUtils.cpp +++ b/ipc/glue/FileDescriptorUtils.cpp @@ -21,6 +21,7 @@ using mozilla::ipc::CloseFileRunnable; CloseFileRunnable::CloseFileRunnable(const FileDescriptor& aFileDescriptor) : mFileDescriptor(aFileDescriptor) { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aFileDescriptor.IsValid()); } @@ -40,6 +41,8 @@ NS_IMPL_ISUPPORTS1(CloseFileRunnable, nsIRunnable) void CloseFileRunnable::Dispatch() { + MOZ_ASSERT(NS_IsMainThread()); + nsCOMPtr eventTarget = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); NS_ENSURE_TRUE_VOID(eventTarget); From 55bbe0a399b83d78c1f887fa812067ecdf27716c Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 6 Mar 2014 09:16:43 +0100 Subject: [PATCH 70/70] Backed out changeset 4fb349c12a63 (bug 977372) for b2g ics emulator debug m8 test failure --- dom/camera/DOMCameraControl.cpp | 10 +--------- dom/camera/GonkCameraControl.cpp | 8 -------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/dom/camera/DOMCameraControl.cpp b/dom/camera/DOMCameraControl.cpp index 15ef138bc09b..6f56a4e6f367 100644 --- a/dom/camera/DOMCameraControl.cpp +++ b/dom/camera/DOMCameraControl.cpp @@ -11,7 +11,6 @@ #include "DeviceStorage.h" #include "DeviceStorageFileDescriptor.h" #include "mozilla/dom/TabChild.h" -#include "mozilla/ipc/FileDescriptorUtils.h" #include "mozilla/MediaManager.h" #include "mozilla/Services.h" #include "mozilla/unused.h" @@ -35,7 +34,6 @@ using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::idl; -using namespace mozilla::ipc; NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMCameraControl) NS_INTERFACE_MAP_ENTRY(nsISupports) @@ -730,14 +728,8 @@ nsDOMCameraControl::OnCreatedFileDescriptor(bool aSucceeded) return; } } - OnError(CameraControlListener::kInStartRecording, NS_LITERAL_STRING("FAILURE")); - // An error occured. We need to manually close the file associated with the - // FileDescriptor, and we shouldn't do this on the main thread, so we - // use a little helper. - nsRefPtr closer = - new CloseFileRunnable(mDSFileDescriptor->mFileDescriptor); - closer->Dispatch(); + OnError(CameraControlListener::kInStartRecording, NS_LITERAL_STRING("FAILURE")); } void diff --git a/dom/camera/GonkCameraControl.cpp b/dom/camera/GonkCameraControl.cpp index e744970d0aee..61c738d55d8c 100644 --- a/dom/camera/GonkCameraControl.cpp +++ b/dom/camera/GonkCameraControl.cpp @@ -30,7 +30,6 @@ #include "mozilla/FileUtils.h" #include "mozilla/Services.h" #include "mozilla/unused.h" -#include "mozilla/ipc/FileDescriptorUtils.h" #include "nsAlgorithm.h" #include #include "nsPrintfCString.h" @@ -47,7 +46,6 @@ using namespace mozilla; using namespace mozilla::layers; using namespace mozilla::gfx; -using namespace mozilla::ipc; using namespace android; #define RETURN_IF_NO_CAMERA_HW() \ @@ -857,12 +855,6 @@ nsGonkCameraControl::StartRecordingImpl(DeviceStorageFileDescriptor* aFileDescri return NS_ERROR_INVALID_ARG; } - // SetupRecording creates a dup of the file descriptor, so we need to - // close the file descriptor when we leave this function. Also note, that - // since we're already off the main thread, we don't need to dispatch this. - // We just let the CloseFileRunnable destructor do the work. - nsRefPtr closer = - new CloseFileRunnable(aFileDescriptor->mFileDescriptor); nsresult rv; int fd = aFileDescriptor->mFileDescriptor.PlatformHandle(); if (aOptions) {